当我们已经有了现成的mxnet模型,如何在自己的数据上测试模型效果呢(即一张一张或者几张几张的过模型),这就涉及到如何读取图像,并将其变换为mxnet认识的结构(一般是4维),并送入模型,其实不光是mxnet,所有的深度学习框架都会有这个处理过程,这里,博主总结了几种常用的方法,都是比较简单的,个人比较喜欢使用mxnet.image.imread()或者是cv2.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)
这时,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))
## 这个函数是用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提供的方法,或者干脆自己写一个类,嘻嘻,都是可以的
未完,待续……