本篇默认在安装好tensorflow的基础之上。
准备工作——配置安装tensorflow Object Detection API
首先从github上下载源代码:tensorflow models
下载后,解压到~/home目录下,为了与github目录结构一致,我们将models-master目录重命名为models
得到如下目录结构~/models/research/object_detection
Protobuf 编译(非常重要)
Tensorflow Object Detection API 用 Protobufs 来配置模型和训练参数. 在用这个框架之前,必须先编译Protobuf 库,切换到这个目录下: tensorflow/models/research/,
cd ~/tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
tensorflow/models/research/ 和 slim 目录 需要添加到PYTHONPATH环境变量中. 从终端中,切换到tensorflow/models/research/目录,执行:
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
注意: 这条命令在新打开的终端中需要重新执行一次才会在新终端中生效,如果不想那么麻烦,就用下面的命令编辑 ~/.bashrc 文件,把上面的语句添加到末尾.
gedit ~/.bashrc
在research目录下执行
python object_detection/builders/model_builder_test.py
出现如下结果表示编译成功
下一步你可以跑一个demo,你可以在这个路径下运行jupyter notebook打开笔记本,然后用笔记本打开/object_detection/object_detection_tutorial.ipynb,然后在jupyter下run all,没问题的话最后会出现一张狗和另外一张好多目标的检测图片。
------------------------------------------------------------分割线--------------------------------------------------------------------------接下来就是训练部分了
一、制作voc格式的数据集
1、VOC2007数据集格式
1)JPEGImages文件夹
文件夹里包含了训练图片和测试图片,混放在一起
2)Annatations文件夹
文件夹存放的是xml格式的标签文件,每个xml文件都对应于JPEGImages文件夹的一张图片。
3)ImageSets文件夹
Main存放的是图像物体识别的数据,Main里面有test.txt , train.txt, val.txt , trainval.txt.这四个文件。
具体可以查看voc里面的数据格式。
2、准备数据集,并进行标注
(1) 图片重命名
命名统一为六位数字,从000001开始。
参考:
Tensorflow Object Detection API-如何制作VOC格式数据集
工具来源: https://github.com/whlook/VOCMaker
(2) 图片标注,这里推荐使用labelimg这个工具,自动生成xml文件,地址如下:Labelimg。
(3)数据集划分
在实际训练过程中,需要四个文件,分别为test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。每个文件为对于图片的名字。在VOC2007中,trainval大概是整个数据集的50%,test也大概是整个数据集的50%;train大概是trainval的50%,val大概是trainval的50%。
(4)完成数据集准备
在research目录下新建MyTrainData文件夹,将前面准备好的数据集放入文件夹中
------ Annotations 将xml文件全部放到该文件夹里
------ ImageSets
------ Main 其有四个txt文件,test.txt是测试集,train.txt是训练集,val.txt是验证集,trainval.txt是训练和验证集。Txt里的内容是即图片名字(无后缀)。
------ JPEGImages 所有的训练图片放到该文件夹里
上述目录及其文件都拷贝到MyTrainData/VOC2007/下。
二、将VOC2007数据集转换为TFRecord格式
1、修改 tensorflow/models/object_detection/create_pascal_tf_record.py 文件第85行和163行。
2、修改tensorflow/models/object_detection/data/pascal_label_map.pbtxt 文件里的类别,如果训练自己的数据这里一定要进行修改:
3、运行命令:
在research目录下,运行下面两条指令,生成train.record和val.record文件
python object_detection/create_pascal_tf_record.py \ --label_map_path=object_detection/data/pascal_label_map.pbtxt \
--data_dir=VOCdevkit --year=VOC2007 --set=train \
--output_path=pascal_train.record
python object_detection/create_pascal_tf_record.py \ --label_map_path=object_detection/data/pascal_label_map.pbtxt \
--data_dir=VOCdevkit --year=VOC2007 --set=val \
--output_path=pascal_val.record
三、下载预训练模型
在object_detection新建train_mymodel文件夹
下载地址:https://github.com/tensorflow/models/blob/master/object_detection/g3doc/detection_model_zoo.md
解压命令例子:
tar -xzvf ssd_mobilenet_v1_coco.tar.gz
将文件里面的model.ckpt.*的三个文件copy到train_mymodel
四、修改配置文件
修改object_detection/samples/configs/ssd_mobilenet_v2_coco.config文件,修改以下6处
(1)num_classes: 3(设为自己的训练集的类别,如果训练voc数据集,无需修改)
(2)fine_tune_checkpoint: “/home/crj/tensorflow/ssd_mobilenet_v2_coco_2018_03_29/model.ckpt”(fine_tune_checkpoint的地址)
(3)train_input_reader:{}中input_path和label_map_path的路径
(4)eval_input_reader:{}中input_path和label_map_path的路径
(5)batch_size:48 通常不能太小,否则会报错
(6)initial_learning_rate: 0.005 不能太小,否则容易陷入局部过拟合
五、训练
在当前research目录下,运行如下指令:
python object_detection/legacy/train.py --logtostderr --train_dir='/home/sc/models/research/object_detection/data' --pipeline_config_path='/home/sc/models/research/object_detection/samples/configs/ssd_mobilenet_v2_coco.config'
六、tensorboad可视化
tensorboard --logdir=/home/sc/models/research/object_detection/data
浏览器访问 ip:6006,可看到趋势以及具体image的预测结果
七、导出训练数据
python object_detection/export_inference_graph.py --input_type image_tensor --pipeline_config_path ssd_mobilenet_v2_coco.config --trained_checkpoint_prefix /home/sc/models/research/object_detection/data --output_directory output_inference_graph
八、测试结果
运行object_detection_tutorial.ipynb并修改其中的各种路径即可
或自写编译inference脚本,如tensorflow/models/object_detection/infer.py: