利用 RTC 與 AI,實現移動端視覺輔助

網課、視頻會議、視頻面試、視頻問診,這些基於 RTC 技術的場景,支撐着我們在疫情期間工作、學習和生活可以繼續,不至於停滯。不過 RTC 技術還可以做更多,只是需要我們去發掘。

在去年 RTC 創新編程挑戰賽上,有一支團隊將聲網 Agora SDK 與機器學習結合,開發了一個視覺輔助產品,可以幫助用戶避障、導航、遠程指引等。我們邀請了這支來自上海科技大學的團隊分享了他們的開發經驗:

01

項目介紹

Guidoge是一套基於普通智能移動設備輔助視覺方案,它依託於Agora提供的實時音視視頻與機器學習,主要面向視障人士、騎行愛好者等有着視覺輔助及拓展需求的羣體。

我們通過RTC技術將移動端捕捉到的攝像頭圖像傳回後端服務器,使用深度學習技術進行場景理解等操作,並通過語音和震動等方式與用戶交互。這一產品無需複雜外設,僅憑一臺手機和一根掛繩(Guidoge Loop)即可實現對象識別、語音反饋等豐富的視覺增強功能。

02

項目初心


AI是一項神奇的發明,特別是近些年深度學習領域中GAN、殘差網絡的提出讓計算機視覺、語音合成等方向都有了長足的進步。

在調研最新的科研結果後,我想,既然我們已經有了合成自然語音以及表現出色的機器視覺技術,那麼只要加上RTC實時傳輸,我們就能實現這個夢想:我們將移動設備隨手掛在胸後,它便能在騎行時用自然的聲音告知後方來車;對於視障人羣,我們甚至不僅能讓Guidoge告訴他們前方的障礙物,甚至能將天空中雲的形狀、街邊發生的趣事都一一講述給他們。Guidoge不只是一個面向視障羣體開發的產品;它試圖解決的是所有人共同面臨的一個問題:視力的衰退與視覺面的不足。

03

主要功能

系統功能介紹

基於視覺輔助這一目的,Guidoge首先需要解決的問題就是障礙規避和導航。運行在移動設備上的客戶端通過RTC接口將視頻信息發送到Guidoge Server,在雲端進行Depth estimation步驟得到前景的深度信息,並通過Object Detection進行障礙識別。除此之外,客戶端程序還能根據預設路徑,利用第三方導航服務的API獲取路徑方案。

 Obstacle Detection(障礙檢測)方案

在這一技術方案中不止計算機視覺技術大放異彩,自然、流暢的語音合成系統也是打造“有溫度的交互”所必不可少的。片頭視頻中所採用的正是Google Tacotron2和WaveNet一同實現的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的手機到處亂跑,是非常愉快的敏捷開發體驗了!

04

未來展望

深度學習的進展使得AI技術呈現井噴式發展,大家都說短視頻與直播是下一個互聯網的“風口”,而5G套餐的第一個用戶就產生數月前。我們深信這些技術本身就具有非常光明的前景,而從它們之間的交叉結合能誕生出更振奮人心的新事物。當然,深入實踐的前提一定是對領域本身有足夠深刻的理解,這很難離得開科技巨頭和獨角獸企業研發部門的通力合作。

對Guidoge方案本身,或許它離真正落地還有一段距離,這段距離可能是5G的全面應用,也有可能是邊緣計算能力的提升。目前來說,Guidoge嘗試的RTC+AI+雲計算方案會是一種方向,爲之後使用RTC服務的開發者們開拓思路,甚至吸引更多志同道合的戰友一起深耕於這個實時化的、充滿互動技術的未來(也是我們團隊成員的美好願望)。

我們相信,未來不會太遠。

04

開源鏈接


  • 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 應聘快速通道,快拉上小夥伴報名吧!

點擊「閱讀原文」,報名參賽

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章