YOLO v3 安装并训练自己数据

1. 安装

1.1 模型安装

YOLO v3的安装与YOLO v2的安装方法一样

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

直接使用上边的命令下载YOLO安装包。下载完以后,打开进入到安装包路径内

cd darknet

如果机器有使用GPU加速的环境,以及安装OPENCV了,需要做一下修改

gedit Makefile

使用gedit打开编译文件,将文件前几行中,对应的GPU、CUDNN、OPENCV由0变为1;

GPU=1
CUDNN=1
OPENCV=1

对Makefile修改结束以后,就可以进行安装。

make -j

下载YOLO v3权重

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

1.2 运行Demo

运行Demo查看运行是否成功。

  ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg

2.训练自己的数据集

2.1数据集准备

首先将自己的数据集生成为VOC数据集的格式,至少生成如下格式的文件夹

Annotations
ImageSets
       --Main
           --test.txt
           --train.txt
           --trainval.txt
           --val.txt
JPEGImages

接着将上边四个文件夹放在/darknet/scripts/VOCdevkit/VOC2007内,这个文件夹需要自己来创建一个。接着对/darknet/scripts/voc_label.py进行修改。
第一处
修改第7行

 sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]
```shell
将“('2012', 'train'), ('2012', 'val'),”删除掉,改为
```shell
 sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

第二处
修改第9行

 classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

修改为自己检测目标类别名称


完成修改以后可运行文件,生成YOLO训练时使用的labels

python voc_label.py

运行结束以后,可以在/darknet/scripts/VOCdevkit/VOC2007文件夹内看到labels文件夹,并且在/darknet/scripts文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt三个文件。到此,数据准备完成。

2.2修改配置文件

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

上边是进行训练的命令,可以按照上边的命令对文件进行修改。

2.2.1修改cfg/voc.data

classes= 3               //修改为训练分类的个数 
train  = /home/ws/darknet/scripts/2007_train.txt          //修改为数据阶段生成的2007_train.txt文件路径
valid  = /home/ws/darknet/scripts/2007_val.txt           //修改为数据阶段生成的2007_val.txt文件路径
names = data/voc.names
backup = backup

2.2.2修改data/voc.names

在上边修改的文件内有一个data/voc.names文件,里边保存目标分类的名称,修改为自己类别的名称即可。

2.2.3修改cfg/yolo-voc.cfg

第一处
文件开头的配置文件可以按照下边的说明进行修改

# Testing
#batch=1
#subdivisions=1
# Training
batch=64                //每次迭代要进行训练的图片数量 ,在一定范围内,一般来说Batch_Size越大,其确定的下降方向越准,引起的训练震荡越小。 
subdivisions=8          //源码中的图片数量int imgs = net.batch * net.subdivisions * ngpus,按subdivisions大小分批进行训练 
height=416              //输入图片高度,必须能被32整除
width=416               //输入图片宽度,必须能被32整除
channels=3              //输入图片通道数
momentum=0.9            //冲量
decay=0.0005            //权值衰减
angle=0                 //图片角度变化,单位为度,假如angle=5,就是生成新图片的时候随机旋转-5~5度    
saturation = 1.5        //饱和度变化大小
exposure = 1.5          //曝光变化大小
hue=.1                  //色调变化范围,tiny-yolo-voc.cfg中-0.1~0.1 
learning_rate=0.001     //学习率
burn_in=1000
max_batches = 120200    //训练次数
policy=steps            //调整学习率的策略
steps=40000,80000       //根据batch_num调整学习率,若steps=100,25000,35000,则在迭代100次,25000次,35000次时学习率发生变化,该参数与policy中的steps对应
scales=.1,.1             //相对于当前学习率的变化比率,累计相乘,与steps中的参数个数保持一致;

注意:如果修改max_batches总的训练次数,也需要对应修改steps,适当调整学习率。
具体的含义可以查看YOLO网络中参数的解读
第二处
修改107行最后一个卷积层中filters,按照filter=5*(classes+5)来进行修改。如果类目为3,则为5*(3+5)=40。

[convolutional]
size=1
stride=1
pad=1
filters=40      //计算公式为:filter=3*(classes+5) 
activation=linear

