The Moment

阿宅的筆記

Custom classifier of IBM visual recogintion

先前同仁利用 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.js
1
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 的效果如何呢 ? 我們以下面三張圖來測試 song_test_01.jpg shia_test_01.jpg shia_test_02.jpg

辨識(分類)的程式碼如下 (指定使用自訂的分類器)

ibm_detect.jg
1
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 同樣的條件可以分類捏,加油~~好嗎 ~~~)