本教程针对Windows10实现谷歌公布的TensorFlow Object Detection API视频物体识别系统,其他平台也可借鉴。

本教程将网络上相关资料筛选整合(文末附上参考资料链接),旨在为快速搭建环境以及实现视频物体识别功能提供参考,关于此API的更多相关信息请自行搜索。

注意: windows用户名不能出现中文!!!

安装Python

注意: Windows平台的TensorFlow仅支持3.5.X版本的Python

进入Python3.5.2下载页,选择 Files 中Windows平台的Python安装包,下载并安装。

安装TensorFlow

进入TensorFlow on Windows下载页,本教程使用最简便的组合 CPU support only + Native pip。

打开cmd,输入以下指令即进行TensorFlow的下载安装,下载位置为python\Lib\site-packages\tensorflow:



打开 IDLE,输入以下指令:



如果出现如下结果则安装成功:



若出现问题,请参考TensorFlow on Windows下载页底端的常见问题。

安装Protoc

Protoc用于编译相关程序运行文件,进入Protoc下载页,下载类似下图中带win32的压缩包。



解压后将bin文件夹内的protoc.exe拷贝到c:\windows\system32目录下(用于将protoc.exe所在的目录配置到环境变量当中)。

安装git

进入git官网下载Windows平台的git,详细安装及配置注意事项可参考此文。

安装其余组件

在cmd内输入如下指令下载并安装相关API运行支持组件:



注意: Native pip会受电脑中另外Python应用的影响,博主因为之前做仿真安装了Anaconda,导致下载的jupyter等相关组件安装到了Anaconda内的site-packages文件夹,后期调用失败。

下载代码并编译

在cmd中输入如下代码:



从github下载谷歌tensorflow/models的代码,一般默认下载到C盘。

同样在cmd进入到models文件夹,编译Object Detection API的代码:

运行notebook demo

继续在models文件夹下运行如下命令:



浏览器自动开启,显示如下界面:



进入object_detection文件夹中的object_detection_tutorial.ipynb:



点击Cell内的Run All,等待三分钟左右(博主电脑接近报废),即可显示如下结果:





修改文件路径,即可检测自己的图片:





注意:要将图片名称设置的和代码描述相符合,如image1.jpg



TensorFlow Object Detection API中提供了五种可直接调用的识别模型,默认的是最简单的ssd + mobilenet模型。



可直接将MODEL_NAME修改为如下值调用其他模型:

MODEL_NAME = 'ssd_inception_v2_coco_11_06_2017'

MODEL_NAME = 'rfcn_resnet101_coco_11_06_2017'

MODEL_NAME = 'faster_rcnn_resnet101_coco_11_06_2017'

MODEL_NAME = 'faster_rcnn_inception_resnet_v2_atrous_coco_11_06_2017'

将模型换为faster_rcnn_inception_resnet,结果如下:





准确率确实获得了极大提高,但是速度却下降了,在博主的老爷机上需要五分钟才能跑出结果。

视频物体识别

谷歌在github上公布了此项目的完整代码,接下来我们将在现有代码基础上添加相应模块实现对于视频中物体的识别。

第一步:下载opencv的cv2包



在Python官网即可下载opencv相关库,点击此处直接进入。

博主安装的版本如下:



下载完成后,在cmd中执行安装命令

pip install opencv_python-3.2.0.8-cp35-cp35m-win_amd64.whl

安装完成后,进入IDLE输入命令

import cv2

若未报错,则opencv-python库成功导入,环境搭配成功。

第二步:在原代码中引入cv2包



第三步:添加视频识别代码

主要步骤如下:

1.使用 VideoFileClip 函数从视频中抓取图片。

2.用fl_image函数将原图片替换为修改后的图片,用于传递物体识别的每张抓取图片。

3.所有修改的剪辑图像被组合成为一个新的视频。

在原版代码基础上,在最后面依次添加如下代码(可从完整代码 处复制,但需要作出一些改变,当然也可以直接从下文复制修改后的代码):

# Import everything needed to edit/save/watch video clips
import imageio
imageio.plugins.ffmpeg.download() from moviepy.editor import VideoFileClip
from IPython.display import HTML

此处会下载一个剪辑必备的程序ffmpeg.win32.exe,内网下载过程中容易断线,可以使用下载工具下载完然后放入如下路径:

C:\Users\ 用户名 \AppData\Local\imageio\ffmpeg\ffmpeg.win32.exe

def detect_objects(image_np, sess, detection_graph):
# Expand dimensions since the model expects images to have shape: [1, None, None, 3]
image_np_expanded = np.expand_dims(image_np, axis=0)
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0') # Each box represents a part of the image where a particular object was detected.
boxes = detection_graph.get_tensor_by_name('detection_boxes:0') # Each score represent how level of confidence for each of the objects.
# Score is shown on the result image, together with the class label.
scores = detection_graph.get_tensor_by_name('detection_scores:0')
classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0') # Actual detection.
(boxes, scores, classes, num_detections) = sess.run(
[boxes, scores, classes, num_detections],
feed_dict={image_tensor: image_np_expanded}) # Visualization of the results of a detection.
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
return image_np

处理图像

def process_image(image):
# NOTE: The output you return should be a color image (3 channel) for processing video below
# you should return the final output (image with lines are drawn on lanes)
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
image_process = detect_objects(image, sess, detection_graph)
return image_process

输入视频文件

white_output = 'video1_out.mp4'
clip1 = VideoFileClip("video1.mp4").subclip(25,30)
white_clip = clip1.fl_image(process_image) #NOTE: this function expects color images!!s
%time white_clip.write_videofile(white_output, audio=False)
其中video1.mp4已经从电脑中上传至object_detection文件夹,subclip(25,30)代表识别视频中25-30s这一时间段。

原版视频:



展示识别完毕的视频:

from moviepy.editor import *
clip1 = VideoFileClip("video1_out.mp4")
clip1.write_gif("final.gif")

将识别完毕的视频导为gif格式,并保存至object_detection文件夹。

至此,快速教程结束。各位应该都能使用谷歌开放的API实现了视频物体识别。

相关参考资料

  • 知乎:何之源对于“谷歌开放的TensorFlow Object Detection API 效果如何?”的回答

  • 林俊宇的博客:导入opencv-python库

  • myboyliu2007的专栏:ffmpeg安装方法

  • 陈强:安装protocolbuffer详解

  • 机器之心:如何使用TensorFlow API构建视频物体识别系统

  • windows安装git和环境变量配置

原创作者:withzheng,原文链接:https://blog.csdn.net/xiaoxiao123jun/article/details/76605928



欢迎关注我的微信公众号「码农突围」,分享Python、Java、大数据、机器学习、人工智能等技术,关注码农技术提升•职场突围•思维跃迁,20万+码农成长充电第一站,陪有梦想的你一起成长。

使用TensorFlow进行训练识别视频图像中物体的更多相关文章

  1. Tensorflow Mask-RCNN训练识别箱子的模型运行结果(练习)

    Tensorflow Mask-RCNN训练识别箱子的模型

  2. AMAP-TECH算法大赛开赛!基于车载视频图像的动态路况分析

    阿里巴巴高德地图AMAP-TECH算法大赛于7月8日开启初赛,赛题为「基于车载视频图像的动态路况分析」,活动邀请了业界权威专家担任评委,优秀选手不仅可以瓜分丰厚的奖金,领取荣誉证书,还有机会进入高德地 ...

  3. Python使用tesserocr识别文字过程中遇到的一个问题

    最近在使用Python识别PNG图像中包含的文字时遇到一个问题.解决过程记录如下. (Python使用tesserocr的安装过程不再描述.) 在使用tesserocr识别PNG图像中的文字时,如果P ...

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

    视频中的物体识别 摘要 物体识别(Object Recognition)在计算机视觉领域里指的是在一张图像或一组视频序列中找到给定的物体.本文主要是利用谷歌开源TensorFlow Object De ...

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

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

  6. 使用 Python 识别并提取图像中的文字

    1. 介绍 介绍使用 python 进行图像的文字识别,将图像中的文字提取出来,可以帮助我们完成很多有趣的事情. 2. 必备工具 tesseract-ocr 下载地址: https://github. ...

  7. 从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中

    //从视频文件中读入数据-->将数据转换为灰度图-->对图像做canny边缘检测-->将这三个结构显示在一个图像中 //作者:sandy //时间:2015-10-10 #inclu ...

  8. Zybo智能小车识别图像中的文字

    智能小车识别图像中的文字 [TOC] 运行平台 这次的内容是基于Xilinx公司的Zybo开发板以及其配套的Zrobot套件开发 Zybo上面的sd卡搭载了Ubuntu12.04LTS的linux版本 ...

  9. [SimplePlayer] 1. 从视频文件中提取图像

    在开始之前,我们需要了解视频文件的格式.视频文件的格式众多,无法三言两语就能详细分析其结构,尽管如此,ffmpeg却很好地提取了各类视频文件的共同特性,并对其进行了抽象描述. 视频文件格式,统称为co ...

随机推荐

  1. ZooKeeper源码阅读——client(二)

    原创技术文章,转载请注明:转自http://newliferen.github.io/ 如何连接ZooKeeper集群   要想了解ZooKeeper客户端实现原理,首先需要关注一下客户端的使用方式, ...

  2. Tortoises SVN 教程

    1.  TortoiseSVN 简介 版本控制是管理信息修改的艺术,它一直是程序员最重要的工具,程序员经常会花时间作出小的修改,然后又在某一天取消了这些修改,想象一下一个开发者并行工作的团队 - 或许 ...

  3. 安装NSQ

    安装文档 https://nsq.io/deployment/installing.html 打开连接后,根据系统找到对应的二进制包 一般都是linux则下载 https://s3.amazonaws ...

  4. ES6学习总结(五)

    与其说是对象合并,还不如说是JavaScript中对象属性的复制和转移,将多个对象中的属性合并到一个对象中 12345678 var person = { name : 'John', age : 2 ...

  5. install jekyll

    最直接的方法就是运行快速指南中的命令: gem install jekyll 这个时候会提示: Command 'gem' not found, but can be installed with: ...

  6. FPGA小白学习之路(4)PLL中的locked信号解析(转)

    ALTPLL中的areset,locked的使用 转自:http://www.360doc.com/content/13/0509/20/9072830_284220258.shtml 今天对PLL中 ...

  7. P1097 统计数字

    P1097题库链接:https://www.luogu.org/problem/P1097 难度:普及- 算法标签:模拟,排序,概率论 1.桶模拟 O(n) 得分20 由于题目让统计数出现的次数,并按 ...

  8. java基础进阶篇(四)_HashMap------【java源码栈】

    目录 一.前言 二.特点和常见问题 二.接口定义 三.初始化构造函数 四.HashMap内部结构 五.HashMap的存储分析 六.HashMap的读取分析 七.常用方法 八.HashMap 的jav ...

  9. 基于python openOPC的监控页面一

    笔者涉猎的工业领域项目遇到一个需求,需要把底层设备(表记)的状态和运行数据集中放到一个监控画面进行展示,数据需要在界面端实时进行刷新,类似网友的例子,如下图(侵删) 数据需要实时主动刷新,笔者基于多年 ...

  10. springboot 解决实体类值为null或者数组为空,不返回前台

    一个注解解决问题 @JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonInclude(JsonInclude.Include.NON_NULL)