像素:組成圖片的基礎單元
現在的多數表征圖像的方式都是采用的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能夠自動提取特征,但是壞處就是整個過程黑盒化了.你需要花很多時間來獲取調參的經驗.
