上個(gè)教程已經(jīng)交代過(guò)深度學(xué)習(xí)中識(shí)別驗(yàn)證碼的一些簡(jiǎn)單步驟了
傳送門(mén):http://www.itdecent.cn/p/df98fcc832ed
但在入坑的時(shí)候總會(huì)在數(shù)據(jù)集列表生成方面出現(xiàn)問(wèn)題
比方說(shuō) 圖像的讀取
“直接open不行嗎?”
“為什么我用OpenCV讀取后顯示Conv intput should be 4-D or 5-D tensor?”
......
簡(jiǎn)單介紹一下常用在PaddlePaddle中處理圖像的方法
1、Pillow(PIL)
PIL是一個(gè)非常輕便的庫(kù),但它讀進(jìn)來(lái)的圖像是一個(gè)對(duì)象,而不是numpy 矩陣
如果要變成矩陣則需要Numpy庫(kù)完成以下代碼
import numpy as np
im = np.array(im)
否則會(huì)在歸一化時(shí)候報(bào)出錯(cuò)誤TypeError: unsupported operand type(s) for /: 'Image' and 'float'

把它變成Numpy數(shù)組后就可以了嗎?
并不是的,圖片以30x15的灰度單通道圖片為例
此時(shí)圖片的維度為1x30x15(單通道x長(zhǎng)x寬)
而你需要放入訓(xùn)練進(jìn)程的是圖片列表,也就是說(shuō)維度應(yīng)該是Nx1x30x15
(N為圖片數(shù)量,N=1時(shí)表示只有一張圖片)
否則會(huì)提示出類(lèi)似Conv intput should be 4-D or 5-D tensor?的錯(cuò)誤
那么接下來(lái)就應(yīng)該使用Numpy對(duì)維度進(jìn)行調(diào)整
from PIL import Image
im = Image.open(path + "data/" + str(i) + ".jpg").convert('L')#單通道模式打開(kāi)圖片
im = numpy.array(im).reshape(1, 1, 30, 15).astype(numpy.float32)#轉(zhuǎn)換維度
如果使用迭代器方法則可以省去''Nx1x30x15''中的'N'
def dataReader():
#使用PaddlePaddle中reader生成數(shù)據(jù)集列表
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庫(kù)的強(qiáng)大之處在于功能非常全面
但OpenCV讀取的三通道圖片并不是RGB順序,而是BGR順序
在使用PaddlePaddle時(shí)讀取圖片還是改一下顏色通道順序
img=np.transpose(img, (2, 0, 1))#numpy庫(kù)
img為OpenCV讀取的三通道圖像
同樣,要避免出現(xiàn)上文中的'沒(méi)有調(diào)整維度'Nx1x30x15'而造成Conv intput should be 4-D or 5-D tensor?的錯(cuò)誤還是要進(jìn)行reshape轉(zhuǎn)換
3、使用PaddlePaddle中dataset.image.load_image讀取圖像(V1.5版本在文檔中取消了該API描述)
操作起來(lái)也是非常簡(jiǎn)單
import paddle.fluid
img = paddle.dataset.image.load_image("./data/1.jpg")#1x30x15
print(len(img),len(img[0]),len(img[0][0]))#打印維度信息
運(yùn)行一下看看輸出信息

可以看到對(duì)應(yīng)的是 長(zhǎng)x寬x通道數(shù)
如果不變換的情況下在定義輸入數(shù)據(jù)類(lèi)型的時(shí)候需要更改為shape=[30,15,3]
在Python中圖像處理庫(kù)還有非常多
參考一下這篇文章,介紹的很詳細(xì)
https://www.cnblogs.com/skyfsm/p/8276501.html