:::

你也懂初音?Weka辨識彩色圖片的分類與預測 / Colorful Images Classification with Weka

image

在「從圖片抽取量化特徵:Weka的ImageFilter」這篇的介紹之後,我們知道怎麼利用Weka的Image Filter從圖片中抽取量化特徵,並進一步用於圖片分類上。本篇我們就以Terrence所撰寫的「用tflearn來做深度學習辨識初音」中分辨初音的例子,用Weka來實作看看吧。


Weka運作環境 / Weka Environment

2017-06-04_193916

本文是使用Weka 3.8.1版本,並安裝Image Filter套件。關於Weka的介紹、下載以及Image Filter套件的安裝,請參考「Weka下載與套件安裝教學」這篇。

初音資料集 / Miku Image Files

這份資料中有20張初音的圖片、20張不是初音的圖片,以及10張未知的圖片(前5張是初音、後5張不是初音)。

miku_1miku_2miku_3

這些圖片是初音,標示為「miku」。

no-miku_1no-miku_2no-miku_3

這些圖片不是初音,分類目標class標示為「no-miku」。

從這兩種類型圖片,我們可以發現分辨初音跟不是初音的主要關鍵,可能就在與綠色的「顏色」跟雙馬尾髮型的「紋理」,因此待會我們會使用Image Filter中的「FCTHFilter」來抽取特徵。

檔案下載 / miku_set.zip download

原檔案來自「用tflearn來做深度學習辨識初音」這篇,我下載後重新整理,並配上Weka分類圖片所需要的「圖片分類檔」之後,重新打包為以下檔案:

image

請下載後解壓縮該檔案,並記得miku_set資料夾的路徑,待會會用到。

在這個壓縮檔中,我先用圖片分類檔小工具weka-imagefilter-arff-builder.exe製作了兩個圖片分類檔:

  • train-set.arff:裡面包含了圖片檔案名稱跟已知的分類目標,我們知道這些圖片是初音或不是初音。
  • test-set.arff:裡面包含了圖片檔案名稱,但是分類目標未知,我們不知道這些檔案是不是初音,待會要請Weka來判斷。

準備好Weka跟miku_set之後,我們就要來作圖片分類囉。


Weka分類彩色圖片 / Colorful Image Classification with Weka

大致上我們的操作流程跟「不寫程式也能預測未知!用Weka分類模型來預測未知案例」這篇一樣。不過因為我們需要從圖片中抽取特徵的關係、並且刪除filename這個屬性,設定分類器的時候會搭配兩層的FilteredClassifier來使用,所以我稍微調整了整個操作流程。這整個操作時很容易令人搞混,請讀者仔細謹慎地一步一步操作吧。

整個分類的處理流程分成兩大階段:1. 建立模型並評估模型的正確率、2. 預測未知案例。讓我們繼續看看怎麼作吧。

Phase 1. 建立模型、並評估模型正確率 / Model Building and Evaluation

image

1. 開啟Weka,從GUI Chooser中開啟Explorer,然後用Open file開啟「train-set.arff」。

image

2. 點選「Classify」分頁進入分類功能。

image

3. 點選Classifier的「Choose」按鈕。

image

4. 選擇「weka.classifiers.meta.FilteredClassifier」,這個路徑中間的「.」等同於操作介面中的資料夾。接下來我會直接將這兩個動作簡稱為:按下「Choose」後選擇「weka.classifiers.meta.FilteredClassifier」,不再截圖敘述。

image

5. 點選粗體字「FilteredClassifier」進入設定。

image

6. 在classifier (分類器)的「Choose」選擇「weka.classifiers.meta.FilteredClassifier」,而filter (篩選器)的「Choose」選擇「weka.filters.unsupervised.instance.imagefilter.FCTHFilter」。

image

7. 點選filter中的粗體字「FCTHFilter」,進入篩選器的設定。

image

8. 在FCTHFilter的設定中的imageDirectory (圖片欄位)欄位中,輸入miku_set的資料夾路徑。例如:「C:\Users\Admin\Desktop\miku_set」。設定完成後按下「OK」退出回到上一層。

