先前同仁利用 Openface 這個 CMU 的專案做人臉識別的簡單測試,原本無法區別的宋芸樺/夏于喬在透過各十張的圖片做 Training 後就可以分辨出來了,有興趣的可以直接在 這裡看結果。上一回雖然 IBM 的 Visual Recognition 表現差強人意,推測是沒有 Train 的結果,正好利用這個機會 Train Train 看,再跟Openface PK 一下。
先講結論 : 相同的條件下,IBM 你連學生做的東西都打不贏,是有沒有要玩啊 ? XD XD
宋芸樺使用下列10張當 Training data
|
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
夏于喬的部份,因為Openface只餵了9張,雖然張數不同怪怪的,但公平起見,用一樣的9張
|
 |
 |
 |
 |
 |
 |
 |
 |
 |
|
IBM 的自訂分類比較麻煩的一點是除了要識別的目標外,還要一組 negative data,隨手找了鬼鬼的照片,一樣用10張 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
 |
把圖片依需求打包成 zip 檔song.zip/shia.zip/wu.zip。資料準備好了就來寫程式 Training 吧,程式範例如下
ibm_training.js1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| var watson = require("watson-developer-cloud"); var fs = require("fs"); var visual_recognition = watson.visual_recognition({ api_key: "<YOUR_OWN_API_KEY>", version_date: "2016-05-20", version: "v3" }); var params = { name: "actress", song_positive_examples: fs.createReadStream("./imgs/song.zip"), shia_positive_examples: fs.createReadStream("./imgs/shia.zip"), negative_examples: fs.createReadStream('./imgs/wu.zip') }; visual_recognition.createClassifier(params, function(err, response) { if (err) console.log(err); else console.log(JSON.stringify(response, null, 2)); } );
|
執行 node ibm_training.js
結果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { "classifier_id": "actress_1485364364", "name": "actress", "owner": "24ca4da2-2e53-435f-9ff2-67b576aaff53", "status": "training", "created": "2016-10-20T03:47:57.089Z", "classes": [ { "class": "song" }, { "class": "shia" } ] }
|
如需要的話,可以用下面的方式查詢你訓練好的 classifier
1 2 3 4 5 6 7 8
| visual_recognition.listClassifiers({}, function(err, response) { if (err) console.log(err); else console.log(JSON.stringify(response, null, 2)); } );
|
結果如下,其中 actress_2004286611 是我犯蠢用空資料做出來的 classifier,很合理的呈現 fail 的狀態,也剛好可以在稍後拿來測試
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| { "classifiers": [ { "classifier_id": "actress_2004286611", "name": "actress", "status": "failed" }, { "classifier_id": "actress_1485364364", "name": "actress", "status": "ready" } ] }
|
那這個我們自訓練的 classifier 的效果如何呢 ?
我們以下面三張圖來測試

辨識(分類)的程式碼如下 (指定使用自訂的分類器)
ibm_detect.jg1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| var watson = require("watson-developer-cloud"); var fs = require("fs"); var visual_recognition = watson.visual_recognition({ api_key: "<YOUR_OWN_API_KEY>", version_date: "2016-05-20", version: "v3" }); var input_file = process.argv[2]; console.log( input_file ); var params = { images_file : fs.createReadStream(input_file), classifier_ids: ["actress_1485364364", "actress_2004286611"] }; visual_recognition.classify(params, function(err, res) { if (err) console.log( err ); else console.log( JSON.stringify(res, null, 2)); });
|
來看結果吧
node ibm_detect.js song_test_01.jpg
1 2 3 4 5 6 7 8 9 10 11
| song_test_01.jpg { "custom_classes": 1, "images": [ { "classifiers": [], "image": "song_test_01.jpg" } ], "images_processed": 1 }
|
node ibm_detect.js shia_test_01.jpg
1 2 3 4 5 6 7 8 9 10 11
| shia_test_01.jpg { "custom_classes": 1, "images": [ { "classifiers": [], "image": "shia_test_01.jpg" } ], "images_processed": 1 }
|
node ibm_detect.js imgs/shia_test_02.jpg
1 2 3 4 5 6 7 8 9 10 11
| shia_test_02.jpg { "custom_classes": 1, "images": [ { "classifiers": [], "image": "shia_test_02.jpg" } ], "images_processed": 1 }
|
GG 啊!!一張都認不出來,是classifier 做壞掉了嗎 ?
用原先的 training data 回頭檢查
node ibm_detect.js song/1.jpg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| song/1.jpg { "custom_classes": 1, "images": [ { "classifiers": [ { "classes": [ { "class": "song", "score": 0.81114 } ], "classifier_id": "actress_1485364364", "name": "actress" } ], "image": "1.jpg" } ], "images_processed": 1 }
|
喔,是認得的呀.. 但 score 只有 0.8 是怎樣 ? 孩子明明是你生的呀~~~~
再來一張
node ibm_detect.js song/2.jpg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| song/2.jpg { "custom_classes": 1, "images": [ { "classifiers": [ { "classes": [ { "class": "song", "score": 0.809645 } ], "classifier_id": "actress_1485364364", "name": "actress" } ], "image": "2.jpg" } ], "images_processed": 1 }
|
那夏的情況呢 ???
node ibm_detect.js shia/1.jpg
1 2 3 4 5 6 7 8 9 10 11
| shia/1.jpg { "custom_classes": 1, "images": [ { "classifiers": [], "image": "1.jpg" } ], "images_processed": 1 }
|
ㄟㄟㄟ,是怎樣,親兒子都不認就是了?? 來研究看看是不是 training 的樣本數不夠的關係好了
(只是,人家 openface 同樣的條件可以分類捏,加油~~好嗎 ~~~)