前幾天學習了卷積神經網絡之后發現卷積神經網絡處理圖片時候的優點,同時我發現了神經網絡不僅僅在於能處理圖片的分類,而且還能實現聲音的識別。我就想着既然它能夠識別圖片的種類,那必定是運用到了圖片中的隱含的信息,而這些信息的表示不就是一個個的像素點嗎,這個想法讓我想將中文轉化為像素點,然后將中文的順序在圖片中也按照同樣的順序來進行處理,這樣圖片中就包含了全部中文的信息,然后將圖片放到卷積神經網絡上進行處理,那么中文之間的關聯信息是否能被挖掘呢(之所以不把中文直接轉化為圖片是因為這樣在神經網絡的眼中並不方便處理,直接將中文轉化為圖片的話會導致一個信息占用太大的空間,不方便存儲太多信息,而且中文之間的順序就變成了圖片的特征了,需要神經網絡去挖掘,這個的模型我想並不高效)
今我想把上述的想法應用的實際上,首先今天完成第一步,在python中如何將中文轉化為像素點。
這個過程應該還是挺容易解決的,python當中支持對中文字符直接的操作,那直接對字符串取ord就得到了對應文字的值
ord('字') ->這個函數在python中就能得出中文的具體值了,那么根據這個具體的值,在圖片上對應的點就能設置為相應的顏色的了。
下面參考一個python驗證碼生成網站:https://blog.csdn.net/peng_for_csdn/article/details/89644853,
實現對中文轉化成像素點的過程:
首先
from PIL import Image # 導入畫布
import io
首先確定函數,傳過來的參數應該是:字符串,輸出圖片的位置,每行像素點能表示中文的個數即圖片的寬度。然后根據這些參數我們定義了以下的函數:
def string_to_imagepixel(str,outpath,width=10):
有了這個函數之后,就要將對應字符串中的信息轉化為像素點的信息,我們的思路是將對應的中文字符的值轉化為對應表示顏色的值,在這里面可以這么表示。
我們知道每個顏色有0-255這256個數值,然后因為是3通道,所以有3種顏色的表示,在這3種顏色中,所能夠表達的種類就有256*256*256種,對於表示漢字來說綽綽有余,而對於這個數值的表示,可以用3位的256進制來表示漢字的信息
我想到用到了對應的python函數int("數值",進制數) ,然后python gg了,提示數值轉換超出范圍
那這個問題就很有趣了,我們根據網上的資料https://blog.csdn.net/zuofanxiu/article/details/81745334找到了以下的進制轉化:
#10進制轉其他進制,從地位到高位輸出結果 def conversion(n, d): while(n//d >= 1): print(n%d) n = n//d if(n%d !=0):
在這個函數之中我們稍作修改,使其變成我們想要的格式
#10進制轉其他進制,從地位到高位輸出結果 def conversion(n, d): result=[] while(n//d >= 1): result.append(n%d) n = n//d if(n%d !=0): result.append(n%d) return result;
接着,查看中文的范圍值有什么,根據資料可以知道中文的范圍大概是這么廣,接着計算一個3通道像素點表示的范圍數是:
256*256=65536
65536*256=16777216種
這遠遠已經超過了中文的字符種類,還有幾位剩余的位置可以留作以后中文的像素點中添加一些額外的信息,暫時當做預設位置。
有了上述的基礎之后,我們開始我們中文生成對應的像素點的過程。
首先對字符串進行切分,切分之后的個數就是像素點的個數,但圖片有長有寬,所以對像素點的個數除以預設長度得到對應數據的高度,但是這些文字不一定能夠填滿整張圖片,因此對圖片的剩余部分進行填充白色的處理,白色的話再中文當中未涉及,因為(255,255,255)即表示為白,而白色的數值16777216大小遠遠超過了中文的表示范圍,因此在這里以白色為填充而不是以黑色
有了上述的設計思想以后,將上述的思想轉為代碼就是:
def string_to_imagepixel(str,outpath,width=10): strlen=len(str) #獲得字符長度 height=strlen//width+1 #計算獲得圖片高度 # strfill=(strlen%width) #計算獲得圖片黑色區域填充大小 # if strfill!=0: # height+=1 #若有填充區域則高度加一 bgcolor = (255 ,255, 255) #設置圖片背景顏色為黑色 img = Image.new(mode='RGB', size=(width, height), color=bgcolor) #創建一個畫板 # print(width," ",height) for i in range(len(str)): x=i%width y=i//width pointvalues=conversion(ord(str[i]),256) #獲得漢字的表示顏色 if(len(pointvalues)==2): color1 = (pointvalues[0], pointvalues[1],0) elif(len(pointvalues)==3): color1 = (pointvalues[0], pointvalues[1], pointvalues[2]) elif (len(pointvalues) == 1): color1 = (pointvalues[0], 0, 0) else: color1 = (255, 255, 255) # print(x, " ", y) img.putpixel((x,y),color1) #設置畫布對應點的顏色 img.save(outpath) # 保存 return img
利用上述代碼生成的圖片為:
已經經過了放大處理,這張圖片中存儲的中文信息為:
天天開心,每天都是幸福滿滿的
經過了函數:
string_to_imagepixel("天天開心,每天都是幸福滿滿的",r"C:\Users\Halo\Desktop\1.6項目開發過程\test.png",10);
的轉換,如此一來,就能生成可以產生含有中文信息的圖片了
這個過程
為了能讓圖片更好地代入卷積神經網絡(卷積神經網絡中有卷積層,會對圖片數據進行卷積計算,因此可以將像素點放大到同樣的卷積核大小,或者直接將卷積核設置為1),或可以對圖片進行放大處理。
然而我發現了在生成的過程當中,圖片的大小會隨着字符串的長度的改變而改變,可變長度的圖片代入神經網絡中,很明顯是不可能的,因此可以采用一開始就預設多個位置,則給圖片設置固定高度,好讓其可以代入神經網絡當中,圖片的高度寬度即固定,則必須對於在此之前長度的字符串均可以代入其中。例如一張寬為40 高為10的圖片可以代入0-400個字符,依次類推,這樣就實現了動態代入神經網絡
修改之后的代碼,hum若為空,則高度自己根據圖片的所給的寬度而發生改變
def string_to_imagepixel(str,outpath,width=40,hnum=None):
strlen=len(str) #獲得字符長度
if(hnum==None):
height=strlen//width+1 #計算獲得圖片高度
else:
height=hnum
# strfill=(strlen%width) #計算獲得圖片黑色區域填充大小
# if strfill!=0:
# height+=1 #若有填充區域則高度加一
bgcolor = (0 ,0, 0) #設置圖片背景顏色為黑色
img = Image.new(mode='RGB', size=(width, height), color=bgcolor) #創建一個畫板
# print(width," ",height)
for i in range(len(str)):
x=i%width
y=i//width
pointvalues=conversion(ord(str[i]),256) #獲得漢字的表示顏色
if(len(pointvalues)==2):
color1 = (pointvalues[0], pointvalues[1],0)
elif(len(pointvalues)==3):
color1 = (pointvalues[0], pointvalues[1], pointvalues[2])
elif (len(pointvalues) == 1):
color1 = (pointvalues[0], 0, 0)
else:
color1 = (0, 0, 0)
# print(x, " ", y)
img.putpixel((x,y),color1) #設置畫布對應點的顏色
img.save(outpath) # 保存
return img
幾百個文字存儲信息圖片:
經過測試后,在神經網絡的識別上,步長設置為1,卷積核設置為1有較好的回溯效果