这两天刚开始研究OpenCV,刚好碰到同事大牛在搞机器学习的识别的算法库,今天跟他一起研究了一下Object Detection API的安装,并基本测试通过!
网上资料很多,但或者版本老,或者环境不一样,总之整个操作下来坑很多。 接下来我的操作是针对Window平台 (Win7), Python 3 (3.6/3.5)
安装 Tensorflow Object Detection API
建立工程
Object Detection API 对应的源码位置为https://github.com/tensorflow/models,可参考安装文档 https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
新建Tensorflow文件夹,将https://github.com/tensorflow/models 下载放在Tensorflow目录下。我习惯git同步,可以用下面命令把代码git到本地
git clone git@github.com:tensorflow/models.git
安装Tensorflow及依赖库
首先安装Tensorflow, 命令如下
# For CPU
pip install tensorflow
# For GPU
pip install tensorflow-gpu
安装依赖库
pip install Cython
pip install contextlib2
pip install pillow
pip install lxml
pip install jupyter
pip install matplotlib
编译 Protobuf 依赖包
Tensorflow Object Detection API使用Protobufs来配置模型和训练参数。在使用框架之前,必须编译 Protobuf 依赖包。在 tensorflow/model
目录运行命令:
cd models/research
protoc object_detection/protos/*.proto --python_out=.
这条手册上的命令很有可能会让你碰到两个问题:
- protoc 命令无法执行,因为没安装
- object_detection/protos/*.proto: No such file or directory
安装 protoc
下载地址: http://code.google.com/p/protobuf/downloads/list,估计你也上不去,可以直接从protocbuf的github网站下载https://github.com/protocolbuffers/protobuf/releases
首先下载protobuf-all-3.6.1.tar 和 protoc-3.6.1-win32.zip 两个包。分别解压到各自目录。
接着将protoc-3.6.1-win32.zip中的protoc.exe
拷贝到c:\windows\system32
中。
这样protoc
命令找不到的问题就能解决了。
object_detection/protos/*.proto: No such file or directory
这个问题是Object Detection Module的一个bug,说明如下
This is a typical bug of the object detection module working in Windows. Here are detailed discussion #1591.
A solution is to compile those .proto files one by one. You can write a batch to run.
所以我就简单做了个批处理脚本运行
protoc object_detection\protos\anchor_generator.proto --python_out=.
protoc object_detection\protos\argmax_matcher.proto --python_out=.
protoc object_detection\protos\bipartite_matcher.proto --python_out=.
protoc object_detection\protos\box_coder.proto --python_out=.
protoc object_detection\protos\box_predictor.proto --python_out=.
protoc object_detection\protos\eval.proto --python_out=.
protoc object_detection\protos\faster_rcnn.proto --python_out=.
protoc object_detection\protos\faster_rcnn_box_coder.proto --python_out=.
protoc object_detection\protos\graph_rewriter.proto --python_out=.
protoc object_detection\protos\grid_anchor_generator.proto --python_out=.
protoc object_detection\protos\hyperparams.proto --python_out=.
protoc object_detection\protos\image_resizer.proto --python_out=.
protoc object_detection\protos\input_reader.proto --python_out=.
protoc object_detection\protos\keypoint_box_coder.proto --python_out=.
protoc object_detection\protos\losses.proto --python_out=.
protoc object_detection\protos\matcher.proto --python_out=.
protoc object_detection\protos\mean_stddev_box_coder.proto --python_out=.
protoc object_detection\protos\model.proto --python_out=.
protoc object_detection\protos\multiscale_anchor_generator.proto --python_out=.
protoc object_detection\protos\optimizer.proto --python_out=.
protoc object_detection\protos\pipeline.proto --python_out=.
protoc object_detection\protos\post_processing.proto --python_out=.
protoc object_detection\protos\preprocessor.proto --python_out=.
protoc object_detection\protos\region_similarity_calculator.proto --python_out=.
protoc object_detection\protos\square_box_coder.proto --python_out=.
protoc object_detection\protos\ssd.proto --python_out=.
protoc object_detection\protos\ssd_anchor_generator.proto --python_out=.
protoc object_detection\protos\string_int_label_map.proto --python_out=.
protoc object_detection\protos\train.proto --python_out=.
运行完成之后,对应的python文件就生成了。
注意: 运行上面命令时,不要在protos目录编译,安装手册步骤,在research目录下,运行protoc object_detection\protos\?.proto,否则会有一些文件依赖相关的报错
在上面的过程中,我们并没有去编译protobuf-all-3.6.1.tar这个包。我也刚开始研究这个库,所以还不确定它跟tensorflow下面的proto内部是否完全一致,但是它不影响接下来的基本测试,不过,我还是在这儿介绍一下它的编译方法,有两种(网上学习到的,待验证)
1.跟前面一样,用protoc编译
2.如它tutorial里说的一样,完全可以拿它编译好的python文件
For non-C++ users, the simplest way to install the protocol compiler is to download a pre-built binary from our release page: https://github.com/protocolbuffers/protobuf/releases
直接进行python安装
python setup.py install
注意: protoc下载的文件里面也有protobuf,这个用不到,不要去编译它protoc-3.6.1-win32\include\google\protobuf
特别注意的是,关于这一步网上有的人给的方案是让你直接用编好的protos文件,但这很有可能会出现版本匹配的问题,这都是血的教训。
为依赖包添加环境变量
将models\research
和models\research\slim
添加到环境变量,可以有几个方法
1.函数添加
import sys
sys.path.append("c:\\")
这需要去改启动脚本,我这儿只是想完成安装,所以不是优选项
2.修改环境变量
用户可以修改系统环境变量PYTHONPATH,因为我是用virtualenv建的工程,还不知道怎么去添加它
3.增加.pth文件,推荐!
在site-packages添加一个路径文件,如oda.pth,该文件必须以.pth为后缀,在文件里写上你指定访问的python库位置,如下:
E:\Computer\virtualenv\oda\models\research\
E:\Computer\virtualenv\oda\models\research\slim
测试
运行下面命令
python object_detection/builders/model_builder_test.py
如果正常的话你看到的结果应该如下
models\research\object_detection\builders>model_builder_test.py
......................
----------------------------------------------------------------------
Ran 22 tests in 0.438s
OK
运行 Jupyter notebook demo
启动Jupyter
cd tensorflow/models/
jupyter notebook
它会启动浏览器窗口,进入object_detection文件夹打开object_detection_tutorial.ipynb ,运行该文件Cell
-> Run All
耐心点,几分钟之后(i5机器,不带GPU)你就可以看到结果了。如果是i3机器,那你必须得升级了。
显示效果如下
接下来,开启你的Object Detection之旅吧!