【QCon】精华内容上线92%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

在实时音视频领域,如何基于 TensorFlow 实现图像识别

  • 2019-09-02
  • 本文字数:4351 字

    阅读完需:约 14 分钟

在实时音视频领域,如何基于 TensorFlow 实现图像识别

近两年来,Python 在众多编程语言中的热度一直稳居前五,热门程度可见一斑。 Python 拥有很活跃的社区和丰富的第三方库,Web 框架、爬虫框架、数据分析框架、机器学习框架等,开发者无需重复造轮子,可以用 Python 进行 Web 编程、网络编程,开发多媒体应用,进行数据分析,或实现图像识别等应用。其中图像识别是最热门的应用场景之一,也是与实时音视频契合度最高的应用场景之一。


本文将分享 TensorFlow 图像识别的实现。然后,我们尝试将 TensorFlow 与 Agora Python SDK 结合,来实现在实时音视频通话下的图像识别。我们利用 Agora Python SDK 来完成音视频的编解码、降噪、回声消除、低延时传输等任务,并将视频图像以 RGB 格式传输给 TensorFlow,然后我们通过 TensorFlow 来进行图像识别,将识别结果返回给客户端。


先分享一下 Demo 的识别效果。左图是对端的视频图像,右下角是我们本地的视频图像,在识别对端图像后,右侧的文本框中会显示出识别结果。注意,这个🙂贴纸只是后期 P 上去的,我们在 Demo 中还没有加入贴图的功能,如果你感兴趣,可以试着在 Demo 基础上做改进,丰富功能。



首先,我们还是要先介绍一下 TensorFlow 的图像识别原理与方法。

TensorFlow 图片及物体识别

TensorFlow 是 Google 的开源深度学习库,你可以使用这个框架以及 Python 编程语言,构建大量基于机器学习的应用程序。而且还有很多人把 TensorFlow 构建的应用程序或者其他框架,开源发布到 GitHub 上。所以我们今天主要基于 Tensorflow 学习下物体识别。


TensorFlow 提供了用于检测图片或视频中所包含物体的 API,详情点击此处。


物体检测是检测图片中所出现的全部物体并且用矩形(Anchor Box)进行标注,物体的类别可以包括多种,例如人、车、动物、路标等。举个例子了解 TensorFlow 物体检测 API 的使用方法,这里使用预训练好的 ssd_mobilenet_v1_coco 模型(Single Shot MultiBox Detector),更多可用的物体检测模型可以点击这里

加载库

# -*- coding:utf-8 -*- import numpy asnpimporttensorflow as tfimportmatplotlib.pyplot as pltfrom PIL importImage from utilsimport label_map_utilfrom utilsimport visualization_utils as vis_util
复制代码

定义部分常量

PATH_TO_CKPT = 'ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb'PATH_TO_LABELS = 'ssd_mobilenet_v1_coco_2017_11_17/mscoco_label_map.pbtxt'NUM_CLASSES = 90
复制代码

加载预训练好的模型

detection_graph = tf.Graph()with detection_graph.as_default():  od_graph_def = tf.GraphDef()  with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:    od_graph_def.ParseFromString(fid.read())    tf.import_graph_def(od_graph_def, name='')
复制代码

加载分类标签数据

label_map = label_map_util.load_labelmap(PATH_TO_LABELS) categories = label_map_util.convert_label_map_to_categories(label_map,max_num_classes=NUM_CLASSES, use_display_name=True)category_index = label_map_util.create_category_index(categories)
复制代码

将图片转化为数组,并测试图片路径

def load_image_into_numpy_array(image):  (im_width, im_height) = image.size  return np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)
TEST_IMAGE_PATHS = ['test_images/image1.jpg', 'test_images/image2.jpg']
复制代码

使用模型进行物体检测

with detection_graph.as_default():  with tf.Session(graph=detection_graph) as sess:      image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')      detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')      detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')      detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')      num_detections = detection_graph.get_tensor_by_name('num_detections:0')      for image_path in TEST_IMAGE_PATHS:        image = Image.open(image_path)        image_np = load_image_into_numpy_array(image)        image_np_expanded = np.expand_dims(image_np, axis=0)        (boxes, scores, classes, num) = sess.run(          [detection_boxes, detection_scores, detection_classes, num_detections],           feed_dict={image_tensor: image_np_expanded})                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)        plt.figure(figsize=[12, 8])        plt.imshow(image_np)        plt.show()
复制代码


