很多博友看了我的第一篇博客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. BZOJ4408&4299[Fjoi 2016]神秘数——主席树

    题目描述 一个可重复数字集合S的神秘数定义为最小的不能被S的子集的和表示的正整数.例如S={1,1,1,4,13},1 = 1 2 = 1+1 3 = 1+1+1 4 = 4 5 = 4+1 6 = ...

  2. BZOJ3172[Tjoi2013]单词——AC自动机(fail树)

    题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...

  3. BZOJ5300 [Cqoi2018]九连环 【数学】【FFT】

    题目分析: 这道题是数学必修五的原题,做法如下图,书上讲得很详细了. 那么这道题目用快速幂就可以解决了,值得注意的是,分析时间复杂度会发现直接做乘法其实是O(n^2)的,但是有一个1/20左右的常数, ...

  4. ecplise debug 无法命中断点 一直在加载中

    发生原因:可能是特殊关闭了Ecplise 导致 1.这个是没问题的,网上大部分都说这个问题 2.删除所有断点再来(试了无效) 3.删除  X:\workspace\.metadata\.plugins ...

  5. LCT总结——概念篇+洛谷P3690[模板]Link Cut Tree(动态树)(LCT,Splay)

    为了优化体验(其实是强迫症),蒟蒻把总结拆成了两篇,方便不同学习阶段的Dalao们切换. LCT总结--应用篇戳这里 概念.性质简述 首先介绍一下链剖分的概念(感谢laofu的讲课) 链剖分,是指一类 ...

  6. 自学Linux Shell18.1-sed编辑器基础特性

    点击返回 自学Linux命令行与Shell脚本之路 18.1-sed编辑器基础特性 linux世界中最广泛使用的两个命令行编辑器: sed gawk 1. sed概念 sed是stream edito ...

  7. Java8的Stream流(一) --- 基础用法

    Java8中的Stream Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象. Stream的特性及优点: 无存储. Stream不是一种数据 ...

  8. Bash: about .bashrc, .bash_profile, .profile, /etc/profile, etc/bash.bashrc and others

    Some interesting excerpts from the bash manpage:When bash is invoked as an interactive login shell, ...

  9. 收藏:c语言的多线程同步

    1.<秒杀多线程第一篇 多线程笔试面试题汇总> 2.<秒杀多线程第二篇 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别> 3.<秒杀 ...

  10. 简单认识python(一)

    最近本宝宝被一部小说迷的神魂颠倒的,在网络上四处找免费的小说资源,一直哭唧唧的等待着每天更新的一章.实在是太可怜了,本宝宝决定自己学python,自己抓包小说. 既然知道目的地了,那就和本宝宝一起打怪 ...