使用darknet(windows GPU 版本) yolov3 训练自己的第一个检测模型(皮卡丘检测)

一。 windows GPU 版本的 darknet 环境

环境:(基本都是按照github上的要求的来的,之前试过没按照上面的版本来,失败了,不挣扎了~ )

1. VS2015    community 免费的社区版本,这个装在哪个位置随意。

2.  CUDA9.1 cudnn7.1    使用默认安装位置(CUDA安装在 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1,cudnn解压出来直接覆盖该目录)。CUDA安装过程中黑屏没关系,只是小小的黑一下而已。

3. opencv3.4.0   将opencv-3.4.0-vc14_vc15.exe解压出来,C盘建个名为“opencv_3.0”的目录,然后把解压出来的东西扔进去,目录结构如下(C:\opencv_3.0\opencv\build)

4. darknet windows版本:github路径:https://github.com/AlexeyAB/darknet(下载的时候是2018.10.7)


二。 在VS2015上编译DEMO

1.  打开 darknet-master\build\darknet\darknet.sln  这个是GPU版本的(darknet_no_gpu.sln 这个是CPU版本的,如果只跑前向,用这个完全没问题,如果要训练,还是GPU版本的吧,CPU版本的实在是太慢了!)

2. 如下图,打开后,右击选中部分,点重新生成,如果是按照我上面的流程安装的环境,应该不要修改配置就能直接使用。darknet-master\build\darknet\x64  中会生成 darknet.exe


VS2015 darknet GPU工程


三。 训练自己的数据集

1.  搜集训练样本(不使用开源数据集)

使用网络爬虫,爬取样本图片。网络爬虫我几乎是小白,是网上随便找的一个比较快且稳定的爬虫脚本(原版在哪里暂时找不到了,找到了再加上去),总共爬了7W多张,可怕。。。


网络爬虫结果


2. 训练的 yolo label 标注

标注工具是基于网上的一个版本改的,基于opencv(http://www.cnblogs.com/louyihang-loves-baiyan/p/4457462.html)。

标样本的时候,取了前1W张图片,然后当标了几百张的时候发现越来越多重复的图片了,最终,我只标了接近1000张图片,实在是懒得标了~!

标注的代码里面会将图片缩放成固定大小,方便我去标。

yolo的label格式是这样的:类别下标(第几个类别,从0开始)     中心点x坐标   中心点y坐标   目标宽度   目标高度    (后面4个值都是实际像素点值除以实际宽高的,也就是占比)

yolo label

每张图片都对应一个label文件,比如图片名字是1.jpg,那么它的标注文件就是1.txt。


3. 准备训练前的东西

1. 标签名字文件:pikaqiu.names 里面每行存放着标签的名字(该文件一般放在data目录,这里我训练的是皮卡丘检测,所以就一个标签)

标签名字

2. data文件(一般放在cfg目录):如图,从上到下分别为类别数量,训练集位置,测试集位置,标签名字文件,模型备份路径

data文件

3.  训练集(pikaqiu_train.txt)和测试集(pikaqiu_test.txt )位置文件:存放图片的位置,在当前目录,每张图片都会有对应的label文件:

训练集

图片和对应的label文件

4. 网络配置文件(再cfg/yolov3-voc.cfg的基础上改的):

训练的超参数

batch:batchSize数,每batch个样本更新一次参数。

subdivisions:如果内存不够大,将batch分割为subdivisions个子batch,每个子batch的大小为batch/subdivisions。在darknet代码中,会将batch/subdivisions命名为batch。

width:网络输入的宽度   height:网络输入的高度   channels:网络输入的通道数

momentum:动量

decay:权重衰减正则项,防止过拟合

angle:通过旋转角度来生成更多训练样本

saturation :通过调整饱和度来生成更多训练样本

exposure :通过调整曝光量来生成更多训练样本

hue:通过调整色调来生成更多训练样本

learning_rate:初始学习率

max_batches:训练达到max_batches后停止学习

policy:调整学习率的policy,有如下policy:CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM

steps:根据batch_num调整学习率

scales:学习率变化的比例,累计相乘


anchors:预选框,可以手工挑选,也可以通过k means 从训练样本中学出

num:预选框的个数,即anchors总数

mask:当前属于第几个预选框

classes:网络需要识别的物体种类数(这里我要训的模型只有一个类别,所以填1)

jitter: 通过抖动增加噪声来抑制过拟合

ignore_thresh:过滤阈值和truth_thresh待研究

random:设置为0,表示关闭多尺度训练(显存小可以设置0)

yolo层前面的卷积层的filters数目是怎么计算的:3x(classes+5),和聚类数目分布有关。如果想修改默认anchors数值,使用k-means即可。


4. 训练及测试

直接从头开始训练(开始loss比较大,慢慢来,会降下去的):build\darknet\x64\darknet.exe detector train .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg

训练的过程中backup目录里面每到一定迭代次数,会有模型参数文件保存下来(比如yolov3_pikaqiu_1000.weights)。

基于前面训练的模型继续训:build\darknet\x64\darknet.exe detector train .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_2500.weights

用生成的模型测试图片:build\darknet\x64\darknet.exe detector test .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_19800.weights


测试模型

用生成的模型测试视频:build\darknet\x64\darknet.exe detector demo .\cfg\pikaiqiu.data .\cfg\yolov3_pikaqiu.cfg backup\yolov3_pikaqiu_19800.weights -i 0 -thresh 0.25 pikaqiu2.mp4


5. anchors说明:

配置文件里面的9个anchor宽高,实际使用的时候是根据训练的样本,通过k-means算法计算出来的点,上面图片中用的默认的配置点,不是计算的,因为当时做这个的时候我还不懂anchor,哈哈。k-mean的原理说明可以参考:https://blog.csdn.net/hrsstudy/article/details/71173305 ,生成anchor的脚本用的https://github.com/AlexeyAB/darknet/blob/master/scripts/gen_anchors.py 这个脚本,这个脚本用在YOLOV3上有个BUG,write_anchors_to_file函数中anchors[i][0]*=width_in_cfg_file/32.

anchors[i][1]*=height_in_cfg_file/32. 这两行“/32”是不对的,yolov2才这么用,yolov3的anchor值是基于网络输入分辨率的,而不是基于feature map,所以要把 /32 去掉就OK了。


以上所有用到的东西(爬虫脚本spider_baidu_pic.py,label标注代码mark_tool.cpp,opencv, vs2015, cuda9.1 CUDNN7.1, darknet windows 2018.10.7版本,皮卡丘检测所有用到的文件和样本,label, 训练出来的模型)我全部存在了网盘里备份,需要的可以下载试试:

链接:https://pan.baidu.com/s/10h8j5OWbdle-Pm2sopLlKw 密码:olxl

第一次写博客,记录自己的学习过程,备份,强化记忆,写的不好大家见谅。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 一瞥(You Only Look Once, YOLO),是检测Pascal VOC2012数据集内对象/目标的系...
    Aspirinrin阅读 52,327评论 28 64
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • “收拾好了没有,准备走了!”王德阳背起一个大行囊,问还在卧室的妻子。 可是,妻子李素芬没有声音,王德阳感到奇怪,走...
    蓝色牛仔阅读 445评论 2 6
  • 导语:你说你疲惫不堪,感觉前路渺茫而艰难。我知道这就像跑一段马拉松途中的感受,但,如果我们能感受到那些生活中零散的...
    菜菜的流浪猫阅读 1,139评论 1 21
  • 转眼儿子开学一个多星期了,儿子也慢慢适应了小学生的生活,每天早起坐校车去学校,中午在学校吃饭,傍晚再坐校车回家。回...
    醉相思_3d2d阅读 160评论 0 0