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

来源: 云巴巴 2019-09-16 17:27:52

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

声网Agora 现已支持 Python 语言,我们还写了一份 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

加载库

  1. # -*- coding:
  2. utf-8 -*-
  3. import numpy as
  4. np
  5. import
  6. tensorflow as tf
  7. import
  8. matplotlib.pyplot as plt
  9. from PIL import
  10. Image
  11. from utils
  12. import label_map_util
  13. from utils
  14. import visualization_utils as vis_util

定义一些常量

  1. PATH_TO_CKPT = 'ssd_mobilenet_v1_coco_2017_11_17/frozen_inference_graph.pb'
  1. PATH_TO_LABELS = 'ssd_mobilenet_v1_coco_2017_11_17/mscoco_label_map.pbtxt'
  1. NUM_CLASSES = 90

加载预训练好的模型

  1. detection_graph = tf.Graph
  2. with detection_graph.as_default:
  3. od_graph_def = tf.GraphDef
  4. with tf.gfile.GFile(PATH_TO_CKPT, 'rb') as fid:
  5. od_graph_def.ParseFromString(fid.read)
  6. tf.import_graph_def(od_graph_def, name='')

加载分类标签数据

  1. label_map = label_map_util.load_labelmap(PATH_TO_LABELS)
  1. categories = label_map_util.convert_label_map_to_categories(label_map,max_num_classes=NUM_CLASSES, use_display_name=True)
  1. category_index = label_map_util.create_category_index(categories)

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

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

使用模型进行物体检测

  1. with detection_graph.as_default:
  2. with tf.Session(graph=detection_graph) as sess:
  3. image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
  4. detection_boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
  5. detection_scores = detection_graph.get_tensor_by_name('detection_scores:0')
  6. detection_classes = detection_graph.get_tensor_by_name('detection_classes:0')
  7. num_detections = detection_graph.get_tensor_by_name('num_detections:0')
  8. for image_path in TEST_IMAGE_PATHS:
  9. image = Image.open(image_path)
  10. image_np = load_image_into_numpy_array(image)
  11. image_np_expanded = np.expand_dims(image_np, axis=0)
  12. (boxes, scores, classes, num) = sess.run(
  13. [detection_boxes, detection_scores, detection_classes, num_detections],
  14. feed_dict={image_tensor: image_np_expanded})
  15. 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)
  16. plt.figure(figsize=[12, 8])
  17. plt.imshow(image_np)
  18. plt.show

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

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

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

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

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

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

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

  1. class objectDetectThread(QThread):
  2. objectSignal = pyqtSignal(str)
  3. def __init__(self):
  4. super.__init__
  5. def run(self):
  6. detection_graph = EventHandlerData.detection_graph
  7. with detection_graph.as_default:
  8. with tf.Session(graph=detection_graph) as sess:
  9. (im_width, im_height) = EventHandlerData.image.size
  10. image_np = np.array(EventHandlerData.image.getdata).reshape((im_height, im_width, 3)).astype(np.uint8)
  11. image_np_expanded = np.expand_dims(image_np, axis=0)
  12. image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
  13. boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
  14. scores = detection_graph.get_tensor_by_name('detection_scores:0')
  15. classes = detection_graph.get_tensor_by_name('detection_classes:0')
  16. num_detections = detection_graph.get_tensor_by_name('num_detections:0')
  17. (boxes, scores, classes, num_detections) = sess.run(
  18. [boxes, scores, classes, num_detections],
  19. feed_dict={image_tensor: image_np_expanded})
  20. objectText = []
  21. # 如果识别概率大于百分之四十,我们就在文本框内显示所识别物体
  22. for i, c in enumerate(classes[0]):
  23. if scores[0][i] > 0.4
  24. object = EventHandlerData.category_index[int(c)]['name']
  25. if object not in objectText:
  26. objectText.append(object)
  27. else:
  28. break
  29. self.objectSignal.emit(', '.join(objectText))
  30. EventHandlerData.detectReady = True
  31. # 本帧图片识别完,isImageDetect 字段置为True,再次开始读取并转换Agora远端实时音视频
  32. 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编译指南:

  •  
  • 若是 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 秒。不同网络情况、设备性能、算法模型,其识别的效率也不同。感兴趣的开发者可以尝试更换自己的算法模型,来优化识别的延时。

 

 

更多产品了解

欢迎扫码加入云巴巴企业数字化交流服务群

产品交流、问题咨询、专业测评

都在这里!

 

评论列表

为你推荐

AI应用中图像识别的计数原理和过程

AI应用中图像识别的计数原理和过程

