用機器學習+實時音視頻,實現一個移動端的視覺輔助應用

網課、視頻會議、視頻面試、視頻問診,這些基於 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 應聘快速通道,快拉上小夥伴報名吧!

相關文章
相關標籤/搜索