如何在Keras上实现YOLOv3解码输出?

时间:2019-03-28 14:07:32

标签: python tensorflow keras deep-learning yolo

我正在尝试使用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并在那里执行获取边界框和分数的方法。最后,我将冻结这个新模型。虽然,我不确定这是否是最糟糕的主意...

谢谢!

0 个答案:

没有答案