检测结果如下,第一张图片检测出了两只狗狗


实时音视频场景下 Tensorflow 物体识别

既然 Tensorflow 在静态图片的物体识别已经相对成熟,那在现实场景中,大量的实时音视频互动场景中,如何来做物体识别?我们现在基于声网实时视频的 SDK,阐述如何做物体识别。


首先我们了解视频其实就是由一帧一帧的图像组合而成,所以从这个层面来说,视频中的目标识别就是从每一帧图像中做目标识别,从这个层面上讲,二者没有本质区别。在理解这个前提的基础上,我们就可以相对简单地做实时音视频场景下 Tensorflow 物体识别。


1)读取 Agora 实时音视频,截取远端视频流的图片


def onRenderVideoFrame(uid, width, height, yStride,                            uStride, vStride, yBuffer, uBuffer, vBuffer,                            rotation, renderTimeMs, avsync_type):         # 用 isImageDetect 字段判断前一帧图像是否已完成识别,若完成置为True,执行以下代码,执行完置为false        if EventHandlerData.isImageDetect:            y_array = (ctypes.c_uint8 * (width * height)).from_address(yBuffer)            u_array = (ctypes.c_uint8 * ((width // 2) * (height // 2))).from_address(uBuffer)            v_array = (ctypes.c_uint8 * ((width // 2) * (height // 2))).from_address(vBuffer)
Y = np.frombuffer(y_array, dtype=np.uint8).reshape(height, width) U = np.frombuffer(u_array, dtype=np.uint8).reshape((height // 2, width // 2)).repeat(2, axis=0).repeat(2, axis=1) V = np.frombuffer(v_array, dtype=np.uint8).reshape((height // 2, width // 2)).repeat(2, axis=0).repeat(2, axis=1) YUV = np.dstack((Y, U, V))[:height, :width, :] # AI模型中大多数模型都是RGB格式训练,声网提供的视频回调数据源是YUV格式,我们做下格式转换 RGB = cv2.cvtColor(YUV, cv2.COLOR_YUV2RGB, 3) EventHandlerData.image = Image.fromarray(RGB) EventHandlerData.isImageDetect = False
复制代码


2)Tensorflow 对截取图片进行物体识别


class objectDetectThread(QThread):    objectSignal = pyqtSignal(str)    def __init__(self):        super().__init__()    def run(self):        detection_graph = EventHandlerData.detection_graph        with detection_graph.as_default():            with tf.Session(graph=detection_graph) as sess:                (im_width, im_height) = EventHandlerData.image.size                image_np = np.array(EventHandlerData.image.getdata()).reshape((im_height, im_width, 3)).astype(np.uint8)                image_np_expanded = np.expand_dims(image_np, axis=0)                image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')                boxes = detection_graph.get_tensor_by_name('detection_boxes:0')                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')                (boxes, scores, classes, num_detections) = sess.run(                    [boxes, scores, classes, num_detections],                    feed_dict={image_tensor: image_np_expanded})                objectText = []                # 如果识别概率大于百分之四十,我们就在文本框内显示所识别物体                for i, c in enumerate(classes[0]):                    if scores[0][i] > 0.4                        object = EventHandlerData.category_index[int(c)]['name']                        if object not in objectText:                            objectText.append(object)                    else:                        break                self.objectSignal.emit(', '.join(objectText))                EventHandlerData.detectReady = True                # 本帧图片识别完,isImageDetect 字段置为True,再次开始读取并转换Agora远端实时音视频                EventHandlerData.isImageDetect = True
复制代码


我们已经将这个 Demo 以及 Agora Python SDK 上传至 Github,大家可以直接下载使用:Agora Python TensorFlow Demo

