根据上一篇《从0开始实现目标检测——原理篇》的讲述,我们选择了YOLOv3作为模型,那么本篇文章将继续接着上篇的内容,自己动手基于YOLOv3实现模型训练和mAP的计算。 在自己动手的这个过程中,一边解决遇到的问题,一边体会YOLOv3的原理,让我们学习起来吧。
一. YOLOv3之初体验
YOLOv3使用参考官网教程:https://pjreddie.com/darknet/yolo/
1. 安装YOLOv3并体验VOC数据
(1). YOLOv3安装
首先就是下载YOLOv3项目并安装了,如下:
git clone https://github.com/pjreddie/darknet
cd darknet
make
接着就是下载YOLOv3已经提前训练好的一个模型体验下效果了:
wget https://pjreddie.com/media/files/yolov3.weights
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
这个条命令运行后,可以看到在项目的安装目录下多了一个predictions.jpg的文件,这就是检查结果的图片。结果如图:
命令也输出了各个网络层的输入和输出,以及最后识别出多少个物体分类和属于这个分类的概率。如下图所示:
上图显示了卷积网络各层的计算过程,下图显示了整张图片检测的耗时,以及图中的物品类别和对应的概率。结果如图所示:
对着输出和结果图片,可以看到识别的准确率还是很高的,但是也相当耗时,耗费了18.66秒。YOLOv3提供了一个层数只有13层的tiny模型,识别速度会更快,下载体验下:
wget https://pjreddie.com/media/files/yolov3-tiny.weights
./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg
识别结果如下:
对于同样的图片,可以看到识别耗时从18.66秒直接降到了0.6秒,时间居然能下降97%,当然准确度也下降了。结果图片如图所示:
从结果中tiny的模型准确度可能的确不高,从图中能看出来把一辆truck识别成了2个car和一个truck的组合。
(2). 下载VOC数据
在体验了几次YOLOv3的检测效果后,开始思考如何才能训练自己的模型呢?很自然的想法是先按照YOLOv3开放的数据集做训练,跑通流程后再利用自己的数据集训练。接着就开始我们的第一步,利用开放的数据集进行训练。
首先使用在公开的VOC数据集上进行下验证,下载数据集:
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
wget https://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
tar xf VOCtrainval_11-May-2012.tar
tar xf VOCtrainval_06-Nov-2007.tar
tar xf VOCtest_06-Nov-2007.tar
下载完毕数据集后,我们还需要对转化数据集的标记格式为YOLOv3的标记方式,YOLOv3采用.txt文件来保存标记,格式如下:
<object-class> <x> <y> <width> <height>
其中object-class就是目标的种类index,x, y, width, height分别是图中目标的起始坐标和宽高。也就是之前《从0开始实现目标检测——原理篇》提到的。
YOLOv3也提供一个脚本程序,将VOC数据转化并标记为YOLO格式的标记,我们需要下载转化程序并进行转化:
wget https://pjreddie.com/media/files