array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 利用YOLO实现自己的目标检测 - 爱码网

因为很多是我按照记忆来写的,可能会有错误,大家一定按照给的链接为准,参考这些即可。。。。。

最近,在师哥的引导下,接触了一下YOLO算法,是近年来一个比较好的目标检测算法,而且它有自己的开源深度学习框架—darknet,使用起来比较简单,对于我一个新手来说,挺直白的这个,可以学习一下。

我是在ubuntu16.04下配置的darknet,darknet的安装比较简单,官网上有详细的步骤,按部就班就能装上。

darknet的   官网   

darknet的安装并不困难,但是因为要训练,就需要配置GPU,要安装显卡驱动,这里面的坑是巨大的,我是站在师哥的肩膀上,师哥已经配置好了,就方便多了,使用darknet不难,配置GPU是真的坑多,按照教程一步一步来,不行就多配置几遍,因为就算第一次配置成了,下一次也不一定成功,配置就是这么烦的工作。我推荐一个网址,可以按照下面链接的教程来。

                                                                  Ubuntu配置GPU

这里面比较别扭的是要很多操作要进入字符界面操作,但是像我这样对Ubuntu系统很不熟悉,几乎陌生的人,玩不转,但是只要耐心多弄几次,不会的就多百度,慢慢就弄出来了,详细的步骤就按照上面的教程来。

还需安装opencv,配置opencv。。。。。

下面说一下,怎么利用YOLO算法的darknet框架来进行自己的目标检测。

先贴一个github教程        

          Yolo-v3 and Yolo-v2 for Windows and Linux

就按照这个教程来,就能做出自己的目标检测了,下面我再解释几个重要的部分。

首先要有样本,我们要有图片,需要对图片进行标注,这里面就要用到一个标注工具  YOLO—mark,需要下载这个包,然后编译配置,安装这个教程来         YOLO—mark    

先把github上的这个包下载下来,解压,然后就把一些文件的参数改改,把图片替换成自己的就行。

利用YOLO实现自己的目标检测

先把 x64/Release下的yolo-obj.cfg 文件中的classes和filters改成自己的,classes就是你要检测目标一共有多少种,filters=(classes+5)*5,打开yolo-obj.cfg 文件,按住Ctrl+f搜索classes跟filters,改成自己需要的数,classes只有一个,filters有很多,改哪一个,看一下上面那个教程,只需要修改一处。。

利用YOLO实现自己的目标检测

然后再对x64/Release/data下的进行修改。img里面的照片换成自己的,按上面给的教程修改obj.data和obj.names文件里面的内容,obj.data文件里要修改的就是classes,自己检测多少种,就改多少。obj.names就是要检测目标的名字,比如cat,dog,car。。。。一个名字一行。。。train.txt不用动,这个文件是一会运行自动生成的,里面是你标注过的图片的路径。那两个文件怎么修改,参考上面的教程即可,这就不多啰嗦了。train.txt文件内容参考下图

利用YOLO实现自己的目标检测

首先cd Yolo_mark-master,先到Yolo_mark-master这个文件夹路径下

然后按照指令编译即可

cmake .     (注意cmake和  .  之间是有一个空格的)

make

编译好了会生成一些文件,如下图

利用YOLO实现自己的目标检测

第一个文件夹,第3,4个文件,还有倒数第三个可执行程序就是新生成的。

然后 ./linux_mark.sh 就会运行了。

输入./linux_mark.sh这个指令可能会报错,缺少权限,再输入指令

chmod a+x ./linux_mark.sh

再输入

./linux_mark.sh

利用YOLO实现自己的目标检测

应该就可以成功运行了,这就解决了标注问题。标注除了会生成那个train.txt文件外,再就会在img文件夹下生成一些txt文件,标注一张图片都会生成想应的txt文件,文件里面就是标注框的中心点坐标和标注框的长宽,长和宽是按照一定比例折算的,不是实际的大小。

剩下的工作就是将你所需要训练的照片都标注上,标注完成后将data文件复制到darknet/x64/Release/下,替换原来的data文件夹。

利用YOLO实现自己的目标检测

然后需要修改yolo-obj.cfg文件里面的内容,到darknet/cfg/下,找到yolov3.cfg,将里面的内容复制到yolo-obj.cfg文件中。

需要修改一些内容,还是按住Ctrl+f搜索classes,一共三处classes,换成你要检测的种类。再搜索yolo,将yolo层上面的filters改成(classes+5)*3,也是一共三处,参考下图。具体参考yolov3。。。for win and linux那个教程,会告诉具体修改哪一行。

这里要注意,不要跟配置标注工具的时候混淆了。。。。。。。filters的计算是不一样的,数目也不一样,标注工具的只有一处,这有三处。。。。。。

利用YOLO实现自己的目标检测          利用YOLO实现自己的目标检测


在训练的时候,按照下图

利用YOLO实现自己的目标检测

测试的时候,按照下图修改

利用YOLO实现自己的目标检测

正常训练过程如下图

利用YOLO实现自己的目标检测

如果,全部都显示nan,说明训练发生错误,可能是哪个文件没修改对,期望的是class趋近1,obj趋近1,no obj趋近0。

前900次,每100次会生成一个模型,后面10000次生成一个,存储在darknet/backup文件夹下

利用YOLO实现自己的目标检测

其中yolo-obj.backup这个是实时存储的,剩下的到了一定步数生成的。

在训练的时候一定要修改yolo-obj.cfg文件,将来转换为训练模式,测试的时候记得修改成测试模式。

下面是训练指令

利用YOLO实现自己的目标检测

./darknet detector train 是训练固定的   x64/Release/data 是obj.data的路径  x64/Release是yolo-obj.cfg的路径,cd darknet是到了darknet路径下,即它们都是在darknrt路径下的

下面是测试指令

利用YOLO实现自己的目标检测

backup/yolo-obj.backup是保存在backup文件下的训练生成的模型

data/test1241.jpg是data文件夹下的一张测试图片

对于一个ubuntu的新手来说,务必要搞清楚这些路径问题。。。。。。。


因为很多是我按照记忆来写的,可能会有错误,大家一定按照给的链接为准,参考这些即可。。。。。

相关文章: