昨天有幸參加了ArchSummit北京2016全球架構(gòu)師峰會(huì),其中對(duì)阿里巴巴技術(shù)專家引商(花名)的《擁抱創(chuàng)新-聚劃算無(wú)線團(tuán)隊(duì)創(chuàng)新玩法實(shí)踐》感觸頗多。索性也來(lái)談?wù)勔苿?dòng)平臺(tái)創(chuàng)新玩法。
什么是移動(dòng)平臺(tái)創(chuàng)新玩法
2016年7月7日,由任天堂、Pokémon公司和谷歌Niantic Labs公司聯(lián)合制作開發(fā)的手游《Pokémon GO》在澳大利亞新西蘭區(qū)域首發(fā),引爆了國(guó)內(nèi)的新技術(shù)熱潮,AR、VR、MR紛紛出現(xiàn)在公眾視野。
VR-Virtual Reality(虛擬現(xiàn)實(shí)),是利用電腦模擬產(chǎn)生一個(gè)三維空間的虛擬世界,提供使用者關(guān)于視覺、聽覺、觸覺等感官的模擬,讓使用者如同身歷其境一般,可以及時(shí)、沒有限制地觀察三度空間內(nèi)的事物。
AR-Augmented Reality(增強(qiáng)現(xiàn)實(shí)),指通過(guò)電腦技術(shù)將虛擬的信息應(yīng)用到真實(shí)世界,真實(shí)的環(huán)境和虛擬的物體實(shí)時(shí)疊加到了同一個(gè)畫面或空間。
MR-Mixed Reality(混合現(xiàn)實(shí)),又稱Hybrid Reality,將真實(shí)世界和虛擬世界混合在一起,來(lái)產(chǎn)生新的可視化環(huán)境,環(huán)境中同時(shí)包含了物理實(shí)體與虛擬信息,并且必須是實(shí)時(shí)的。
如何區(qū)分AR和MR呢?簡(jiǎn)單的區(qū)分辦法是:虛擬物體的相對(duì)位置是否隨設(shè)備的移動(dòng)而移動(dòng),如果是,就是AR;如果不是,就是MR。
當(dāng)然移動(dòng)平臺(tái)創(chuàng)新玩法遠(yuǎn)不止這些,人人都是產(chǎn)品設(shè)計(jì)師嘛。
和AR有個(gè)約會(huì)
今年9月份,產(chǎn)品經(jīng)理跑過(guò)來(lái)問(wèn):我們能不能做一個(gè)AR相關(guān)的功能?于是開啟了一段AR之路。首先要做的是技術(shù)選型,也就是技術(shù)領(lǐng)域的調(diào)研,筆者選型依據(jù):
1、跨平臺(tái);
2、能快速接入,做出演示Demo;
3、免費(fèi)。
因此和聚劃算無(wú)線團(tuán)隊(duì)一樣,選擇了EasyAR。考慮快速出成果,沒有使用其中的Unity 3D SDK。

EasyAR的技術(shù)架構(gòu),由于閉源筆者只能大致猜測(cè)一二。

**Camera **- 攝像頭負(fù)責(zé)圖像二進(jìn)制流數(shù)據(jù)的采集,跨平臺(tái)封裝了PC、iOS和Android的攝像頭設(shè)備
Player - 視頻播放器,可支持脫卡播放,目前不支持3D模型
**ImageTarget **- 配置識(shí)別目標(biāo)圖信息
Frame - 攝像頭采集到二進(jìn)制流數(shù)據(jù)幀數(shù)據(jù)處理,并通過(guò)OpenGL渲染至界面
Barcode - 二維碼識(shí)別模塊
Recongnition - 圖像識(shí)別模塊,這是EasyAR的核心部分,目前的版本只能本地識(shí)別本地圖片,不支持云識(shí)別功能。支持云識(shí)別的2.0版本從10月底開始跳票,至今難產(chǎn)
Tracker - 圖像跟蹤模塊
為了支持“云識(shí)別”功能,筆者做了簡(jiǎn)單處理:把網(wǎng)絡(luò)圖片下載至本地加載,變相實(shí)現(xiàn)“云識(shí)別”功能。由于ImageTarget模塊支持動(dòng)態(tài)加載、卸載,在實(shí)際移動(dòng)應(yīng)用中也不太可能出現(xiàn)同時(shí)識(shí)別太多目標(biāo)圖片的需求,因此這是一種簡(jiǎn)易可行的方法。
有興趣的可以參見 https://github.com/zhangyinglong/ARKit 的效果。
關(guān)于圖像識(shí)別算法(相似圖片搜索算法)
首先來(lái)普及兩個(gè)術(shù)語(yǔ),圖像指紋和漢明距離。圖像指紋和人的指紋一樣,是身份的象征,而圖像指紋簡(jiǎn)單點(diǎn)來(lái)講,就是將圖像按照一定的哈希算法,經(jīng)過(guò)運(yùn)算后得出的一組二進(jìn)制數(shù)字。漢明距離(計(jì)算機(jī)科班出身的應(yīng)該都不陌生),就是指從A變成B所經(jīng)過(guò)的步驟數(shù),這里指的是圖像指紋的二進(jìn)制數(shù)據(jù)變成另一組數(shù)據(jù)所需的步驟數(shù),顯然,這個(gè)數(shù)值可以衡量?jī)蓮垐D片的差異,漢明距離越小,則代表相似度越高。漢明距離為0,即代表兩張圖片完全一樣。
筆者猜測(cè)EasyAR可能使用的是圖像指紋算法,常見的有三種:
平均哈希值(aHash)算法,是基于比較灰度圖每個(gè)像素與平均值來(lái)實(shí)現(xiàn)的。
步驟如下:
1.縮小圖片:保留結(jié)構(gòu)去掉細(xì)節(jié),去除大小、橫縱比的差異,把圖片統(tǒng)一縮放到88,共64個(gè)像素的圖片。
2.轉(zhuǎn)化為灰度圖:把縮放后的圖片轉(zhuǎn)化為256階的灰度圖。
附上灰度圖相關(guān)算法(R = red, G = green, B = blue)
1).浮點(diǎn)算法:Gray=R0.3+G0.59+B0.11
2).整數(shù)方法:Gray=(R30+G59+B11)/100
3).移位方法:Gray =(R76+G151+B28)>>8;
4).平均值法:Gray=(R+G+B)/3;
5).僅取綠色:Gray=G;
3.計(jì)算平均值: 計(jì)算進(jìn)行灰度處理后圖片的所有像素點(diǎn)的平均值。
4.比較像素灰度值:遍歷灰度圖片每一個(gè)像素,如果大于平均值記錄為1,否則為0。
5.得到信息指紋:組合64個(gè)bit位,順序隨意保持一致性即可。
6.對(duì)比指紋:計(jì)算兩幅圖片的指紋,計(jì)算漢明距離(從一個(gè)指紋到另一個(gè)指紋需要變幾次),漢明距離越大則說(shuō)明圖片越不一致,反之,漢明距離越小則說(shuō)明圖片越相似,當(dāng)距離為0時(shí),說(shuō)明完全相同。(通常認(rèn)為距離>10 就是兩張完全不同的圖片)。
平均哈希算法過(guò)于嚴(yán)格,不夠精確,更適合搜索縮略圖。
感知哈希(pHash)算法,采用的是DCT(離散余弦變換)來(lái)降低頻率的方法。
步驟如下:
1.縮小圖片:32 * 32是一個(gè)較好的大小,這樣方便DCT計(jì)算。
2.轉(zhuǎn)化為灰度圖:把縮放后的圖片轉(zhuǎn)化為256階的灰度圖。(具體算法見平均哈希算法步驟)
3.計(jì)算DCT:DCT把圖片分離成分率的集合
4.縮小DCT:DCT計(jì)算后的矩陣是32 * 32,保留左上角的8 * 8,這些代表的圖片的最低頻率
5.計(jì)算平均值:計(jì)算縮小DCT后的所有像素點(diǎn)的平均值。
6.進(jìn)一步減小DCT:大于平均值記錄為1,反之記錄為0.
7.得到信息指紋:組合64個(gè)信息位,順序隨意保持一致性。
8.對(duì)比指紋。
dHash算法
步驟如下:
1.縮小圖片:收縮到9*8的大小,以便它有72的像素點(diǎn)
2.轉(zhuǎn)化為灰度圖:把縮放后的圖片轉(zhuǎn)化為256階的灰度圖。(具體算法見平均哈希算法步驟)
3.計(jì)算差異值:dHash算法工作在相鄰像素之間,這樣每行9個(gè)像素之間產(chǎn)生了8個(gè)不同的差異,一共8行,則產(chǎn)生了64個(gè)差異值
4.獲得指紋:如果左邊的像素比右邊的更亮,則記錄為1,否則為0.最后比對(duì)兩張圖片的指紋,獲得漢明距離即可。
相比pHash,dHash的速度要快的多,相比aHash,dHash在效率幾乎相同的情況下的效果要更好,它是基于漸變實(shí)現(xiàn)的。
基于OpenCV的圖像識(shí)別算法
此外,今年10月雅虎開源了一個(gè)基于深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)算法 - 色情圖片檢測(cè),有興趣的朋友可以去研究一下,體驗(yàn)一下深度學(xué)習(xí)。
云識(shí)別引擎
這里就引用阿里巴巴PPT中的流程圖來(lái)說(shuō)明

