1 思路产生
在进行了多次cifor10网络训练浦东机场飞机样本的试验后,发现网络只能做到辨别是不是飞机而无法实现在一张图中正确找出一架或多架飞机的功能,实验思路陷入僵局。7月27日凌晨觉得如此下去不能完胜既定实验任务,幸而在知乎大神的博文中发现了object_detection API这一google最新开源出来的技术,简要阅读后发现和自己的实验目标十分吻合,遂开始这一方向的研究。
2 环境准备
简要阅读官方文档后,按照installation进行配置。
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
pwd是当前路径的意思,需要自己填写完整的路径进行配置,否则是找不到slim文件夹的,修改后为
export PYTHONPATH=$PYTHONPATH:/home/diana/tensorflow/models:/home/diana/tensorflow/models/slim
# From tensorflow/models/
protoc object_detection/protos/*.proto --python_out=.
每次使用新解压出来的object_detection文件夹时都要重新运行这一句,否则运行demo时会出现找不到string_int_label_map_pb2的问题,查看label_map_util.py文件发现from object_detection.protos import string_int_label_map_pb2
,重新配置后问题解决。
label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
报错”得到的是byte类型,not string”
搜索之后锁定问题出在python的版本问题,这个API仅支持python2.7。尝试修改源码失败,从根本解决问题重新安装了沙箱facecourse-py2,并在其中安装tensorflow进行配置,demo运行成功!(但是我今天写blog想符合错误信息的时候,它使用python3也不报错了…….)
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.8.0rc0-cp27-none-linux_x86_64.whl
–ignore-installed忽略了一些依赖包,所以使用pip install tensorflow
重新安装,这个命令会帮助你自动匹配相应的版本,由于是从国外的网站进行下载所以速度很慢,经常因为网速问题出现time runs out导致安装失败,可以使用清华大学临时镜像进行下载pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow
也可以修改配置文件永久使用清华大学镜像源。
sudo ln -s libcudnn.so.5.* libcudnn.so.6
一定要加 -s,否则删除libcudnn.so.6时会把libcudnn.so.5源文件一起删掉。
3 数据准备
object_detection API仅支持两种格式的数据集,分别是Oxford-IIIT Pets Dataset和PASCAL VOC2007/2012格式,所以要先将自己的数据制作成VOC2007格式,参考博文[http://www.cnblogs.com/whlook/p/7220105.html] ,因为这个工具是使用C++和python实现的所以在win10系统下安装vs2013和opencv2.4.9并进行配置,网上参考博文很丰富,使用时需要改为release模式,添加好标记后要按 ‘o’ 生成xml文件。在win10环境下安装沙箱facecourse-pyw,为win10下的python3.6下载匹配的opencv python-3.2.08-cp36-cp36m-win amd 64.whl
4 在本机实现训练过程
参考博文
[http://blog.csdn.net/shz_0519/article/details/73471128?utm_source=itdadao&utm_medium=referral]
由于本机显存太小,报错OOM无法进行训练。
5 在云端实现训练过程
注册谷歌云,创建GCS并配置自己的名字。
export YOUR_GCS_BUCKET=${YOUR_GCS_BUCKET}
export YOUR_GCS_BUCKET=17diana18
其他的步骤和在本机运行相似
sed -i "s|PATH_TO_BE_CONFIGURED|"gs://${YOUR_GCS_BUCKET}"/data|g" \
object_detection/samples/configs/faster_rcnn_resnet101_pets.config
train_input_reader: {
tf_record_input_reader {
input_path: "gs://17diana18/data/pet_train.record"
}
label_map_path: "gs://17diana18/data/pascal_label_map.pbtxt"
}
eval_config: {
num_examples: 2000
}
eval_input_reader: {
tf_record_input_reader {
input_path: "gs://17diana18/data/pet_val.record"
}
label_map_path: "gs://17diana18/data/pascal_label_map.pbtxt"
shuffle: false
num_readers: 1
}
6 将训练模型保存为.pb文件并移植到demo
gsutil cp gs://${YOUR_GCS_BUCKET}/train/model.ckpt-3942.* .
python object_detection/export_inference_graph.py \
--input_type image_tensor \
--pipeline_config_path object_detection/samples/configs/faster_rcnn_inception_resnet_v2_atrous_pets.config \
--checkpoint_path model.ckpt-3942 \
--inference_graph_path output_inference_graph.pb
直接导入生成的.pb文件即可不用再次下载模型
PATH_TO_CKPT = '/home/diana/tensorflow/models/output_inference_graph.pb'
PATH_TO_LABELS = os.path.join('data', 'pascal_label_map.pbtxt')
NUM_CLASSES = 1