如何为我们自己的数据集重新训练SSD对象检测模型?

时间:2017-04-19 10:58:49

标签: tensorflow deep-learning object-detection

我已尝试过tensorflow中的SSD和YOLO实现。现在我想重新训练我自己的数据集中的任何一个,比如交通信号。除了pascal voc之外,我如何重新训练ssd以获取数据?任何人都可以帮忙吗?我正在使用https://github.com/balancap/SSD-Tensorflow

中的tensorflow实现

2 个答案:

答案 0 :(得分:2)

不是特定于SSD的实现,

  • 由于所有图层都是卷积的,因此您需要更改预测图层中应用的滤镜数量,因为(根据第4页中的文章),输出是根据您要预测的类数量给出的:即,对于网络中的任何预测层,对于m * n要素图,我们期望分类和定位的(c + 4)kmn输出/预测; c是您要预测的类数,k是该要素图中使用的锚点/默认框的数量,mn是2要素图的尺寸。
  • 您可能希望根据论文中给出的公式更改锚点/默认框尺度

特定于SSD-Tensorflow,

  • 您需要确保输入格式与tf.contrib.slim提供的界面相匹配。目前SSD-Tensorflow仅支持Pascal VOC格式。我一直在修改它以接受其他数据集。您可以看到https://github.com/balancap/SDC-Vehicle-Detection/作为示例KITTI界面。 SDC-Vehicle-Detection回购与SSD-Tensorflow的作者相同,但部分代码库已过时。

答案 1 :(得分:0)

从已训练的模型中删除完全连接的图层,并添加自己完全连接的图层,以便学习分类。

基本上,你有类似的东西:

Image -> Conv1 -> Pool1 -> Conv2 -> Pool2 -> ... -> ConvN -> FC1 -> FC2 -> Softmax

第一部分,Conv和Pool图层提取图像功能。分类部分发生在最后FC -> FC -> Softmax。要根据此训练模型训练您自己的分类器,您将自己的完全连接层连接到最后一个卷积层,将卷积层设置为不可训练,然后在数据集上训练网络。

说,你想添加3个完全连接的图层和输出图层,它将变成这样:

Image -> Conv1 -> Pool1 -> ... -> ConvN - FC1 -> FC2 -> Softmax
                                        \
                                          MyFC1 -> MyFC2 -> MyFC3 -> MySoftmax

您的分类输出将为MySoftmax,其中包含您拥有的课程数量。