数据科学竞赛-计算机视觉赛流程
本文主要介紹計算機視覺類競賽的流程,均為理論經(jīng)驗,比較枯燥但干貨滿滿。
簡介
計算機視覺的任務一般認為有三大基本任務(分類、檢測、分割)和三大進階任務(圖像理解、視頻理解、圖像生成)。 三大基本任務是最常被作為計算機視覺賽題的,這主要是因為其評價標準比較統(tǒng)一(如分類使用準確率、召回率等評價模型效果等),并且難度并不是特別大,而進階任務一方面評價較為主觀難以量化,另一方面也確實存在難度。
計算機視覺的處理方法一般分為傳統(tǒng)方法(Hog算子、Sift算子、Haar級聯(lián)合)和深度方法(卷積神經(jīng)網(wǎng)絡),在Python語言中這兩者封裝為OpenCV和TensorFlow,一個計算機視覺任務不是簡單的使用深度學習方法就能做到完美的,配合傳統(tǒng)的優(yōu)質(zhì)方法是必經(jīng)之路,兩者互補相成。(其中opencv可以使用pip安裝,TensorFlow尤其在Windows環(huán)境下建議使用conda安裝。)
不同于數(shù)據(jù)挖掘賽,花費大量的時間在特征工程上力求輸入模型的數(shù)據(jù)是極好的,計算機視覺任務對數(shù)據(jù)的預處理并不是特別復雜,輸入模型的一般也就是一個個圖片矩陣,所以計算機視覺類的比賽最核心的就是模型的構建和優(yōu)化。同時,因為模型訓練最為關鍵,需要大量算力所以需要使用TensorFlow或PyTorch這類支持GPU運算和自動求導的運算庫。
數(shù)據(jù)獲取
數(shù)據(jù)源是一切的開端,良好的、大量的、多類的有標注數(shù)據(jù)對于計算機視覺相當重要,這也是前面很多年沒有太大突破的原因,因為深度學習方法在計算機視覺任務中表現(xiàn)極好但是需要大量的訓練數(shù)據(jù)用于參數(shù)訓練。
- 官方提供
幾乎所有的計算機視覺類比賽都會提供數(shù)據(jù)集(包括訓練集和測試集),只有這樣才能確保模型的效果(訓練能力及泛化能力)。 - 公開數(shù)據(jù)集
近些年,計算機視覺的飛速發(fā)展誕生了很多有標注的海量數(shù)據(jù),為了科研的發(fā)展,很多大型數(shù)據(jù)集都是對外開放的,如ImageNet、Object365、Caltech101等。 - 爬蟲采集
互聯(lián)網(wǎng)存在大量的有標簽的圖片、視頻等計算機視覺需要的數(shù)據(jù),可以通過網(wǎng)絡爬蟲采集這些數(shù)據(jù)。
工具選擇
CV類的比賽,常常要用到很多圖片處理和深度學習框架的第三方庫,參加這類比賽必須對這類框架至少熟悉一到兩種。
- OpenCV
主要用于讀取和處理圖像,這里需要注意,Python接口的OpenCV讀取的圖像矩陣式按照BGR存儲而不是RGB,可能在PIL或者Matplotlib中顯示不正常。類似的庫有Pillow、Skimage等,安裝使用pip install opencv-python - TensorFlow和Keras
最新版2.0.0的TensorFlow已經(jīng)集成了Keras(Google收購Keras),TensorFlow是一個使用最廣泛的深度學習框架,在學術界和工業(yè)界認可度極高,Keras是對復雜的TensorFlow進行的一個封裝,使得用戶可以輕松構建各類神經(jīng)網(wǎng)絡。類似的庫有PyTorch等。安裝使用pip install tensorflow安裝CPU版本,pip install tensorflow-gpu安裝GPU版本。Keras直接使用pip安裝即可。 - 其他常用庫
- tqdm
- 一個非常常用的很實用的進度條工具。
- glob
- 支持正則匹配的目錄下文件搜索工具。
- face_recognition
- 最簡單的人臉檢測識別框架。
- tqdm
數(shù)據(jù)探索
在CV比賽中一般不使用EDA(探索性數(shù)據(jù)分析)來稱呼視覺任務中的數(shù)據(jù)探索,這是因為計算機視覺的數(shù)據(jù)大多格式統(tǒng)一(圖片或者視頻配以一個說明性表格文件)沒必要進行過多的探索,達不到分析的地步。
- 數(shù)據(jù)集存儲信息
通過shell腳本或者Python腳本了解數(shù)據(jù)集中數(shù)據(jù)的基本信息,如圖片格式,標注方式(文件夾名稱標注一批圖片或者csv文件逐一標注每個圖片,后者更加常用,適用于分布式存儲和分類回歸等多種任務)等。使用Python腳本更加靈活且保證整個項目的流程化。 - 圖片格式
抽樣顯示圖片及其標簽或者標注,確認是否需要對圖片進行進一步處理,如表情識別中每個圖是給的檢測到的人臉還是全身照,如輸入圖片大小不一致(卷積網(wǎng)絡要求輸入等尺寸,如均為224*224*3)。
Pipeline制定
深度系統(tǒng)通常認為是端到端的,給定輸入給出輸出,中間的細節(jié)被封裝成管道中的一個個部件。在探索之后的步驟都會概念上理解為一個管道處理。視頻的處理本質(zhì)就是一幀一幀的圖片處理。一般分為數(shù)據(jù)預處理和模型構建兩步,前者一般可以通過opencv實現(xiàn),后者可以通過tensorflow實現(xiàn)。
數(shù)據(jù)預處理
- 圖片尺寸調(diào)整
通常數(shù)據(jù)集中每個圖片的大小是不規(guī)整的,而卷積神經(jīng)網(wǎng)絡要求輸入是規(guī)整的,這樣后續(xù)的操作及輸出層才能是預估的結(jié)果才能進行反向傳播。一般分為等尺寸放縮和固定大小放縮。各個圖片處理庫(如opencv)都提供了圖片尺寸調(diào)整的方法,如cv.resize(img, [target_width, target_height]等。 - 圖片摳取
通常數(shù)據(jù)集中數(shù)據(jù)是人為采集的,當初采集的目標不一定是以task為驅(qū)動的,所以圖中有很多的冗余信息。如人類識別的關鍵特征應為人的面部,全身信息并不重要,所以需要利用檢測器找到人面部的區(qū)域摳取出來。
目標摳取通常用到很多檢測算法,就比較簡單的人臉摳取而言檢測算法大致分為傳統(tǒng)方法如Haar檢測器和深度方法如MTNN,但是一般的比賽中為了前期處理數(shù)據(jù)的高效率,使用傳統(tǒng)方法以及足夠,即使準確率差那么一些。
- 圖片的旋轉(zhuǎn)和翻轉(zhuǎn)
有時在很多的分類問題總,數(shù)據(jù)量即使很大但是對于參數(shù)巨大的神經(jīng)網(wǎng)絡還是遠遠不夠的,數(shù)據(jù)增廣是一個常用手段,其中旋轉(zhuǎn)和翻轉(zhuǎn)可以增加和原來同分布的新數(shù)據(jù)用于模型的訓練。 - 圖片格式轉(zhuǎn)換
很多任務并不關心RGB三通道的色彩信息,而關心更核心的信息,轉(zhuǎn)為灰度圖是個不錯的選擇。有時數(shù)據(jù)集有JPG和PNG等圖片,他們之間也需要統(tǒng)一轉(zhuǎn)換,因為前者是RGB后者是RGBA。圖片的格式轉(zhuǎn)換在減少任務復雜度方面是一個很有效的手段。
模型構建
- 數(shù)據(jù)集劃分
為了防止過擬合等在深度學習中常見的問題,劃分出一個不參與訓練的驗證集用于測試模型的泛化能力是很常見的一個手段。 - 數(shù)據(jù)加載
由于計算機視覺的任務數(shù)據(jù)都是非常龐大的,單純的內(nèi)存或者顯存是不可能放下所有的數(shù)據(jù)的,所以必須分批量從磁盤中讀取數(shù)據(jù)輸入給模型訓練。這個分批加載的手段一般是通過一個生成器不斷獲取一個batch的數(shù)據(jù)送入網(wǎng)絡進行訓練。 - 數(shù)據(jù)增廣
數(shù)據(jù)增廣是深度學習訓練的一個技巧,首先在2012年AlexNet中被提出,隨后和Dropout等訓練的trick一起,被后來的神經(jīng)網(wǎng)絡訓練所廣泛采用。數(shù)據(jù)增廣只是一個概念,實現(xiàn)數(shù)據(jù)增廣的方式有很多如圖片翻轉(zhuǎn)、圖片旋轉(zhuǎn)等,當然,數(shù)據(jù)增廣不能違背增廣的初衷,即增加有效的數(shù)據(jù),例如手寫集上下翻轉(zhuǎn),原來的標簽就沒有意義,這是無效的增廣。
數(shù)據(jù)增廣這一步可以放在數(shù)據(jù)加載這個步驟之后,即不同輪次讀取到的同一個圖片可以隨機進行不同的增廣送入模型訓練。(一般增廣產(chǎn)生的數(shù)據(jù)不需要落入本地。)
- 神經(jīng)網(wǎng)絡設計
- 網(wǎng)絡結(jié)構
一般是借鑒經(jīng)典的網(wǎng)絡設計思路(如VGG、ResNet、DenseNet等)進行設計,對先進的網(wǎng)絡結(jié)構進行融合、重構等,但是應當明確,過于復雜的網(wǎng)絡也許有著較好的表現(xiàn)但是難以實際部署,本質(zhì)上還是無用的。 - 損失函數(shù)
- 對于比較簡單的任務有比較使用的損失函數(shù),如分類使用交叉熵、回歸使用MSE等,但是對于一些比較復雜的任務,這些原有的損失函數(shù)未必很有效,這是需要設計新的損失函數(shù)(如OCR中使用CTC損失函數(shù))。
- 優(yōu)化函數(shù)
- 目前大多數(shù)優(yōu)化函數(shù)都是基于SGD的優(yōu)化(有Adagrad、Adam、RAdam等),但是,應當明確沒有最好的優(yōu)化方法只有最合適的,也許有的任務最簡單的SGD表現(xiàn)是最優(yōu)的。
- 網(wǎng)絡結(jié)構
- 模型應用
比賽中,主要指的是將訓練好的在驗證集上表現(xiàn)較好的模型對測試集進行預測然后提交。實際應用中,是指在成型系統(tǒng)上進行模型的部署,這方面TensorFlow提供了不錯的接口,在關于TensorFlow的博客中我有提到。
補充說明
本文較為簡略的說明了計算機視覺類比賽的主要流程及方法,由于篇幅限制沒有過細展開,具體的相關問題可以查看我的其他博客。博客同步至我的個人博客網(wǎng)站,歡迎查看。如有錯誤,歡迎指正。
總結(jié)
以上是生活随笔為你收集整理的数据科学竞赛-计算机视觉赛流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TensorFlow2-高阶操作
- 下一篇: TensorFlow2-神经网络基础