caffe train


原文链接: caffe train

安装Caffe_ssd并用自己的数据训练MobileNetSSD模型 - 幽冥之花的博客 - CSDN博客
SSD算法caffe配置,训练及测试过程 - 简书

修改版的caffe

caffe数据集格式转换—图像格式到LMDB/LEVELDB - 简书
caffe-SSD修改.sh文件,训练自己的数据集 - anqian123321的博客 - CSDN博客
在Caffe上进行迁移学习 - HZQTS - 博客园

MobileNetv2-SSDLite训练自己的数据集 - MT2048的博客 - CSDN博客

mkdir caffe

VOC 格式实现目标检测

  1. 准备图像数据 JPEGImages
  2. 标注数据生成 Annotations
  3. python脚本生成 ImageSets/Main/train.txt (好像可以省略)

  4. 编译caffe-ssd

  5. data/voc0712/create_list.sh 生成 test_name_size.txt test.txt trainval.txt

  6. data/VOC0712/create_data.sh 生成 VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb

  7. 训练caffe
    ln -s /data/opendata/VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb trainval_lmdb
    /home/ubuntu/caffe/models/weiliu89/build/tools/caffe train --solver=solver_train.prototxt

第一步:准备图像数据集

  1. 从ImageNet2012 数据集中选取部分数据
  2. 把caffe数据集格式转换—>图像格式到LMDB/LEVELDB。
  3. sudo mount --bind /data/opendata/imagenet/models/ models
  4. 最终得到了caffe/models/vgg_train_lmdbcaffe/models/vgg_val_lmdb两个文件夹。

数据准备完毕

在 Caffe-SSD 上进行迁移学习


机器环境

OS: Ubuntu16.04
GPU: TITAN Xp

编译Caffe-SSD时,我们没有选择 python 接口。不过事后来看也许添加 python 接口会更方便。

准备数据集

生成 trainval.txt

由于习惯,我们将图片和标注都按照VOC数据集的格式组织,放到caffe-ssd/data/VOC0712目录下。

+ caffe-ssd:
    + data:
        ...
        + VOC0712:
            - create_list.sh
            - create_data.sh
            - labelmap_emotor.prototxt
            + VOCdevkit:
                + Anotations:
                    - all .xml
                + ImageSets:
                    + Main:
                        - emotor_train.txt
                        - emotor_val.txt
                + JPEGImages:
                    - all pics

首先执行create_list.sh创建trainval.txt
需要根据自己文件夹的结构修改create_list.sh中的路径。

trainval.txt中的内容如下(一行例子):

VOC2012/JPEGImages/486.jpg VOC2012/Annotations/486.xml

作用是记录.jpg和对应的.xml的位置。

我没有创建用于测试的数据,测试数据的生成方法如出一辙。

得到 lmdb 文件

caffe提供了用于转换带标注的数据集的工具。位于/caffe-ssd/build/tools下的conver_annoset。实际的位置跟编译caffe时候的设置有关。

convert_annoset: Convert a set of images and annotations to the leveldb/lmdb format used as input for Caffe.
Usage:
    convert_annoset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME

  Flags from tools/convert_annoset.cpp:
    -anno_type (The type of annotation {classification, detection}.)
      type: string default: "classification"
    -backend (The backend {lmdb, leveldb} for storing the result) type: string
      default: "lmdb"
    -check_label (When this option is on, check that there is no duplicated
      name/label.) type: bool default: false
    -check_size (When this option is on, check that all the datum have the same
      size) type: bool default: false
    -encode_type (Optional: What type should we encode the image as
      ('png','jpg',...).) type: string default: ""
    -encoded (When this option is on, the encoded image will be save in datum)
      type: bool default: false
    -gray (When this option is on, treat images as grayscale ones) type: bool
      default: false
    -label_map_file (A file with LabelMap protobuf message.) type: string
      default: ""
    -label_type (The type of annotation file format.) type: string
      default: "xml"  "json"
    -max_dim (Maximum dimension images are resized to (keep same aspect ratio))
      type: int32 default: 0
    -min_dim (Minimum dimension images are resized to (keep same aspect ratio))
      type: int32 default: 0
    -resize_height (Height images are resized to) type: int32 default: 0
    -resize_width (Width images are resized to) type: int32 default: 0
    -shuffle (Randomly shuffle the order of images and their labels) type: bool
      default: false

在我们的例子中参数设置如下:

./convert_annoset --anno_type=detection --encode_type=jpg --encoded=true  --shuffle=true \
        --label_map_file=../../data/VOC0712/labelmap_emotor.prototxt \
        ../../data/VOC0712/VOCdevkit/ \
        ../../data/VOC0712/trainval.txt \
        ../../data/emotor_lmdb

转换得到的 lmdb 文件放在 caffe-ssd/data/emotor_lmdb 下。

至此数据准备完毕。

准备训练

我们用来进行迁移学习的基础模型是 ssd_mobilenet_V1,其他预训练模型可以去 caffe model zoo 找找。

ssd_mobilenet_V1 这个 github 仓库里的脚本gen.py可用来创建训练用的train.prototxt也可以使用templete下的模板来自行修改。

usage: gen.py [-h] [-s STAGE] [-d LMDB] [-l LABEL_MAP] [--classifier]
              [--size SIZE] -c CLASS_NUM

我的labelmap_emotor.prototxt里是两个类,一个背景,一个是电动车,所以需要将输出层的 num_class 设置为 2。

python gen.py -s=train -d=~/caffe-ssd/data/emotor_lmdb/ \
                -l=~/caffe-ssd/data/VOC0712/labelmap_emotor.prototxt \
                -c=2

产生的train.prototxt中些层的名字需要修改,那些需要修改可以看我的train.prototxt中的内容,所有后缀为_my的层都是被修改的。亦可以直接执行训练,会有提示哪些层名字需要修改。

trainsform_param中的:

我在这里删除了test的部分,如果需要的话可以对照原来的版本进行修改。

其他

以上就是整个训练过程的记录,期间还有一些小 bug 没记下来,但应该问题不大,网上查查就解决了。

测试过程和训练过程大同小异,使用 gen.py 那个脚本产生一个test.prototxt就行了

建议编译时添加caffe-ssd的python接口,因为很多用于推理的脚本都是python写的,不然需要自己写。

`