Yolo v2&v3 训练自己的数据

  • 目录
    • darknet框架配置
    • 数据集准备
    • 训练与测试

环境:Ubuntu16.04 + Opencv + Nvidia驱动 + CUDA

一、darknet配置

项目地址: https://github.com/pjreddie/darknet
官网:https://pjreddie.com/darknet/
一个非常好用的开源darknet项目:https://github.com/AlexeyAB/darknet

可直接参考官方网站和Github上面的教程。

  1. 下载,终端输入:

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

    下载完成后进入到darknet目录: cd darknet

  2. darknet文件夹中文件:
    Yolo v2&v3 训练自己的数据_第1张图片
    cfg文件夹中是训练时需要的配置文件。data文件夹里面一般放训练的图片和date,names,train.txt等。example、include、src中是源码文件。scripts文件夹里面包含VOC数据集转换脚本等文件.

  3. 修改 Makefile 文件

    	GPU=1   #使用显卡,把0改为1,CPU填写0。
    	CUDNN=1  #默认为0,安装有cudnn,改为1。
    	OPENCV=0   #安装有Opencv,把0改为1。
    	OPENMP=0
    	DEBUG=0
    	......
    

    其余的可以保持不变。

  4. 编译

    	 make -j4 
    

    make -j4表示允许4个编译命令同时执行,可以加快编译速度,-j后面的数字根据CPU调整,直接使用make -j表示不限制。也可以直接用 make,不跟任何参数。

  5. 测试。
    编译完成后,在终端键入 ./darknet ,出现 usage: ./darknet 则 darknet配置完毕。
    下载yolov3.weights.放到darknet目录下:

    	wget https://pjreddie.com/media/files/yolov3.weights
    

    多张图片测试:

    	./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights 
    

    加载完成后会停留在左下图箭头所指的地方,输入测试的图片路径即可,右下图为测试结果,终端左下角也会显示测试结果。在图片界面按下 Enter或者空格键,可以继续输入图片路路径。
    Yolo v2&v3 训练自己的数据_第2张图片

  6. 其他测试命令
    ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights
    命令第一个参数是编译生成的可执行文件darknet,第三个test是测试命令,后面依次为data文件(包含类,图片路径相关的txt文件),yolo的cfg文件,权重文件。

    单张图片测试,直接在后面跟图片路径:

    ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg
    

    Opencv测试,有老鹰图片出现:

     ./darknet imtest data/eagle.jpg
    

    视频测试:

    ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
    

    即把test改为demo,在命令最后跟参数test.mp4之类的视频文件路径,不跟参数会打开默认的摄像头。

  7. 更多信息请参考官网说明。

