如何在滴滴云上用 Darknet 训练 VOC

准备

资源准备

登录滴滴云主页创建 GPU 云主机。

环境准备

  1. 使用 SSH 客户端登录云主机。

  2. 编译 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>,表示安装成功
    

数据准备

  1. 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 。

  2. 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 文件夹下。

  3. 数据准备

    • 数据下载

      数据可以从 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,印象需要做对脚本做一些修改:

      1. 把 scripts 下 voc_label.py 脚本复制到和上一步解压的 VOCdevkit 文件夹同一个目录下:

         cp scripts/voc_label.py  dataset/
        

        如果你没有将 VOC2007 数据集保存在 dataset 目录下,则将第二个参数改成你自己数据集的路径:

        cp scripts/voc_label.py  VOCdevkit所在的路径
        
      2. 修改 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")
        
      3. 执行该脚本:

         python voc_label.py
        

        执行完会发现在此文件夹下多了几个文件,其中包括:

         train.txt
         train.all.txt
        

        这两个文件是训练时候需要的。

    • 返回 Darknet 目录

      如果你将数据集保存在了 dataset 目录,则你现在在 dataset 目录,需要返回 Darknet 目录下:

       cd ..	
      

      如果你将数据集下载到了你自己指定的文件夹,请确保返回到 Darknet 目录下再进行下一步。

训练 VOC2007 数据集

  1. 配置工程

    在开始训练前,需要做一些配置工作,指定数据位置。

    • 进入 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 两项。

  2. 开始训练

     ./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 -gpus 0   #我们使用GPU进行加速
    

猜你喜欢

转载自blog.csdn.net/java060515/article/details/86495264