14

我想使用 yolo 架构进行对象检测。在使用我的自定义数据训练网络之前,我按照以下步骤在 Pascal VOC 数据上对其进行训练:https ://pjreddie.com/darknet/yolo/

指示非常清楚。但在最后一步之后

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

darknet 立即停止训练并宣布权重已写入backups/目录。

起初我认为预训练简直太好了,马上就达到停止标准。所以我./darknet detect在其中一张测试图像上使用了带有这些权重的命令data/dog。什么都找不到。

如果我不使用任何预训练的权重,网络会训练。我已编辑 cfg/yolo-voc.cfg 以使用

# Testing
#batch=1
#subdivisions=1
# Training
batch=32
subdivisions=8

现在训练过程已经运行了好几个小时,并且让我的 gpu 保持温暖。

这是训练暗网的预期方式吗?如何正确使用预训练的权重,而无需中断训练?

是否有任何设置可以创建检查点或了解进度?

4

4 回答 4

25

在训练命令的末尾添加-clear 1将清除该模型在之前的训练中看到的图像数量的统计信息。然后,您可以根据新数据(集)微调您的模型。

void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear) 您可以在https://github.com/pjreddie/darknet/blob/b13f67bfdd87434e141af532cdb5dc1b8369aa3b/examples/detector.c找到有关函数签名中使用的更多信息

我怀疑增加最大迭代次数是个好主意,因为学习率通常与当前的迭代次数有关。当我们想要恢复由于达到最大迭代次数而结束的先前训练任务时,我们通常会增加最大迭代次数,但我们相信通过更多迭代,它会产生更好的结果。

仅供参考,当您有一个小数据集时,从头开始或从分类网络对其进行训练可能不是一个好主意。您可能仍希望重新使用在 Coco 或 ImageNet 等大型数据集上训练的检测网络的权重。

于 2018-08-28T02:01:26.930 回答
17

这是一个老问题,所以我希望你现在能得到答案,但这是我的,以防万一。

在使用暗网大约一个月后,我遇到了人们在论坛上询问/发布的大部分障碍。在您的情况下,我很确定这是因为已经针对最大批次数训练了权重,并且当在暗网中读取预训练的权重时,假设训练已经完成。

相关个人经验:当我使用其中一个预训练的权重文件时,它从迭代 40101 开始,一直运行到 40200 才中断。

如果您有自定义数据,我会坚持从头开始训练,但如果您想再次尝试预训练的权重,您可能会发现更改 cfg 文件中的最大批次数会有所帮助。

于 2017-08-03T03:01:29.903 回答
4

此外,如果使用 AlexeyAB/darknet,他们可能会遇到 -clear 选项的问题,在检测器.c 中:

if (clear) *nets[k].seen = 0 

真的应该是:

if (clear) {*nets[k].seen = 0;*nets[k].cur_iteration = 0;}

否则训练循环将立即退出。

于 2020-03-10T21:57:54.657 回答
0

将您的暗网/Makefile 中的 OpenCV 编号修改为 0

OpenCV=0

于 2020-12-10T05:18:23.630 回答