创建字母图像用于识别:
from PIL import Image, ImageDraw, ImageFont, ImageFilter import random def getChar(): return chr(random.randint(65, 90)) def getColor2(): return (random.randint(32, 200), random.randint(32, 200), random.randint(32, 200)) width = 32 height = 32 #循环 画A B C 三个字母的图像 for charIndex in range(65, 68): char = chr(charIndex) for i in range(0,100): # 生成图片的底 image = Image.new('RGB', (width, height), (255, 255, 255)) # 创建Draw对象: draw = ImageDraw.Draw(image) #确定字体类型,需要加载对应的ttf文件 font = ImageFont.truetype('arialuni.ttf', random.randint(19,30)) # 输出文字 按照不同的起始位置 不同的字体大小 不同的颜色 绘制字母ABC: draw.text((random.randrange(0,2), random.randrange(0,2)), char, font=font, fill=getColor2()) #按字母-数字的格式存储文件 image.save('yanzhengma/'+char+'-'+str(i)+'.jpg', 'jpeg');
借助keras包依赖theano实现图像识别
import numpy as np from PIL import Image from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers import Conv2D, MaxPooling2D from keras.optimizers import SGD #这一行新加的,用于导入绘图包 from keras.utils import plot_model from sklearn.cross_validation import train_test_split from keras.optimizers import adam img_width, img_height = 32, 32 data = np.empty((300,img_width,img_height,3),dtype="float32") y=[] ##打开图片 for index,i in enumerate('ABC'): print(index) for j in range(0,100): img = Image.open("yanzhengma/"+i+'-'+str(j)+'.jpg') ##把图片转换成数组形式 data[index*100+j] = np.asarray(img,dtype="float32") y.append(index) data = data/255 from sklearn import preprocessing enc = preprocessing.OneHotEncoder() enc.fit(np.array(y).reshape(-1, 1)) # fit来学习编码 y_new = enc.transform(np.array(y).reshape(-1, 1)) print(y_new.shape) model = Sequential() #一层卷积层,包含了32个卷积核,大小为3*3 model.add(Conv2D(10, (3, 3), activation='relu', input_shape=(32, 32,3))) #一个最大池化层,池化大小为2*2 model.add(MaxPooling2D(pool_size=(2, 2))) # #压平层 model.add(Flatten()) #来一个全连接层 #model.add(Dense(16, activation='relu')) #来一个遗忘层 #model.add(Dropout(0.5)) #最后为分类层 model.add(Dense(3, activation='softmax')) model.compile(loss='categorical_crossentropy', optimizer=adam(lr=1e-3),metrics=['accuracy']) model.fit(data, y_new, batch_size=300, epochs=16) _,accuracy = model.evaluate(data, y_new, batch_size=10) print('准确率:',accuracy) model.save("CNN.model")
#因为电脑配置比较低,数据量也不多,我只用了比较少的层数来训练,经过16轮将近12个小时才跑完整个程序,这个三分类问题,最后的准确率为60%。自己自学,第一次做实验,相信通过增加训练时间,提高电脑配置和数据量,能得到更好的结果。