我自己的一個體會,在學習機器學習和深度學習的過程里,包括閱讀模型源碼的過程里,一個比較大的阻礙是對numpy掌握的不熟,有的時候對矩陣的維度,矩陣中每個元素值的含義暈乎乎的.
本文就以一個2 x 2 x 3的三維矩陣為例,說明矩陣是如何表示圖像的.
3d array表示一個圖片.比如對ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ]),ex代表的維度是怎樣的?
其實類似於list of list.
- 先看最外層的list內有幾個list,可以看到有2個[],分別為[ [1, 2, 3], [4, 5, 6] ] 和 [ [7, 8, 9], [0, 1, 2] ],我們分別稱之為l1,l2 所以第一個維度是2
- 再看上述的l1,l2內有幾個list.以[ [1, 2, 3], [4, 5, 6] ]為例,有2個,分別為[1,2,3] 和 [4,5,6] 我們稱之為l3,l4 所以第二個維度是2
- 再看上述的l3,l4有幾個list.以[1,2,3]為例,可以看到已經不再有list了.內部是3個數.所以這是最后一個維度了,維度為3.
所以,我們現在就得出ex是一個2 X 2 X 3的矩陣.假設說它代表一副圖的話,代表的就是一個3通道的圖片,圖片尺寸為2 X 2.
即我們有4個像素點,第一個像素點的rgb值為(1,2,3) 第二個像素點rgb值為(4,5,6)..以此類推.
看一段對圖片做預處理的代碼.
在用opencv讀圖像時,是按bgr的順序讀的.
def prep_image(img, inp_dim):
"""
Prepare image for inputting to the neural network.
Returns a Variable
"""
img = (letterbox_image(img, (inp_dim, inp_dim)))
img = img[:,:,::-1].transpose((2,0,1)).copy()
重點看img = img[:,:,::-1].transpose((2,0,1)).copy().
::-1表示在這一維度做倒序.通過前面的分析知道第三個維度表示rgb,所以img[:,:,::-1]可以表示前兩個維度不變,第三個維度倒序,則此時bgr的表示變成了rgb. 此時矩陣代表的是h x w x c.我們想轉換成c x h x w. 原先的第0,1,2維度分別代表h,w,c. 則transpose((2,0,1))代表轉換成矩陣c x h x w.
結合下面測試代碼體會一下,看看每個元素此時表達什么含義.相信對用三維矩陣表達圖片應該不再有問題了.
import numpy
ex = numpy.array([ [ [1, 2, 3], [4, 5, 6] ], [ [7, 8, 9], [0, 1, 2] ] ])
#2 x 2 x 3
print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2])
ex=ex[:,:,::-1]
print(ex)
print(ex[0][0][0])
print(ex[0][0][1])
print(ex[0][0][2])
print(ex.transpose((2,0,1)))
輸出如下:

