动手学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读取方式进行图像操作

## 这个函数是用opencv来读取图像的
def readImage(path):
    img = cv2.imread(path)
    if img is None:
       print 'error image'
       return None
    img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)  ### BGR -> RGB
    return img
 
def read_and_aug(path):
    img = readImage(path) # get RGB image by opencv
    if img is None:
        return None
    img = mx.nd.array(img) # change to mxnet.ndarray
    img = mx.nd.transpose(img, axes=(2,0,1))   ### channel to first  ([channel, height, weight])
    img = mx.nd.expand_dims(img, axis=0)  ### 3 dims to 4 dims  ([batch, channel, height, weight])
    return img
    
img = read_and_aug(path)  ## 调用

个人感觉,使用opencv与mxnet相结合比较方便,mxnet对于读取的图像类型有局限性,非jpe或者jpeg图像容易出现错误,但是在使用mxnet操作时候,注意将opencv图像格式转换为NDArray格式,转换方式如下:

    mx.nd.array(xxx)

当然还有其他方法,比如可以利用mxnet.image.ImageIter读取文件夹,或者ImageFolderDataset,不过这要求图像是要有标签的,使用受限,这两个方法都是mxnet提供的方法,或者干脆自己写一个类,嘻嘻,都是可以的

未完,待续……

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值