图像识别的原理主要是处理具有一定复杂性的信息,处理技术在计算机中不是随机的,主要是根据一些医学研究者的实践,结合计算机程序来模拟和实现相关内容。该技术的计算机实现与人类对图像进行识别的基本工作原理基本类似,在人类感觉及视觉等方面只是计算机不会受到任何一个

2020-04-21 17:33:12

自动化生产中机器视觉图像识别技术有多给力?

自动化生产中机器视觉图像识别技术有多给力?

想必各位机友都知道图像识别技术是人工智能的一个重要领域。随着计算机技术的迅速发展和科技的不断进步,图像识别技术已经在众多领域中得到了应用,其产生的目的是为了让计算机代替人类去处理大量的物理信息,并以此用来识别不同模式下目标和对象的一门技术。

2020-04-21 17:15:36

如何做到人脸三维图像识别技术呢

如何做到人脸三维图像识别技术呢

现在,在我们的生活中,能够接触到三维人脸识别技术的地方有很多,就比如说我们现在每个人都会接触到的微信和支付宝上的人脸三维图像识别技术,线面,朋友们,就让我们一起来了解一下它吧。 三维人脸识别技术使用3D传感器来捕捉关于人脸形状的信息。这些信息随后被用来识

2022-11-22 16:07:30

面部图像识别技术的应用都有哪些

面部图像识别技术的应用都有哪些

在本文章中,主要谈论下面部图像识别技术在面容 ID、移动平台和社会化媒体的应用。 社交媒体平台采用了面部识别算法来丰富其功能,以便在激烈竞争中吸引更广泛的用户群。 应用程序允许通过一个特殊的过滤器与其他人进行视频聊天,这个过滤器可以修改用户的面部表情。虽

2022-11-22 16:13:29

图像识别技术该如何发展,应用价值在哪里?

图像识别技术该如何发展,应用价值在哪里?

图像识别为图像处理,分析和识别目标的理解,各种模式和现有技术的图像的计算机。识别研究过程主要包括图像进行预处理、图像分割、特征提取和判断匹配。 随着图形识别技术的不断进步,越来越多的技术公司开始涉足图形识别领域,标志着读图时代的正式到来。

2022-11-22 16:15:06

智能机器是如何有效的图像识别的

智能机器是如何有效的图像识别的

本地文化生活实际场景中包含企业大量极富挑战的计算机视觉设计任务,图像识别技术也相应而生,其对应的核心技术,这些计算机视觉任务可归纳为三类:物体识别,文字识别和重建。 对于我们现在与有的技术水平来说,在图像识别过程中会遇到许多问题,当然,技术开发人员也在积

2022-11-22 16:07:38

严选云产品

万昆科技ADAM应用交付智能运维服务平台 万昆科技ADAM应用交付智能运维服务平台,ADAM能够将多设备、多区域、多功能、多品牌的负载均衡设备纳入平台统一管理,解决该领域的运维管理痛点。通过自动化、统一管控、功能配置编排、动态关联和协同合作,实现高效运维并能为客户带来显著的收益和价值。
企企通汽车零部件行业SRM采购解决方案 企企通汽车零部件行业SRM采购解决方案,针对线下渠道获取的供应商,主动触达,提高供应商响应积极性;对接天眼查,获取基本信息,查询供应商风险项、征信报告、往来关系等,便于规避风险。采购可通过代注册,规范准入流程,实现线上化管理,提高效率。
SAAS化云防火墙 腾讯云原生的 SaaS 化防火墙,客户业务上云的第一个网络安全基础设施,重保利器,等保必备。腾讯金牌代理云巴巴提供一站式网络云安全产品选型和技术支持,拥有比官网更低的折扣和更完善的服务。
X-Suite一站式大数据分析平台 Yonghong X-Suite是面向部门级或中小企业的自助式分析应用,快速整合海量数据,提供易用、高效的数据可视化分析。
腾讯问卷校园数据采集解决方案 腾讯问卷校园数据采集解决方案,通过问卷系统实现信息高效统计与数据闭环管理,安装腾讯问卷企微应用,复用校内架构,可通过企微推送问卷。可实时追踪各组别/班级填答进度,支持匿名、实名投票,可投票后实时查看整体结果。
ZEGO即构双师课堂解决方案 即构自研的音视频SDK,在嵌入式设备有限的CPU资源上,能高效地运行。自适应不同状态的网络,智能抹平网络抖动,对抗网络抖动带来的卡顿,支撑1080P多路高并发。同时提供PaaS和软硬件一体解决方案。完全自研回声消除算法,针对教室场景和硬件专门适配,可以根据环境和设备做兼容。提供线上互动白板标注,动态PPT教学等能力,让线上互动教学更生动有趣。

推荐视频

甄选10000+数字化产品 为您免费使用

申请试用