keras图像识别入门练习:cnn识别字母图像(一)

创建字母图像用于识别:

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%。自己自学,第一次做实验,相信通过增加训练时间,提高电脑配置和数据量,能得到更好的结果。

你可能感兴趣的:(keras图像识别入门练习:cnn识别字母图像(一))