以YOLO为例的微调和迁移学习

kak*_*tus 7 machine-learning object-detection yolo transfer-learning

我有一个关于微调和迁移学习的一般性问题,当我试图找出如何最好地让 yolo 检测我的自定义对象(手)时出现了这个问题。

对于可能包含大量虚假信息的长文本,我深表歉意。如果有人有耐心阅读它并帮助我清除我的困惑,我会很高兴。

经过大量的谷歌搜索,我了解到很多人认为微调是迁移学习的一个子类,而其他人则认为他们是训练模型的不同方法。同时,人们区分仅在自定义数据集上重新训练模型的最后一个分类器层与重新训练模型的其他层(并且可能添加一个全新的分类器而不是重新训练?)。这两种方法都使用预先训练的模型。

我最后的困惑就在这里:我按照以下说明操作:https : //github.com/thtrieu/darkflow 通过darkflow 使用以下命令训练小yolo:

# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU: flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0 但是这里发生了什么?我想我只是重新训练分类器,因为说明说要更改配置文件中最后一层的类数。但话又说回来,还需要更改倒数第二层(卷积层)中的过滤器数量。

最后,说明提供了替代培训的示例: # Completely initialize yolo-new and train it with ADAM optimizer flow --model cfg/yolo-new.cfg --train --trainer adam我完全不明白这与迁移学习的不同方式有何关联。

gam*_*n67 3

如果您使用 AlexeyAB 的 darknet 存储库(不是 darkflow),他建议通过在 cfg 文件中设置此参数来进行微调而不是迁移学习:stopbackward=1

然后输入./darknet partial yourConfigFile.cfg yourWeightsFile.weights outPutName.LastLayer# LastLayer#例如:

./darknet partial cfg/yolov3.cfg yolov3.weights yolov3.conv.81 81
Run Code Online (Sandbox Code Playgroud)

它将创建yolov3.conv.81并冻结下层,然后您可以使用权重文件yolov3.conv.81而不是原始的darknet53.conv.74.

参考文献: https://github.com/AlexeyAB/darknet#how-to-improve-object-detection,https ://groups.google.com/forum/#!topic/ darknet / mKkQrjuLPDU

  • **这是一个误导性的答案。AlexeyAB 确实_不_“建议进行微调而不是迁移学习”。**阅读您链接到的部分:_加速训练(随着**降低检测精度**)进行微调而不是迁移学习,设置参数向后停止=1_。因此,使用“stopbackward”会失去检测精度。它只适合那些想要快速训练而不关心准确性的人。 (10认同)