動機
之前寫了篇 tfjs 移植到微信小程序,本來以為沒什么人會感興趣,就只是大概寫了個思路。
前幾天,突然有讀者通過公眾號聯系我,咨詢實現細節。我心血來潮微信小程序調用電子海圖,想把之前的代碼再折騰下,搞個 Demo 再開源出去,沒準還能火一把?
坎坷的嘗試從頭開始
把大象裝進冰箱需要三步,但是首先得有冰箱和大象。距離上篇文章已經快半年時間了,原來的 Demo 代碼早就不知道扔哪里去了,只剩下之前改造的 wx-tfjs-core。
因為需要 tfjs-core 和 tfjs- 配合使用,才能實現模型的加載和預測功能。兩者版本要一致,而我已經不太記得當時的 tfjs-core 和 tfjs- 是從哪個時間點拉的代碼,真的是雪上加霜。
克隆了 wx-tfjs-core 到本地,再把 tfjs-core 的官方代碼合進去重新編譯后,下載官方編譯好的 tfjs-,一起引入小程序中。
正要開始實現的時候,我發現一個比較嚴重的問題:加載模型的 API 變了。emoji--hunt中使用的 已經廢棄微信小程序調用電子海圖,改用 。
兩者最主要的區別在于, 分別加載 .pb 和 .json,而新接口則是把兩者統一到一個 json 文件中。這個倒是還可以解決的,畢竟有相應的解決方案:
git clone git@github.com:tensorflow/tfjs-converter.git

cd tfjs-converter
yarn
yarn ts-node tools/pb2json_converter.ts pb_model_directory/ json_model_directory/
麻煩的地方在于,需要對之前改造 tfjs-core 時寫的一些方法做改造,比較費時費力。而且使用模型預測的代碼也不適用了,真叫人頭大。
發現新大陸
某天晚上,洗完澡躺床上思考人生的時候,我突然想到之前有把代碼通過微信傳給別人。于是我馬上搜索微信聊天記錄,把代碼轉存到了本地,真是天助我也!
打開微信開發工具,導入代碼運行,一氣呵成!看著控制臺輸出的模型加載的相關日志,我仿佛看到了曙光。當然事情也不是那么順利,由于微信可能又做了什么升級,原來改造的一些代碼,不得不「重構」一番。
比如,原來寫的 fetch 方法中,用于將 轉成字符串的 ..apply(null, xxx),現在在手機端已經無法正常運行,總是報類似「調用棧溢出」的錯誤。
實現思路
解決一些基本的 BUG 之后,算是能夠在手機端正常加載模型,對打開的圖片進行識別了。但這還不夠,我要做的是利用攝像頭成像,然后識別所拍攝的物體。
多番嘗試之后,我找到了可行的辦法:攝像頭成像之后,將圖片顯示在 中,通過小程序的 API 可以獲取到 的「類 」數據,再調用 tfjs 的 API 實現預測。
至于剛剛提到的「類 」,是因為獲取到的數據格式和 是基本一致的,不過小程序中并沒有提供 這個類。
Demo 效果
代碼開源在 wx-tfjs-demo,可以改進的地方很多,感興趣的同學可以優化然后提交 PR。具體的功能代碼實現和 UI 調整,我就不啰嗦了,看下 Demo 的實現效果吧。
微信小程序運行 結語
熬了幾次夜,匆匆搞出來的 Demo,模型的預測效果還行,不過代碼寫得比較隨意。因為是純 CPU 運算,預測的速度不快,如果能深度定制化 tfjs-core,速度應該還可以再次提高。
如果只是純興趣愛,本人是不打算繼續深挖了,小程序的坑怎么都填不完,表示再也不想開發微信小程序!另外,如果該項目對你有幫助,歡迎通過各種途徑贊賞!
參考資料