我正在尝试使用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公司在那里做得到边界框和分数的方法。最后,我会冻结这个新模型。不过,我不确定这是不是一个最坏的主意。。。在
谢谢!在
目前没有回答
相关问题 更多 >
编程相关推荐