视频中的物体识别

摘要

物体识别(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

谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程的更多相关文章

  1. 对于谷歌开源的TensorFlow Object Detection API视频物体识别系统实现教程

    本教程针对Windows10实现谷歌近期公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴. 本教程将网络上相关资料筛选整合(文末附上参考资料链接) ...

  2. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(一)[超详细教程] ubuntu16.04版本

    谷歌宣布开源其内部使用的 TensorFlow Object Detection API 物体识别系统.本教程针对ubuntu16.04系统,快速搭建环境以及实现视频物体识别系统功能. 本节首先介绍安 ...

  3. 谷歌开源的TensorFlow Object Detection API视频物体识别系统实现(二)[超详细教程] ubuntu16.04版本

    本节对应谷歌开源Tensorflow Object Detection API物体识别系统 Quick Start步骤(一): Quick Start: Jupyter notebook for of ...

  4. 安装运行谷歌开源的TensorFlow Object Detection API视频物体识别系统

    Linux安装 参照官方文档:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/inst ...

  5. 基于谷歌开源的TensorFlow Object Detection API视频物体识别系统搭建自己的应用(四)

    本章主要内容是利用mqtt.多线程.队列实现模型一次加载,批量图片识别分类功能 目录结构如下: mqtt连接及多线程队列管理 MqttManager.py # -*- coding:utf8 -*- ...

  6. Tensorflow object detection API 搭建物体识别模型(一)

    一.开发环境 1)python3.5 2)tensorflow1.12.0 3)Tensorflow object detection API :https://github.com/tensorfl ...

  7. Tensorflow object detection API 搭建物体识别模型(四)

    四.模型测试 1)下载文件 在已经阅读并且实践过前3篇文章的情况下,读者会有一些文件夹.因为每个读者的实际操作不同,则文件夹中的内容不同.为了保持本篇文章的独立性,制作了可以独立运行的文件夹目标检测. ...

  8. Tensorflow object detection API 搭建物体识别模型(三)

    三.模型训练 1)错误一: 在桌面的目标检测文件夹中打开cmd,即在路径中输入cmd后按Enter键运行.在cmd中运行命令: python /your_path/models-master/rese ...

  9. Tensorflow object detection API 搭建物体识别模型(二)

    二.数据准备 1)下载图片 图片来源于ImageNet中的鲤鱼分类,下载地址:https://pan.baidu.com/s/1Ry0ywIXVInGxeHi3uu608g 提取码: wib3 在桌面 ...

随机推荐

  1. 浏览器端类EXCEL表格插件 - 智表ZCELL产品V1.0.0.1版本发布

    智表的优势 智表兼容与依赖 ZCELL 基于jQuery V1.11.3版本研发,兼容性依赖于jQuery自身的兼容性. 经过验证,目前IE.火狐.谷歌.360等主流浏览器均可以正常使用. 智表下载 ...

  2. LeetCode & Q283-Move Zeroes-Easy

    Array Two Pointers Description: Given an array nums, write a function to move all 0's to the end of ...

  3. Docker学习笔记 - Docker Compose 脚本命令

    Docker Compose 配置文件包含 version.services.networks 三大部分,最关键的是 services 和 networks 两个部分, version: '2' se ...

  4. OAuth2.0学习(1-6)授权方式3-密码模式(Resource Owner Password Credentials Grant)

    授权方式3-密码模式(Resource Owner Password Credentials Grant) 密码模式(Resource Owner Password Credentials Grant ...

  5. python当中的生成器

    最近身边的朋友都在问我迭代器是什么回事,经常跟大家一起讨论python的迭代器,一点点的我觉着自己有了更深一层的理解.我写下这篇文章,希望能对懵懵懂懂的好伙伴有些帮助~ 我也不是什么能人,难免说错一些 ...

  6. jodatime 时间比较

    public ArrayList<CalcPeriod> getCalcPeriods() { DateTime now = DateTime.now(); DateTime.Proper ...

  7. django Form组件

    django Form组件 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建 ...

  8. Sublime Text3 运行Python 出现Error:Decode error - output not utf-8

    问题描述: Sublime Text 3 在build Python时,如果python源代码输出有中文,例如"print('中文')",Sublime Text 会报 [Deco ...

  9. super函数的作用

    super函数的作用super().__init__()当子类重写父类的方法时,会覆盖父类方法,super此举是保留父类 如果属性名跟方法名相同,属性会覆盖方法 方法必须要有实例才能被调用,这叫做绑定

  10. Linux下内存问题检测神器:Valgrind

    在写大型C/C++工程时难免会发生内存泄漏现象,系统编程中一个重要的方面就是有效地处理与内存相关的问题.你的工作越接近系统,你就需要面对越多的内存问题.有时这些问题非常琐碎,而更多时候它会演变成一个调 ...