caffe train
安装Caffe_ssd并用自己的数据训练MobileNetSSD模型 - 幽冥之花的博客 - CSDN博客
SSD算法caffe配置,训练及测试过程 - 简书
caffe数据集格式转换—图像格式到LMDB/LEVELDB - 简书
caffe-SSD修改.sh文件,训练自己的数据集 - anqian123321的博客 - CSDN博客
在Caffe上进行迁移学习 - HZQTS - 博客园
MobileNetv2-SSDLite训练自己的数据集 - MT2048的博客 - CSDN博客
mkdir caffe
VOC 格式实现目标检测
- 准备图像数据 JPEGImages
- 标注数据生成 Annotations
python脚本生成 ImageSets/Main/train.txt (好像可以省略)
编译caffe-ssd
data/voc0712/create_list.sh 生成 test_name_size.txt test.txt trainval.txt
data/VOC0712/create_data.sh 生成 VOCdevkit/VOC0712/lmdb/VOC0712_trainval_lmdb
训练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
第一步:准备图像数据集
- 从ImageNet2012 数据集中选取部分数据
- 把caffe数据集格式转换—>图像格式到LMDB/LEVELDB。
sudo mount --bind /data/opendata/imagenet/models/ models
- 最终得到了
caffe/models/vgg_train_lmdb
和caffe/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写的,不然需要自己写。