第三处
修改类别数,直接搜索关键词“classes”即可,全文就一个。

 classes=3    

2.3 训练

./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 >> log.txt

输入上边的指令就可以进行训练,在命令最后的命令>> log.txt是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看。

3. 测试

3.1 单张图像测试

./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
./darknet detect [训练cfg文件路径] [权重文件路径] [检测图片的路径]

按照上边的规整进行填写即可。

3.2多张图像测试

由于博主能力有限,修改YOLO内部文件失败,只能使用shell写命令来进行重复单张测试的命令

input_data_folder="./data/VOCdevkit/VOC2007/JPEGImages/"
output_data_folder="./results/CD8" 

file_name_tmp=`ls $input_data_folder`

file_names=($(echo $file_name_tmp));


for filename in ${file_names[@]}
do

  echo "testing $file ..."
  ./darknet detector test cfg/inst25.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights $input_data_folder$filename -thresh .3 -gpu 0,1 >> result.txt

mv predictions.png ./results/CD8_final_thresh_0.3/$filename'.png'

done

修改相应自己存储图片的路径就可以进行测试 。

3.3 测试数据集测试mAP、recall等参数

./darknet detector valid cfg/voc.data cfg/voc.cfg backup/voc_final.weights -out result_ -gpu 0 -thresh .5
./darknet detector valid [data路径] [cfg路径] [权重文件路径] -out [生成txt文件前缀] -gpu [GPU的ID号] -thresh [门限的大小]

按照上边的规则对测试数据集进行测试,会在result文件夹内生成相应的相应检测结果的文件。
下边借助Faster R-CNN中voc_eval.py文件进行参数测试。

from voc_eval import voc_eval
rec, prec, ap, fp, tp, nobj = voc_eval('/home/app/darknet/results/result_ {}.txt', '/home/app/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml',
                  '/home/app/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt', 'Target1', '.')
print("class name: " + classname)
print("Average Precision: " + str(ap))
print("True Positive: " + str(tp))
print("False Positive: " + str(fp))

首先将上边的命令新建一个python文件,同时将Faster R-CNN中voc_eval.py文件放在一个文件夹内,这个文件可以能在Github中不能找到,可以去CSDN下载。

命令参数总结

训练模型

单GPU训练
./darknet -i <gpu_id> detector train <data_cfg> <train_cfg> <weights>  

举例:

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
多GPU训练

格式为:

./darknet detector train <data_cfg> <model_cfg> <weights> -gpus <gpu_list> 

举例

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3
测试图片

测试单张图片

./darknet detector test <data_cfg> <test_cfg> <weights> <image_file>

<test_cfg>文件中batch和subdivisions两项必须为1。
测试时还可以用-thresh和-hier选项指定对应参数。
生成预测结果

./darknet detector valid <data_cfg> <test_cfg> <weights> <out_file>

<test_cfg>文件中batch和subdivisions两项必须为1。
结果生成在<data_cfg>的results指定的目录下以<out_file>开头的若干文件中,若<data_cfg>没有指定results,那么默认为<darknet_root>/results。
计算recall(执行这个命令需要修改detector.c文件,修改信息请参考“detector.c修改”)

./darknet detector recall <data_cfg> <test_cfg> <weights>

<test_cfg>文件中batch和subdivisions两项必须为1。
输出在stderr里,重定向时请注意。
RPs/Img、IOU、Recall都是到当前测试图片的均值。
detector.c中对目录处理有错误,可以参照validate_detector对validate_detector_recall最开始几行的处理进行修改。

Error

/bin/sh: 1: nvcc: not found

在这里插入图片描述
当安装在CUDA10.1的情况下会报下边的错误,这时候需要将Makefile文件中的NVCC

NVCC=nvcc 

修改为下边的格式:

NVCC=/usr/local/cuda-10.1/bin/nvcc 

./darknet: error while loading shared libraries: libcurand.so.10.0: cannot open shared object file: No such file or directory

使用下边的命令进行修正

sudo cp /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/libcudart.so.10.0 && sudo ldconfig
sudo cp /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 && sudo ldconfig
sudo cp /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/libcurand.so.10.0 && sudo ldconfig

参考

YOLOv3: 训练自己的数据 - CSDN博客

  • 14
    点赞
  • 142
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值