動手學mxnet系列之讀取圖像----多種方式讀取圖像送入mxnet模型

前言

當我們已經有了現成的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提供的方法,或者乾脆自己寫一個類,嘻嘻,都是可以的

未完,待續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章