不知你是否注意到,數據集可能是機器學習項目中最容易被忽視的部分。在大多數人看來,數據集不過是一些快速拼湊、或已下載的預制圖像的集合。而實際上,數據集是任何基于圖像的人工智能(AI)項目的基石。對于任何旨在實現高準確性的機器學習項目來說,創建和管理一個平衡且結構合理的數據集,都是至關重要的。
不過,創建一個數據集并不像收集幾百張圖片那么簡單。我們在嘗試啟動某個AI項目時,很可能會遇到各種隱患。下面,我將和您討論可用來創建自己的數據集的七個典型步驟,以便您深入了解數據集大小的重要性、可能出現的數據遺漏、以及將數據集轉化為數據庫等要素。
注意:這些步驟將主要適用于,那些針對包含了圖像數據集的對象檢測和分類項目。而諸如 NLP 或圖形項目等其他項目類型,則需要采用不同的方法。
步驟 1:圖像大小
通常,神經網絡僅能處理特定的圖像大小,而任何超過閾值的圖像都會被強制縮小。也就是說,在使用數據集之前,我們需要選擇合適的神經網絡,并對圖像大小做相應的調整。
如您所知,圖像尺寸的縮小可能會導致精確度大幅下降,讓圖片上小的物體消失,進而對整個識別過程造成損害。如下圖所示,您需要在監控攝像頭所拍攝到的圖像上檢測出汽車牌號碼。而車牌只占有整個圖像的一小部分。那么當神經網絡對圖像進行縮小處理時,車牌號就可能因為變得非常小,而無法被識別到。
如下圖所示,如果能夠了解網絡可使用的圖像尺寸,將有助于您裁剪出適當的數據集圖像。
雖然大多數神經網絡可處理的圖像尺寸都比較小,但是諸如 Yolo v5x6之類的最新神經網絡,則能夠處理更大分辨率的圖像。例如,Yolo v5xs6就能夠處理寬達 1280 像素的圖像。
步驟 2:了解您的環境
為了讓數據集能夠反映神經網絡在運行過程中待識別的真實圖像,我們在收集數據集時,需要注意如下因素:
攝像頭的類型,是智能手機攝像頭,還是安全攝像頭
圖像的大小
攝像頭的位置,是在室內,還是室外
天氣條件,如光照、雨、霧、雪等。
在清楚了解了神經網絡待處理的真實圖像后,我們就能夠創建一個數據集,來準確地反映那些感興趣的對象、及其所處的環境。
您可能會直觀地認為收集谷歌上的普通圖片,可能是組建大型數據集的最簡單、最快捷的方法。但是由此所產生的系統,實際上很難達到較高的精確度要求。如下圖所示,與真實相機所拍攝的圖像相比,谷歌或照片數據庫中的圖像通常是被“美顏”過的。
而一個過于“漂亮”的數據集,很可能會導致較高的測試準確率。這意味著,神經網絡將僅能在測試數據(從數據集中提純過的圖像集合)上良好運行,但在真實條件下運行不佳,并導致準確率低下。
步驟 3:格式和注釋
我們需要注意的另一個重要方面是:圖片的格式。在開始項目之前,請檢查您選擇的框架能夠支持哪些格式,而您的圖片是否能夠符合此類要求。雖然當前的框架已能夠支持多種圖片格式,但是對于 .jfif等格式仍存在問題。
注釋數據可以被用來詳細地說明邊界框、文件名、以及可以采用的不同結構。通常,不同的神經網絡和框架,需要不同的注釋方法。有些需要包含邊界框位置的絕對坐標,有些則需要相對坐標;有些要求每幅圖像都附帶有一個單獨的、包含了注釋的.txt 文件,而另一些僅需要一個包含了所有注釋的文件。可見,即使您的數據集擁有良好的圖像,如果您的框架無法處理注釋的話,也將無濟于事。
步驟 4:訓練和驗證子集
出于訓練目的,數據集通常被分成兩個子集:
訓練子集- 它是一組圖像。神經網絡將會在這組圖像上進行訓練。其占比為圖像總數的 70% 至 80%。
驗證子集- 是用于檢查神經網絡在訓練過程中學習效果的較小圖像集。其占比為圖像總數的 20% 到 30% 之間。
通常,神經網絡會使用從訓練子集中提取到的物體特征,來“學習”物體的外觀。也就是說,在一個訓練周期結束(歷時,epoch)后,神經網絡會查看驗證子集的數據,并嘗試猜測它能夠 “看 ”到那些物體。無論是正確的、還是錯誤的猜測,其結構都能夠讓神經網絡進一步去深入學習。
雖然這種方法已被廣泛使用,并被證明能夠取得良好的效果,但我們更傾向于采用一種不同的方法,將數據集劃分為如下子集:
訓練子集 - 占圖像總數的 70%
驗證子集 - 占圖像總數的 20%
測試數據集 - 約占圖像總數的10%
由于測試子集包含了神經網絡從未見過的數據集中的圖像,因此開發人員可以通過該子集來測試模型,以了解其手動運行的效果,以及在處理哪些圖像時會遇到困難。換句話說,該子集將有助于在項目啟動前,找出神經網絡可能犯錯的地方,進而避免在項目啟動之后,進行過多的重新訓練。
步驟 5:數據遺漏
如果您用來訓練機器學習算法的數據中,恰好包含了您試圖預測的信息,那么就可能發生數據泄露。如下圖所示,從圖像識別的角度來看,當訓練子集和驗證子集中的同一對象的照片非常相似時,就會發生數據泄露。顯然,數據遺漏對于神經網絡的質量來說是極為不利的。
從本質上說,模型在訓練數據集中看到了一幅圖像后,會先提取其特征,然后進入驗證數據集,進而發現看到的完全相同(或非常相似)的圖像。因此,與其說模型在真實學習,不如說它只是在記憶各種信息。有時,這會導致驗證數據集上的準確率,高得離譜(例如,可高達 98%),但是在生產實際中的準確率卻非常低。
目前最常用的一種數據集分割方法是:將數據隨機打亂,然后選取前 70% 的圖像放入訓練子集,剩下的 30% 則放入驗證子集。這種方法就容易導致數據遺漏的產生。如下圖所示,我們的當務之急是從數據集中刪除所有“重復”的照片,并檢查兩個子集中是否存在相似的照片。
對此,我們可以使用簡單的腳本來自動執行重復刪除。當然,您可以調整重復閾值,比如:只刪除完全重復的圖片、或相似度高達到 90% 的圖片等。總的說來,只要刪除的重復內容越多,神經網絡的生產精度就會越高。
步驟 6:大型數據集數據庫
如果您的數據集相當大,例如:超過 10萬 幅圖像、以及具有幾十個對象類與子類的話,我們建議您創建一個簡單的數據庫,來存儲數據集信息。這背后的原因其實非常簡單:對于大型數據集而言,我們很難跟蹤所有的數據。因此,如果不對數據進行某種結構化的處理,我們將無法對其進行準確分析。
通過數據庫,您可以快速地診斷數據集,進而發現諸如:特定類別的圖片數量過少,會導致神經網絡難以識別出對象;類別之間的圖片分布不夠均勻;特定類別中的谷歌圖片數量過多,導致該類別的準確率得分過低等情況。
通過簡單的數據庫,我們可以包含如下信息:
文件名
文件路徑
注釋數據
類數據
數據源(源自生產環境、還是谷歌等)
對象類型、名稱等對象相關信息
可以說,數據庫是收集數據集統計數據不可或缺的工具。它可以協助我們快速、輕松地查看到數據集的平衡程度,以及每個類別中有多少高質量(從神經網絡的角度來看)的圖像。根據類似如下直觀呈現出來的數據,我們可以更快地進行分析,并將其與識別的結果進行比較,從而找出準確率低下的根本原因。
值得注意的是,準確率低下的一個原因,可能源于圖片數量較少、或某一類中谷歌照片的比例較高。而通過創建此類數據庫,則可以大幅減少生產、測試、以及模型再訓練的時間。
步驟 7:數據集增強
作為一種用于增加圖像數量的技術,數據增強是對數據進行簡單或復雜轉換的過程,例如通過翻轉或樣式轉化,我們可以提高數據的有效性。而據此獲得的有效數據集,則無需經歷過多的訓練。如下圖所示,此類數據轉換既可以是簡單到僅將圖像旋轉 90 度,也可以復雜到在圖像中添加太陽耀斑、以模仿背光照片或鏡頭耀斑。
通常,此類增強轉化都是自動執行的。例如,我們可以準備一個專門用于數據增強的 Python 庫。目前,數據增強有兩種類型:
訓練前增強- 在訓練過程開始之前,對數據進行擴增,并將其添加到訓練子集中。當然,只有在數據集被劃分為訓練子集和驗證子集之后,我們才能進行此類增加,以避免出現前文提到的數據遺漏。
訓練內增強- 采用類似 PyTorch的框架內置圖像變換技術。
值得注意的是,將數據集的大小增加十倍,并不會使得神經網絡的效率提高十倍。事實上,這反而可能會使網絡的性能比以前更差。因此,我們應當只使用與生產環境相關的增強功能。例如,對于被安裝在建筑物內的攝像機,在其正常運行的情況下,是不會出現雨淋的。因此我們完全沒有必要在圖像中添加針對“雨景”的增強。
小結
盡管對于那些希望將AI應用到業務中的人們來說,數據集是最不令人興奮的部分。但不可否認的是,數據集是任何圖像識別項目中的重要部分。而且在大多數圖像識別項目中,數據集的管理和整理,往往會花費團隊大量的時間。最后,讓我們小結一下,該如何通過恰當地處置數據集,以便從AI項目中獲得最佳結果:
裁剪或調整圖像的大小,以滿足神經網絡的要求
根據天氣和照明條件,采集真實圖像
根據神經網絡的要求,構建注釋
避免使用所有的圖像來訓練網絡。而需留一部分用于測試
刪除驗證數據集中的重復圖像,以避免數據遺漏
創建數據庫,以快速診斷數據集
盡量少用數據增強,來增加圖像數量