美高梅官方网站3045-mgm6608美高梅app下载
Yolo训练自个儿的数量集完整记

Yolo训练自个儿的数量集完整记

作者:mgm6608美高梅app下载    来源:未知    发布时间:2020-01-26 20:34    浏览量:

图片 1

refer

一瞥(You Only Look Once, YOLO),是检测Pascal VOC 2012数据集内对象/目标的系统,能够检测出20种Pascal对象:

虽然网上教程一大把,但是作为小白,训练自己的数据集还是费了点事。记录下一些关键点,少踩一点坑。本文假设已经拥有以下条件:

Yolo darknet训练自己的数据集教程(Newest 2016.12.23)

人person

鸟bird、猫cat、牛cow、狗dog、马horse、羊sheep

飞机aeroplane、自行车bicycle、船boat、巴士bus、汽车car、摩托车motorbike、火车train

瓶子bottle、椅子chair、餐桌dining table、盆景potted plant、沙发sofa、显示器tv/monitor

1. Linux操作系统,已经安装好CUDA和cuDNN(参考教程:https://www.jianshu.com/p/bc614f23d9eb)2. 耐心

经过两天的折腾终于搞定了Yolo训练自己的数据集的过程,整个过程其实并不繁琐,只是网上一些过时的教程已经不适用了,依照那个反而让大家各种出出错,加之Yolo中文教程过少,因此本大神再次放一个,如果大家有任何问题直接在文章后面评论即可,笔者看到之后给予第一时间回复。

补充 :有的同学报告说数据集无法下载,如果遇到这样的问题,可以用下面的方式在terminal中下载,也可以提取链接在浏览器或迅雷等软件中下载。

Darknet是Yolo作者自己写的一个网络框架,官方网站是:

先插一句,Atom中文不能跟随窗口wrap文字的同学,打开settingview,设置soft wrap即可,百度上的答案真的是渣

wget

wget

wget

1)下载源码

Yolo简介

YOLO由以下参与者共同完成:Santosh、Ross和Ali,详细内容参见其paper

git clone https://github.com/pjreddie/darknetcd darknet

在训练数据集之前,相信大家对yolo应该有一些了解,本文所采用的测试环境为:Ubuntu 16.04 + opencv2.4 + cuda8 + cudnn5.1 PLUS GTX1080,当然这个硬件不是必须,在下只是偶尔装一下逼。Yolo基于darknet编写,而编译draknet的时候最好安装一下opencv,因为没有opencv图不会自动弹出,没有那种快感,你懂得,不知道如何安装opencv的同学去我之前写的几个博客中搜寻。均能够找到最新的答案。

以下教程分为9部分(不要害怕,easy),运行系统Ubuntu 14.04。OpenCV、cuda、GPU这些依赖是可选项,如果没有也可以,就是慢点啦。最后会添加一下官网教程中没有的安装错误和修改信息。

2)修改Makefile文件,启用GPU,cuDNN,OpenCV等相关支持

yolo之所以快,是因为它的方法和fastrcnn以及其他detect算法不同,而采用了很多ssd的思想,在最新的更新中,yolo也改进了他们的算法,在pascal voc数据集上取得了不错的结果。本文将主要利用yolo来做realtime detect,对自己的数据进行训练和预测。

本篇教程内容全部翻译自官网

xed ./Makefile# 修改GPU=0CUDNN=0OPENCV=0# 为GPU=1CUDNN=1OPENCV=1

开始开车

先前的检测系统多使用分类器(classifier)或者定位器(localizer)进行检测任务,把图片的不同局部位置和多种尺度输入到模型中去,图片得分较高的区域作为检测目标。

3)编译

OK,闲话不多说,让我们直接上车,这次是无人驾驶,速度比较快,大家系好安全带。

YOLO是一个全新的方法,把一整张图片一下子应用到一个神经网络中去。网络把图片分成不同的区域,然后给出每个区域的边框预测和概率,并依据概率大小对所有边框分配权重。最后,设置阈值,只输出得分超过阈值的检测结果。

make

Step 1 编译darknet,并熟悉目录结构

图片 2输入-检测-输出

最终得到可执行文件“darknet

第一部分没有什么说的,很简单其实,首先clone代码到本地~目录:

