import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import cv2
import matplotlib.pyplot as plt
import os
from multiprocessing import cpu_count
from paddle.fluid.dygraph import Pool2D,Conv2D
# from paddle.fluid.dygraph import FCfrom paddle.fluid.dygraph import Linear
生成車牌字符圖像列表
data_path = '/home/aistudio/data'
character_folders = os.listdir(data_path)
label = 0
LABEL_temp = {}
if(os.path.exists('./train_data.list')):os.remove('./train_data.list')
if(os.path.exists('./test_data.list')):os.remove('./test_data.list')
for character_folder in character_folders:with open('./train_data.list', 'a') as f_train:with open('./test_data.list', 'a') as f_test:if character_folder == '.DS_Store' or character_folder == '.ipynb_checkpoints' or character_folder == 'data23617':continueprint(character_folder + " " + str(label))LABEL_temp[str(label)] = character_folder #存儲一下標簽的對應關系character_imgs = os.listdir(os.path.join(data_path, character_folder))for i in range(len(character_imgs)):if i%10 == 0: f_test.write(os.path.join(os.path.join(data_path, character_folder), character_imgs[i]) + "\t" + str(label) + '\n')else:f_train.write(os.path.join(os.path.join(data_path, character_folder), character_imgs[i]) + "\t" + str(label) + '\n')label = label + 1
print('圖像列表已生成')
class MyLeNet(fluid.dygraph.Layer):def __init__(self):super(MyLeNet,self).__init__()self.hidden1_1 = Conv2D()self.hidden1_2 = Pool2D()self.hidden2_1 = Conv2D()self.hidden2_2 = Pool2D()self.hidden3 = Conv2D()self.hidden4 = Linear()def forward(self,input):return y
用動態圖進行訓練
with fluid.dygraph.guard():model=MyLeNet() #模型實例化model.train() #訓練模式opt=fluid.optimizer.SGDOptimizer(learning_rate=0.001, parameter_list=model.parameters())#優化器選用SGD隨機梯度下降,學習率為0.001.epochs_num=200 #迭代次數為200for pass_num in range(epochs_num):for batch_id,data in enumerate(train_reader()):images=np.array([x[0].reshape(1,20,20) for x in data],np.float32)labels = np.array([x[1] for x in data]).astype('int64')labels = labels[:, np.newaxis]image=fluid.dygraph.to_variable(images)label=fluid.dygraph.to_variable(labels)predict=model(image)#預測loss=fluid.layers.cross_entropy(predict,label)avg_loss=fluid.layers.mean(loss)#獲取loss值acc=fluid.layers.accuracy(predict,label)#計算精度if batch_id!=0 and batch_id%50==0:print("train_pass:{},batch_id:{},train_loss:{},train_acc:{}".format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))avg_loss.backward()opt.minimize(avg_loss)model.clear_gradients() fluid.save_dygraph(model.state_dict(),'MyLeNet')#保存模型
模型校驗
with fluid.dygraph.guard():accs = []model=MyLeNet()#模型實例化model_dict,_=fluid.load_dygraph('MyLeNet')model.load_dict(model_dict)#加載模型參數model.eval()#評估模式for batch_id,data in enumerate(test_reader()):#測試集images=np.array([x[0].reshape(1,20,20) for x in data],np.float32)labels = np.array([x[1] for x in data]).astype('int64')labels = labels[:, np.newaxis]image=fluid.dygraph.to_variable(images)label=fluid.dygraph.to_variable(labels)predict=model(image)#預測acc=fluid.layers.accuracy(predict,label)accs.append(acc.numpy()[0])avg_acc = np.mean(accs)print(avg_acc)
對車牌圖片進行處理,分割出車牌中的每一個字符并保存
license_plate = cv2.imread('CarID.png')
gray_plate = cv2.cvtColor(license_plate, cv2.COLOR_RGB2GRAY)
ret, binary_plate = cv2.threshold(gray_plate, 175, 255, cv2.THRESH_BINARY)
result = []
for col in range(binary_plate.shape[1]):result.append(0)for row in range(binary_plate.shape[0]):result[col] = result[col] + binary_plate[row][col]/255
character_dict = {}
num = 0
i = 0while i < len(result):if result[i] == 0:i += 1else:index = i + 1while result[index] != 0:index += 1character_dict[num] = [i, index-1]num += 1i = indexfor i in range(8):if i==2:continuepadding = (170 - (character_dict[i][1] - character_dict[i][0])) / 2ndarray = np.pad(binary_plate[:,character_dict[i][0]:character_dict[i][1]], ((0,0), (int(padding), int(padding))), 'constant', constant_values=(0,0))ndarray = cv2.resize(ndarray, (20,20))cv2.imwrite('./' + str(i) + '.png', ndarray)def load_image(path):img = paddle.dataset.image.load_image(file=path, is_color=False)img = img.astype('float32')img = img[np.newaxis, ] / 255.0return img
將標簽進行轉換
print('Label:',LABEL_temp)
match = {'A':'A','B':'B','C':'C','D':'D','E':'E','F':'F','G':'G','H':'H','I':'I','J':'J','K':'K','L':'L','M':'M','N':'N','O':'O','P':'P','Q':'Q','R':'R','S':'S','T':'T','U':'U','V':'V','W':'W','X':'X','Y':'Y','Z':'Z','yun':'云','cuan':'川','hei':'黑','zhe':'浙','ning':'寧','jin':'津','gan':'贛','hu':'滬','liao':'遼','jl':'吉','qing':'青','zang':'藏','e1':'鄂','meng':'蒙','gan1':'甘','qiong':'瓊','shan':'陜','min':'閩','su':'蘇','xin':'新','wan':'皖','jing':'京','xiang':'湘','gui':'貴','yu1':'渝','yu':'豫','ji':'冀','yue':'粵','gui1':'桂','sx':'晉','lu':'魯','0':'0','1':'1','2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9'}
L = 0
LABEL ={}for V in LABEL_temp.values():LABEL[str(L)] = match[V]L += 1
print(LABEL)
構建預測動態圖過程
with fluid.dygraph.guard():model=MyLeNet()#模型實例化model_dict,_=fluid.load_dygraph('MyLeNet')model.load_dict(model_dict)#加載模型參數model.eval()#評估模式lab=[]for i in range(8):if i==2:continueinfer_imgs = []infer_imgs.append(load_image('./' + str(i) + '.png'))infer_imgs = np.array(infer_imgs)infer_imgs = fluid.dygraph.to_variable(infer_imgs)result=model(infer_imgs)lab.append(np.argmax(result.numpy()))
# print(lab)display(Image.open('CarID.png'))
print('\n車牌識別結果為:',end='')
for i in range(len(lab)):print(LABEL[str(lab[i])],end='')