用机器学习+实时音视频,实现一个移动端的视觉辅助应用

网课、视频会议、视频面试、视频问诊,这些基于 RTC 技术的场景,支撑着咱们在疫情期间工做、学习和生活能够继续,不至于停滞。不过 RTC 技术还能够作更多,只是须要咱们去发掘。前端

在去年 RTC 创新编程挑战赛上,有一支团队将声网 Agora SDK 与机器学习结合,开发了一个视觉辅助产品,能够帮助用户避障、导航、远程指引等。咱们邀请了这支来自上海科技大学的团队分享了他们的开发经验(源码在文末)。git

另外,今年的 RTC 创新编程挑战赛已经在线上开赛了!相信你们已经在 SF 首页上看到了:) 欢迎你们拉上小伙伴一块儿来线上约战!咱们准备了丰厚的大奖,☞戳这里了解更多github

项目介绍

Guidoge是一套基于普通智能移动设备辅助视觉方案,它依托于Agora提供的实时音视视频与机器学习,主要面向视障人士、骑行爱好者等有着视觉辅助及拓展需求的群体。面试

咱们经过RTC技术将移动端捕捉到的摄像头图像传回后端服务器,使用深度学习技术进行场景理解等操做,并经过语音和震动等方式与用户交互。这一产品无需复杂外设,仅凭一台手机和一根挂绳(Guidoge Loop)便可实现对象识别、语音反馈等丰富的视觉加强功能。编程

项目初心

AI是一项神奇的发明,特别是近些年深度学习领域中GAN、残差网络的提出让计算机视觉、语音合成等方向都有了长足的进步。json

在调研最新的科研结果后,我想,既然咱们已经有了合成天然语音以及表现出色的机器视觉技术,那么只要加上RTC实时传输,咱们就能实现这个梦想:咱们将移动设备随手挂在胸后,它便能在骑行时用天然的声音告知后方来车;对于视障人群,咱们甚至不只能让Guidoge告诉他们前方的障碍物,甚至能将天空中云的形状、街边发生的趣事都一一讲述给他们。Guidoge不仅是一个面向视障群体开发的产品;它试图解决的是全部人共同面临的一个问题:视力的衰退与视觉面的不足。canvas

主要功能

系统功能介绍

图:系统功能介绍segmentfault

基于视觉辅助这一目的,Guidoge首先须要解决的问题就是障碍规避和导航。运行在移动设备上的客户端经过RTC接口将视频信息发送到Guidoge Server,在云端进行Depth estimation步骤获得前景的深度信息,并经过Object Detection进行障碍识别。除此以外,客户端程序还能根据预设路径,利用第三方导航服务的API获取路径方案。后端

Obstacle Detection(障碍检测)方案
图:Obstacle Detection(障碍检测)方案api

在这一技术方案中不止计算机视觉技术大放异彩,天然、流畅的语音合成系统也是打造“有温度的交互”所必不可少的。片头视频中所采用的正是Google Tacotron2和WaveNet一同实现的TTS系统。

TTS(文字转语音)方案

图:TTS(文字转语音)方案

系统功能框图

图:系统功能框图

  • 接受前端图像数据并进行深度预测:
from PIL import Image
import base64
from io import BytesIO
def parse_img(url):
   url = url.split(',')[1]
   data = base64.decodebytes(url.encode())
   return Image.open(BytesIO(data))
from sanic import Sanic
from sanic.response import json
from sanic_cors import CORS, cross_origin
app = Sanic()
CORS(app)
@app.route("/")
async def test(request):
   return json({"hello": "world"})
@app.route("/json", methods=['POST', 'OPTIONS'])
def post_json(request):
   ret = None
   try:
       img = parse_img(request.json['answer']).transpose(Image.ROTATE_90)
       img.save('target_network.bmp')
   except:
       return json({ "received": True, "message": request.json })
   ret = predict_depth(img, True, True)
返回预测的depth map

raw_data = base64.encodebytes(ret)
 return json({ "received": True, "message": 'data:image/jpg;base64,' + raw_data.decode()})
  • Web端对视频数据的预处理:
const width = video.videoWidth, height = video.videoHeight
 canvas.width = width
 canvas.height = height
 context.drawImage(video, 0, 0, width, height)

 const data = canvas.toDataURL('image/png')
 if (data.indexOf('base64') != -1) {
   result.style="position: absolute;left: 0;top: 0;width: 100vw;height: 100vh;background:white"
   postData(`${api_entrypoint}/json`, {answer: data})
     .then(data => {
       console.log(data)
       resultimg.src = data.message
       cont()
     })
     .catch(error => {
       console.error(error)
       cont()
     })
 } else {
   cont()
 }
  • 链接到Agora提供的RTC服务:
client = AgoraRTC.createClient({mode: 'live'});
client.init(appId.value, function () {
   client.join(channel_key, channel.value, null, function(uid) {
       camera = videoSource.value;
       localStream = AgoraRTC.createStream({streamID: uid, cameraId: camera, video: true, screen: false});
   })
});

值得一提的是,声网开发者中心提供的样例代码上手很是友好,虽然我本身此前未接触过音视频直播,但也成功实现了当天调通上线——当时我和队友凌晨三点开了瓶可乐庆祝,在实验场地带着运行了App的手机处处乱跑,是很是愉快的敏捷开发体验了!

将来展望

深度学习的进展使得AI技术呈现井喷式发展,你们都说短视频与直播是下一个互联网的“风口”,而5G套餐的第一个用户就产生数月前。咱们深信这些技术自己就具备很是光明的前景,而从它们之间的交叉结合能诞生出更振奋人心的新事物。固然,深刻实践的前提必定是对领域自己有足够深入的理解,这很难离得开科技巨头和独角兽企业研发部门的通力合做。

对Guidoge方案自己,或许它离真正落地还有一段距离,这段距离多是5G的全面应用,也有多是边缘计算能力的提高。目前来讲,Guidoge尝试的RTC+AI+云计算方案会是一种方向,为以后使用RTC服务的开发者们开拓思路,甚至吸引更多志同道合的战友一块儿深耕于这个实时化的、充满互动技术的将来(也是咱们团队成员的美好愿望)。

咱们相信,将来不会太远。

做者与源码

  • 做者姚沧力:上海科技大学FemtoTech工做室创始人之一,全栈开发者,热衷视频创做和各种新兴技术,因大赛获奖,通过了声网应聘快速通道,现已于声网 Agora 实习。
  • 姚沧力主页:https://github.com/nekowink
  • 做者张启煊:上海科技大学GeekPie社团社长,MARS实验室成员,热衷于计算机视觉与区块链技术。
  • 张启煊主页:https://github.com/eEhyQx
  • Repo:https://github.com/AgoraIO-Co...
  • 编译与运行指南已附在GitHub Repo中。

One more thing

RTC 2020 编程挑战赛春季赛已经开启报名了!本次大赛从 3月10日 ~ 4月21日 进行报名、组队与开发,4 月 22 日至 4 月 24 日提交做品,4 月 25 日评奖,全程在线上进行。本次大赛准备了丰厚的大奖,获奖者更有机会进入声网 Agora 应聘快速通道,快拉上小伙伴报名吧!

相关文章
相关标签/搜索