Agora Python TensorFlow Demo 编译指南

  • 点击下载Agora Python SDK

  • 若是 Windows,复制.pyd and .dll 文件到本项目文件夹根目录;若是 IOS,复制.so 文件到本文件夹根目录

  • 下载 Tensorflow 模型,然后把 object_detection 文件复制.到本文件夹根目录

  • 安装 Protobuf。然后运行:


 protoc object_detection/protos/*.proto --python_out=.
复制代码


  • 点击下载预先训练的模型

  • 推荐使用 ssd_mobilenet_v1_coco

  • 和 ssdlite_mobilenet_v2_coco,因为他们相对运行较快

  • 提取 frozen graph,命令行运行:


python extractGraph.py --model_file='FILE_NAME_OF_YOUR_MODEL'
复制代码


  • 最后,在 callBack.py 中修改 model name,在 demo.py 中修改 Appid,然后运行即可


请注意,这个 Demo 仅作为演示使用,从获取到远端实时视频画面,到 TensorFlow 进行识别处理,再到显示出识别效果,期间需要 2 至 4 秒。不同网络情况、设备性能、算法模型,其识别的效率也不同。感兴趣的开发者可以尝试更换自己的算法模型,来优化识别的延时。


如果 Demo 运行中遇到问题,请在 Github 直接提 issue。


作者介绍


金叶清,6 年研发运营经验,从事开发者社区领域工作近五年。曾负责华为开发者社区相关运营工作;目前就职于声网,从事开发者布道师工作。


公众号推荐:

2024 年 1 月,InfoQ 研究中心重磅发布《大语言模型综合能力测评报告 2024》,揭示了 10 个大模型在语义理解、文学创作、知识问答等领域的卓越表现。ChatGPT-4、文心一言等领先模型在编程、逻辑推理等方面展现出惊人的进步,预示着大模型将在 2024 年迎来更广泛的应用和创新。关注公众号「AI 前线」,回复「大模型报告」免费获取电子版研究报告。

AI 前线公众号
2019-09-02 11:555398

评论

发布
暂无评论
发现更多内容

手机影像二十载,AI多摄会是终极答案吗?

脑极体

IPFS分币挖矿系统软件开发资料(现成)

现成IPFS分布式存储矿机软件系统开发案例

redis--多机

en

redis 高可用

区块链将规则写入代码 重构市场新制度

CECBC

filecoin云算力挖矿系统软件开发源码搭建

丰收音乐会,去找美丽却隐秘的生机

E科讯

博鳌亚洲论坛国际科技与创新论坛第二届大会区块链分论坛紧密筹备中

时空云

区块链 博鳌 亚洲论坛

linux【redhat&ubuntu】下ffmpeg-3.1安装编译及视频转码

程序员架构进阶

架构 ffmpeg 视频流 10月月更

跳槽时需要注意的事项

石云升

跳槽 职场经验 10月月更

小红书爆款笔记如何写,掌握3种类型的笔记写法

石头IT视角

微信小程序获取用户授权的思路

Changing Lin

10月月更

Minio环境搭建

Fox

Minio 分布式文件存储

网络安全漏洞深度剖析

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

Go应用场景与适应项目

hanaper

IPFS算力挖矿系统开发方案(源码案例)

Large Scale Distributed Deep Networks论文记录

春秋易简

央行数字货币即将破茧,一场大变局,震撼全球

CECBC

趣说 Node.js 的事件循环

Regan Yue

node.js Regan Yue 10月月更

分布式文件存储系统Minio实战

Fox

Minio 分布式文件存储

未来已来,运营商如何驱动区块链应用创新提速?

CECBC

现成filecoin算力挖矿软件系统开发公司

Java容器学习二

风翱

Java 10月月更

FIL云算力分币软件系统开发内容(源码)

IPFS云矿机分币软件系统开发简介(源码)

站立会(Daily Scrum)我们说些什么

Bruce Talk

Scrum 敏捷 Agile Coach/Facilitate

越来越被需要的售前工程师·「这就是售前」前言

jiezhao

售前 企业服务

filecoin矿机分币系统开发方案(现成)

fil挖矿分币系统开发资料(案例)

Java 面试八股文之数据库篇(一)

Dobbykim

人工智能解决方案 --- 智能运维(AIOps)

micklongen

人工智能 AIOPS 知识图谱 智能运维 数据工程

在实时音视频领域,如何基于 TensorFlow 实现图像识别_AI&大模型_金叶清_InfoQ精选文章