二、数据集准备

  1. 数据集说明:Yolo训练需要的数据包括两部分,图片文件(png,jpg等)和
    标注文件(同名txt文件,包含标记的类,坐标信息)。
  2. 基于VOC数据集的数据集准备。
     #1、在darknet根目录scripts下新建文件夹VOCdevkit,VOCdevkit下新建VOC2007,
     	   #VOC2007下新建Annotations,ImageSets,JPEGImages三个文件夹。
     #2、VOC2007文件夹下有以下5个文件夹	****(yolo中新建前三个即可)***
    	# Annotations文件夹 
    		#该文件下存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
    	#JPEGImages文件夹 
    		#该文件夹下存放的是数据集图片,包括训练和测试图片。
    	#ImageSets文件夹 
    		#该文件夹下存放了三个文件,分别是Layout、Main、Segmentation。
    		#在这里我们只用存放图像数据的Main文件,#其他两个暂且不管。
    	#SegmentationClass文件和SegmentationObject文件。 
    		#这两个文件都是与图像分割相关。
     #3、将自己图片放到JPEGImages文件夹下。
     	#注意:图片的名字可修改为000001.jpg格式 ,图片的格式是JPEG或者JPG格式
     #4、标注:制作Annotations文件夹下所需要存放的xml文件。
     #5、在ImageSets文件夹下创建一个Main文件夹。
     	#Main文件夹中创建的4个文件(test.txt、train.txt、trainval.txt、val.txt)
     	#test.txt:测试集  train.txt:训练集  val.txt:验证集  trainval.txt:训练和验证集
     	#该文本文件里面的内容是需要用来训练或测试的图像的名字(无后缀无路径)
     	#例子:train.txt中内容,原数据集均占50%
     		000001 
     		000002
     		000003
     #6、数据转化为yolo格式:
     
    	#修改scripts/voc_label.py
    	
    	sets=[ ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
    	classes = ["person"]#修改成自己的类别,要与VOC标注的xml文件中的名字一致
    	os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt  > train.txt") 
    	#删除最后一句。
     
     #7、执行voc_label.py
    	
    	python voc_label.py
    	
    	#在scripts下得到4个txt,其中train.txt为所有的图用于训练,
    	#Main文件夹中会生成label文件夹,里面为yolo训练需要的数据格式
    
  3. 用Yolo_mark标注的数据集。
    Yolo_mark标注参考。yolo_mark标注后的数据都在 x64/Release/data/img文件夹中,包括图片和标注文件。

三、训练与测试

  1. 基于VOC的数据集
    将cfg文件下的yolov3-voc.cfgvoc.data复制到darknet根目录下。
    修改cfg文件:

    [net]
    # Testing
    #batch=1		     #检测时去掉前面的`#`,注释training里面对应两行的内容
    #subdivisions=1        #检测时去掉前面的`#`,注释training里面对应两行的内容
    # Training 
    # batch=64			#训练时去掉前面的`#`
    # subdivisions=8 	#训练时去掉前面的`#`
    ...
    ###  修改数值的时候不能用全部替换操作,手动修改###
    
    filters= 18    #[检测目标数(classes)+ 5 ] * 3   在[yolo]标签上面4行。 一共三处
    ...
    classes = 1    #目标类的数量,此处为一类物体。 [yolo]标签下面3行。一共三处
    ...
    random=0    ##显存大可以改为1,可以提高精度。
    

    修改voc.data文件:

    classes= 1    ##检测目标类的数目,和cfg文件一致。
    train  = /home/.../train.txt    ###修改为你转化后的train.txt路径。
    									###默认在darknet/script目录下面
    valid  = /home/.../voc/2007_test.txt   ##同上,为对应的文件路径
    names = data/voc.names     ##保存标注物体的名字的文件路径。
    backup = backup
    

    打开data/voc.names文件,将里面的内容修改成自己训练需要的类名。每行一个类名。例如:

    person
    air
    dog
    

    训练:

    ./darknet detector train voc.data yolov3-voc.cfg   ##需要预训练模型在最后加上预训练模型路径即可
    
  2. 用yolo_mark数据训练
    将Yolo_mark中x64文件夹复制到 darknet目录下

    Yolov2:
    	将x64/Release目录下的cfg文件复制到darknet根目录下,修改文件中的一些内容:
    		[net]
    		batch=64              ##显存小出现错误减小这个数值 
    		subdivisions=8      ##同上显存错误增大这个数值
    		height=416
    		width=416
    		channels=3
    		...
    		[convolutional]    ###直接下拉到文件最后
    		...
    		filters=30   ##修改filters=(类 + 5) * 5
    		...
    		[region]
    		anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52
    		bias_match=1
    		classes=1       ##修改为标记的类的数目
    		....
    		random=0    ##显存大可以改为1,可以提高精度。
    
    Yolov3:
    	#复制cfg/yolov3.cfg到darknet根目录下。重命名为yolo-obj.cfg。修改内容:
    
      	[net]
    	# Testing
    	#batch=1		     #检测时去掉前面的`#`,注释training里面对应两行的内容
    	#subdivisions=1        #检测时去掉前面的`#`,注释training里面对应两行的内容
    	# Training 
    	# batch=64			#训练时去掉前面的`#`
    	# subdivisions=8 	#训练时去掉前面的`#`
    	...
    	###  修改数值的时候不能用全部替换操作,手动修改###
    	
    	filters= 18    #[检测目标数(classes)+ 5 ] * 3   在[yolo]标签上面4行。 一共三处
    	...
    	classes = 1    #目标类的数量,此处为一类物体。 [yolo]标签下面3行。一共三处
    	...
    	random=0    ##显存大可以改为1,可以提高精度。
    

    将x64/Release/data 目录下的obj.names,obj.data,train.txt复制到 darknet/data中
    开始训练:

    ./darknet detector train data/obj.data yolo-obj.cfg  ##根据需要选择用不用预训练模型
    
  3. Yolov3训练前期会出现-nan,如果出现大量 -nan ,可适当增加 cfg文件中的 batch 数量。
    前1000次训练每100次会保存一个预训练模型,1000次以后每10000次保存一次模型。保存在backup文件夹中。可以通过修改example/detector.c中:

     if(i%10000==0 || (i < 1000 && i%100 == 0)){
    

    这个判断来自定义每训练多少次保存一次权重文件。

  4. 测试。
    测试代码与darkent测试相同,只需更改后面对应的参数即可:

    ./darknet detector test voc.data yolov3-voc.cfg backup/xxx_10000.weights  data/test.jpg
    

    Yolov3测试需要把cfg文件里面的这两个参数改为1。

    		batch=1		    
    		subdivisions=1      
    
  5. 如果是初次尝试 Yolo训练,建议一边训练一边测试,如果步骤有问题,训练会没有结果。例如1000次或者2000次左右测试是否有效果,来手动验证训练过程没有问题。Yolov3如果有大量的-nan,可以参考这个教程:

     #1、重新计算锚点(anchors),使用 https://github.com/AlexeyAB/darknet
    	#cfg文件中,如果 width=416 height=416,计算命令为:
    	./darknet detector calc_anchors data/name.data -num_of_clusters 9 -width 416 -heigh 416
    	#将计算的值替换cfg中默认的anchors值
     #2、显存够大可增大batch数量
    
  6. yolo训练中断后可接着训练,只需在最后面跟上backup/xxx.weights,即相应的权重文件即可。(最好跟backup.weight)。例子:

    ./darknet detector test voc.data yolov3-voc.cfg backup/xxx_10000.weights
    
  7. 多显卡训练在最后加参数 -gpus 0, 1,… 即可。例如,双显卡同时训练:

    ./darknet detector test voc.data yolov3-voc.cfg -gpus 0,1
    
  8. 如果遇到错误:

    CUDA Error: out of memory
    darknet: ./src/cuda.c:36: check_error: Assertion `0' failed.
    已放弃
    

    尝试减小cfg里面的batch数或增大subdivisions参数:

    	batch=32		
    	###或者    
    	subdivisions=16
    

更多信息请参考官方网站和Github上的教程。

最后,强烈推荐 Alexey大神的darknet项目,有一些很有用的功能,比如计算mAP、训练时自动生成loss曲线等。具体参考大神的Github,里面的教程也非常详细。

你可能感兴趣的:(Yolo v2&v3 训练自己的数据)