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