网课、视频会议、视频面试、视频问诊,这些基于 RTC 技术的场景,支撑着我们在疫情期间工作、学习和生活可以继续,不至于停滞。不过 RTC 技术还可以做更多,只是需要我们去发掘。
在去年 RTC 创新编程挑战赛上,有一支团队将声网 Agora SDK 与机器学习结合,开发了一个视觉辅助产品,可以帮助用户避障、导航、远程指引等。我们邀请了这支来自上海科技大学的团队分享了他们的开发经验:
项目介绍
Guidoge是一套基于普通智能移动设备辅助视觉方案,它依托于Agora提供的实时音视视频与机器学习,主要面向视障人士、骑行爱好者等有着视觉辅助及拓展需求的群体。
项目初心
在调研最新的科研结果后,我想,既然我们已经有了合成自然语音以及表现出色的机器视觉技术,那么只要加上RTC实时传输,我们就能实现这个梦想:我们将移动设备随手挂在胸后,它便能在骑行时用自然的声音告知后方来车;对于视障人群,我们甚至不仅能让Guidoge告诉他们前方的障碍物,甚至能将天空中云的形状、街边发生的趣事都一一讲述给他们。Guidoge不只是一个面向视障群体开发的产品;它试图解决的是所有人共同面临的一个问题:视力的衰退与视觉面的不足。
主要功能
图:系统功能介绍
基于视觉辅助这一目的,Guidoge首先需要解决的问题就是障碍规避和导航。运行在移动设备上的客户端通过RTC接口将视频信息发送到Guidoge Server,在云端进行Depth estimation步骤得到前景的深度信息,并通过Object Detection进行障碍识别。除此之外,客户端程序还能根据预设路径,利用第三方导航服务的API获取路径方案。
图:Obstacle Detection(障碍检测)方案
在这一技术方案中不止计算机视觉技术大放异彩,自然、流畅的语音合成系统也是打造“有温度的交互”所必不可少的。片头视频中所采用的正是Google Tacotron2和WaveNet一同实现的TTS系统。

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

图:系统功能框图
主要功能


接受前端图像数据并进行深度预测
from PIL import Imageimport base64from io import BytesIOdef parse_img(url):url = url.split(',')[1]data = base64.decodebytes(url.encode())return Image.open(BytesIO(data))from sanic import Sanicfrom sanic.response import jsonfrom sanic_cors import CORS, cross_originapp = Sanic()CORS(app)@app.route("/")async def test(request):return json({"hello": "world"})@app.route("/json", methods=['POST', 'OPTIONS'])def post_json(request):ret = Nonetry: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.videoHeightcanvas.width = widthcanvas.height = heightcontext.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.messagecont()}).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});})});
未来展望
作者与源码
-
Repo:https://github.com/AgoraIO-Community/2019-Hackathon-Works-Vision-Enhancement-Guidoge -
编译与运行指南已附在GitHub Repo中。 作者姚沧力:上海科技大学FemtoTech工作室创始人之一,全栈开发者,热衷视频创作和各类新兴技术,现于声网 Agora 实习。
姚沧力主页:https://github.com/nekowink
作者张启煊:上海科技大学GeekPie社团社长,MARS实验室成员,热衷于计算机视觉与区块链技术。
张启煊主页:https://github.com/eEhyQx

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

点击「阅读原文」,报名参赛