我们的模型相比于基于分类器的模型有一些优势,在测试阶段,整张图片一次输入到模型中,所以预测结果结合了图片的全局信息。同时,模型只是用一次网络计算来做预测,而在R-CNN中一张图片就需要进行上千次的网络计算!所以YOLO非常快,比R-CNN快1000倍,比Fast R-CNN快100倍。整个系统的细节见paper

整个过程难就难在数据集的准备(先无脑训练,除开网络调优)。先看看训练的命令需要准备哪些东西

cd ~
git clone https://github.com/pjreddie/darknet
cd darknet
make
这个时候我们在home根目录就有了darknet了。直接编译,不需要修改任何参数,当然如何你是土豪,你有GTX1080,像我一样(手动装比)。可以编译一下Makefile里面的参数。为了防止大家出错我还是说一下,直接改标志为:

本节内容会知道你如何使用YOLO预训练好的模型进行目标检测。在这之前,你应该安装好DarkNet,安装方法戳这里。

./darknet detector train prcv.data prcv-tiny.cfg

GPU=1
CUDNN=1
OPENCV=0
DEBUG=0
如果你的cuda没有设置环境变量,nvcc的路径也设置一下:

安装好DarkNet之后,在darknet的子目录cfg/下已经有了一些网络模型的配置文件,在使用之前,需要下载好预训练好的权重文件yolo.weights.

其中“./darknet detector train”为训练的固定命令,最重要的是prcv.dataprcv-tiny.cfg两个参数。这两个文件,prcv.data即与数据集相关,prcv-tiny.cfg与网络结构相关。看看prcv.data文件都有些啥内容

NVCC=/usr/local/cuda/bin/nvcc
不要想的很复杂其实很简单。ok,现在直接make,编译就可以了。

现在,使用DarkNet的yolo命令进行一下测试吧(假设你在darknet/目录下,自己修改好yolo.weights和image的路径)

classes = 1train = /home/user/Prcv2018/Dataset/mission/detection/train/train_set.txtvalid = /home/user/Prcv2018/Dataset/mission/detection/train/test_set.txtnames = /home/user/Prcv2018/Dataset/mission/detection/train/prcv.namesbackup = /home/user/Prcv2018/Train/backupeval = prcv

**Step 2 准备自己的数据集 **

./darknet yolo test cfg/yolo.cfg <path>/yolo.weights <image>

可以看出,里面是与数据集相关的配置参数,classes是目标类别数,train、valid分别是训练集和测试集txt文件所在路径,names为目标内别名称。backup为训练中间权重文件保存目录。很明显,这个文件里指出的三个文件与数据集相关,是需要准备的。train_set.txt里是训练集图片路径,test_set.txt里是测试集图片路径。

好了我们现在有了darktnet,但是我要那个匡出物体的掉炸天的图怎么搞?莫慌,我们先用darknet自带的测试数据来测试一下。 首先呢,yolo这个网络是训练VOC数据集得来的,20中物体都能识别出来,我们直接下载已经训练好的权重然后来预测一张图片看看:

如果你没有现成的图片,不妨直接使用darknet/data/下面的某张图片。

本文描述的数据集是PRCV2018行人计数挑战赛的数据集,鉴于保密协议,不公开放出。该数据集的特点是方框标注出头和肩的位置。目标分类数量只有一类:person。

wget http://pjreddie.com/media/files/yolo.weights
这时候我们就下载好了yolo.weights,在darknet目录下。然后我们就可以用这个权重来预测啦!

进行上面的测试,Darknet会打印出检测到的目标对象和可信度,以及耗时。使用CPU时,每张图片耗时为6-12秒,GPU版本会快,快很多。

因此,这三个文件的内容分别是:

./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
detect命令意思是,检测,后面还有i一个命令是detector train,后者是训练的命令,预测用detect,cfg/yolo.cfg就是yolo这个网络的结构文件,后面是权重,最后后面是图片。 ok,enter你就可以看到狗和自行车了!~ 这就搞定了darknet,那么问题来了。自己的数据集怎么准备呢? 重点来了重点来了: * images 准备

如果安装DarkNet的时候,没有使用OpenCV,上面的测试不会直接显示出图片结果,你需要自己手动打开predictions.png. 打开你会看到类似于下图的预测结果

# prcv.namesperson# train_set.txt/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000158_R_2018_05_17_18_40_00_left_027091.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000158_R_2018_05_17_11_37_26_left_008230.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000158_R_2018_05_17_11_37_26_left_017198.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000158_R_2018_05_17_14_00_00_left_023063.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000051_R_2018_05_17_14_00_00_left_030518.jpg... ...# test_set.txt/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000051_R_2018_05_17_14_00_00_left_031430.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000158_R_2018_05_17_14_00_00_left_019522.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000051_R_2018_05_17_11_43_47_left_000923.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000052_R_2018_05_17_18_40_01_left_010092.jpg/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000051_R_2018_05_17_16_00_00_left_028425.jpg... ...

首先,把你的图片放到一个/images 文件夹下面,文件名的名字要有规律,比如0001.jpg,0002.jpg….0100.jpg;

图片 3predictions.png

以上描述了训练集和测试集,以及类别名称。对于训练来讲,还差什么?对了,就是标注文件。darknet识别的标注文件是txt格式。它位于图片的上级目录labels目录下。

xml 准备
我相信很多人都需要用图片标注工具来对图片生成标注信息来训练,但是图片标注工具生成的多半是xml的标签信息。darknet需要的label并不是xml格式,而是一张图片一个txt的形式,txt中是你标注的物体方框坐标。后面我会放出几个脚本来处理。

如果想运行一次DarkNet检测多张图片的话,你应该先运行以下命令载入预训练模型

# 比如train_set.txt里是/home/user/Prcv2018/Dataset/mission/detection/train/images/202018000051_R_2018_05_17_14_00_00_left_031430.jpg# 那么对应的标注文件 202018000051_R_2018_05_17_14_00_00_left_031430.txt# 应该在/home/user/Prcv2018/Dataset/mission/detection/train/lables# 目录下

xml 转 darknet label
xml转为darknet需要的label形式,一张图片一个标注信息。

./darknet yolo test cfg/yolo.cfg yolo.weights

标注文件中标签的数据格式:

生成图片路径 最后一部我们要生成两个txt文件,一个是train.txt,一个是valid.txt,train.txt包含了你训练图片需要的图片路径,没一行都是一张图片的路径,为了防止出错,后面我放出一个统一的脚本生成这个train.txt。
Step 3 训练之前修改darknet参数

模型载入成功后,会提示输入图片路径Enter Image Path:

<object-class> <x> <y> <width> <height># Where x, y, width, and height are relative to the image's width and height. 

接下来就要修改darknet的参数了,只要修改/cfg/voc.data 文件,因为yolo是为了voc而存在的,为了不修改源代码的情况下来训练我们的数据,建议直接修改voc.data而不是修改voc.data文件名。修改内容如下:

键入类似于data/eagle.jpg的路径,检测这张图片,给出结果之后,会继续提示Enter Image Path。注意如果你连续输入了多张图片,之前的结果会被下一次的检测结果覆盖掉,因为预测结果都叫predictions.jpg。。。要退出/中断程序的话,直接键入Ctrl-C(自己记住这个命令,后面会再用)即可。

以上是官方说明,说的很简单,实际意思是:

classes= 20
train = /home/pjreddie/data/voc/train.txt
valid = /home/pjreddie/data/voc/2007_test.txt
names = data/voc.names
backup = /home/pjreddie/backup/

上面的YOLO模型会占用很多GPU内存,方法类似,只需要调用不同的配置文件,载入相应的权重文件即可。在这里,提供一个更小版本的模型,使用yolo-small.cfg配置文件,调用yolo-small.weights,命令如下

1. x,y是中心点的坐标2. 坐标点是相对于整张图片的相对比例3. 宽高也是相对于整张图片的相对比例4. 类别编号是从0开始的# eg.# 图片大小是320*240,目标框中心位置是,框的宽高是[32,24],类别编号是0# 那么,对应的txt文件内容应该是# 0 0.5 0.5 0.1 0.1

这里,classes就是你数据集的类别,names你的新建一个,在data下面,然后在这里指向它,仿照voc.names 新建即可。 修改train.txt valid.txt的路径,用绝对路径哦,防止出错,因为你darknet和数据可能不再一个目录。 ok,这就setup完了,接着直接训练。 不过训练之前获取一个预处理的权重:

./darknet yolo test cfg/yolo-small.cfg yolo-small.weights

源数据集的格式是左上角坐标x,y,框的宽高w,h。生成训练集和测试集以及标签格式转换py文件如下(第一次写python,实现得可能不太优雅):

curl -O http://pjreddie.com/media/files/darknet19_448.conv.23
然后,train:

