PaddlePaddle 极简入门实践五:图像读取

上个教程已经交代过深度学习中识别验证码的一些简单步骤了
传送门:https://www.jianshu.com/p/df98fcc832ed

但在入坑的时候总会在数据集列表生成方面出现问题
比方说 图像的读取
“直接open不行吗?”
“为什么我用OpenCV读取后显示Conv intput should be 4-D or 5-D tensor?”
......
简单介绍一下常用在PaddlePaddle中处理图像的方法

1、Pillow(PIL)

PIL是一个非常轻便的库,但它读进来的图像是一个对象,而不是numpy 矩阵
如果要变成矩阵则需要Numpy库完成以下代码

import numpy as np
im = np.array(im)

否则会在归一化时候报出错误TypeError: unsupported operand type(s) for /: 'Image' and 'float'

PaddlePaddle 极简入门实践五:图像读取_第1张图片
归一化时报错

把它变成Numpy数组后就可以了吗?
并不是的,图片以30x15的灰度单通道图片为例
此时图片的维度为1x30x15(单通道x长x宽)
而你需要放入训练进程的是图片列表,也就是说维度应该是Nx1x30x15
(N为图片数量,N=1时表示只有一张图片)
否则会提示出类似Conv intput should be 4-D or 5-D tensor?的错误
那么接下来就应该使用Numpy对维度进行调整

from PIL import Image
im = Image.open(path + "data/" + str(i) + ".jpg").convert('L')#单通道模式打开图片
im = numpy.array(im).reshape(1, 1, 30, 15).astype(numpy.float32)#转换维度

如果使用迭代器方法则可以省去''Nx1x30x15''中的'N'

def dataReader():
     #使用PaddlePaddle中reader生成数据集列表
    def redaer():
        for i in range(1,1501):
            im = Image.open(path + "data/" + str(i) + ".jpg").convert('L')
            im = np.array(im).reshape(1,30, 15).astype(np.float32)
            im = im / 255.0 * 2.0 - 1.0
            yield im
    return redaer

2、OpenCV

OpenCV库的强大之处在于功能非常全面
但OpenCV读取的三通道图片并不是RGB顺序,而是BGR顺序
在使用PaddlePaddle时读取图片还是改一下颜色通道顺序

img=np.transpose(img, (2, 0, 1))#numpy库

img为OpenCV读取的三通道图像
同样,要避免出现上文中的'没有调整维度'Nx1x30x15'而造成Conv intput should be 4-D or 5-D tensor?的错误还是要进行reshape转换

3、使用PaddlePaddle中dataset.image.load_image读取图像(V1.5版本在文档中取消了该API描述)

操作起来也是非常简单

import paddle.fluid

img = paddle.dataset.image.load_image("./data/1.jpg")#1x30x15
print(len(img),len(img[0]),len(img[0][0]))#打印维度信息

运行一下看看输出信息


PaddlePaddle 极简入门实践五:图像读取_第2张图片
输出信息

可以看到对应的是 长x宽x通道数
如果不变换的情况下在定义输入数据类型的时候需要更改为shape=[30,15,3]

在Python中图像处理库还有非常多
参考一下这篇文章,介绍的很详细
https://www.cnblogs.com/skyfsm/p/8276501.html

你可能感兴趣的:(PaddlePaddle 极简入门实践五:图像读取)