image

9. 接下來改設定classifier中的內層「FilteredClassifier」,請按下粗體字進入設定吧。

image

10. 現在我們要設定的是「FilteredClassifier」中classifier (分類器)的內層「FilteredClassifier」,跟前面很像但是是不一樣的,請小心謹慎地操作,不要搞混囉。

在內層FilteredClassifier中的classifier的「Choose」選擇「weka.classifieres.functions.SMO」,而filter (篩選器)的「Choose」選擇「weka.filters.unsupervised.attribute.RemoveByName」。

image

11. 點選filter中的粗體字「RemoveByName」進入設定。

image

12. 在RemoveByName篩選器中的expression欄位輸入「filename」。這個意思是分類時我們要刪掉「filename」屬性,分類時不要把它考慮在內。設定完成後按下「OK」退出。

image

13. 接下來一直按「OK」退出到Classify主畫面吧。

image

14. Test options (評估方式)選擇「Cross-validation Folds: 10」 (交互驗證:10疊)。這是預設值,一般來說不用修改。

 image

15. 進入「More options…」。

image

16. Output predictions (輸出預測結果)的「Choose」選擇「weka.classifiers.evaluation.output.prediction.CSV」。

image

17. 點下「CSV」粗體字,進入設定。

image

18. outputDistribution (輸出預測機率分佈)設定為「True」,然後一直按「OK」退出到Classifier主畫面。

image

19. 分類目標選擇「(Nom) class」。這是預設值,一般來說不用修改。

image

20. 按下「Start」。

image

21. 等待Weka跑完之後,右邊的Classifier output (分類輸出)可以找到「Correctly Classified Instances          39               97.5    %」。39表示分類正確的數量,後面的「97.5%」就是分類的正確率。表示40張圖片中只有1張分類錯誤。

到目前為止,第一階段「建立模型、並評估模型正確率」就此結束。我們得知此模型的正確率為「97.5%」,接著繼續下一階段。


Phase 2. 預測未知案例 / Unknown Prediction

這一階段我們會用前一階段以「train-set.arff」建立的模型來預測未知案例「test-set.arff」。全部操作都繼續面前階段的內容,讓我們看看怎麼作吧。

image

1. Test options (評估選項)選擇「Supplied test set」,並按下「Set」按鈕。

image

2. 按下「Open file」中選擇「test-set.arff」,然後按下「Close」退出回到Classifier主畫面。

image

3. 按下「Start」開始分類。

image

4. 等待Weka跑完之後,右邊的Classifier output (分類輸出)可以找到「Predictions on test set」,裡面寫著對未知案例的預測結果。每一種結果以逗號「,」分隔不同欄位。

取得「Predictions on test set」之後,這一階段大致上的處理流程就結束了。讓我們來看看預測結果每個欄位代表的意思:

  1. inst# (案例編號):跟原本的test-set.arff對應,從上而下為每一個案例編號。因此1就是對應到檔案「unknown_1.jpg」。
  2. actual (實際分類):因為分類項目是未知,所以這裡都是「?」。不過實際上我們知道編號1至5是初音,6到10不是初音。
  3. predicted (預測分類):這裡Weka會預測該圖片的分類,有些是「miku」,有些是「no-miku」。
  4. error (發生錯誤):如果有錯誤,這個欄位會顯示「+」。不過因為Weka不知道正確答案,所以不會有資料。
  5. distribution (分類機率分佈):表示該案例分類到「miku」或「no-miku」的機率。

從預測結果中可以發現兩個錯誤分類的案例:

  • 案例編號2被分類到「no-miku」。
    unknown_2
    是因為綠色的範圍相對較小嗎?
  • 案例編號6被分類到「miku」。
    unknown_6
    是因為這個紋理很像是馬尾嗎?

到此為止,我們就這樣完成了彩色圖片的分類與預測囉。雖然步驟看起來很多,但熟悉這個流程之後就可以很快上手了。

image

有心的同學也可以試著將外層FilteredClassifier中的filter換成其他的Image Filter看看,比較看看抽取不同圖片特徵對於分類的影響吧。