在做项目的过程中需要实现物体实时识别的功能,因此上网找了很多材料。现有的一些博客都是基于tensorflow1的代码,然而tensorflow的GitHub上的源码及模型已经更新成tensorflow2的版本了,我改了一下代码上传到了我GitHub上,希望对大家有所帮助。
Windows10, Anaconda3, VS2015, Python3.7, TensorFlow2.0, OpenCV4.1.1
由于我的代码是基于官方的源码改的,源码就是.ipynb文件,所以建议下载Anaconda3会方便一点。
#CPU版本的tf2.0的话可以直接这样安装,我用的就是这个
pip install tensorflow
#如果要安装特定版本,等号后面可以输入指定的版本号
pip install --upgrade tensorflow==1.9.0
#GPU版本的安装,需要系统配置 CUDA 和 cuDNN,我没安过。
pip install --upgrade tensorflow-gpu==1.9.0
过程中可能会提示“pip”不是内部或外部指令,说明要添加环境变量;“pip”找不到就重新安装一下pip并更新一下pip。
还有一些其他的包需要安装,比如numpy等。反正之后运行代码时,缺什么安什么就好。
pip install numpy
pip install opencv-python
pip install matplotlib
pip install pandas
pip install Pillow
接下来安装tensorflow的官方包,地址如下:API地址
解压后会出现一个models-master文件夹,我重命名为models文件夹了。
protocolbuffer(以下简称PB)是google 的一种数据交换的格式,它独立于语言,独立于平台。google 提供了多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。由于它是一种二进制的格式,比使用 xml 进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件、数据存储等诸多领域。(源于百度百科)
简单来说就是把包里的Proto文件,编译生成Python文件。
下载windows版本的Protobuf,我下载的是
(虽然我是64位机,但大家好像都下载的32位),解压后将bin文件夹中的protoc.exe放到C:\Windows中。
在上一步解压的models文件夹下的research目录下(比如我的D:\models\research)打开命令行窗口,输入:
#在models\research目录下
protoc object_detection/protos/*.proto --python_out=.
在 ‘此电脑’-‘属性’- ‘高级系统设置’ -‘环境变量’-‘系统变量’ 中新建系统变量,变量名为‘PYTHONPATH’,变量值为models/、
models/research/ 及 models/research/slim 三个文件夹的完整目录(用分号隔开)效果如下图:
接下来测试一下API:
#在models/research目录下运行
python object_detection/builders/model_builder_test.py
若没有报错“ModuleNotFoundError: No module named ‘object_detection’”,说明成功添加环境变量。tf2.0已经弃用tf.contrib,可以不用在意下图这个报错。
在models/research/object_detection目录下运行jupyter notebook。
下图是官方示例。
运行该代码会得到识别出物体的图片,如下
代码用了两种不同的模型进行训练,得到结果。
运行到这一步说明环境搭建成功了,接下来可以利用tensorflow已有的模型实现动态物体的实时识别。
总结一下,运行该代码时会遇到一些问题:
(1)运行pip install pycocotools
时会遇到一些问题,因为pycocotools不支持Windows。
Unable to find vcvarsall.bat
error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
解决方法:缺少C++编译环境,下载VS2015或者单独下载C++的包。我是下载了VS2015解决的。(源于博客)
windows下 cl: 命令行 error D8021 :无效的数值参数“/Wno-cpp”
ModuleNotFoundError: No module named ‘pycocotools._mask’
解决办法:(源于博客及philferriere的cocoapi)
pip install git+https://github.com/philferriere/cocoapi.git#subdirectory=PythonAPI
因为源码提供的是图片中的静态物体识别,我的项目要求实时识别动态的物体,网上已经有很多博主分享了代码,但是都是基于tensorflow1的实现。我本来想把自己的tensorflow版本改低一点来应用,又发现官方给的API的例程已经全改为tensorflow2的版本了,这样一来,我就必须自己改一改代码了。作者本人是Python的小白,所以希望对新入门的同学也有一点帮助吧。
我将代码放在了自己的GitHub上,希望大家多多指教。
将object_detection_realtime.ipynb文件下载到D:\models\research\object_detection(API模型下载的位置),在该目录下打开jupyter notebook
注意:该代码的运行需要在完成前文所有步骤后才能运行,否则会缺少一些包的安装导致报错。
当弹出摄像头拍摄的实时画面的显示框时,说明运行成功,效果如下图。
代码上已经有注释了,需要解释的就只有,选择不同的模型这一步。
在detection model zoo选择合适的COCO-trained models,点击会弹出模型及其更新时间,这就是可更改的model_name.
代码更改参考了以下文章及源码:
datitran的GitHub
第三章 利用TensorFlow Object Detection API实现摄像头实时物体检测
如果大家有什么问题的话,欢迎与我交流,谢谢!