圖像分類基礎


像素:組成圖片的基礎單元

現在的多數表征圖像的方式都是采用的RGB color space.圖片可視為由width*height個像素組成.在RGB顏色空間下每一個像素是一個三元組(r,g,b),分別代表R/G/B的值.對單通道的圖像(即灰度圖)來說,像素是一個數.

圖片由一堆像素組成.[0-255]之間.從0-255由暗到亮.

用numpy array表達圖片

通常用(height, width, depth)來表達一個圖片.
這種表達方式是為了適應用矩陣表達.矩陣表達我們通常用rows*columns來表達一個矩陣. 對應的就是height width. 對rgb圖片而言,depth就是3.

import cv2
image = cv2.imread("example.png")
print(image.shape)
cv2.imshow("Image", image)
cv2.waitKey(0)

##上述代碼輸出(248,300,3)意味着width是300個像素,height是248個像素.3個channel(RGB).
(b, g, r) = image[20, 100] # accesses pixel at x=100, y=20
(b, g, r) = image[75, 25] # accesses pixel at x=25, y=75
(b, g, r) = image[90, 85] # accesses pixel at x=85, y=90

##image[20,100]意味着第20行第100列.  x=100,y=20。 x軸的方向是width的方向,y軸的方向是height的方向. 

##注意opencv返回的順序是(b,g,r)而不是(r,g,b).為什么這么設計,不用糾結,歷史原因.

改變圖像尺寸

通常來講,我們在resize一個image的時候希望不改變其寬高比,因為寬高比的改變會扭曲原圖.

但是對深度學習而言,這一原則並不適用.

對處理圖像分類任務的神經網絡或者卷積神經網絡而言,我們通常假定接受的輸入是一個fixed size的input.常見的卷積神經網絡的輸入的尺寸(width*height)有32*32,64*64,224*224,227*227,256*256,299*299.

假設我們的cnn的輸入是224*224的image,但是我們的數據集里的image尺寸是312*234,800*600這種,我們要怎么做,是

  • 不考慮長寬比,得到一個扭曲的圖像?
  • 保持長寬比,裁剪部分圖像?
    如下圖所示:

    這個沒有定論,視你的具體的數據集而定.

圖像分類

對上圖,人是很容易識別出左邊是貓,右邊是狗的.但是對計算機而言,它看見的就是2個像素矩陣而已.
傳統的圖像識別采用特征提取+機器學習的方式,現在大火的深度學習則把特征提取這一步自動化了,自動探索特征.

圖像識別的挑戰

上圖描述了一些常見的挑戰,結合圖片理解一下.

  • viewpoint variation 圖一個物體,只是拍攝的角度不同,對不同圖片,要能夠正確識別.
  • scale variation 同一個物品,只是形狀不同,對不同圖片,要能夠正確識別.
  • deformation 姿態不同
  • occlusion 有遮擋
  • illumination 光線明暗差別
  • background clutter 背景有很多噪音圖片
  • intra-class variration 屬於同一種類,類內差別 比如圖片中6個物體均應該分類為椅子

考慮到這么多復雜性,所以在構建一個圖像分類系統的時候,要盡量明確你的分類目標.比如你想做一個系統,能夠識別出廚房的所有物品,那將是極端復雜而且准確性很難保證的.但是如果你把系統的目標縮小到"識別出冰箱",這樣一個系統更具可操作性,准確率將會更高.

機器學習中的幾種不同的學習類型

  • 監督學習
    • 常見的有邏輯回歸,svm,隨機森林,神經網絡
  • 非監督學習
    • PCA/K-MEANS
  • 半監督學習
    半監督學習很有用,因為很多時候標注數據是及其耗時耗力的. 半監督學習在用較少數據和取得較高准確率之間找到一個平衡.

    Popular choices for semisupervised learning include label spreading , label propagation , ladder networks , and co-learning/co-training .

其實標准很簡單,根據訓練集是否已經標識了正確的類別,即對某個訓練圖片,我是否已經知道其類別是什么.全都標識了,就是監督學習.部分標識,就是半監督,全部無標識,就是非監督學習.

深度學習用於分類

與傳統的機器學習不同,深度學習省去了特征提取這一步,模型可以自己學習到特征.

深度學習steps

  • 數據收集
    注意:各種label的數據要均衡,比如cat圖片1張,dog圖片1000張.那你訓練出來的model肯定對cat的識別能力很差.
  • 數據集划分
    訓練集/測試集/驗證集 測試集用來測試網絡效果.訓練集中划分一部分出來做調參.叫做驗證集.
  • 訓練
  • 模型效果評估

相比於傳統的特征提取,CNN能夠自動提取特征,但是壞處就是整個過程黑盒化了.你需要花很多時間來獲取調參的經驗.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM