数据集
需要voc2007和voc2012, 目录结构如下
VOCdevkit/VOC2007
VOCdevkit/VOC2012
darknet/sctripts/voc_label.py 在VOCdevkit目录下执行该脚本,生成若干txt,里面都是绝对路径
其中train.all.txt是所有图片的列表, train.txt是除了voc2007 test以外的图片列表,训练时可以使用train.txt,用2007_test.txt作测试
另外VOCdevkit/VOC2007/labels和VOCdevkit/VOC2012/labels目录下生成很多label文件,里面一行表示一个目标
class, x,y,w,h
其中(x,y,w,h)表示目标位置,对图像宽高作了归一化,注意(x,y)是中心点
此处只需要把train.txt和2007_test.txt
修改darknet/cfg/voc.cfg中
classes= 20
train = <path-to-voc>/train.txt
valid = <path-to-voc>2007_test.txt
names = data/voc.names
backup = backup
其中data/voc.names在darknet/data/目录下,记录voc中类别名字
预训练模型
下载一个在imagenet上预训练的darknet53,放在darknet目录下
wget https://pjreddie.com/media/files/darknet53.conv.74
启动训练
3.1 修改cfg/yolov3-voc.cfg中
batch_size = 64
subdivision = 16
如果遇到GPU内存不够的情况,可以适度增大subdividaion的值,当然不能超过batch_size
3.2 ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
GPU内存4G不到,但有时会升高到7G多, 训练中一个关键指标是Avg IOU, 这个值可以偶尔为nan,但是不能一直为nan
iteration打印类似下面的结果
135: 210.697388, 304.020233 avg, 0.000000 rate, 11.308264 seconds, 8640 images
其中
iteration = 135
loss = 210.697388
avg loss = 304.020233
测试
./darknet detect cfg/yolov3-voc.cfg backup/yolov3-voc.backup data/dog.jpg
上面的命令默认使用coco的类别名,所以会看到定位正确,但类比不对
正确的命令如下
./darknet detector test cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup data/dog.jpg
下面的命令会批量处理图片,结果保存在results目录下,但不会自动统计recalling
./darknet detector valid cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc.backup
50多个epoch,avg loss 0.8左右,看了几个图,定位不错,类比还有错误的