上个教程已经交代过深度学习中识别验证码的一些简单步骤了
传送门: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'
把它变成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]))#打印维度信息
运行一下看看输出信息
可以看到对应的是 长x宽x通道数
如果不变换的情况下在定义输入数据类型的时候需要更改为shape=[30,15,3]
在Python中图像处理库还有非常多
参考一下这篇文章,介绍的很详细
https://www.cnblogs.com/skyfsm/p/8276501.html