UI主線程在OpenGL渲染過(guò)程中,會(huì)不斷地從當(dāng)前幀數(shù)據(jù)中獲取traker狀態(tài)值,獲取到表示目標(biāo)已識(shí)別,否則表示目標(biāo)未識(shí)別。當(dāng)前已識(shí)別的會(huì)被標(biāo)記為跟蹤目標(biāo),若跟蹤目標(biāo)的traker狀態(tài)值變?yōu)閬G失時(shí),則表示識(shí)別失敗目標(biāo)已丟失,主線程進(jìn)入下一輪循環(huán)。即左部分的流程圖,右部分的圖表示圖像識(shí)別的算法過(guò)程。
阿里巴巴集團(tuán)作為中國(guó)互聯(lián)網(wǎng)的龍頭之一自然不會(huì)受制于任何第三方,于是開始搭建自己的云識(shí)別系統(tǒng),說(shuō)不定還會(huì)放到阿里云,開放云識(shí)別能力(EasyAR會(huì)不會(huì)感到亞歷山大呢)。所謂云識(shí)別,指的是無(wú)需將識(shí)別目標(biāo)下載至本地,即可識(shí)別的技術(shù)。



新玩法暢想
《Pokémon GO》基于LBS系統(tǒng)的玩法與電商APP結(jié)合,當(dāng)用戶走在路上發(fā)現(xiàn)某個(gè)人穿了一件很漂亮的衣服,掏出手機(jī)掃一掃立刻會(huì)顯示出穿在路人身上衣服的所有信息,并智能引導(dǎo)用戶去最近的商鋪購(gòu)買,推薦最新的優(yōu)惠信息等。當(dāng)然要是不用掏手機(jī),而是像Google Glass那樣的可穿戴智能設(shè)備體驗(yàn)更佳。
再比如,用戶看到網(wǎng)上某件衣服很想買,但有擔(dān)心看到的和實(shí)際的不一樣,掏出手機(jī)掃一掃,立刻可以把識(shí)別出來(lái)的衣服像游戲裝備一樣穿在身上,體驗(yàn)試穿效果??傊X洞打開。