看過(guò)美劇《硅谷》的同學(xué)都知道人工智能識(shí)別熱狗曾是硅谷最賺錢(qián)的技術(shù)之一斟或。去年 HBO 發(fā)布了官方的 Not Hotdog 應(yīng)用瘤缩,支持 iOS 和 Android 平臺(tái),據(jù)說(shuō)是用 TensorFlow叽躯、Keras 和 React Native 打造的檩坚,但是源碼沒(méi)有公開(kāi)。
最近入門(mén)了機(jī)器學(xué)習(xí)的一些邊邊角角崇猫,仿制了一個(gè) Not Hotdog 應(yīng)用沈条。代碼主要使用 React Native 和 TensorFlow Mobile ,訓(xùn)練模型使用 Yolo v2 Tiny诅炉。
源代碼
https://github.com/shaqian/Not-Hotdog
效果圖
是時(shí)候表演真正的技術(shù)了 —— 畫(huà)框
建模過(guò)程
1. 制作數(shù)據(jù)集
偷懶用了 COCO 2014 數(shù)據(jù)集蜡歹。COCO 一共有 80 種物體類別,其中一個(gè)就是熱狗 (hot dog)涕烧。我寫(xiě)了個(gè)腳本導(dǎo)出所有的熱狗圖片(共 1200 多張)并生成 yolo 格式的標(biāo)注:
https://github.com/shaqian/Not-Hotdog/blob/master/yolo/coco2yolo.py
2. 訓(xùn)練 Yolov2 Tiny
使用的是 darknet 的 這個(gè) fork 月而。
- 首先從預(yù)訓(xùn)練的 yolov2 tiny 模型 提取初始 weights:
darknet.exe partial yolov2-tiny.cfg yolov2-tiny.weights yolov2-tiny.conv.13 13
然后整理數(shù)據(jù)集,主要是生成 obj.data 和 obj.names 文件议纯,可參考:
https://timebutt.github.io/static/how-to-train-yolov2-to-detect-custom-objects/修改 .cfg 文件:
將原本的 80 個(gè)類別改成 1 個(gè)類別父款。.cfg 文件和初始 weights 請(qǐng)見(jiàn) GitHub repo 。最后訓(xùn)練模型:
darknet.exe detector train data\obj.data yolov2-tiny-hotdog.cfg yolov2-tiny.conv.13
3. 將 weights 轉(zhuǎn)為 TensorFlow protobuf (.pb) 格式
我用的 darkflow 轉(zhuǎn)換:
flow --model ../yolov2-tiny-hotdog.cfg --load ../yolov2-tiny-hotdog_final.weights --savepb
4. 量化
轉(zhuǎn)換后的 .pb 約有 44MB瞻凤。用 TensorFlow repo里面的 quantization 腳本 壓縮一下憨攒,體積可以減小到 11MB。
python3 tensorflow/tools/quantization/quantize_graph.py --input=yolov2-tiny-hotdog.pb --output_node_names=output --output=quantized_yolov2-tiny-hotdog.pb --mode=weights
制作應(yīng)用
React Native 的 Native 模塊
出于方便鲫构,調(diào)用 TensorFlow Mobile 接口是自己實(shí)現(xiàn)的 native 模塊浓恶。
iOS 端的實(shí)現(xiàn)代碼在 ./react-native-NotHotdog/ios/NotHotdog/TensorflowManager.mm
Android 端的實(shí)現(xiàn)代碼在 ./react-native-NotHotdog/android/app/src/main/java/com/nothotdog/tensorflowmanager
參考了以下 repo 特此感謝:
依賴庫(kù)一覽
- TensorFlow Mobile: iOS, Android
- react-native-camera
- react-native-share
- react-native-fs
- react-native-svg
- react-native-animatable
準(zhǔn)備工作
將 ./yolo 文件夾的 quantized_yolov2-tiny-hotdog.pb 復(fù)制至以下路徑:
- react-native-NotHotdog/android/app/src/main/assets
- react-native-NotHotdog/ios/NotHotdog/data
安裝依賴
- iOS 的 TensorFlow Mobile 用 pod 安裝:
cd react-native-NotHotdog/ios
pod install
- 安裝其他依賴:
cd react-native-NotHotdog/
npm install
運(yùn)行
iOS
- 模擬器:
react-native run-ios
-
真實(shí)設(shè)備:
請(qǐng)參考 Running your app on iOS devices。
Android
由于 react-native-camera 的一些問(wèn)題结笨,Android 端拍照要比 iOS 慢很多包晰,有時(shí)間可以改進(jìn)一下。
GitHub repo 里的 hotdog.apk 可直接安裝炕吸。
模擬器:
react-native run-android
-
真實(shí)設(shè)備:
請(qǐng)參考 Running your app on Android devices伐憾。