網課、視頻會議、視頻面試、視頻問診,這些基於 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(障礙檢測)方案api
在這一技術方案中不止計算機視覺技術大放異彩,天然、流暢的語音合成系統也是打造「有溫度的交互」所必不可少的。片頭視頻中所採用的正是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()})
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() }
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服務的開發者們開拓思路,甚至吸引更多志同道合的戰友一塊兒深耕於這個實時化的、充滿互動技術的將來(也是咱們團隊成員的美好願望)。
咱們相信,將來不會太遠。
RTC 2020 編程挑戰賽春季賽已經開啓報名了!本次大賽從 3月10日 ~ 4月21日 進行報名、組隊與開發,4 月 22 日至 4 月 24 日提交做品,4 月 25 日評獎,全程在線上進行。本次大賽準備了豐厚的大獎,獲獎者更有機會進入聲網 Agora 應聘快速通道,快拉上小夥伴報名吧!