從構想、規劃、試錯到完成深度學習的手勢辨識模型。
第4關
準備資料<I> Get dataset from Kaggle.
進行深度學習的過程中,尋找合適的訓練資料所耗費的成本並不亞於在學習的過程。
既然要很多圖片,從哪開始找呢?
心想就先照著圖片分類來定義預測 0,1,2,3,4,5 的手勢吧!
依序照著流程處理,在jupyter lab 中看來測試時相當正常,但很快就發現失敗了…………
Why?
問題出在哪?
讓機器訓練的圖片集(有雜訊背景),
但是實際上測試時卻是透過OpenCV取得的閾值畫面,這兩者根本不一樣!
(情境好比讓學生讀國文,但實際考題卻是考日文,雖然都是語言,但對機器來說這難以找出相同的特徵進行預測。)
再做一次嘗試,如果Kaggle來源圖片直接轉成閾值圖片去訓練呢?
在直接用圖片測試的過程中表現不錯,可是實際由Webcam擷取影像的過程依舊有問題。
奇怪?
跟預期不同的地方在哪裡?
苦思許久,得出的結論是:
雖然是用現成的圖片集,但實際上機器預測所接收的圖片還是有落差,
圖片集已經先將手臂去背,僅留下手掌與手指;
但實際情境中,仍然有整隻手臂的圖像,訓練資料與現實生活中的影像有著明顯差異,極可能是失敗的主因;
而且,我認為沒有必要透過影像處理非得將手腕以下的影像去除,
因為在手勢操作中,手臂也是手勢的一部份才合理。
與達成目標不見得有直接相關,評估目前太難兼無法確認效益的issue 沒有必要非去挑戰不可呀……
準備資料<II> Try again, capture the gesture by myself.
因為沒有辦法一次找到令人滿意的資料,所以我決定要重新錄製自己的手勢,
並同時參考網友做過類似的範例,發現確實有類似的成功案例,
既然有前例可循,也就代表自己所設想的主要方向沒錯。並設定條件如下:
● 用OpenCV拍照截圖 + 從Kaggle 找到適合的訓練圖,雙管齊下。
這裡自行取得圖片時,有將背景極簡化 + 並設定cv2.threshold()方法,
將訓練的內容盡可能的簡化,去除非必要的因素,採用灰階單色圖片。
再分別配置訓練training、驗證validation、測試test 等資料夾。
● 各個手勢應先定義有明確不同的形狀。
如果太過接近模稜兩可,以訓練圖片量不夠多的情況下,
我無法保證預測的效果是否可能令人滿意? 因此這個有疑點的因素需要先排除。
● 設定的手勢有沒有不符各國當地民情? 查了一下還真的有!
大家習以為常的OK,居然在法國與比利時是罵人的意思,
發現幾乎不可能所有手勢都能夠在各地通用,大概只有 I LOVE YOU 是最沒問題的。
在這一階段,定義了以下5種手勢:
這裡先特別說明為什麼有none = 漆黑一片
因為在先前測試過程中,發現在沒有手勢進入ROI之前,
機器仍會將當下畫面判斷為一種結果,這可能導致預測將與真實偏離太遠。
而現階段目的是為了要先能確認透過CNN可以訓練辨識手勢,
因此先將無訊號也定義為一種輸入。
後話:
測試成功後,我參考 Gesture Jseter 定義的手勢,又再添加了兩種手勢,Straight & Thumb。
之所以增加新的手勢定義除了豐富性之外,也考慮到新增定義要與原本的手勢有明顯區別會比較好(免得增加誤判機率)。
本來也有想到 Star Trek 瓦肯人的問候手勢,但我實在比不出來! 只能放棄......這也是很講天份
Series link:
[DL]Static Gestures Recognition(1): Conception
[DL]Static Gestures Recognition(2): Solution finding
[DL]Static Gestures Recognition(3): Define workflow
[DL]Static Gestures Recognition(4): Preparing appropriate dataset
[DL]Static Gestures Recognition(5): Time is worth more than money
[DL]Static Gestures Recognition(6): Training Model & Next Step
沒有留言:
張貼留言