10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

Agora 新增支持 Python:视频通话中也可做图像识别了

2019 年 11 月 29 日

Agora新增支持Python:视频通话中也可做图像识别了

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


我们还写了一份 Python demo,并已分享至 Github。本文将从 TensorFlow 图像识别讲起,并讲 TensorFlow 与 Agora Python SDK 结合,在实时音视频场景中实现图像识别。实现后的效果,如下图所示。



实时通话中成功识别左图中的人、椅子和显示器


TensorFlow 图片物体识别

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


TensorFlow 提供了用于检测图片或视频中所包含物体的 API,详情可参考以下链接:https://github.com/tensorflow/models/tree/master/research/object_detection


物体检测是检测图片中所出现的全部物体并且用矩形(Anchor Box)进行标注,物体的类别可以包括多种,例如人、车、动物、路标等。举个例子了解 TensorFlow 物体检测 API 的使用方法,这里使用预训练好的 ssd_mobilenet_v1_coco 模型(Single Shot MultiBox Detector),更多可用的物体检测模型可以参考这里:https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md#coco-trained-models-coco-models


加载库


# -*- coding:utf-8 -*-import numpy asnpimporttensorflow as tfimportmatplotlib.pyplot as pltfrom PIL importImagefrom 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)
复制代码


⼀个将图⽚转为数组的辅助函数,以及测试图⽚路径


使⽤模型进⾏物体检测


categories = label_map_util.convert_label_map_to_categories(label_map,max_num_classdef load_image_into_numpy_array(image):(im_width, im_height) = image.sizereturn np.array(image.getdata()).reshape((im_height, im_width, 3)).astype(np.uiTEST_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:0num_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_detectiofeed_dict={image_tensor: image_np_expanded})vis_util.visualize_boxes_and_labels_on_image_array(image_np, np.squeezeplt.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,执⾏以下代码,执⾏完if EventHandlerData.isImageDetect:y_array = (ctypes.c_uint8 * (width * height)).from_address(yBuffer)u_array = (ctypes.c_uint8 * ((width // 2) * (height // 2))).from_addresv_array = (ctypes.c_uint8 * ((width // 2) * (height // 2))).from_addresY = np.frombuffer(y_array, dtype=np.uint8).reshape(height, width)U = np.frombuffer(u_array, dtype=np.uint8).reshape((height // 2, widthV = np.frombuffer(v_array, dtype=np.uint8).reshape((height // 2, widthYUV = 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_graphwith detection_graph.as_default():with tf.Session(graph=detection_graph) as sess:(im_width, im_height) = EventHandlerData.image.sizeimage_np = np.array(EventHandlerData.image.getdata()).reshape((im_himage_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(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.4object = EventHandlerData.category_index[int(c)]['name']if object not in objectText:objectText.append(object)else:breakself.objectSignal.emit(', '.join(objectText))EventHandlerData.detectReady = True# 本帧图⽚识别完,isImageDetect 字段置为True,再次开始读取并转换Agora远端实时⾳视频EventHandlerData.isImageDetect = True
复制代码


我们已经将这个 Demo 以及 Agora Python SDK 上传⾄ Github,⼤家可以直接下载使⽤。


Agora Python TensorFlow Demo:https://github.com/AgoraIO-Community/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 运⾏中遇到问题,请在 RTC 开发者社区中反馈、交流,或在 Github 提 issue。


本文转载自公众号声网 Agora(ID:shengwang-agora)。


原文链接:


https://mp.weixin.qq.com/s/wbW1-hZ7zOqDTtTCGz83IQ


2019 年 11 月 29 日 18:52305

评论

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

架构师训练营 week2

devfan

设计模式

极客大学架构师训练营第一天总结

Ethan

ElasticSearch原理解析

Chank

elasticsearch

编程的本质

陈皮

Architecture Programing

分布式柔性事务的TCC方案

奈学教育

分布式

构架师训练营-第二周总结

Dawn

极客大学架构师训练营

教程序员使用Jekyll搭建漂亮的个人博客

小傅哥

小傅哥 Jekyll GitHub Pages 个人博客

全网唯一秃头数据集:20 万张人像,网罗各类秃头

神经星星

人工智能 程序员 人脸识别 科技互联网

架构师训练营Week2

Frank Zeng

架构师week2 作业

李锦

极客大学架构师训练营

基于docker部署的Java应用jmx无法远程访问的问题

qihuajun

杜克大学提出 AI 算法,拯救渣画质马赛克秒变高清

神经星星

人工智能 算法 分辨率 GAN

第二周总结

andy

Week2学习总结

Frank Zeng

架构师训练营第二周作业

王铭铭

架构训练营-第二节

刘志刚

分布式柔性事务的TCC方案

古月木易

分布式

架构师训练营第二周学习总结

James-Pang

极客大学架构师训练营

架构师培训 -02 面向对象基本设计原则

刘敏

对进入面向对象世界的思考

云飞

UML 面向对象设计原则

架构师训练营第二次作业0616

Geek_10

领域驱动设计(DDD)学习笔记

Chank

DDD

架构师训练营-第二周作业

Linuxer

极客大学架构师训练营

架构师训练营第二周学习总结

不谈

极客大学架构师训练营

第二周总结

王锟

第二周作业

新世界

架构

架构师训练营第二周课后作业三

不谈

极客大学架构师训练营

GitHub 热榜:适合初学者学习的 Prometheus 监控系统

JackTian

GitHub 开源 运维 Prometheus 监控系统

极客大学架构师训练营第一天作业

Ethan

面向对象设计学习总结

周冬辉

架构师训练营第二周总结

王铭铭

Agora新增支持Python:视频通话中也可做图像识别了-InfoQ