iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 26
0

Deep features for image retrieval

我們可以從上一個例子看到 Deep features 用在圖片分類中的效用

我們可以獲得較為精確的分類,即使只用了特定分類任務裡的一小部分訓練集

透過 ImageNet 大賽獲勝的模型來尋找 Deep features

但如果你還記得一開始的動機

我們是要從中尋找我們喜歡的商品相似的圖像

所以除了圖像分類外,我們將使用 image retrieval 機制來獲取這些 Deep features

Loading image data

我們一樣使用先前使用的資料集

因為只需要要在 train set 中進行索引,所以在這個情形下只載入 train set 的資料

import graphlab

image_train = graphlab.SFrame('image_train_data/')

此時若我們觀察 train_data 的資料集

image_train.head()

這裡的id是指圖像,不是用來索引的標籤,實際上我們並不會用到它,我們只會用到 deep_features

id image label deep_features image_array
24 Height: 32 Width: 32 bird [0.242871761322,1.09545373917, 0.0, ... [73.0, 77.0, 58.0, 71.0,68.0, 50.0, 77.0, 69.0, ...
33 Height: 32 Width: 32 cat [0.525087952614, 0.0,0.0, 0.0, 0.0, 0.0, ... [7.0, 5.0, 8.0, 7.0, 5.0,8.0, 5.0, 4.0, 6.0, 7.0, ...
36 Height: 32 Width: 32 cat [0.566015958786, 0.0,0.0, 0.0, 0.0, 0.0, ... [169.0, 122.0, 65.0,131.0, 108.0, 75.0, ...
70 Height: 32 Width: 32 dog [1.12979578972, 0.0, 0.0,0.778194487095, 0.0, ... [154.0, 179.0, 152.0,159.0, 183.0, 157.0, ...
90 Height: 32 Width: 32 bird [1.71786928177, 0.0, 0.0,0.0, 0.0, 0.0, ... [216.0, 195.0, 180.0,201.0, 178.0, 160.0, ...
97 Height: 32 Width: 32 automobile [1.57818555832, 0.0, 0.0,0.0, 0.0, 0.0, ... [33.0, 44.0, 27.0, 29.0,44.0, 31.0, 32.0, 45.0, ...
107 Height: 32 Width: 32 dog [0.0, 0.0,0.220677852631, 0.0, ... [97.0, 51.0, 31.0, 104.0,58.0, 38.0, 107.0, 61.0, ...
121 Height: 32 Width: 32 bird [0.0, 0.23753464222, 0.0,0.0, 0.0, 0.0, ... [93.0, 96.0, 88.0, 102.0,106.0, 97.0, 117.0, ...
136 Height: 32 Width: 32 automobile [0.0, 0.0, 0.0, 0.0, 0.0,0.0, 7.5737862587, 0.0, ... [35.0, 59.0, 53.0, 36.0,56.0, 56.0, 42.0, 62.0, ...
138 Height: 32 Width: 32 bird [0.658935725689, 0.0,0.0, 0.0, 0.0, 0.0, ... [205.0, 193.0, 195.0,200.0, 187.0, 193.0, ...

Creating a nearest neighbors model for image retrieval

這其實非常簡單,跟之前的 document retrieval 很相似

我們用它來找與 Barack Obama 相似的文檔

所以首先我們要先訓練一個 nearest neighbors 模型

# Train a nearest-neighbors model for retrieving images using deep features
knn_model = graphlab.nearest_neighbors.create(image_train,features=['deep_features'],
                                             label='id')

Querying the nearest neighbors model to retrieve images

接著我們就可以使用這個模型來尋找相似的圖,為了看看模型經過訓練的成果

我們先用一個簡單的範例,取出一張圖,並且定義它

cat = image_train[18:19]
cat['image'].show()

https://ithelp.ithome.com.tw/upload/images/20180113/20107448hEmabGxIp8.jpg

現在我們想找尋與這隻貓,最相近的圖片,所以利用剛才訓練的 knn_model 來實現

knn_model.query(cat)
query_label reference_label distance rank
0 384 0.0 1
0 6910 36.9403137951 2
0 39777 38.4634888975 3
0 36870 39.7559623119 4
0 41734 39.7866014148 5

最相近的編號是384號,也就是這張圖片本身的編號

透過編號去查找是一件相對麻煩的事情,所以我們可以使用一個輔助函數,透過它來顯示對應的圖片

def get_images_from_ids(query_result):
    return image_train.filter_by(query_result['reference_label'],'id')

在使用這個函數之前我想先做點小實驗,把這個函數應用到剛剛尋找與 cat 鄰近的結果

cat_neighbors = get_images_from_ids(knn_model.query(cat))
cat_neighbors['image'].show()

你可以發現,得到的幾乎都是相似的虎斑貓的品種
https://ithelp.ithome.com.tw/upload/images/20180113/201074485aMzZdWhCd.jpg

接著我們來試試看,這個函數是不是可以輕易地應用在任何的例子

# Finding similar images to a car
car = image_train[8:9]
car['image'].show()

在這個例子裡面我們得到一台紅色的車子

https://ithelp.ithome.com.tw/upload/images/20180113/20107448nGIOvklUEK.jpg

同樣的我們將此返回給剛定義的輔助函數

get_images_from_ids(knn_model.query(car))['image'].show()

你會看到全部都是相似的紅色汽車

https://ithelp.ithome.com.tw/upload/images/20180113/20107448qkSodY2qMF.jpg

Displaying other example image retrievals with a Python lambda

最後我想透過 python 的 lambda,來個自覺的產生相應的圖片

#create a lambda to find and show nearest neighbor images
show_neighbors = lambda i: get_images_from_ids(knn_model.query(image_train[i:i+1]))['image'].show()
show_neighbors(1314)

https://ithelp.ithome.com.tw/upload/images/20180113/20107448DHa9QEDHiq.jpg

show_neighbors(7)

https://ithelp.ithome.com.tw/upload/images/20180113/20107448Bk071QFQt1.jpg

show_neighbors(2000)

https://ithelp.ithome.com.tw/upload/images/20180113/20107448a4DaxGlNfX.jpg

你可以發現,它還是會有誤判得情形,但大多數時刻都可以得到正確的結果

Reference:


上一篇
[day 24] 深度學習-小範例
下一篇
[Day26] Deploying machine learning as a service
系列文
到底是在learning什麼拉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言