总结了一些写的好的YOLOv3的文章与自己使用中的问题,便于学习与回顾
一、学习YOLOv3
YOLOv3:An Incremental Improvement全文翻译
语言生动易懂,适合新手学习,有很多实测的图,效果非常好,展示了YOLOv3的强大!
总结了YOLOv3的改进之处,并对下一代YOLO提出展望
实测看效果,用YOLOv3检测一段视频,截取部分帧展示YOLOv3在小物体或者远处的物体识别、重叠遮挡物体的识别、运动模糊物体的识别、高密度汽车的识别、密集人群识别的效果。
具体讲解了YOLOv1到v2到v3的改进之处,值得学习
知乎话题,一些回答挺好的,各种总结、图表、文章链接
二、实践YOLOv3
图表展示了YOLOv3的优势,讲解了如何搭建Darknet、下载预训练模型、测试图像、测试视频、用VOC数据集训练模型、用COCO数据集训练模型
详细讲解了如何制作VOC格式的数据集,将VOC格式的xml文件转换成YOLO格式的txt文件,修改训练相关的配置文件,如何训练自己的模型,如何进行测试,论文阅读
详细讲解了YOLOv3配置文件每个参数的意义,以及源码中如何使用这些参数
三、修改YOLOv3
讲解了如何批量测试图片并保存在自定义文件夹下,给出了代码
讲解了YOLOv3如何计算mAP、recall来衡量模型效果
四、自己使用问题总结
1、运行test,recall,vaild命令时,<test_cfg>文件中batch和subdivisions两项必须为1。否则会出现测试检测不到目标、计算recall为0,验证没有产生结果文件。训练时候根据GPU情况调大batch和subdivisions,官方cfg中两者值分别为64和16。
2、测试标签上如何添加置信值
由于官方代码测试只标注了类别,标签文字较大。使用过程中希望减小标签,并加上检测的置信值。
修改src/image.c文件draw_detections函数,前面部分代码修改如下:
-
int i,j;
-
for(i = 0; i < num; ++i){
-
char labelstr[4096] = {0};
-
int class = -1;
-
char possible[2];//存放检测的置信值
-
for(j = 0; j < classes; ++j){
-
sprintf(possible,"%.2f",dets[i].prob[j]);//置信值截取小数点后两位赋给possible
-
if (dets[i].prob[j] > thresh){
-
if (class < 0) {
-
strcat(labelstr, names[j]);
-
strcat(labelstr, possible);//标签中加入置信值
-
class = j;
-
} else {
-
strcat(labelstr, ", ");
-
strcat(labelstr, names[j]);
-
strcat(labelstr, possible);//标签中加入置信值
-
}
-
printf("%s: %.0f%%\n", names[j], dets[i].prob[j]*100);
-
}
-
}
-
///后面保持不变//
修改src/image.c文件draw_detections函数中get_label函数调用的参数
image label = get_label(alphabet, labelstr, (im.h*.02));
源码中为0.03,修改为0.02后,标签文字减小,可以根据需要调整。
修改代码后需要使用make clean,make重新编译。
加入置信值,减小标签大小后的检测效果图!
3、使用多GPU训练时,由于并行处理,训练迭代次数会一次跳过几轮,导致某些整数次迭代的模型没有保存。
修改example/detector.c文件中的第148行
源代码为:if(i%10000==0 || (i<1000 && i%100==0))//迭代小于1000次,每100次保存模型,大于1000次,每10000次保存模型。
可以根据需要修改训练多少轮保存一个模型,if(i%1000==0 || (i<1000 && i%100==0)),大于1000次,每1000次保存模型。