谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程
视频中的物体识别
摘要
物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体。本文主要是利用谷歌开源TensorFlow Object Detection API物体识别系统对视频内容进行识别,下面将详细介绍整个实现过程。
关键词:物体识别;TensorFlow
1.引言
随着人们工作、生活智能化的不断推进,作为智能化承载者—-摄像头,充当起了非常重要的“眼”的作用. 物体识别技术能够进一步实现了“脑”的作用, 让在图片与视频中识别所看到的物体,对于智能化推进起到了关键作用。 在一张图像或一组视频中,尽管图像中的物体可能千变万化:大小和尺寸不尽相同,摆放位置不同、部分可见,人类却能够在图像中轻松的识别出众多的物体,而物体识别通过对大量样本进行深度学习,同样能够很好地识别。物体识别被大量运用于各个领域,从烤箱对食物的识别需求,汽车对人、车、路的识别需求,机器人对房间摆设的识别需求,到AR/VR对眼前物体的识别。物体识别技术在各领域都发挥着重要的作用。
2.关键技术
本次实验主要是调用谷歌开源TensorFlow Object Detection API物体识别系统完成的。这个代码库是一个建立在 TensorFlow 顶部的开源框架,方便其构建、训练和部署目标检测模型。设计这一系统的目的是支持当前最佳的模型,同时允许快速探索和研究。它的第一个版本包含:
(1) 一个可训练性检测模型的集合,包括:
l 带有 MobileNets 的 SSD(Single Shot Multibox Detector)
l 带有 Inception V2 的 SSD
l 带有 Resnet 101 的 R-FCN(Region-Based Fully Convolutional Networks)
l 带有 Resnet 101 的 Faster RCNN
l 带有 Inception Resnet v2 的 Faster RCNN
上述5种识别模型在代码中可以直接调用。SSD 模型使用了轻量化的 MobileNet,这意味着它们可以轻而易举地在移动设备中实时使用。
(2) 一个 Jupyter notebook 可通过我们的模型之一执行开箱即用的推理。
(3) 借助谷歌云实现便捷的本地训练脚本以及分布式训练和评估管道。
3.实验环境
(1) 操作系统:win7 64位
(2) 编程语言:Python(版本:3.5.2)
(3) 编程工具:Jupyter Notebook
(4) 框架:TensorFlow
4.实验思路
(1) 使用 VideoFileClip 函数从视频中抓取图片。
(2) 用fl_image函数将原图片替换为修改后的图片,用于传递物体识别的每张抓取图片。
(3) 所有修改的剪辑图像被组合成为一个新的视频
5.实验过程
谷歌开源TensorFlow Object Detection API物体识别系统可以识别图片或视频中存在的大部分物体,在此基础上对源代码进行修改,通过用户的输入,进行对指定物体的识别。
5.1 搭建环境
首先搭建好运行环境,下载并安装相关API运行支持组件:
pip install pillow(Python Imaging Library)
pip install jupyter
pip install opencv_python-3.3.0.10-cp35-cp35m-win_amd64.whl(下载opencv的cv2包,导入opencv-python库)
pip install moviepy-0.2.3.2-py2.py3-none-any.whl (用于视频编辑的Python模块)
pip install imageio(下载一个剪辑必备的程序ffmpeg.win32.exe)
pip install ipython
5.2 代码修改整合
然后对源代码进行修改,主要的修改内容是visualization_utils.py文件中的visualize_boxes_and_labels_on_image_array函数,源代码是对视频中出现的物体都进行识别,识别不出来的物体用N/A来标识,识别出来的物体都用方框标识,并且在方框旁边显示具体的物体名称和所侦测到物体的可信度分值。
5.3 核心代码:
(1) 载入所使用的类库。
(2) 物体检测载入。
(3) 准备所需的识别模型,这里我们使用“移动网SSD”模型,模型已经下载好。
(4) 将TensorFlow模型载入内存。
(5) 载入标签图(所能识别的所有物体集合,一个字符标签的字典)。
字典的内容,即可以识别的物体种类:
[{\’name\’: \’person\’, \’id\’: 1}, {\’name\’: \’bicycle\’, \’id\’: 2}, {\’name\’: \’car\’, \’id\’: 3}, {\’name\’: \’motorcycle\’, \’id\’: 4}, {\’name\’: \’airplane\’, \’id\’: 5}, {\’name\’: \’bus\’, \’id\’: 6}, {\’name\’: \’train\’, \’id\’: 7}, {\’name\’: \’truck\’, \’id\’: 8}, {\’name\’: \’boat\’, \’id\’: 9}, {\’name\’: \’traffic light\’, \’id\’: 10}, {\’name\’: \’fire hydrant\’, \’id\’: 11}, {\’name\’: \’stop sign\’, \’id\’: 13}, {\’name\’: \’parking meter\’, \’id\’: 14}, {\’name\’: \’bench\’, \’id\’: 15}, {\’name\’: \’bird\’, \’id\’: 16}, {\’name\’: \’cat\’, \’id\’: 17}, {\’name\’: \’dog\’, \’id\’: 18}, {\’name\’: \’horse\’, \’id\’: 19}, {\’name\’: \’sheep\’, \’id\’: 20}, {\’name\’: \’cow\’, \’id\’: 21}, {\’name\’: \’elephant\’, \’id\’: 22}, {\’name\’: \’bear\’, \’id\’: 23}, {\’name\’: \’zebra\’, \’id\’: 24}, {\’name\’: \’giraffe\’, \’id\’: 25}, {\’name\’: \’backpack\’, \’id\’: 27}, {\’name\’: \’umbrella\’, \’id\’: 28}, {\’name\’: \’handbag\’, \’id\’: 31}, {\’name\’: \’tie\’, \’id\’: 32}, {\’name\’: \’suitcase\’, \’id\’: 33}, {\’name\’: \’frisbee\’, \’id\’: 34}, {\’name\’: \’skis\’, \’id\’: 35}, {\’name\’: \’snowboard\’, \’id\’: 36}, {\’name\’: \’sports ball\’, \’id\’: 37}, {\’name\’: \’kite\’, \’id\’: 38}, {\’name\’: \’baseball bat\’, \’id\’: 39}, {\’name\’: \’baseball glove\’, \’id\’: 40}, {\’name\’: \’skateboard\’, \’id\’: 41}, {\’name\’: \’surfboard\’, \’id\’: 42}, {\’name\’: \’tennis racket\’, \’id\’: 43}, {\’name\’: \’bottle\’, \’id\’: 44}, {\’name\’: \’wine glass\’, \’id\’: 46}, {\’name\’: \’cup\’, \’id\’: 47}, {\’name\’: \’fork\’, \’id\’: 48}, {\’name\’: \’knife\’, \’id\’: 49}, {\’name\’: \’spoon\’, \’id\’: 50}, {\’name\’: \’bowl\’, \’id\’: 51}, {\’name\’: \’banana\’, \’id\’: 52}, {\’name\’: \’apple\’, \’id\’: 53}, {\’name\’: \’sandwich\’, \’id\’: 54}, {\’name\’: \’orange\’, \’id\’: 55}, {\’name\’: \’broccoli\’, \’id\’: 56}, {\’name\’: \’carrot\’, \’id\’: 57}, {\’name\’: \’hot dog\’, \’id\’: 58}, {\’name\’: \’pizza\’, \’id\’: 59}, {\’name\’: \’donut\’, \’id\’: 60}, {\’name\’: \’cake\’, \’id\’: 61}, {\’name\’: \’chair\’, \’id\’: 62}, {\’name\’: \’couch\’, \’id\’: 63}, {\’name\’: \’potted plant\’, \’id\’: 64}, {\’name\’: \’bed\’, \’id\’: 65}, {\’name\’: \’dining table\’, \’id\’: 67}, {\’name\’: \’toilet\’, \’id\’: 70}, {\’name\’: \’tv\’, \’id\’: 72}, {\’name\’: \’laptop\’, \’id\’: 73}, {\’name\’: \’mouse\’, \’id\’: 74}, {\’name\’: \’remote\’, \’id\’: 75}, {\’name\’: \’keyboard\’, \’id\’: 76}, {\’name\’: \’cell phone\’, \’id\’: 77}, {\’name\’: \’microwave\’, \’id\’: 78}, {\’name\’: \’oven\’, \’id\’: 79}, {\’name\’: \’toaster\’, \’id\’: 80}, {\’name\’: \’sink\’, \’id\’: 81}, {\’name\’: \’refrigerator\’, \’id\’: 82}, {\’name\’: \’book\’, \’id\’: 84}, {\’name\’: \’clock\’, \’id\’: 85}, {\’name\’: \’vase\’, \’id\’: 86}, {\’name\’: \’scissors\’, \’id\’: 87}, {\’name\’: \’teddy bear\’, \’id\’: 88}, {\’name\’: \’hair drier\’, \’id\’: 89}, {\’name\’: \’toothbrush\’, \’id\’: 90}]
(6) Python GUI设计,编写一个简单用户输入界面。
(7) 具体的物体探测内容是放在一个show方法下的,然后通过点击按钮来调用show方法。
参考:http://blog.csdn.net/xiaoxiao123jun/article/details/76605928
全部代码:https://github.com/lyj8330328/Object-Detection