前言
當我們已經有了現成的mxnet模型,如何在自己的數據上測試模型效果呢(即一張一張或者幾張幾張的過模型),這就涉及到如何讀取圖像,並將其變換爲mxnet認識的結構(一般是4維),並送入模型,其實不光是mxnet,所有的深度學習框架都會有這個處理過程,這裏,博主總結了幾種常用的方法,都是比較簡單的,個人比較喜歡使用mxnet.image.imread()或者是cv2.imread()
其實無論採用什麼方法,只要注意以下幾點,方法就多了:
- mxnet是RGB格式,不是BGR,所以opencv讀取需要變換BGR->RGB。
- 目前默認的格式是[batch, channel, h, w],而一般讀取圖像的接口默認channel一般是放到後面的,比如opencv讀取的圖像一般是[h,w,channel],所以這裏需要變換,將channel變換到前面去。
- 模型前向傳播一般是4維的,讀取圖像一般是3維的,所以需要增加一個維度變換成4維。
下面介紹一些方法
1、利用mxnet的imread()函數讀取圖像並進行數據擴增:
#### data augment function
def transform(data,augmenters):
for aug in augmenters:
data = aug(data)
return data
#### 常用操作
cast_aug = mx.image.CastAug()
resize_aug = mx.image.ForceResizeAug(size=[width,height])
color_normal_aug = mx.image.ColorNormalizeAug(mx.nd.array([123,117,104]),mx.nd.array([1,1,1]))
argmenters = [cast_aug, resize_aug, color_normal_aug]
#### read image
image = mx.image.imread(path) ## 默認是RGB格式的,mxnet默認操作RGB格式數據
image = transform(image,argmenters) ## mxnet默認的圖像操作在channel_last進行
image = mx.nd.transpose(image,axes=(2,0,1))
image = mx.nd.expand_dims(image,axis=0)
2、另一種mxnet圖像讀取方式:利用數據流:
這時,data是ndarray格式的數據(imdecode應該是解析圖像的頭)
image_string = open('file_path', 'rb').read()
data = mx.image.imdecode(image_string, flag=1)
data = mx.nd.transpose(data,axes=(2, 0, 1))
data = mx.nd.expand_dims(data, axis=0)
print('shape:{}'.format(data.shape))
3、採用opencv讀取方式進行圖像操作
def readImage(path):
img = cv2.imread(path)
if img is None:
print 'xxx'
return
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img= np.transpose(img,(2,0,1)) ## channel first
img = img[np.newaxis,:] ## add batch -> 4 dims
return img
個人感覺,使用opencv與mxnet相結合比較方便,mxnet對於讀取的圖像類型有侷限性,非jpe或者jpeg圖像容易出現錯誤,但是在使用mxnet操作時候,注意將opencv圖像格式轉換爲NDArray格式,轉換方式如下:
mx.nd.array(xxx)
當然還有其他方法,比如可以利用mxnet.image.ImageIter讀取文件夾,或者ImageFolderDataset,不過這要求圖像是要有標籤的,使用受限,這兩個方法都是mxnet提供的方法,或者乾脆自己寫一個類,嘻嘻,都是可以的
未完,待續……