YOLO: Real-Time Object Detection:https://pjreddie.com/darknet/yolo/
YOLO模型训练可视化训练过程中的中间参数:http://blog.csdn.net/yudiemiaomiao/article/details/72469135
一.制作数据集
1.数据集准备
(1)将数据集VOCdevkit2007拷贝到darknet\scripts下 (2)VOCdevkit2007修改名称为VOCdevkit
2.修改darknet\scripts\voc_label.py
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
classes = ["comp"]
#os.system("cat 2007_train.txt 2007_val.txt 2012_train.txt 2012_val.txt > train.txt")
#os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt 2012_train.txt 2012_val.txt > train.all.txt")
3.终端进入darknet\scripts,执行:
python voc_label.py
此后可以看到:
VOCdevkit\VOC2007里多了一个labels文件夹(如下)
darknet\scripts下多了2007_train.txt、2007_val.txt和2007_test.txt三个文件
二.修改配置文件
(1)修改data/voc.names文件:comp
(2)修改cfg/voc.data文件。
classes= 1 //类别数
train = /home/gjw/darknet/scripts/train.txt //训练集
valid = /home/gjw/darknet/scripts/2007_test.txt //测试集
names = data/voc.names
backup = backup //在darknet新建一个backup目录,存储.weight
(3) 修改×××.cfg(以yolo-voc.cfg为例),修改2个参数(filters,class),见下:
① 【region】层中 classes 改成1。
② 【region】层上方第一个【convolution】层,其中的filters值要进行
修改,改成(classes+ coords+ 1)* (NUM) ,我的情况中:(1+4+1)* 5=30
③ learning_rate:学习率
④ max_batches:最大迭代次数
三.下载预训练模型
下载好的预训练模型保存在/darknet/目录下
PS:经过以上的修改,记得重新make一下darknet
四.训练
在darknet/目录下新建backup目录用于存放训练生成的模型
官网上下载预训练的模型,训练命令:
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
./darknet detector train cfg/voc.data cfg/yolo-voc.cfg yolo-voc.weights
【结果】训练完毕就可以生成weights文件
Saving weights to backup/yolo-voc.backup
Saving weights to backup/yolo-voc_100.weights
Saving weights to backup/yolo-voc_final.weights
五.评估性能http://blog.csdn.net/hysteric314/article/details/54093734
经过漫长的训练过程,model终于训练好了,为了评估性能,可以使用以下指令
./darknet detector recall cfg/voc.data cfg/yolo_voc.cfg backup/yolo_voc_final.weights
需要注意的是,在使用这个指令之前,我先修改一下src/detector.c 这一函数
(1)位置第375行改成:list *plist = get_paths(“/home/yolo_v2_tinydarknet/darknet/infrared/infrared_val.txt”);//改成infrared_val.txt的完整路径
(2)运行上面的指令会调用validate_detector_recall函数,
这个函数中有个参数thresh(阈值),默认的值是.001,这个默认
值设的很小,会让系统识别出更多的框来,导致proposals值激增,
还会让recall值变高,达到98.5%。最终我改成了 .25。
(3)上面的函数只会显示出recall值,没有precision值,precision的
值计算方法是:识别为正确的个数/画了多少个框,所以我修改了代码。
我把第447行显示结果的代码修改为 :
fprintf(stderr, "ID:%5d Correct:%5d Total:%5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\t", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
fprintf(stderr, "proposals:%5d\tPrecision:%.2f%%\n",proposals,100.*correct/(float)proposals);
运行后显示的结果是:
Correct :可以理解为正确地画了多少个框,遍历每张图片的Ground Truth,网络会预测出很多的框,对每一Groud Truth框与所有预测出的框计算IoU,在所有IoU中找一个最大值,如果最大值超过一个预设的阈值,则correct加一。
Total:一共有多少个Groud Truth框。
Rps/img:p 代表proposals, r 代表region。 意思就是平均下来每个图片会有预测出多少个框。预测框的决定条件是,预测某一类的概率大于阈值。在validation_yolo_recall函数中,默认的这一个阈值是0.001,这一阈值设置的比较低,这就会导致会预测出很多个框,但是这样做是可以提升recall的值,一般yolo用于画框的默认值是.25,使用这个阈值会让画出来的框比较准确。而validation_yolo_recall使用的阈值改成。25的时候,Rps/img 值会降低,recall的值会降低,所以validation_yolo_recall默认使用一个较低的阈值,有可能作者的目的就是为了提高recall值,想在某种程度上体现网络的识别精度比较高。
IoU、Recall、Precision:解释起来比较麻烦,请看博客有详细说明:
http://blog.csdn.net/hysteric314/article/details/54093734
六.测试单张图像
./darknet detector test cfg/voc.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/000020.jpg
[扩展]
可以通过-thresh 0设置所有检测的阈值为0,同理,也可以通
过设置不同的阈值进行检测。
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0
七.测试摄像头/视频
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights
http://blog.csdn.net/burning_keyboard/article/details/71056164
http://blog.csdn.net/xjz18298268521/article/details/61922405
http://blog.csdn.net/sinat_30071459/article/details/53100791
http://blog.csdn.net/sinat_30071459/article/details/53161113