如何实现Keras YOLOv3解码输出?

2024-10-01 11:20:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用Keras(以及作为参考的git:https://github.com/experiencor/keras-yolo3)和我自己的数据集训练YOLOv3模型。在

尽管如此,我在训练部分取得了很好的效果,当我对我的模型进行推理时,它的运行速度接近每秒15帧。例如,在TF Slim中使用其他实现,它以每秒30帧的速度运行(使用的是GTX 1070)。在

在做一些测试时,我发现瓶颈是因为Keras模型输出了82层、94层和106层的3个特征映射,而获取边界框和分数的解码部分是使用CPU上的numpy完成的。在

达到30 fps的模型是https://github.com/YunYang1994/tensorflow-yolov3之一。这两个模型的区别在于,当云阳冻结时,模型使用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公司在那里做得到边界框和分数的方法。最后,我会冻结这个新模型。不过,我不确定这是不是一个最坏的主意。。。在

谢谢!在


Tags: https模型githublayerfalsetrueyolofilter