目标检测笔记二:Object Detection API 小白实践指南
- 2019 年 11 月 27 日
- 筆記
本文使用公开数据去运行Tensorflow 新推出的 Object Detection API 带大家实验 Faster RCNN 的 training。 Faster RCNN 是 object detection 中的經典方法, 而 object detection 主要是由 classification 与 localization 所組成,可以參考 cs231n
网络上已经有一堆原理说明文了,但是纯小白要实践来看看却总是很不知所措,因此本文偏小白详细描述如何运作项目,其次过度封装好的数据,也让小白想应用的时候无从下手,因此本文完成一个简单demo简述如何构建自己的数据集
TensorFlow model 官方开源网址:https://github.com/tensorflow/models/tree/master/object_detection
自建的tensorflow有趣小项目开源网址:https://github.com/luyishisi/tensorflow,持续更新小项目欢迎star
附各种依赖公开数据和模型的下载链接: https://pan.baidu.com/s/1c23vV5A 密码: 7877
目录:
- 环境安装{ubuntu与window 7}
- 数据预处理
- 修改配置
- 开始训练
- 测试模型
一.环境安装:
ubuntu:
1:TensorFlow环境二选一:
亲测用使用公开数据CPU需要在i5下跑一晚上,GPU只要30分钟,建议安装TensorFlow 1.00
pip install tensorflow # For CPU pip install tensorflow-gpu # For GPU
2:依赖环境
sudo apt-get install protobuf-compiler python-pil python-lxml sudo pip install jupyter,matplotlib,pillow,lxml
3:务必需要的操作
必须编译Protobuf库,在object_detection同级目录打开终端运行:
protoc object_detection/protos/*.proto --python_out=.
将object_detection加入到环境变量
打开.bashrc 修改下面PYTHONPATH为你的object_detection的路径
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
4:环境监测
在object_detection同级目录打开终端运行:
python object_detection/builders/model_builder_test.py
结果没有报错,并且返回若干秒数据,则说明环境搭建成功。

window 7
在window下回麻烦的多
1:打开下载好的tensorflow model文件夹
2:安装protoc在https://github.com/google/protobuf/releases/download/v3.4.0/protoc-3.4.0-win32.zip下载protoc-3.4.0-win32.zip。解压后在bin目录下有 protoc.exe。我将bin和include两个文件夹,移到C:Windows目录下(在path的即可),然后再mdels(或者models-master)文件夹下运行如下命令:
protoc.exe object_detection/protos/*.proto –python_out=.
没有报错即正确
3:安装tensorflow model 以及slim
在models-master 目录下运行
python setup.py install
如果你这时候运行测试命令
python object_detection/builders/model_builder_test.py
会报错:ImportError: No module named nets
则需要进一步安装slim,在models-masterslim目录下也运行
python setup.py install
4:配置path环境变量,如下:
C:UsersAdministratorDesktopobjmodels-mastermodels-master:C:UsersAdministratorDesktopobjmodels-mastermodels-masterslim;
5:测试成功

二.数据预处理
Tensorflow对象检测API必须使用TFRecord的档案格式,我用的是2007年的数据集,如果你手边有2012年的--year
要改成2012. 详细内容可参考标准TensorFlow格式,Pascal VOC数据集,我存放一份在百度云的链接。。含预训练好的模型,和2007年的数据
数据预处理
解压缩VOCtrainval
然后运行create_pascal_tf_record.py来处理成
TFRecord。
# From tensorflow/models/object_detection tar -xvf VOCtrainval_11-May-2007.tar python create_pascal_tf_record.py --data_dir=VOCdevkit --year=VOC2007 --set=train --output_path=pascal_train.record python create_pascal_tf_record.py --data_dir=VOCdevkit --year=VOC2007 --set=val --output_path=pascal_val.record
这个create_pascal_tf_record.py
做的事情分为三个部分
- 将每张图片注释参数(图片的宽度与高度,对象边界框,类名称,…等)跟标签映射(类ID跟类名称的对应关系)读出来并塞进
tf.train.Example
协议缓冲区 - 将
tf.train.Example
协议缓冲区序列化为字符串 - 最后
tf.python_io.TFRecordWriter
把字符 串写入TFRecords
三.修改配置
直接从项目中复制一个样本出来改(object_detection/samples/configs/
)我是使用的是 faster_rcnn_resnet101_voc07.config
配置文件分成五个部分,
model
模型的框架 meta-architecture, feature extractor…train_config
,定义 optimizer (Momentum, Adam, Adagrad…), fine-tune modeleval_config
,定义valuation估值指标train_input_config
,定义作为训练数据集与标签映射路径eval_input_config
,定义作为估值数据集的路径与标签映射路径
主要修改这三部分
1:自定义路径指定模型位置
fine_tune_checkpoint: “PATH_TO_BE_CONFIGURED/model.ckpt”
通常在进行训练时不会从头开始训练,大部份会利用别人已经训练好的参数来微调以减少训练的时间
fine_tune_checkpoint的数值为:
你定义的faster_rcnn_resnet101_coco_11_06_2017
位置(例如:"object_detection/faster_rcnn_resnet101_coco_11_06_2017/model.ckpt"
)
2:指定训练数据的label和record数据文件
label文件 官方已经有提供放在 object_detection/pascal_val.record
train_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pascal_train.record" } label_map_path: "PATH_TO_BE_CONFIGURED/pascal_label_map.pbtxt"}
3:指定测试数据的label和record数据文件
eval_input_reader: { tf_record_input_reader { input_path: "PATH_TO_BE_CONFIGURED/pascal_val.record" } label_map_path: "PATH_TO_BE_CONFIGURED/pascal_label_map.pbtxt" }
四.启动训练
构建标准项目结构,建立demo目录为主文件夹
- demo目录下包含(train和eval,config文件)
- train目录下包含(faster_rcnn_resnet101_coco_11_06_2017的解压后文件)
- eval是为空的,用于存放之后跑测试的文件
另外我比较喜欢在新建一个dete文件夹,存放上面处理后的record数据文件,和
pascal_label_map .pbtxt类别映射表文件
然后开始运行吧!
python object_detection/train.py --logtostderr --pipeline_config_path=${定义的Config} --train_dir=${训练结果要存放的目录}
如果你是按照上诉的标准结构的话则:
python train.py --logtostderr --pipeline_config_path="./demo/***.config" --train_dir="./demo/train/"}
运行需要较大内存5-8G,训练时日志如下
当你的loss到0.5以下,基本就算训练的比较准了,可以在运行eval来看看你的测试结果。

五.测试模型:
python object_detection/eval.py --logtostderr --pipeline_config_path=${定义的Config} --checkpoint_dir=${训练模型存放的目录} --eval_dir=${测试结果要存放的目录}
之后再针对这个demo启动tensorboard
tensorboard --logdir demo
之后浏览器查看127.0.1.1:6006,在image下即可看到具体的识别结果了。


六:训练自己定义的数据,
请看github:https://github.com/luyishisi/tensorflow/tree/master/4.Object_Detection
四种定位算法的原理对比:链接
原创文章,转载请注明: 转载自URl-team
本文链接地址: 目标检测笔记二:Object Detection API 小白实践指南