视频中的物体识别

摘要

物体识别(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. VMware虚拟机误删除vmdk文件后如何恢复?

    故障描述: Dell R710系列服务器(用于VMware虚拟主机),Dell MD 3200系列存储(用于存放虚拟机文件),VMware ESXi 5.5版本,因意外断电,导致某台虚拟机不能正常启动 ...

  2. 关于TomCat上传文件中文名乱码的问题

    最近在学习TomCat文件上传这一部分,由于文件上传必须要三个条件: 1.表单提交方式必须为Post 2.表单中需要有<input type="file">元素,还需要 ...

  3. 用python实现与小米网关通讯

    python 与小米网关通讯的三块内容: 以下内容的理解需要配合<绿米网关局域网通讯协议>使用 1.监听网关发出的组播信息:(有网关及连接设备的生命信号,事件信息) 2.读取需要获得的信息 ...

  4. Python内置函数(41)——id

    英文文档: id(object) Return the "identity" of an object. This is an integer which is guarantee ...

  5. 新概念英语(1-117)Tommy's breakfast

    Lesson 117  Tommy's breakfast 汤米的早餐 Listen to the tape then answer this question. What does she mean ...

  6. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...

  7. SpringBoot 分布式session

    SpringBoot 分布式session实现 1. 什么是分布式session 在集群环境中,不得不考虑的一个问题是用户访问产生的session如何处理.如过不做任何处理,用户将出现频繁俸禄的现象, ...

  8. Android 学习资料入门到精通(PDF集合)共54本

    最近收集一些安卓入门到精通,包含游戏编程,网络编程,多媒体开发,需要学习朋友就下载保持下来,下载链接在最下面 下面是网盘内容 14天学会安卓开发_(完整版).pdf Android 4  游戏高级编程 ...

  9. vuex commit保存数据技巧

    vuex 单向数据流,推荐的commit 改变state数据,写起来非常繁琐,因为改数据可能要写很多commit函数. 依据我的理解,单向数据流主要是为了避免数据混乱,便于调试. 说白了,就是一个数据 ...

  10. scrapy 选择器官方文档

    当抓取网页时,常见的任务是从HTML源码中提取数据.现有的一些库可以达到这个目的: BeautifulSoup lxml Scrapy 提取数据有自己的一套机制.它们被称作选择器(seletors), ...