網站備案查詢 whois百度網站提交
PyTorch深度學習實戰(zhàn)(5)——計算機視覺
- 0. 前言
- 1. 圖像表示
- 2. 將圖像轉換為結構化數組
- 2.1 灰度圖像表示
- 2.2 彩色圖像表示
- 3 利用神經網絡進行圖像分析的優(yōu)勢
- 小結
- 系列鏈接
0. 前言
計算機視覺是指通過計算機系統(tǒng)對圖像和視頻進行處理和分析,利用計算機算法和方法,使計算機能夠模擬和理解人類的視覺系統(tǒng)。通過計算機視覺技術,計算機可以從圖像和視頻中提取有用的信息,實現對環(huán)境的感知和理解,從而幫助人們解決各種問題和提高效率。本節(jié)中,將介紹計算機中的圖像表示,并介紹如何利用神經網絡進行圖像分析,為計算機視覺的高級任務和應用奠定基礎。
1. 圖像表示
數字圖像文件(通常擴展名為“JPEG
”或“PNG
”)由像素數組組成,像素是圖像的最小構成元素。在灰度圖像中,每個像素都是 0
到 255
之間的標量值,0
表示黑色,255
表示白色,介于 0
到 255
之間的值都是灰色值(像素值越小,像素越暗)。
形式上,圖像可以描述為 2D
函數 f ( x , y ) f(x, y) f(x,y),其中 ( x , y ) (x, y) (x,y) 是空間坐標,而 f ( x , y ) f(x, y) f(x,y) 是圖像在點 ( x , y ) (x, y) (x,y) 處的亮度或灰度或顏色值,其中:
- x ∈ [ 0 , h ? 1 ] x∈ [0, h-1] x∈[0,h?1],其中 h h h 是圖像的高度
- y ∈ [ 0 , w ? 1 ] y∈ [0, w-1] y∈[0,w?1],其中 w w w 是圖像的寬度
- f ( x , y ) ∈ [ 0 , L ? 1 ] f(x, y)∈ [0,L-1] f(x,y)∈[0,L?1],其中 L = 256 L=256 L=256 (對于8位灰度圖像)
而彩色圖像中的像素是三維矢量,分別對應于紅色、綠色和藍色通道中的標量值,可以定義三個函數來分別表示紅色、綠色和藍色值。這三個單獨的函數中的每一個都遵循與為灰度圖像定義的 f ( x , y ) f(x, y) f(x,y) 函數相同的公式。我們將這三個函數的子索引 R
、G
和 B
分別表示為 f R ( x , y ) f_R(x, y) fR?(x,y)、 f G ( x , y ) f_G(x, y) fG?(x,y) 和 f B ( x , y ) f_B(x, y) fB?(x,y)。
一個圖像的像素值數量通常為 height x width x c
,其中 height
表示像素的行數,width
表示像素的列數,c
表示通道數,對于彩色圖像 c
為 3
(紅色、綠色和藍色強度分量各占據一個通道),對于灰度圖像 c
為 1
,下圖表示包含 4 x 4
像素及其相應標量值的灰度圖像:
像素值為 0
表示黑色,而 255
表示白色,0-255
中間的值表示不同強度的灰色值。彩色圖像中,通常使用 RGB
模型表示圖像,RGB
模型是一種加法顏色模型,其中原色(在 RGB
模型中,原色是紅色 R
、綠色 G
和藍色 B
) 混合在一起就可以用來表示廣泛的顏色范圍。
每個原色 (R, G, B)
通常表示一個通道,其取值范圍為 [0, 255]
內的整數值。因此,每個通道有共 256
個可能的離散值,其對應于用于表示顏色通道值的總比特數 ( 2 8 = 256 2^8=256 28=256)。此外,由于有三個不同的通道,使用 RGB
模型表示的圖像稱為 24
位色深圖像:
在上圖中,可以看到 RGB
顏色空間的“加法顏色”屬性:
- 紅色加綠色會得到黃色
- 藍色加紅色會得到品紅
- 藍色加綠色會得到青色
- 三種原色加在一起得到白色
因此,如前所述,RGB
顏色模型中,特定顏色可以由紅、綠和藍值分量合成表示,將像素值表示為 RGB
三元組 (r, g, b)
。典型的 RGB
顏色選擇器如下圖所示:
2. 將圖像轉換為結構化數組
2.1 灰度圖像表示
我們首先介紹如何轉換灰度圖像,將灰度圖像轉換為結構化數組,并進行可視化。
(1) 導入 cv2
(用于從磁盤讀取圖像) 和 matplotlib
(用于繪制加載的圖像)庫,并讀取圖像:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('1.jpeg')
在以上代碼中,利用 cv2.imread
方法讀取圖像,將圖像轉換為像素值數組。
(2) 裁剪第 100-600
行以及第 100-900
列之間的圖像,將圖像轉換為灰度圖像并進行繪制:
img = img[100:600,100:900]
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.imshow(img_gray, cmap='gray')
plt.show()
以上代碼得到的圖像可以表示為 500 x 800
像素數組。接下來,我們減少用于表示圖像的像素數量,例如在 25 x 40
陣列上可視化像素值。
(3) 將圖像轉換為 25 x 40
數組并進行繪制:
img_gray_small = cv2.resize(img_gray,(40, 25))
plt.imshow(img_gray_small, cmap='gray')
plt.show()
可以看到,用較少的像素來表示相同的圖像會導致輸出圖像變得模糊。
(4) 接下來,我們檢查像素值:
print(img_gray_small)
輸出結果如下所示,為了便于觀察,我們僅查看前四行像素值:
[[251 252 252 252 253 253 253 253 254 254 254 254 254 254 254 254 254 254254 255 255 255 255 255 255 255 255 255 255 249 205 200 183 193 215 199200 192 212 250][250 248 251 252 253 253 253 253 254 254 254 254 254 254 254 254 254 254254 254 254 254 254 255 255 255 255 255 255 252 193 229 234 184 184 176217 178 233 244][222 205 226 237 237 253 253 253 253 254 254 254 254 254 254 254 254 254242 252 254 254 254 254 254 255 255 255 255 253 239 227 243 229 216 166231 205 214 251][221 237 235 228 200 73 46 42 138 91 74 78 237 254 254 254 254 253232 244 248 250 250 253 254 250 253 255 255 251 240 246 250 237 241 206213 229 212 252][...]]
我們可以將像素值顯示在對應像素上,如下所示:
如圖所示,接近 255
的像素看起來更亮,而接近 0
的像素看起來更暗。
2.2 彩色圖像表示
我們也可以將以上步驟用于彩色圖像上,每個像素可以表示為 3
維向量,最亮的紅色像素表示為 (255,0,0)
,圖像中的純白色像素表示為 (255,255,255)
。接下來,將彩色圖像轉換為結構化像素值數組。
(1) 導入相關庫并加載圖像:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('1.jpeg')
(2) 裁剪圖像并繪制圖像:
img = img[100:600,100:900]
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
print(img.shape)
# (500, 800, 3)
在以上代碼中,使用 cv2.cvtcolor
方法對通道進行了重新排序。這是因為使用 cv2
導入圖像時,通道的順序是:藍色-綠色-紅色 (BGR)
,但通常,我們習慣于以“紅色-綠色-藍色
”的 RGB
通道查看圖像。
(3) 打印右下角的 3 x 3
像素陣列,并繪制像素值:
crop = img[-3:,-3:]
print(crop)
'''
[[[ 80 152 86][ 77 148 82][ 74 146 80]][[ 82 153 87][ 81 150 87][ 79 148 85]][[ 81 151 81][ 88 154 90][ 88 154 90]]]
'''
plt.imshow(crop)
plt.show()
將圖像轉換為結構化的數字數組(即將圖像讀入 Python
內存)使我們能夠對圖像(表示為數字數組)執(zhí)行各種數學運算,利用這種數據結構可以執(zhí)行計算機視覺各種任務,例如分類、檢測和分割等。
3 利用神經網絡進行圖像分析的優(yōu)勢
在傳統(tǒng)計算機視覺中,在將數據輸入到模型之前需要利用專業(yè)知識為每張圖像提取一些特征。接下來,我們根據以下示例圖像介紹傳統(tǒng)計算機視覺如何獲取特征,以了解通過訓練神經網絡避免手動提取圖像特征的優(yōu)勢。
- 直方圖特征:對于一些任務,圖片中的光照(或者說圖像中亮像素和暗像素的比例)十分重要,如夜視應用。下圖展示了示例圖像的直方圖,可以看到圖像的亮度較高:
- 邊和角點特征:對于圖像分割等任務,需要獲取與每個目標對應的像素集,提取邊是一種有效的做法;而在圖像匹配等任務中,檢測關鍵點則至關重要,這些關鍵點是圖像中角點的子集。下圖表示在示例圖像中獲得的邊和角點:
- 色彩分離特征:在自動駕駛汽車的交通信號燈檢測等任務中,通常需要了解交通信號燈上顯示的顏色。下圖顯示了示例圖像的紅色、綠色和藍色通道:
- 圖像梯度特征:了解顏色在像素級別的變化同樣可能非常重要,不同的紋理具有不同的梯度,因此可以將圖像梯度用作紋理檢測器。事實上,獲取梯度是進行邊緣檢測的先決條件。下圖顯示了示例圖像的整體梯度及其
x
和y
方向上的分量:
以上特征只是諸多圖像特征中的一小部分,構建這些特征需要了解圖像和信號分析方面的大量知識,并且應該充分了解哪些特征最適合解決問題。即使?jié)M足這兩個約束條件,也不能保證能夠找到正確的輸入特征組合,即使找到這樣的特征,也不能保證其在新的應用場景中能夠起作用。
基于神經網絡的模型不僅能提取正確的特征,還能學習如何進行最佳組合完成目標任務,解決了傳統(tǒng)特征提取的缺點,也就是說,神經網絡既可以作為特征提取器,也可以作為分類器。
綜上,利用神經網絡進行圖像分析具有以下幾個優(yōu)勢:
- 自動特征學習:傳統(tǒng)的圖像分析方法需要手動提取特征,而神經網絡可以自動學習圖像中的特征表示。通過多層神經網絡的堆疊和訓練,網絡可以學習到不同層次的特征抽象,從低層次的邊緣和紋理到高層次的對象和語義概念。這種自動特征學習使得神經網絡在復雜的圖像分析任務中表現出色。
- 非線性建模能力:神經網絡是一種非線性模型,可以更好地建模和捕捉圖像中的非線性關系。由于圖像具有豐富的結構、紋理和形態(tài)信息,線性模型無法充分表示這些復雜特征。神經網絡通過激活函數和多層連接來引入非線性變換,從而更好地適應各種圖像分析任務。
- 魯棒性和泛化能力:神經網絡在大規(guī)模數據集上進行訓練,并具有較強的魯棒性和泛化能力。這意味著網絡能夠處理具有不同視角、光照條件、噪聲等變化的圖像,并且在未見過的數據上也能有良好的表現。通過合理設計和訓練,神經網絡可以對圖像中的變化和干擾具有一定的容忍度。
- 端到端學習:神經網絡可以實現端到端學習,從原始圖像輸入到最終的輸出結果,無需手工設計復雜的流程和特征轉換。這簡化了圖像分析系統(tǒng)的開發(fā)和部署過程,同時減少了人工錯誤和信息損失。通過端到端學習,神經網絡可以直接從數據中學習到有效的表示和決策規(guī)則。
- 可擴展性和靈活性:神經網絡可以通過增加網絡層數、調整神經元數量以及引入不同的模塊和結構來提高模型的能力。這使得神經網絡具有很強的可擴展性和靈活性,在各類圖像分析任務中可以根據需求進行調整和優(yōu)化。
小結
利用神經網絡進行圖像分析能夠自動學習特征、處理非線性關系、具有魯棒性和泛化能力,并且支持端到端學習和可擴展性,這使其成為當今計算機視覺領域的主要技術手段之一。本節(jié)介紹了計算機視覺的基本概念以及圖像在計算機中的表示方法,為計算機視覺的高級任務奠定了基礎。
系列鏈接
PyTorch深度學習實戰(zhàn)(1)——神經網絡與模型訓練過程詳解
PyTorch深度學習實戰(zhàn)(2)——PyTorch基礎
PyTorch深度學習實戰(zhàn)(3)——使用PyTorch構建神經網絡
PyTorch深度學習實戰(zhàn)(4)——常用激活函數和損失函數詳解