如何實現商品圖片的顏色偵測與色系分類功能

Sean Wang
Feb 9, 2021

機器學習模型建模過程中,作為訓練材料的特徵們會跟模型要預測的問題息息相關。比如著名的Kaggle房價預測,拿來做模型訓練的特徵包含有:內部坪數、房間個數、地段等等。我們還會使用特徵工程手法,一般來說是一些統計方法,從初始訓練資料中,創造對模型準確度更有益的特徵。

真實商業場域,拿來讓模型訓練的特徵,除了用特徵工程手法取得,也可能是前一個機器學習模型的輸出。或是其他程式運算的結果。

最近的專案中,需要從服飾類商品圖擷取該服飾主色系,作為下一階段模型的輸入特徵。這篇文章主要分享我怎麼從沒有頭緒到做出以下兩功能的過程:

顏色偵測:擷取商品實際顏色

色系分類:將商品實際顏色歸類到網站上的商品色系

Strategies:

首先以技術角度來理解此問題,功能的實踐分成以下四步驟:

  1. 將一張圖片(.jpg)輸入程式
  2. 程式從圖片中判斷商品主體於圖片中所在位置
  3. 擷取商品顏色
  4. 回傳結果給使用者

這隻功能主要在於步驟2. 與步驟3. 的實踐。經過一番資料蒐集與摸索嘗試。決定以Github上開源的影像去背模型(rembg )實踐步驟2.,步驟3.則是參考網路上Color Dection 的介紹文,使用K-means 來將擷取出的商品主體做分色。

調整後的開發步驟:

  1. 將一張圖片(.jpg)輸入程式
  2. 影像去背
  3. K-means 尋找商品主色碼
  4. 回傳結果給使用者

步驟2. 與步驟3. 是本篇文章主要討論的部分。

Process of Developing Color Detection(顏色偵測):

影像去背(Rembg)

  • 直接使用現成的github 開源工具 rembg 來做影像去背。
  • rembg 背後以CNN模型來做物件偵測,此模型會自動找出畫面中主體,並做切割。並不像其它模型會限定偵測特定物件(例如衣服或人臉),泛用性高,切割效果很不錯。(見下圖範例)

K-means 尋找商品主色碼

  • K-means 在機器學習中是一種非監督式的分群演算法。以下來自wiki的解釋:k-means的目的是:把 n個點(可以是樣本的一次觀察或一個實例)劃分到k個聚類中,使得每個點都屬於離他最近的均值(此即聚類中心)對應的聚類,以之作為聚類的標準。這個問題將歸結為一個把資料空間劃分為Voronoi cells的問題。
  • 首先透過去背後的圖片,我們擷取商品上每個點的RGB值,使其成為向量空間中的一個點,如下圖所示。
  • 將向量空間中的每個點分群,由使用者指定分成k群,便會有k個質心。顏色相近的點,在空間中的距離接近,會被分到同一質心,形成同一群。最後重新計算k個群集,每一群集的質心位置(別忘記這裡的質心位置就是一組RGB位置,可轉成色碼表示),得到代表色與資料點數量,用圓餅圖呈現如下。

更多範例:

小結:

  • K-means 分群可以近乎精確的擷取模特兒身上顏色的代表色色碼(也包含皮膚與頭髮的顏色)並且算出每個代表色的百分比。
  • 分群數k越高,越能擷取到圖片中佔比較少的顏色,如下圖,模特兒的芥末黃腰帶在k=10的時候出現了。
  • 至此,我們完成的文章標題中提到的顏色偵測功能。

Process of Developing Color Categorization(色系分類):

從顏色偵測到色系分類

  • 色系分類的標的物是12色系色碼
  • 我們想要將擷取出的商品顏色分類到上面12個色系之一。

原本想直接把商品代表色碼 mapping to 色系色碼

  • 原本構想是,拿K-means 分群出的商品代表色色碼,藉由計算RGB座標空間中的最小距離,找到最近的色系色碼,進而將每個代表色色碼分類到對應的色系色碼。但這個做法是失敗的,程式實作結果如圖中下方路徑。明明是藍色的衣服,並沒有被分類到藍色。

顏色分類失真,原因分析,為什麼分錯了(以藍色牛仔裙商品為例)

  • 我們把牛仔裙的K-means 分群結果(上圖左方的圓餅圖)投影到RGB空間中並用圓點代表,有深淺不一的藍色圓點與深淺不一的咖啡色圓點;三角形則是12個分類色系(分類的標的物)。
  • 觀察可見,藍色系圓點們,在RGB座標空間中,呈現長條狀傾斜地分佈,代表藍色系的藍色三角形,位於條狀分佈外。
  • 藍色圓點們剛好離其他色系標籤更近,因此就被歸類過去。在這樣的空間分布中,離藍色圓點較近的反而是綠色以及紫色三角形。
  • 結論是,無法藉由計算最短距離,將每個藍色圓點都分給代表藍色系的藍色三角形。

從失效分析的結論歸納出解決問題的方法

這邊我做了兩件事:

1. 改用HSV座標系:

  • 在RGB座標空間中,同色系的資料點常常都是呈現傾斜地分布樣貌,試著將其投影至HSV座標系看看效果。
  • 可以看出轉成HSV座標系,不同色系間的分群更明顯、且分布相對垂直不傾斜(這有額外的好處後續會提到)。
  • 補充:HSV坐標系:HSV即色相飽和度明度(英語:Hue, Saturation, Value)來表示顏色。此種方式比基於笛卡爾坐標系的幾何結構RGB更加直觀。
  • 改將顏色資料投影至HSV座標系,更接近人類理解方式。

2. 自定義HSV 座標空間中,任意一點位置代表何種分類色系:

  • 再複習一次原本的想法,分類標的物(色系)用12個座標空間中的來代表。從先前失敗經驗學到,用最短距離把顏色資料做分類,很容易有偏頗。
  • 那如果我的分類標的物從點變成空間中的範圍呢?自定義出現在空間中某個範圍的顏色,都屬於某個色系,這樣可行嗎?
  • 把所有顏色投影到HSV座標係如下圖。從下圖可看出,把資料轉到HSV的優勢出現了,同色系的空間分布呈現垂直分布。看起來可以藉由定義x 軸、y軸的範圍來某色系的空間範圍。我們有機會用條件判斷式來自定義該空間中任意位置屬於什麼色系。

實作開發劃分顏色空間的條件判斷式

  • 依照從失效分析中得到的靈感,轉為由條件判斷式來定義空間與色系間的關係。
  • 取得色系範圍的色票,讀入hsv座標空間,可粗略訂出條件判斷式的架構:
  • 最後使用了大量圖片實測來微調分色程式,才完成了色系分類功能(撒花)

一些心得:

  • 過去工作經驗中,大多以機器學習手法做分類預測或是分群分析任務。但此次的任務更像是Computer Vision領域問題,對我來說是沒接觸過的領域,也藉此學到基礎的影像處理技術。
  • GitHub是我們的好朋友!以這次任務來說,若要直接實作去背功能,我可能得重新訓練一個objection detection model 再搭配openCV截圖功能。勢必將延長開發時間。但開源社群裡的小工具,可以幫我們省下不少時間。
  • 色系分類的設計上,從一開始實驗失敗的最短距離算法,通過失效分析後,轉為思維從對單點的分類,拓展為對空間的切割。偶而學著從不同角度理解同個問題。

最後附上兩個功能的資料流架構圖:

--

--

Sean Wang

I am an engineer working in the data science field