Tensorflow Object Detection API

本文记录了如何使用Tensorflow ObjectDetection API及相关环境的部署过程。
Tensorflow Models(https://github.com/tensorflow/models)包含了许多Tensorflow的例子和已经实现的模型,这里仅用到了其中的object detection部分。

一、环境

硬件:
CPU:AMD Ryzen7 1700 8C16T
RAM:4*DDR4 8GB 2400
SSD:SAMSUNG SM961 256GB
HDD:ST3000DM008
GPU:NVIDIA Geforce GTX1080TI 11GB
PSU:DELTA NX650W

软件:
OS:MicroSoft Windows10 Pro 64bit build17134
Python:3.6.2
TensorFlow:Tensorflow-gpu 1.10
CUDA:9.0
CUDNN:7.1
Nvidia GPU Driver:399.07

二、Tensorflow-GPU的部署

要使用Tensorflow的Object Detection API,首先得部署Tensorflow,由于大多数模型训练起来非常慢,强烈建议使用GPU版本,并且需要一块显存足够大的显卡(至少11GB),显存较小的显卡稍微复杂一点的模型就容易出现OOM(Out of Memory)。
Tensorflow-GPU的部属过程比CPU版略麻烦一些,首先打开Tensorflow的网站查看一下当前版本的安装说明(国内请访问https://tensorflow.google.cn/install/)。
可以看到当前版本已经不再在Windows下支持Python 2.7,仅支持Python 3.4/3.5/3.6,那么先去Python的网站上下载一个3.6.x for Windows(https://www.python.org/downloads/windows/)。
不要轻易尝试未在TF网站上列出的python版本,可能会造成未知问题。这里仅介绍直接在Python下的安装方法,不涉及Anaconda
安装过程中记得选上将PYTHON添加到PATH环境变量,另外如果选择为当前系统的所有用户安装会出现Python无权限访问目录的问题。
安装完成后,在CMD中运行:

1
python --version

检查安装是否成功。
之后需要安装NVIDIA CUDA和CUDNN,首先确保当前系统中已经正确安装了Nvidia的显卡驱动,当前版本的Tensorflow使用CUDA9,要求Nvidia显卡驱动的版本号大于384.xx,CUDA9和CUDNN在NVIDIA的网站上下载(https://developer.nvidia.com/cuda-zone,https://developer.nvidia.com/cudnn)。
目前需要注册之后才能下载,注册没什么难度。
Tensorflow的官网上要求CUDNN版本大于等于7.2,不过之前用7.1似乎没发生什么问题。可选的组件还有NCCL和TensorRT,暂时没有用到。
CUDA Toolkit下载下来是个安装包,CUDNN则是个zip压缩包,安装完CUDA后将CUDNN中的bin目录覆盖到CUDA的安装目录下即可(需要其中的cuDNN64_7.dll)。
最后把CUDA的目录加入环境变量:

1
2
3
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin;%PATH%
SET PATH=C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\CUPTI\libx64;%PATH%
SET PATH=C:\tools\cuda\bin;%PATH%

安装完成CUDA和CUDNN之后即可开始安装Tensorflow-GPU,在CMD中运行:

1
pip3 install --upgrade tensorflow-gpu

如果嫌官方源速度太慢可以使用清华的源(对于pip3安装都适用):

1
pip3 install --upgrade tensorflow-gpu -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

安装完成之后验证一下:

1
python3 -c "import tensorflow as tf; print(tf.__version__)"

三、Tensorflow Models和Object Detection API的部署

Object Detection API包含在Tensorflow Models中,首先要把它下载下来:https://github.com/tensorflow/models
可以用git clone,也可以直接download zip,整个项目体积比较大,国内直接git clone很可能跑到一半报错,如果下载了zip的话需要解压。Tensorflow Models和Tensorflow的更新并不一定同步,当前实际上使用的是r1.9.0版本,但是这个分支下面的代码又被移除了很大一部分;Tensorflow Models本身也是试验性质的,刚更新的时候经常会有bug,比如某些代码只能在python2下运行。
解压之后可以看到有四个目录,Object Detection在/research下面。找到Object Detection API的安装说明:
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/installation.md
首先安装依赖的包:

1
2
3
4
5
6
pip install --user Cython
pip install --user contextlib2
pip install --user pillow
pip install --user lxml
pip install --user jupyter
pip install --user matplotlib

似乎这个说明主要是对Linux用户写的,没有jupyter好像也没什么问题。
然后需要安装cocoapi,这玩意不是必须的,但是有些模型的代码里一定要用到,然后就会遇到第一个坑:这玩意压根不支持windows。
Google一翻之后发现可以自己折腾解决,或者用别人改好的代码:

1
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI

在使用之前需要安装一个Microsoft Visual C++ 2015 build tools:
https://www.microsoft.com/en-us/download/details.aspx?id=48159
之后需要Protobuf编译一下代码,那么就去下载一个(注意下载win32版的,除非你打算自己编译一遍):
https://github.com/protocolbuffers/protobuf/releases
有人说3.5.0的会报错,我用比较老的3.4.0和新的3.6.1都成功了,出错就换个版本。
找个地方解压然后添加到PATH,或者偷懒直接丢进Windows目录下也行。
然后编译一下代码:

1
2
cd tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.

之后要把tensorflow/models/research/和tensorflow/models/research/slim加入环境变量PYTHONPATH
最后测试一下:

1
python object_detection/builders/model_builder_test.py