自己收資料要注意哪些事? 這裡有一份模板供你參考。
前言
由於業界的AI專案與學術界的專案不太一樣,後者通常在固定的一個或多個資料集測試新的算法,新的資料增強方法等等,然而前者一般來說沒有固定的資料集,研究用的公開資料集有時候也很難真正貼合需求,因此自建資料集往往能夠提供較大的彈性,也能夠讓Machine Learning Engineer / Data Scientist在推論實際應用場景時能夠更有信心的交付,此外,知名顧問公司BCG也指出6個資料科學專案失敗的原因,其中一項原因指出:
資料的可取性、品質與控管不佳,使得模型沒有辦法自動化以及穩定的準確度。
因此筆者決定藉由本次自建資料集的經驗紀錄下來,除了幫助自己記錄以外,也給沒有自建資料集的網友能夠有個參考!
近期公司有一個與AI x AR的物件辨識專案,在大部分的ML/AI 模型中,拉高模型準確度的方法,基本上遵循著資料 > 特徵 > 算法的原則,在可以自己建構資料集的情況下,核心目標為:
- 盡可能收集精準反應使用場景的資料讓模型能夠產生較佳的泛用性(good generalization)。
- 盡可能地拉大資料多樣性(data diversity)。
關於圖片資料
雖然想通了之後就是基本觀念,但是一開始沒有發現這件事還真的覺得蠻神奇的。
雖然我們要收集的是圖片資料,但是多數情況下都可以用錄影的,現在的取像裝置隨隨便便都有25, 30 (FPS) frame per second,也就是說,確定目標的情況下,對著它錄30秒你就有750張照片了,所以在適當規劃下,能夠取得相當多的圖資。
關於背景
物件偵測就目前主流的方法(YOLO, SSD, R-CNN 家族,這裡先不考慮很潮的Transformer系列…),都會從整張圖來找尋物件,也就是說同樣的物件在不同的背景下對CNN會是不同的輸入,那麼背景的複雜度就必須納入考量,這裡我們粗略地分成兩種:
固定背景 — 實際使用時背景幾乎不變,例如室內特定地點拍照,或是近距離人臉辨識,在這樣的情況下:
- 由於背景固定,大幅降低偵測的複雜度,能夠拉高mAP,能夠降低所需要的訓練資料。
可以當作參考的是,MINIST可以視為固定背景(都是白底),每個類別粗估在5000張~8000張。
非固定背景 — 實際使用時背景會改變,例如即時安全帽辨識,室外路口行人偵測,或是任何即時辨識的系統:
- 由於背景存在改變的因素,偵測難度較高,mAP較難有好的表現,會需要較多的訓練資料,實務上必須多錄取一些可能會出現的背景,與待偵測物件做Data Augmentation(例如把待偵測物件去背然後隨機的地丟到可能出現的背景,隨機部分拼接等等)。
可以當作參考的是MS COCO dataset,總共80個類別,20萬張圖片,粗估平均一張圖片約5–6個物件,那麼每個類別的資料總數約是12500張~15000張。
透過實驗推估資料量
在作者的專案中,我們首先根據下面的規劃制定資料收集規格,大收了一批,每個類別約四千筆資料,接著進行小額度的資料訓練來觀察模型準確度,在收取到的資料能夠良好反應使用場景的情況下,我們能夠透過學習曲線(Learning curve)來推估需要的資料量。
事前規劃
資料複雜度
在收集資料之前,我們必須關心使用場景中關於我們的待偵測物件會給電腦帶來哪些複雜度資訊,例如以下的圖片就介紹了6種維度,分別是視角,光照條件,物體形變,遮擋,混亂背景,待側物體變異等等,顯然,了解使用場境的資料複雜度並針對各個維度逐一評估資料可取得性,會成為收集資料成功的關鍵。
實測場景
這是另一個用yolov3做番茄偵測的實測場景分析,我們可以看到物件偵測受到各種不同的環境影響,光照,角度,遮擋,背景,取像裝置,甚至使用者如何使用都會對辨識模型產生影響,例如近期我們公司的專案用AR眼鏡來作為取像裝置,AR眼鏡的相機和攝影機對比到手機上的解析度不同,對比不同,對焦程度也不太一樣,這意味著使用手機取訓練資料將會在實際使用下的圖資分佈不一致,因此取像時最好就採用AR眼鏡(手機仍然可以作為輔助),以下就針對各個維度列出可能的情況。
取像裝置
- 是監視攝影機 / 手機 / AR眼鏡 / 還是空拍機? 能使用該裝置取資料就這麼做,如果不行,是否可以透過其他方式營造出類似的對焦程度,遠近,對比?
物件變異度
物件可視範圍、可能的遮擋、形變
- 對於使用者來說,待偵測物件會出現 / 全部 / 部分 / 些許遮擋?
- 待側物件是否具有形變的可能性?
光照
- 對於使用情境來說,光源是 室內日光燈 / 室外隨著天氣變化 / 窗簾遮光 / 弱光源 / 受到不同色光照射?
尺度
- 對於使用者來說,待偵測物件會出現在 多遠/多近?
角度
- 對於使用者來說,會以哪些角度看到待偵測物件? 包含水平方向及鉛直方向的角度。
可能的誤判
- 這也是一個非常tricky的地方,例如以下兩個例子
- 人類偵測模型將拿著氣球的人偵測成兩個人
- 足球賽的足球追焦AI追錯物件,追到裁判的光頭
解決方案則是取得這類型的圖資(即使不好取得,但如果需要模型足夠強健就必須要),並在正確的辨識目標上拉框。
資料收集規格
如果實測場景能夠規劃個7–8成的話,也就能夠更明確的定義出資料收集規格,做成以下表格:
收集的當下
不同拍攝者帶來的資料多樣性
- 拍攝圖資的當下,對於同個畫面的拍攝儘管已經有透過資料收集規格來限縮,如果只有一個人,還會容易引入個人的bias,兩個(多個)不同的人,對同個畫面仍然會有不同的想像,這個部分可作為增加資料多樣性的一種手段。
開始資料標記
資料品質管理
讓我們回顧最一開始所說的,知名顧問公司BCG曾指出那些讓資料科學專案失敗的原因
其中提到一點
資料的可取性、品質與控管不佳,使得模型沒有辦法自動化以及穩定的準確度
這點顯示出了嚴謹看到資料品質管理的重要,因此有必要讓圖資盡可能的乾淨以及方便溝通。
資料格式
- 統一為jpg,而不是jpg, png, tiff混雜,不同資料來源務必整合成同個格式,方便後續的維護管理。
- 讓圖片名稱自己說話,在筆者的案例中,定義為:
lbl_LabelName_dvc_DeviceName_no_No.jpg
資料清理 & 折損管理
- 預先對影片處理翻轉。
- 資料收集的過程可能不同人拍出不一樣的內容,筆者在專案中有人工看過一次,並過濾掉和偵測物件不相干的片段,放置在
nothing
的資料夾,意味著模型看預測裡面的圖片,應該要偵測不出半點東西。 - 粗估每個類別的折損率,在筆者的案例中,0% — 15%都有,這有助於我們估算資料總數。
高效的影片/圖片處理工具
- 筆者的實際經驗中,opencv要寫較多程式碼,操作起來error也比較多,ffmpeg能夠做到影片翻轉,切成圖片,按照給定的index命名等功能,都只要一行程式碼,真的是高效工具XD
標記範例
- 資料標記基本上是勞力密集且無腦的(?),但又希望每個人的標記不要差太多,這時候就需要一個標記範例讓標記人員可以Follow,進而穩定標記品質。
資料分割原則
- 資料的訓練集/驗證集/測試集應該按照怎樣的分層抽樣才能忠實反映實際情況? 怎樣的訓練能讓模型夠產生較少的Bias?
舉作者的例子,我們的分層抽樣按照以下規則:
- AR眼鏡 / 手機 8:2
- 標註人員 1 : 1 : 1
- 目標辨識物 1 : 1 : 1 : 1 : …..
- 其餘維度採隨機抽樣。
結語
以上就是筆者在自己建構資料集所採過的坑XD,透過以上的分析,能夠讓資料收集的多樣性更好,更穩定的資料品質,以及更順暢的標記/訓練協作,在實際的AI專案落地時,資料收集的規劃非常的重要,與學術圈也有所不同,同時筆者也還在學習,有其他想法也歡迎指教一下!
參考文獻
- AI 工程師工作一年心得:AI 專案落地實務
- Data Science Projects: How You Can Fail Before A Single Line of Code Is Written — and How to Avoid It
- Understanding and interpreting your data set
- 6 Obstacles to Robust Object Detection
- 【M12】PyTorch 之 MNIST 之 一
- 【AI數據處理的策略思考】 發展安防監控,從數據開始助攻
- Object detection with deep learning and OpenCV
- YOLO: Real-Time Object Detection
- YOLO-Tomato: A Robust Algorithm for Tomato Detection Based on YOLOv3
- Stanford University School of Engineering Lecture 11 | Detection and Segmentation
- Stanford University School of Engineering Lecture 3 | Loss Functions and Optimization