我們可以從上一個例子看到 Deep features 用在圖片分類中的效用
我們可以獲得較為精確的分類,即使只用了特定分類任務裡的一小部分訓練集
透過 ImageNet 大賽獲勝的模型來尋找 Deep features
但如果你還記得一開始的動機
我們是要從中尋找我們喜歡的商品相似的圖像
所以除了圖像分類外,我們將使用 image retrieval 機制來獲取這些 Deep features
我們一樣使用先前使用的資料集
因為只需要要在 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, ... |
這其實非常簡單,跟之前的 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')
接著我們就可以使用這個模型來尋找相似的圖,為了看看模型經過訓練的成果
我們先用一個簡單的範例,取出一張圖,並且定義它
cat = image_train[18:19]
cat['image'].show()
現在我們想找尋與這隻貓,最相近的圖片,所以利用剛才訓練的 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()
你可以發現,得到的幾乎都是相似的虎斑貓的品種
接著我們來試試看,這個函數是不是可以輕易地應用在任何的例子
# Finding similar images to a car
car = image_train[8:9]
car['image'].show()
在這個例子裡面我們得到一台紅色的車子
同樣的我們將此返回給剛定義的輔助函數
get_images_from_ids(knn_model.query(car))['image'].show()
你會看到全部都是相似的紅色汽車
最後我想透過 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)
show_neighbors(7)
show_neighbors(2000)
你可以發現,它還是會有誤判得情形,但大多數時刻都可以得到正確的結果