不少博友看了个人第一篇博客yolo类检测算法解析——yolo v3,对其有了必定的认识和了解,可是并无贴出代码和运行效果,略显苍白。所以在把篇博客理论的基础上,造就了第一篇实践文章,也就是本文。只要读者有着强大的理论支撑,什么模型什么框架都是同样玩。因此老师又会跟你说哲学和科学、科学和技术存在如何的关联,尽管很抽象,可是没有人反驳过就像有这么多的编程语言,各有特点,最后也都干了相同或类似的事,那么多的框架,各有千秋,最后也都干了相同或类似的事。又或者说反了,是由于它们都想干相同或类似的事,而又有着不一样的实现方法,最后造成了那么多的框架和语言,也许这就是All roads lead to Rome的道理。虽都是通往罗马的路,可是每条路的特征不同,存在即合理......html
yolov3的实践篇必须向读者介绍两个很好用的开源项目,面向Windows开发用户而设计,而它们都来源于同一个做者,也就是AlexeyAB,做者的奉献推进了yolo系列算法的研究和推动,在此仅以绵薄的文字表达对做者的敬仰之意。本篇博客主要是介绍、安装和使用这两个项目的入门介绍。git
两个项目:github
1. Yolo_mark算法
这是在yolo项目下做者建立的标注项目,就是把图片集标注成一个txt文件,以下:编程
0 0.498437 0.481499 0. 117188 0.175000
第一位是类ID,表示为0具体表明的是啥,请看相应的.names文件,而后接下来四个小数字表明的是bbox和图片分辨率的关系,具体说明一下:框架
yolo中用到的GT都是bbox中心点坐标,可是光有中心点坐标是不能准肯定位一个框的,因此须要两个辅助的坐标,天然就是框的宽和高,并对其归一化处理;而在预测环节,若是用相对anchor box的绝对值坐标,同一目标相对anchor的位置受参数影响变化很大,模型收敛困难,所以论文经过相对网格点的偏移固定bbox中心点,并经过先验anchor box预测bbox的宽和高,这样的话,能够归纳为:编程语言
#GT:假设bbox的中心点坐标为(x,y);bbox的宽和高分别为(w,h);图片分辨率为(u,v),原本的坐标是(x,y,w,h);归一化后的坐标是:(x/u, y/v, w/u, h/v) #Pr:(x,y,w,h)经过创建相对网格点和anchor box的位置关系得到。
#同理,上述推理也很容易求得bbox矩形框的坐标,画出最终的检测结果。
曾经我也试用了一下,感受仍是很不错的,感兴趣的能够写一个标注的工具分享给你们。函数
如何编译和使用,项目介绍里写得很清楚;须要将opencv的依赖配置到项目属性中,编译过程当中可能会遇到以下错误:工具
2. darknetpost
这个项目才是最重要的。首先第一步就是配置darknet。本文的环境是cuda8.0和cudnn7。首先须要打开darknet项目的vcxproj文件,修改cuda版本,不然会没法加载darknet项目。修改9.1 为8.0,如图:
紧接着打开darknet项目解决方案,配置项目属性。
接下来就能够build该项目了,如图所示:
成功以后,就是和以前的yolo版本同样用了,Ubuntu的也是,代码也是差很少。下面测试一下其性能:
测试视频:darknet.exe detector demo data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 test.mp4
测试图片:darknet.exe detector test data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 test.jpg
测试USB摄像头:darknet.exe detector demo data/coco.data yolov3.cfg yolov3.weights -i 0 -thresh 0.25 -c 0
忘截图了,若是USB摄像头没法调用,第一步确保电脑相机能够打开,第二步尝试更换-c 后面的编号,第三步参考USB摄像头没法正常读取问题。
最后,重要的部分,yolo里面有几个源代码文件对应于上面的测试,具体请看:darknet.c(主程序)解析第一个输入的关键字指令,好比上面的detector,而后执行run_detector(int argc, char **argv)这个函数,接着跳到detector.c,继续解析命令行关键指令,好比上面的demo和test和后面跟着的配置参数如cfg,data,weight等等,重点是demo跳到
demo(cfg, weights, thresh, hier_thresh, cam_index, filename, names, classes, frame_skip, prefix, out_filename, http_stream_port, dont_show);
就到了demo.c里面,test就跳到test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, dont_show)函数了。还有image.c,detection_layer.c,utils.c,data.c等等。
欢迎加入QQ交流群864933024