一.环境安装:
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
结果没有报错,并且返回若干秒数据,则说明环境搭建成功。
二.数据预处理
解压缩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做的事情分为三个部分
1,将每张图片注释参数(图片的宽度与高度,对象边界框,类名称,…等)跟标签映射(类ID跟类名称的对应关系)读出来并塞进tf.train.Example协议缓冲区
2,将tf.train.Example协议缓冲区序列化为字符串
3,最后tf.python_io.TFRecordWriter把字符 串写入TFRecords
三.修改配置
直接从项目中复制一个样本出来改(object_detection/samples/configs/)我是使用的是 faster_rcnn_resnet101_voc07.config
配置文件分成五个部分,
1,model模型的框架 meta-architecture, feature extractor…
2,train_config,定义 optimizer (Momentum, Adam, Adagrad…), fine-tune model
3,eval_config,定义valuation估值指标
4,train_input_config,定义作为训练数据集与标签映射路径
5,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目录为主文件夹
1,demo目录下包含(train和eval,config文件)
3,train目录下包含(faster_rcnn_resnet101_coco_11_06_2017的解压后文件)
3,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下即可看到具体的识别结果了。
训练自己的数据集
数据集准备:
在objcet_detect同级目录
export PYTHONPATH=$PYTHONPATH:`pwd`
如果版本没有slim路径则加上
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
在create_pascal_tf_record.py中去掉’aeroplane_’。
训练验证
#生成训练集record
python object_detection/dataset_tools/create_pascal_tf_record.py --data_dir=`自己的训练数据集路径` --year=VOC2007 --set=train --output_path=`你想保存的训练集的record路径`
#生成验证集record
python object_detection/dataset_tools/create_pascal_tf_record.py --data_dir=`自己的验证数据集路径` --year=VOC2007 --set=val --output_path=`你想保存的验证集的record路径`
针对kitti数据集
python object_detection/dataset_tools/create_kitti_tf_record.py --data_dir='/KITTI/' --output_path='/object_detection/data/kitti/'
下载预训练模型
将下载好的模型进行解压,并将.ckpt的三个文件拷贝到models目录下。将./object_detection/samples/configs/ssd_inception_v2_coco.config复制到models目录下并做如下修改:
1)num_classes:修改为之前修的的.pbtxt文件中的类别数目
2)将所有’PATH_TO_BE_CONFIGURED’修改为自己之前设置的路径将下载好的模型进行解压,并将.ckpt的三个文件拷贝到models目录下。
开始训练
python object_detection/train.py --train_dir='object_detection/log/kitti/train/' --pipeline_config_path='object_detection/models/ssd_inception_v2_coco.config'
模型可视化
tensorboard --logdir='object_detection/log/kitti/train/'
训练完成后会生成三个.cpkt的文件,利用这三个文件生成一个.pb文件,生成代码如下:
python object_detection/export_inference_graph.py \
--pipeline_config_path 'object_detection/models/ssd_inception_v2_coco.config' \
--trained_checkpoint_prefix 'object_detection/log/kitti/train/model.ckpt-10000' \
--output_directory object_detection/log/kitti/train/model/
利用.pb文件进行目标检测
# /home/whsyxt/Desktop/zhuzhao/github_code/object_detection/log/kitti/train/train/model.ckpt-10000.meta
python object_detection/train.py --train_dir='./log/kitti/train' --pipeline_config_path='./data/kitticonfig/ssd_inception_v2_coco.config'