我正在尝试使用Keras(以及该git作为参考:https://github.com/experiencor/keras-yolo3)和我自己的数据集来训练YOLOv3模型。
即使在训练部分,我也取得了不错的成绩,当我推断模型时,它以接近15 fps的速度运行。使用其他实现方式(例如TF-Slim)以30 fps(使用GTX 1070)运行。
在进行一些测试时,我发现瓶颈是因为Keras模型输出了第82、94和106层的3个特征图以及解码部分以获得边界框,并且在CPU上使用numpy完成了得分。< / p>
达到30 fps的模型是https://github.com/YunYang1994/tensorflow-yolov3之一。这两个模型的区别在于,当YunYang冻结时,该模型使用了YOLO班级中的预测方法。
我想在Keras模型中执行这些相同的操作,因此我考虑使用Lambda层或创建自定义层。但是,我不知道是否可能。
...
x = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 96}], skip=False)
x = UpSampling2D(2)(x)
x = concatenate([x, skip_36])
# Layer 99 => 106
yolo_106 = _conv_block(x, [{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 99},
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 100},
{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 101},
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 102},
{'filter': 128, 'kernel': 1, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 103},
{'filter': 256, 'kernel': 3, 'stride': 1, 'bnorm': True, 'leaky': True, 'layer_idx': 104},
{'filter': 255, 'kernel': 1, 'stride': 1, 'bnorm': False, 'leaky': False, 'layer_idx': 105}], skip=False)
boxes = Lambda(decode_feature_maps, output_shape=(1,), name='ctc')([[yolo_82, yolo_94, yolo_106], anchors, 0.5])
model = Model(input_image, [boxes])
是否可以在模型中添加此额外的层?我想过的另一个选择是将输出三个特征图的模型转换为.pb,然后运行tf.sess并在那里执行获取边界框和分数的方法。最后,我将冻结这个新模型。虽然,我不确定这是否是最糟糕的主意...
谢谢!