文章目录
- 1. 安装
- 1.1 模型安装
- 1.2 运行Demo
- 2.训练自己的数据集
- 2.1数据集准备
- 2.2修改配置文件
- 2.2.1修改cfg/voc.data
- 2.2.2修改data/voc.names
- 2.2.3修改cfg/yolo-voc.cfg
- 2.3 训练
- 3. 测试
- 3.1 单张图像测试
- 3.2多张图像测试
- 3.3 测试数据集测试mAP、recall等参数
- 命令参数总结
- 训练模型
- 单GPU训练
- 多GPU训练
- 测试图片
- Error
- /bin/sh: 1: nvcc: not found
- ./darknet: error while loading shared libraries: libcurand.so.10.0: cannot open shared object file: No such file or directory
- 参考
1. 安装
1.1 模型安装
YOLO v3的安装与YOLO v2的安装方法一样
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">git</span> clone https://github.com/pjreddie/darknet
</code></span>
直接使用上边的命令下载YOLO安装包。下载完以后,打开进入到安装包路径内
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">cd</span> darknet
</code></span>
如果机器有使用GPU加速的环境,以及安装OPENCV了,需要做一下修改
<span style="color:#000000"><code class="language-shell">gedit Makefile
</code></span>
使用gedit打开编译文件,将文件前几行中,对应的GPU、CUDNN、OPENCV由0变为1;
<span style="color:#000000"><code class="language-shell">GPU<span style="color:#6272a4">=</span>1
CUDNN<span style="color:#6272a4">=</span>1
OPENCV<span style="color:#6272a4">=</span>1
</code></span>
对Makefile修改结束以后,就可以进行安装。
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">make</span> -j
</code></span>
下载YOLO v3权重
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">wget</span> https://pjreddie.com/media/files/yolov3.weights
</code></span>
1.2 运行Demo
运行Demo查看运行是否成功。
<span style="color:#000000"><code class="language-shell"> ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
</code></span>
2.训练自己的数据集
2.1数据集准备
首先将自己的数据集生成为VOC数据集的格式,至少生成如下格式的文件夹
<span style="color:#000000"><code class="language-shell">Annotations
ImageSets--Main--test.txt--train.txt--trainval.txt--val.txt
JPEGImages
</code></span>
接着将上边四个文件夹放在/darknet/scripts/VOCdevkit/VOC2007
内,这个文件夹需要自己来创建一个。接着对/darknet/scripts/voc_label.py
进行修改。
第一处
修改第7行
<span style="color:#000000"><code class="language-shell"> sets<span style="color:#6272a4">=</span><span style="color:#999999">[</span><span style="color:#999999">(</span><span style="color:#f1fa8c">'2012'</span>, <span style="color:#f1fa8c">'train'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2012'</span>, <span style="color:#f1fa8c">'val'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'train'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'val'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'test'</span><span style="color:#999999">)</span><span style="color:#999999">]</span>
``<span style="color:#ee9900"><span style="color:#ee9900">`</span>shell
将“<span style="color:#999999">(</span><span style="color:#f1fa8c">'2012'</span>, <span style="color:#f1fa8c">'train'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2012'</span>, <span style="color:#f1fa8c">'val'</span><span style="color:#999999">)</span>,”删除掉,改为
<span style="color:#ee9900">`</span></span>``shellsets<span style="color:#6272a4">=</span><span style="color:#999999">[</span><span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'train'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'val'</span><span style="color:#999999">)</span>, <span style="color:#999999">(</span><span style="color:#f1fa8c">'2007'</span>, <span style="color:#f1fa8c">'test'</span><span style="color:#999999">)</span><span style="color:#999999">]</span>
</code></span>
第二处
修改第9行
<span style="color:#000000"><code class="language-shell"> classes <span style="color:#6272a4">=</span> <span style="color:#999999">[</span><span style="color:#f1fa8c">"aeroplane"</span>, <span style="color:#f1fa8c">"bicycle"</span>, <span style="color:#f1fa8c">"bird"</span>, <span style="color:#f1fa8c">"boat"</span>, <span style="color:#f1fa8c">"bottle"</span>, <span style="color:#f1fa8c">"bus"</span>, <span style="color:#f1fa8c">"car"</span>, <span style="color:#f1fa8c">"cat"</span>, <span style="color:#f1fa8c">"chair"</span>, <span style="color:#f1fa8c">"cow"</span>, <span style="color:#f1fa8c">"diningtable"</span>, <span style="color:#f1fa8c">"dog"</span>, <span style="color:#f1fa8c">"horse"</span>, <span style="color:#f1fa8c">"motorbike"</span>, <span style="color:#f1fa8c">"person"</span>, <span style="color:#f1fa8c">"pottedplant"</span>, <span style="color:#f1fa8c">"sheep"</span>, <span style="color:#f1fa8c">"sofa"</span>, <span style="color:#f1fa8c">"train"</span>, <span style="color:#f1fa8c">"tvmonitor"</span><span style="color:#999999">]</span>
</code></span>
修改为自己检测目标类别名称
完成修改以后可运行文件,生成YOLO训练时使用的labels
<span style="color:#000000"><code class="language-shell">python voc_label.py
</code></span>
运行结束以后,可以在/darknet/scripts/VOCdevkit/VOC2007
文件夹内看到labels
文件夹,并且在/darknet/scripts
文件夹内会生成2007_train.txt、2007_test.txt、2007_val.txt
三个文件。到此,数据准备完成。
2.2修改配置文件
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23
</code></span>
上边是进行训练的命令,可以按照上边的命令对文件进行修改。
2.2.1修改cfg/voc.data
<span style="color:#000000"><code class="language-shell">classes<span style="color:#6272a4">=</span> 3 //修改为训练分类的个数
train <span style="color:#6272a4">=</span> /home/ws/darknet/scripts/2007_train.txt //修改为数据阶段生成的2007_train.txt文件路径
valid <span style="color:#6272a4">=</span> /home/ws/darknet/scripts/2007_val.txt //修改为数据阶段生成的2007_val.txt文件路径
names <span style="color:#6272a4">=</span> data/voc.names
backup <span style="color:#6272a4">=</span> backup
</code></span>
2.2.2修改data/voc.names
在上边修改的文件内有一个data/voc.names文件,里边保存目标分类的名称,修改为自己类别的名称即可。
2.2.3修改cfg/yolo-voc.cfg
第一处
文件开头的配置文件可以按照下边的说明进行修改
<span style="color:#000000"><code class="language-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中的参数个数保持一致;
</code></span>
注意:如果修改max_batches总的训练次数,也需要对应修改steps,适当调整学习率。
具体的含义可以查看YOLO网络中参数的解读
第二处
修改107行最后一个卷积层中filters,按照filter=5*(classes+5)来进行修改。如果类目为3,则为5*(3+5)=40。
<span style="color:#000000"><code class="language-cfg">[convolutional]
size=1
stride=1
pad=1
filters=40 //计算公式为:filter=3*(classes+5)
activation=linear
</code></span>
第三处
修改类别数,直接搜索关键词“classes”即可,全文就一个。
<span style="color:#000000"><code> classes=3
</code></span>
2.3 训练
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23 <span style="color:#6272a4">>></span> log.txt
</code></span>
输入上边的指令就可以进行训练,在命令最后的命令>> log.txt是将输出的日志保存到log.txt文件内,这样便于后期训练结果的查看。
3. 测试
3.1 单张图像测试
<span style="color:#000000"><code class="language-shell">./darknet detect cfg/yolo-voc.cfg backup/yolo-voc_final.weights data/dog.jpg
</code></span>
<span style="color:#000000"><code class="language-shell">./darknet detect <span style="color:#999999">[</span>训练cfg文件路径<span style="color:#999999">]</span> <span style="color:#999999">[</span>权重文件路径<span style="color:#999999">]</span> <span style="color:#999999">[</span>检测图片的路径<span style="color:#999999">]</span>
</code></span>
按照上边的规整进行填写即可。
3.2多张图像测试
由于博主能力有限,修改YOLO内部文件失败,只能使用shell写命令来进行重复单张测试的命令
<span style="color:#000000"><code class="language-shell">input_data_folder<span style="color:#6272a4">=</span><span style="color:#f1fa8c">"./data/VOCdevkit/VOC2007/JPEGImages/"</span>
output_data_folder<span style="color:#6272a4">=</span><span style="color:#f1fa8c">"./results/CD8"</span> file_name_tmp<span style="color:#6272a4">=</span><span style="color:#ee9900"><span style="color:#ee9900">`</span><span style="color:#8be9fd">ls</span> $input_data_folder<span style="color:#ee9900">`</span></span>file_names<span style="color:#6272a4">=</span><span style="color:#999999">(</span><span style="color:#ee9900"><span style="color:#ee9900">$(</span><span style="color:#ff79c6">echo</span> $file_name_tmp<span style="color:#ee9900">)</span></span><span style="color:#999999">)</span><span style="color:#999999">;</span><span style="color:#ff79c6">for</span> filename <span style="color:#ff79c6">in</span> <span style="color:#ee9900">${file_names[@]}</span>
<span style="color:#ff79c6">do</span><span style="color:#ff79c6">echo</span> <span style="color:#f1fa8c">"testing <span style="color:#ee9900">$file</span> ..."</span>./darknet detector <span style="color:#8be9fd">test</span> cfg/inst25.data cfg/yolo-voc.cfg backup/yolo-voc_final.weights <span style="color:#ee9900">$input_data_folder</span><span style="color:#ee9900">$filename</span> -thresh .3 -gpu 0,1 <span style="color:#6272a4">>></span> result.txt<span style="color:#8be9fd">mv</span> predictions.png ./results/CD8_final_thresh_0.3/<span style="color:#ee9900">$filename</span><span style="color:#f1fa8c">'.png'</span><span style="color:#ff79c6">done</span>
</code></span>
修改相应自己存储图片的路径就可以进行测试 。
3.3 测试数据集测试mAP、recall等参数
<span style="color:#000000"><code class="language-shell">./darknet detector valid cfg/voc.data cfg/voc.cfg backup/voc_final.weights -out result_ -gpu 0 -thresh .5
</code></span>
<span style="color:#000000"><code>./darknet detector valid [data路径] [cfg路径] [权重文件路径] -out [生成txt文件前缀] -gpu [GPU的ID号] -thresh [门限的大小]
</code></span>
按照上边的规则对测试数据集进行测试,会在result文件夹内生成相应的相应检测结果的文件。
下边借助Faster R-CNN中voc_eval.py文件进行参数测试。
<span style="color:#000000"><code class="language-shell">from voc_eval <span style="color:#8be9fd">import</span> voc_eval
rec, prec, ap, fp, tp, nobj <span style="color:#6272a4">=</span> voc_eval<span style="color:#999999">(</span><span style="color:#f1fa8c">'/home/app/darknet/results/result_ {}.txt'</span>, <span style="color:#f1fa8c">'/home/app/darknet/scripts/VOCdevkit/VOC2007/Annotations/{}.xml'</span>,<span style="color:#f1fa8c">'/home/app/darknet/scripts/VOCdevkit/VOC2007/ImageSets/Main/test.txt'</span>, <span style="color:#f1fa8c">'Target1'</span>, <span style="color:#f1fa8c">'.'</span><span style="color:#999999">)</span>
print<span style="color:#999999">(</span><span style="color:#f1fa8c">"class name: "</span> + classname<span style="color:#999999">)</span>
print<span style="color:#999999">(</span><span style="color:#f1fa8c">"Average Precision: "</span> + str<span style="color:#999999">(</span>ap<span style="color:#999999">))</span>
print<span style="color:#999999">(</span><span style="color:#f1fa8c">"True Positive: "</span> + str<span style="color:#999999">(</span>tp<span style="color:#999999">))</span>
print<span style="color:#999999">(</span><span style="color:#f1fa8c">"False Positive: "</span> + str<span style="color:#999999">(</span>fp<span style="color:#999999">))</span>
</code></span>
首先将上边的命令新建一个python文件,同时将Faster R-CNN中voc_eval.py文件放在一个文件夹内,这个文件可以能在Github中不能找到,可以去CSDN下载。
命令参数总结
训练模型
<span style="color:#000000"><code class="language-shell">./darknet -i <span style="color:#6272a4"><</span>gpu_id<span style="color:#6272a4">></span> detector train <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>train_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span>
</code></span>
举例:
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74
</code></span>
格式为:
<span style="color:#000000"><code class="language-shell">./darknet detector train <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>model_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span> -gpus <span style="color:#6272a4"><</span>gpu_list<span style="color:#6272a4">></span>
</code></span>
举例
<span style="color:#000000"><code class="language-shell">./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0,1,2,3
</code></span>
测试单张图片
<span style="color:#000000"><code class="language-shell">./darknet detector <span style="color:#8be9fd">test</span> <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>test_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>image_file<span style="color:#6272a4">></span>
</code></span>
<test_cfg>文件中batch和subdivisions两项必须为1。
测试时还可以用-thresh和-hier选项指定对应参数。
生成预测结果
<span style="color:#000000"><code>./darknet detector valid <data_cfg> <test_cfg> <weights> <out_file>
</code></span>
<test_cfg>文件中batch和subdivisions两项必须为1。
结果生成在<data_cfg>的results指定的目录下以<out_file>开头的若干文件中,若<data_cfg>没有指定results,那么默认为<darknet_root>/results。
计算recall(执行这个命令需要修改detector.c文件,修改信息请参考“detector.c修改”)
<span style="color:#000000"><code class="language-shell">./darknet detector recall <span style="color:#6272a4"><</span>data_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>test_cfg<span style="color:#6272a4">></span> <span style="color:#6272a4"><</span>weights<span style="color:#6272a4">></span>
</code></span>
<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
<span style="color:#000000"><code class="language-txt">NVCC=nvcc
</code></span>
修改为下边的格式:
<span style="color:#000000"><code class="language-txt">NVCC=/usr/local/cuda-10.1/bin/nvcc
</code></span>
./darknet: error while loading shared libraries: libcurand.so.10.0: cannot open shared object file: No such file or directory
使用下边的命令进行修正
<span style="color:#000000"><code class="language-shell"><span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcudart.so.10.0 /usr/local/lib/libcudart.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig
<span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcublas.so.10.0 /usr/local/lib/libcublas.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig
<span style="color:#8be9fd">sudo</span> <span style="color:#8be9fd">cp</span> /usr/local/cuda-10.0/lib64/libcurand.so.10.0 /usr/local/lib/libcurand.so.10.0 <span style="color:#6272a4">&&</span> <span style="color:#8be9fd">sudo</span> ldconfig</code></span>
参考
YOLOv3: 训练自己的数据 - CSDN博客
任何程序错误,以及技术疑问或需要解答的,请添加