准备
资源准备
登录滴滴云主页创建 GPU 云主机。
环境准备
-
使用 SSH 客户端登录云主机。
-
编译 Darknet:
sudo yum install -y opencv-core.x86_64 opencv-devel.x86_64 opencv.x86_64 #git clone命令将会在当前目录下下载源代码,所以尽量自己选择一个合适的目录运行该命令 git clone https://github.com/pjreddie/darknet.git cd darknet #修改Makefile,支持GPU, CUDNN, OPENCV,修改后如下: #GPU=1 #CUDNN=1 #OPENCV=1 #可以使用vim编辑器进行修改(或者其它你喜欢的方式) make -j6 #-j6参数代表使用6个线程同时编译,6可以替换成你想要的值,也可以直接使用make命令 #如果执行没有问题,执行如下命令,检测下darknet是否已经装好 ./darknet #如果输出usage: ./darknet <function>,表示安装成功
数据准备
-
YOLOv3 pre-train 模型做预测
-
首先我们用 YOLOv3 作者提供的 pre-train 模型进行测试,该模型由作者用 COCO 数据集提前训练好了,可以识别 80 个类,可用如下命令下载:
wget https://pjreddie.com/media/files/yolov3.weights
yolov3.weights 文件将会被默认下载到 Darknet 文件夹下。
-
使用 pre-train 模型测试下 inference 效果:
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
执行这个命令后,会看到有如下输出:
Loading weights from yolov3.weights...Done! data/dog.jpg: Predicted in 0.054222 seconds. dog: 100% truck: 92% bicycle: 99%
输出 log 显示检测到三个目标,这三个目标分别为:100% 概率是 dog,92% 概率是 truck, 99% 概率是 bicycle;最终结果图片保存为 predictions.png 。
-
-
dartnet53.conv.74 模型做训练
通常训练我们都会使用从其他一些网络上训练好的模型来初始化,这里我们用 ImageNet 上预训练好的 dartnet53.conv.74 进行上传,下载该模型到 Darknet 工程下:
wget https://pjreddie.com/media/files/darknet53.conv.74
通常想要在别的训练数据集上训练 YOLOv3 ( 如 VOC 数据集 ),而不是使用作者在 COCO 数据集预先训练好的模型 ( .weights 文件 ),需要使用该模型进行模型初始化。
darknet53.conv.74 文件将会被默认下载到 Darknet 文件夹下。
-
数据准备
-
数据下载
数据可以从 VOC 官网下载,但是官网下载耗时较长;为了减少下载时间,我们在滴滴云内部创建了一个公开的对象存储 S3,将常用的数据集都存储在这里,方便用户快速下载。
为了保持文件的整洁,推荐在 Darknet 文件夹下新建一个名为 dataset 的文件夹,将数据集下载到 dataset 文件夹中:
mkdir dataset cd dataset
-
官网下载
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
-
解压上述三个压缩包到 VOCdevkit:
tar xvf VOCtrainval_06-Nov-2007.tar tar xvf VOCtest_06-Nov-2007.tar tar xvf VOCdevkit_08-Jun-2007.tar
-
解压后的文件夹结构如下:
$VOCdevkit/ # development kit $VOCdevkit/VOCcode/ # VOC utility code $VOCdevkit/VOC2007 # image sets, annotations, etc. # ... and several other directories ...
使用 tree 命令查看文件夹结构:
tree -L 2
得到如下结果:
. ├── VOCdevkit │ ├── create_segmentations_from_detections.m │ ├── devkit_doc.pdf │ ├── example_classifier.m │ ├── example_detector.m │ ├── example_layout.m │ ├── example_segmenter.m │ ├── local │ ├── results │ ├── viewanno.m │ ├── viewdet.m │ ├── VOC2007 │ └── VOCcode ├── VOCdevkit_08-Jun-2007.tar ├── VOCtest_06-Nov-2007.tar └── VOCtrainval_06-Nov-2007.tar 5 directories, 11 files
-
退出 dataset 文件夹,返回 Darknet 目录
如果你在 Darknet 下新建了一个dataset,像我推荐的那样,需要返回 dataset 文件夹的上级目录,也就是 Darknet 目录下:
cd ..
如果你将数据集下载到了你自己指定的文件夹,请确保返回到 Darknet 目录下再进行下一步。
-
生成 label 文件
Darknet 使用 .txt 文件保存 label 信息,而 VOC 是 xml,这里需要做一个转换,第一步编译 Darknet 时 Git 的工程里有一个
scripts/voc_label.py
脚本就是用来做转换的。因为我们这里只用 VOC2007 数据做 Demo,印象需要做对脚本做一些修改:
-
把 scripts 下
voc_label.py
脚本复制到和上一步解压的 VOCdevkit 文件夹同一个目录下:cp scripts/voc_label.py dataset/
如果你没有将 VOC2007 数据集保存在 dataset 目录下,则将第二个参数改成你自己数据集的路径:
cp scripts/voc_label.py VOCdevkit所在的路径
-
修改
voc_label.py
脚本,删除处理 VOC2012 的代码。进入
voc_label.py
所在的文件夹:cd dataset
修改
voc_label.py
文件:#第7行修改如下 sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')] #最后两行修改如下: os.system("cat 2007_train.txt 2007_val.txt > train.txt") os.system("cat 2007_train.txt 2007_val.txt 2007_test.txt > train.all.txt")
-
执行该脚本:
python voc_label.py
执行完会发现在此文件夹下多了几个文件,其中包括:
train.txt train.all.txt
这两个文件是训练时候需要的。
-
-
返回 Darknet 目录
如果你将数据集保存在了 dataset 目录,则你现在在 dataset 目录,需要返回 Darknet 目录下:
cd ..
如果你将数据集下载到了你自己指定的文件夹,请确保返回到 Darknet 目录下再进行下一步。
-
训练 VOC2007 数据集
-
配置工程
在开始训练前,需要做一些配置工作,指定数据位置。
-
进入 Darknet 工程,
cfg/voc.data
配置文件如下:classes= 20 #总共有20类 train = /home/dc2-user/train.txt. #修改为你自己的目录,demo里下载后的数据直接放家目录下,因此train.txt在家目录下 valid = /home/dc2-user/2007_test.txt #同上 names = data/voc.names backup = backup
需要被修改的是 train 和 valid 两项。
-
-
开始训练
./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0 #我们使用GPU进行加速