找回密码
 立即注册
搜索

在实时音视频范畴,如何基于 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-*-
importnumpyas
np
import
tensorflowastf
import
matplotlib.pyplotasplt
fromPILimport
Image
fromutils
importlabel_map_util
fromutils
importvisualization_utilsasvis_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()
withdetection_graph.as_default():
od_graph_def = tf.GraphDef()
withtf.gfile.GFile(PATH_TO_CKPT, 'rb')asfid:
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
returnnp.array(image.getdata()).reshape((im_height, im_width,3)).astype(np.uint8)
TEST_IMAGE_PATHS = ['test_images/image1.jpg','test_images/image2.jpg']

运用模型停止物体检测

 复制代码
withdetection_graph.as_default():
withtf.Session(graph=detection_graph)assess:
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_pathinTEST_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 实时音视频,截取远端视频流的图片

 复制代码
defonRenderVideoFrame(uid, width, height, yStride,
uStride, vStride, yBuffer, uBuffer, vBuffer,
rotation, renderTimeMs, avsync_type):
# 用 isImageDetect 字段判别前一帧图像能否已完成辨认,若完成置为True, 执行以下代码,执行完置为 false
ifEventHandlerData.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 对截取图片停止物体辨认

 复制代码
classobjectDetectThread(QThread):
objectSignal = pyqtSignal(str)
def__init__(self):
super().__init__()
def run(self):
detection_graph =EventHandlerData.detection_graph
withdetection_graph.as_default():
withtf.Session(graph=detection_graph)assess:
(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, cinenumerate(classes[0]):
ifscores[0]>0.4
object =EventHandlerData.category_index[int(c)]['name']
ifobject notinobjectText:
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。
回复

使用道具 举报

大神点评3

Qung 2019-9-3 19:58:23 来自手机 显示全部楼层
一点毛病没有,顶你
回复

使用道具 举报

a8159787 2019-9-4 22:42:31 来自手机 显示全部楼层
对不起,我就来看看,不说话
回复

使用道具 举报

很堕落 2019-9-5 16:30:50 显示全部楼层
very good
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies