:::

從圖片抽取量化特徵:Weka的ImageFilter / Extract Features from an Image File with Weka’s ImageFilter

image

在「不寫程式也能預測未知!用Weka分類模型來預測未知案例」這篇介紹了如何用Weka來進行預測,不過基本上像是Weka這樣的資料探勘工具處理的都是經過量化的數值或分類資料,如果今天遇到的是非結構的資料,像是圖片的話,我們要怎麼處理呢?這就要藉助Weka的「Image Filter」套件,來從非結構化的圖片檔案中抽取量化的特徵資料囉。


Weka運作環境 / Weka Environment

2017-06-04_193916

本篇是以Weka 3.8.1來作介紹。Weka是開放原始碼的資料探勘工具,操作簡單、功能強大,非常適合用在教學跟研究上喔。關於Weka的詳細介紹請見「Weka下載與套件安裝教學」。

安裝套件:imageFilter / Install Package: imageFilter

如果要用Weka來處理圖片的話,我們還要安裝額外的套件:「imageFilter」

同樣地,也請參考「Weka下載與套件安裝教學」來安裝套件吧。

如果套件無法直接在Package Manager安裝的話,也可以從以下網址下載套件檔案:

image

確認你已經順利安裝好imageFilters之後,我就可以來用Weka處理圖片囉。


圖片檔案跟圖片分類檔 / Image Files and Labeled ARFF file

要進行圖片分類的話,必須要同時準備兩種資料:

  1. 要分類的「圖片檔案」
  2. 註明圖片檔案屬於那一種分類的ARFF「圖片分類檔」
範例圖片:貓頭鷹與蝴蝶 / Example Images: Owl and Butterfly

owl015mno010

這是來自於「ImageFilter」網站上面的範例資料,這也是線上課程「Advanced Data Mining with Weka (4.6: Application: Image classification)」中的例子。我特別把它抽取出來打包成獨立的ZIP壓縮檔,方便大家練習用。

image

這個壓縮檔裡面包含了50張貓頭鷹跟50張蝴蝶的照片。除此之外,最重要的還包含一個圖片分類檔:arff檔案的「train-set.arff」。

圖片分類檔 / ARFF File

讓我們來看看「train-set.arff」這個圖片分類檔的內容吧:

2017-06-04_211259

這個ARFF檔案只有兩個特徵:

  • filename:圖片的檔案名稱,資料類型是「string」(字串)。
  • class:分類目標,資料類型是類別變項,分成兩種:「BUTTERFLY」(蝴蝶)跟「OWL」(貓頭鷹)。

就這樣簡單。

圖片分類檔小工具:weka-imagefilter-arff-builder / Create ARFF from a Directory

如果要作圖片分類的話,必須要先整理出這樣的ARFF檔案才行。當然,自己慢慢輸入資料的話也未免太累了,所以我用AutoIT開發了一個Windows專用、方便產生圖片分類檔的小工具:「weka-imagefilter-arff-builder.exe」,下載位置如下:

image

weka-imagefilter-arff-builder.exe的使用方法很簡單:

  1. 先圖片檔案的分類名稱寫在檔案名字上,用空格「 」、底線「_」或橫線「-」隔開編號。例如「OWL_43.jpg」表示是「OWL」(貓頭鷹)的圖片;「BUFFERFLY_37.jpg」表示是「BUTTERFLY」(蝴蝶)的圖片。
  2. 將weka-imagefilter-arff-builder.exe放到該資料夾中。
  3. 執行weka-imagefilter-arff-builder.exe,就會產生圖片分類檔「train-set.arff」了。

如果分類是「unknown」的話,該程式會另外產生一個「test-set.arff」,以供我們作預測使用。

    命名檔案的工具 / Image File Rename Tool

    image

    檔案批次命名的工具很多,最方便的工具就是Windows內建的「檔案總管」。做法請參考「在 Windows 中更改大量檔案名稱,批次修改檔名,快速又省力!」這篇。

    我自己習慣使用的是XnViewMP中的Batch rename功能,不過這個操作比較複雜就是了。XnViewMP的介紹請看「XnView MP v0.86 看圖軟體(支援 Mac, Linux, Win 系統)」這篇。


      使用Image Filter從圖片抽取特徵 / Extract Features from Image File by Image Filter

      在準備好「圖片檔案」跟「圖片分類檔」之後,接下來我們就要用Image Filter來從圖片中抽取特徵資料囉。

      Weka的Image Filter (imageFilter套件)是一種圖片處理器,可以讓我們針對指定的圖片檔案中抽取特徵。Image Filter屬於Weka的Preprocess (前處理)功能中的Filter (篩選器)功能之一,以下就讓我們繼續用「貓頭鷹與蝴蝶」這個例子來看看它怎麼使用。

      image

      1. 打開Weka的Explorer,用「open file」開啟圖片分類檔「train-set.arff」。順利開啟的話,會看到下面Attributes特徵出現了「filename」跟「class」兩個。

      image

      2. 點選Filter (篩選器)的「Choose」按鈕。

      image

      3. 選擇「weka.filters.unsupervised.instance.imagefilter.ColorLayoutFilter」。從這裡可以看到Image Filter其實包含了10種篩選器,每一種篩選器的功能不相同,但用法都一樣。現在我們先以「ColorLayoutFilter」篩選器介紹怎麼使用,至於篩選器的功能我會在後面介紹。

      image

      4. 點選篩選器的粗體字「ColorLayoutFilter」,打開篩選器的設定。

      image

      5. 在篩選器的設定中的「imageDirectory」欄位輸入你擺放圖片檔案的目錄位置,例如「C:\Users\Admin\Desktop\butterfly_vs_owl」。然後按下「OK」按鈕。

      image

      6. 按下Filter (篩選器)右邊的「Apply」套用。

      image

      7. Attributes (屬性)會出現很多從圖片中抽取出來的特徵,ColorLayoutFilter會抽取出33個特徵,都以「MPEG-7 Color Layout」開頭。這樣表示圖片處理成功。

      不過,我們的工作還沒結束,請繼續做下去吧。

      image

      8. 因為稍後要進行分類時「filename」這個無法處理的特徵屬性會造成分類器處理錯誤,所以我們要在這裡把「filename」移除掉。請勾選「filename」前面的核取方塊,按下下面的「Remove」移除按鈕,將「filename」屬性移除。

      image

      9. 按下右上角的「Save」,將處理完的檔案另存成新的檔案吧。檔名我會加上篩選器的名稱,就用「train-set-ColorLayoutFilter.arff」好了。

      image

      10. 接下來我們來看看抽取出來的特徵資料,請按下「Edit」按鈕。

      image

      11. 從Viewer中可以看到ColorLayoutFilter抽取出來的33個特徵,都是連續資料的數字。最後一個特徵則是該圖片對應的分類,要嘛是「BUFFERFLY」、不然就是「OWL」。

      可以分類囉 / Next: Classification

      2017-06-04_204229

      看到這裡,聰明的你應該已經知道了,接下來的處理方式就跟在「不寫程式也能預測未知!用Weka分類模型來預測未知案例」裡面的做法是一樣的,已經可以進入分類與預測的處理囉。在此我推薦的分類器是「SMO」,又快又準確。

      不過話說回來,這個ColorLayoutFilter抽取出來的「MPEG-7 Color Layout」特徵是什麼意思呢?就讓我們繼續看下去吧。


      Image Filter中各種篩選器的功能 / Filters of Image Filter

      image

      Image Filter是Weka處理圖片的篩選器合集,其包含了10種不同功能的子篩選器。以下我們一一來看這10種篩選器的功能吧:

      • AutoColorCorrelogramFilter:計算圖片與每一種顏色的關聯程度,會產生以「Auto Color Coreelogram」為首的1024個特徵,每個特徵都代表它與某一種顏色的關聯程度。如果圖片的差異主要來自於顏色,這個篩選器表現會很好。
      • BinaryPatternsPyramidFilter:從圖片中抽取局部二元模式(local binary patterns)旋轉不變性(rotation-invariant)的數值直方圖。此篩選器能夠分辨出圖片中點旁邊的邊線或折角,特別適合用於紋理判斷(texture)或臉部辨識(face recognition)。
      • ColorLayoutFilter:從圖片中抽取MPEG7顏色排版的篩選器。它會將圖片切成64塊,然後計算各塊中的平均顏色。如果圖片的差異主要來自於顏色跟圖片位置的話,這個篩選器的表現會很好。
      • EdgeHistogramFilter:從圖片中抽取MPEG7邊界直方圖特徵的篩選器。邊界是指線或是圖片中兩種顏色交界、不連續的部分。邊界直方圖可以量化圖片中邊界的方向的數值。如果圖片的差異主要來自於很多明顯方向邊界或沒有邊界的話,例如自然風景照跟建築物照片,這個篩選器表現會很好。
      • FCTHFilter:從圖片中抽取模糊顏色與紋理直方圖FCTH顏色特徵的篩選器。它同時考量了顏色與紋理資訊。這個篩選器會限制每張圖片只取出72位元組的資訊,因此容易用於大型圖片資料庫。
      • FuzzyOpponentHistogramFilter:從圖片中抽取對立色彩空間(opponent color space)的模糊64-bin(64欄)的數值。
      • GaborFilter:從圖片中使用Gabor小波轉換(Gabor wavelet)抽取圖片的紋理特徵。Gabor篩選器常用與電腦視覺化以及具有旋轉不變性的特徵。
      • JpegCoefficientFilter:從圖片中抽取出JPEG係數(JPEG coefficients)的篩選器。它會將圖片轉換成JPEG,以過濾圖片中許多人類無法識別的特徵,然後再計算壓縮後的JPEG係數。
      • PHOGFilter:從圖片中抽取方向梯度直方圖數值PHOG的篩選器。它會計算圖片中顏色方向特數值。在手寫辨識資料集MNIST中,它可以抽取出有用的特徵。
      • SimpleColorHistogramFilter:從圖片中抽取出屬於某種顏色的像素數量的篩選器。顏色是以紅色R、綠色G、藍色B各分32個箱子,總共96個箱子,然後計算圖片中像素落於這些箱子的數量,計算速度快。如果圖片的差異只有來自於顏色,這個篩選器表現會很好。

      這裡面有太多影像處理的專業術語,老實說我也不是完全瞭解每一種篩選器的差異。

      玩到現在,我發現圖片特色及能夠抽取出最有鑑別度特徵的篩選器組合如下:

      • 圖片有明顯的顏色跟紋理差異:FCTHFilter
        BUFFERFLY_08
      • 圖片沒有顏色差別,但有明顯線條差異:PHOGFilter
        mnist_0_9mnist_1_3859mnist_2_3016mnist_3_2331mnist_4_636mnist_5_3200mnist_6_4114mnist_7_3044mnist_8_179mnist_9_1722

      下一篇,就讓我們用這兩種篩選器來正式進入圖片分類的應用吧。

      總共5 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

      1. 好,我重做了weka-imagefilter-arff-builder.exe
        把它變成了網頁版的工具
        https://pulipulichen.github.io/weka-imagefilter-arff-builder/

        http://3.bp.blogspot.com/-f-z3_WbyEic/XtEr_PePEGI/AAAAAAAEq3k/6g-Og9YV_kEvQMKZOrQwvYkVmdUCOIuDwCK4BGAYYCw/s1600/2020-05-29_233427.png
        在這邊選擇要處理的圖片,然後就可以下載訓練集的train.arff跟未知資料集unknown.arff

        這樣子不是Windows環境也可以使用了!

        回覆刪除
      2. 感謝大神拯救我的期中報告

        回覆刪除