这个小版本的YOLO大概占用1.1GB的GPU内存~

import osimg_with = 320 # 图片宽img_height = 240 # 图片高rootdir = '/home/user/Prcv2018/Dataset/mission/detection/train'def f2s: return str(rounddef convert_data(path, tgt_path): out_file = open(tgt_path, 'w') with open(path, 'r') as txt_file: while True: line = txt_file.readline() if not line: break org_x, org_y, org_w, org_h = [int for i in line.split()] tgt_x = (org_x + org_w / 2.0) / img_with tgt_y = (org_y + org_h / 2.0) / img_height tgt_w = org_w / img_with tgt_h = org_h / img_height # 单分类,序列号只有0 tgt_line = '0 ' + f2s + ' ' + f2s + ' ' + f2s + ' ' + f2s + 'n' out_file.writelines out_file.close()def main(): img_dir = rootdir + '/images' ann_dir = rootdir + '/annotations' lab_dir = rootdir + '/labels' # 1. 分出训练集和测试集 train_txt = open(rootdir + '/train_set.txt', 'w') test_txt = open(rootdir + '/test_set.txt', 'w') img_list = os.listdir for i in range(0, len): path = os.path.join(img_dir, img_list[i]) if i % 5 == 0: test_txt.writelines(path + 'n') else: train_txt.writelines(path + 'n') train_txt.close() test_txt.close() # 2. 处理标签数据 target_dir = lab_dir # 得到目录下列表名 txt_list = os.listdir for i in range(0, len): path = os.path.join(ann_dir, txt_list[i]) tgt_path = os.path.join(target_dir, txt_list[i]) if os.path.isfile: # 处理文件 convert_data(path, tgt_path)if __name__ == '__main__': main()

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
对了,如果你上面改了voc.data的文件名,这里也要改,所以说其实改也是可以的。然后yolo-voc.cfg就可以不改了。

./darknet yolo test cfg/yolo-tiny.cfg yolo-tiny.weights

其中测试集数据量占20%。

Step 4 yolo训练出的模型预测

占用611MB的GPU内存,在Titan X上的速度是150 fps

前面提到的另一个重要文件prcv-tiny.cfg。先放出它的具体内容:

./darknet detect cfg/yolo-voc.cfg /backup/voc.weights data/sample.jpg
这里不要和直接copy我的代码,cfg/yolo-voc.cfg就是我们训练的网络。后面是训练保存的权重,最后是你要预测的图片。 OK,看看结果咋么样~

yolo.cfg,基于extraction网络,处理一张图片的速度为45fps,训练数据来源2007 train/val + 2012 train/val + 2007、2012所有数据

yolo-small.cfg,全连接层变小,占用内存变小,50fps,训练数据来源2007 train/val + 2012 train/val

yolo-tiny.cfg,更加小型的网络,基于DarkNet reference network,155fps,数据来源2007 train/val + 2012 train/val

[net]batch=128subdivisions=1width=416height=416channels=3momentum=0.9decay=0.0005angle=0saturation = 1.5exposure = 1.5hue=.1learning_rate=0.001max_batches = 40200policy=stepssteps=-1,100,20000,30000scales=.1,10,.1,.1[convolutional]batch_normalize=1filters=32size=7stride=3pad=1activation=leaky... ...[convolutional]batch_normalize=1size=1stride=1pad=1filters=128activation=leaky[convolutional]size=1stride=1pad=1filters=30 <-------------------------------------------activation=linear[region]anchors = 1.08,1.19, 3.42,4.41, 6.63,11.38, 9.42,5.11, 16.62,10.52bias_match=1classes=1coords=4num=5softmax=1jitter=.2rescore=1object_scale=5noobject_scale=1class_scale=1coord_scale=1absolute=1thresh = .5random=1

YOLO默认返回可信度至少为0.2的检测结果,可以通过-thres <val>参数改变可信度阈值,例如设置为0:

这个文件里面包含了一些参数和网络结构,每项具体的释义网上一大把,就不过多解释了。唯一需要注意的是最后一层filters数量的计算,

./darknet yolo test cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0

filters = num×(classes + coords + 1)= 5* = 30

这将可能返回所有的检测结果。

上一篇:没有了
下一篇:没有了
友情链接: 网站地图
Copyright © 2015-2019 http://www.zen-40.com. mgm美高梅有限公司 版权所有