2011年5月1日 星期日

Recognize your friend with Face.com

替照片上的每個人都加上標籤(tag)是一個蠻好用的功能, 這可以方便你找到有某人的照片, 或是一群人在某時的合照, 如果善加利用是相當好用的功能, 目前主流的幾個相片服務像是Flickr, Facebook, Picasa等等, 都有這樣的功能

其中以Picasa的功能最為先進, 它可以自動幫你把你所有照片裡的朋友都挑出來標示, 不像Flickr跟Facebook就只能手動

如果每張照片都只能手動標示的話, 標示完所有的照片是很累人的, 更何況可能還有很多未標示的舊照片, 就這點來說, Picasa就強勁很多, 至於Facebook和Flickr呢? 所幸有Face.com

Face.com是一個做自動標示的服務, 其實這樣講有點狹隘, 自動標示照片的服務只是它其中一個產品 - PhotoTagger, PhotoTagger的用處就有點像Picasa做的一樣, 自動幫你把照片的人物找出來做標示:

_2011-05-01_8
當然準確度不會到100%那麼高啦, 不過加上手動輔助的話, 已經可以節省不少功夫了

此外還有PhotoFinder和CelebrityFindr....不過這些並不是重點, 它真正比較強大的是, 它乾脆把它的Face detection和Face recogintion 的API開放出來, 讓你可以利用它們的雲端運算做出自己的應用

它的API是以REST的形態提供的, 支援的後端服務有Facebook, Flickr, Twitter, 基本的API也大致相當完整, train, detect, recongnize, tag等等, 如果是做Facebook相關的應用, 甚至可以省略過train的部份, 就可以達到辨識的效果

當然, 剛剛的應用像是PhotoTagger都是以拍完後的照片為目標而做的, 如果拍照完後馬上就可以找出有哪些人可以tag的話, 那就更棒了

為了實驗這個我寫了一個簡單的Android app - Face.me , 只要拿著Android手機對著你朋友拍一張(按螢幕畫面), 它就會利用Face.com去找出你這朋友的名字 (可以從連結下載APK安裝, 因為Camera部分不熟, 寫的不太好, 可能會有bug, 就不open source了 :P) 

這App利用了一個open source的Face.com的Java lib叫face4j, 基本上這lib移植到Android上並不困難, 它用到一些apache commons, http的library, 只要把這些含入就可以

要開發這個, 首先你必須要有Facebook API key和Face.com的API key, Face.com的API key可以到這裡註冊個新的, 另外還得把Facebook的API key和secret註冊到Face.com上(看你信不信任它囉)

Facebook API的部份, 我是用Facebook Android SDK去開發的, 其實也沒用到幾個API, 大致上只有login和取得自己的UID而已

另外由於face4j在reconigize這個method只支援檔案跟url兩種方式, 我另外修改了一個支援input stream的:

https://gist.github.com/950492.js?file=gistfile1

 

剩下的部份就簡單了, 在Camera.takePicture的第三個參數的PictureCallback.onPictureTaken裡加上: