很多博友看了我的第一篇博客yolo类检测算法解析——yolo v3,对其有了一定的认识和了解,但是并没有贴出代码和运行效果,略显苍白。因此在把篇博客理论的基础上,造就了第一篇实践文章,也就是本文。只要读者有着强大的理论支撑,什么模型什么框架都是一样玩。所以老师又会跟你说哲学和科学、科学和技术存在如何的关联,尽管很抽象,但是没有人反驳过就像有这么多的编程语言,各有特色,最后也都干了相同或相似的事,那么多的框架,各有千秋,最后也都干了相同或相似的事。又或者说反了,是因为它们都想干相同或相似的事,而又有着不同的实现方法,最后形成了那么多的框架和语言,也许这就是All roads lead to Rome的道理。虽都是通往罗马的路,但是每条路的特征不一样,存在即合理......

yolov3的实践篇必须向读者介绍两个很好用的开源项目,面向Windows开发用户而设计,而它们都来源于同一个作者,也就是AlexeyAB,作者的奉献推动了yolo系列算法的研究和推进,在此仅以绵薄的文字表达对作者的敬仰之意。本篇博客主要是介绍、安装和使用这两个项目的入门介绍。

两个项目:

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的依赖配置到项目属性中,编译过程中可能会遇到如下错误:

  • 找不到highgui.hpp:这个错误是由于头文件地址不对,把highgui.hpp的地址改为#include<opencv2/highgui/highgui.hpp>。
  • snprintf()函数报错:在Windows系统中该函数其实是_snprintf,但是编译器提示最好用_snprintf_s()函数替代。

2. darknet

这个项目才是最重要的。首先第一步就是配置darknet。本文的环境是cuda8.0和cudnn7。首先需要打开darknet项目的vcxproj文件,修改cuda版本,否则会无法加载darknet项目。修改9.1 为8.0,如图:

紧接着打开darknet项目解决方案,配置项目属性。

  • 配置第三方库,如图所示。

  • 配置opencv,步骤同上,include,lib,如果配置好就不需要再配了,此处省略。
  • 预编译器定义。

接下来就可以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

yolov3实践(一)的更多相关文章

  1. yolov3实践(二)

    这次给大家带来一个有趣的项目,项目主要是Python写的,基于Keras,backend是tf. 首先,当我们回顾视觉目标检测这个任务时,我们可能纠结于如何使这个项目变得更加work,我理解的更加wo ...

  2. AlexeyAB DarkNet YOLOv3框架解析与应用实践(六)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(六) 1. Tiny Darknet 听过很多人谈论SqueezeNet. SqueezeNet很酷,但它只是优化参数计数.当大多数高 ...

  3. AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(五) RNNs in Darknet 递归神经网络是表示随时间变化的数据的强大模型.为了更好地介绍RNNs,我强烈推荐Andrej K ...

  4. AlexeyAB DarkNet YOLOv3框架解析与应用实践(四)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(四) Nightmare 从前,在一所大学的大楼里,西蒙尼亚.维达第和齐瑟曼有一个很好的主意,几乎和你现在坐的大楼完全不同.他们想,嘿 ...

  5. AlexeyAB DarkNet YOLOv3框架解析与应用实践(三)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(三) ImageNet分类 您可以使用Darknet为1000级ImageNet挑战赛分类图像.如果你还没有安装Darknet,你应该 ...

  6. AlexeyAB DarkNet YOLOv3框架解析与应用实践(二)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(二) 版本3有什么新功能? YOLOv3使用了一些技巧来改进训练和提高性能,包括:多尺度预测.更好的主干分类器等等.全部细节都在我们的 ...

  7. AlexeyAB DarkNet YOLOv3框架解析与应用实践(一)

    AlexeyAB DarkNet YOLOv3框架解析与应用实践(一) Darknet:  C语言中的开源神经网络 Darknet是一个用C和CUDA编写的开源神经网络框架.它速度快,易于安装,支持C ...

  8. 2018软工实践—Alpha冲刺(2)

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前端界面的开发 搭建测试用服务器的环境 完成 ...

  9. YoLo 实践(1)

    目录 YoLo 实践(1) 目标: 实施方法: Step 0. 测试项目是否可以正常运行 运行效果图 使用VOC数据结构训练模型 Step1: 生成统一格式的标注文件和类别文件 Step2: 加载预训 ...

随机推荐

  1. loadrunner基础学习笔记七-面向目标场景

    部署应用程序之前,要执行验收测试以确保系统能够承担预期的实际工作量. 可以为想要生成的每秒点击次数,每秒事务数或事务响应时间设置目标 loadrunner将使用面向目标的场景自动生成所需的目标,当应用 ...

  2. C# region指令和控制台清零

    region指令 有的时候,为了完成一个需求,可能会写几十行.几百行.甚至几千行代码. 当代码数量非常多的时候,尽管你可以使用很详细的注释来帮助阅读,但也不太容易分清楚哪些代码在干什么事情. 因此,C ...

  3. Code First 重复外键

    原因:在一个表中,我有如下字段 表名:orderInfo 列名:companySend,companyReceiver 先展示表结构,(手打了,见谅) public class OrderInfo { ...

  4. 【Gym - 101124A】The Baguette Master (数学,几何)

    BUPT2017 wintertraining(15) #4F Gym - 101124A 题意 给定画框宽度,画的四边和一个对角线长度,求画框外沿周长. 题解 过顶点做画框的垂线,每个角都得到两个全 ...

  5. HNOI2017大佬

    贼难的一道题 虽然算法都不难,但组合起来就是想不到 首先,最简单的一步,对所有大佬,嘲讽你减的自信值和你做水题回复自信值都是不变的,写个\(dp\),设\(dp[i][j]\)表示第\(i\)天自信值 ...

  6. 稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记。

    稍稍乱入的CNN,本文依然是学习周莫烦视频的笔记. 还有 google 在 udacity 上的 CNN 教程. CNN(Convolutional Neural Networks) 卷积神经网络简单 ...

  7. 【BZOJ1856】[SCOI2010]字符串(组合数学)

    [BZOJ1856][SCOI2010]字符串(组合数学) 题面 BZOJ 洛谷 题解 把放一个\(1\)看做在平面直角坐标系上沿着\(x\)正半轴走一步,放一个\(0\)看做往\(y\)轴正半轴走一 ...

  8. 洛谷 P1378 油滴扩展 改错

    P1378 油滴扩展 题目描述 在一个长方形框子里,最多有\(N(0≤N≤6)\)个相异的点,在其中任何一个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油 ...

  9. (转)JVM——Java虚拟机架构

    背景:最近开始忙着找工作了,把需要储备的知识再整理总结一遍!关于JVM的总结,是转自下面的连接.结合<深入理解java虚拟机>,看起来有更清晰的认识. 转载自:http://blog.cs ...

  10. max,min,Zip函数(十一)

    zip函数,拉链,传两个有序的参数,将他们一一对应为元祖形式 max,min比较默认比较一个元素,处理的是可迭代对象,相当于for循环取出每个元素进行比较,注意:不同类型之间不可比较 #!/usr/b ...