Tensorflow案例:车牌识别代码内容与注释
来自CloudWiki
目录
车牌定位、矫正、筛选
Pycharm中 ,选择python3.5 版本的解释器,下同
需要导入的库
import cv2 as cv import numpy as np from PIL import Image import matplotlib.pyplot as plt import tensorflow as tf
sobel边缘检测
HSV颜色定位
Sobel与HSV综合定位
偏斜车牌矫正
筛选模型训练(单独新建一个训练)
图片导入及处理
import cv2 import numpy as np import matplotlib.pyplot as plt from PIL import Image import os import random import tensorflow as tf #我们将所有输入的图片,高度统一为60,宽度统一为160 IMAGE_HEIGHT = 60 IMAGE_WIDTH = 160 type_num = 2 #随机得到图片(转矩阵)以及标签:输入-文件夹地址 def get_plate(file_dir): path,label = RandomDir(file_dir) filelist=os.listdir(path) index=random.randint(0, len(filelist)-1) filename=filelist[index] file_path = os.path.join(path, filename) img=Image.open(file_path).convert("RGB") #转换为高60宽160的统一格式 img = img.resize((IMAGE_WIDTH, IMAGE_HEIGHT)) img = np.array(img) # 灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # OTUS二值化 ret3, th3 = cv2.threshold(gray , 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) plate_image=np.array(th3) return label,plate_image
生成一个训练batch
# 生成一个训练batch def get_next_batch(batch_size=20): batch_x = np.zeros([batch_size, IMAGE_HEIGHT * IMAGE_WIDTH]) batch_y = np.zeros([batch_size, 1 * type_num]) # 有时生成图像大小不是(60, 160, 3) def wrap_gen_captcha_text_and_image(): #while True: text, image = get_plate('./CNN/') #if image.shape == (60, 160, 3): return text, image for i in range(batch_size): text, image = wrap_gen_captcha_text_and_image() #image = convert2gray(image) batch_x[i, :] = image.flatten() / 255 # (image.flatten()-128)/128 mean为0 vector = np.zeros(1 * type_num) dirlist=os.listdir('./CNN/') if text in dirlist: vector[dirlist.index(text)]=1 batch_y[i, :] = vector return batch_x, batch_y def RandomDir(rootDir): filelist=os.listdir(rootDir) index=random.randint(0, len(filelist)-1) filename=filelist[index] filepath = os.path.join(rootDir, filename) return filepath,filename
定义CNN
X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH]) Y = tf.placeholder(tf.float32, [None, 1 * type_num]) keep_prob = tf.placeholder(tf.float32) # dropout # 定义CNN def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1): x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1]) # w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHT*IMAGE_WIDTH)) # # w_c2_alpha = np.sqrt(2.0/(3*3*32)) # w_c3_alpha = np.sqrt(2.0/(3*3*64)) # w_d1_alpha = np.sqrt(2.0/(8*32*64)) # out_alpha = np.sqrt(2.0/1024) # 3 conv layer w_c1 = tf.Variable(w_alpha * tf.random_normal([3, 3, 1, 32])) b_c1 = tf.Variable(b_alpha * tf.random_normal([32])) conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1)) conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv1 = tf.nn.dropout(conv1, keep_prob) w_c2 = tf.Variable(w_alpha * tf.random_normal([3, 3, 32, 64])) b_c2 = tf.Variable(b_alpha * tf.random_normal([64])) conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2)) conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv2 = tf.nn.dropout(conv2, keep_prob) w_c3 = tf.Variable(w_alpha * tf.random_normal([3, 3, 64, 64])) b_c3 = tf.Variable(b_alpha * tf.random_normal([64])) conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3)) conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv3 = tf.nn.dropout(conv3, keep_prob) # Fully connected layer w_d = tf.Variable(w_alpha * tf.random_normal([8 * 32 * 40, 1024])) b_d = tf.Variable(b_alpha * tf.random_normal([1024])) dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]]) dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d)) dense = tf.nn.dropout(dense, keep_prob) w_out = tf.Variable(w_alpha * tf.random_normal([1024, 1 * type_num])) b_out = tf.Variable(b_alpha * tf.random_normal([1 * type_num])) out = tf.add(tf.matmul(dense, w_out), b_out) # out = tf.nn.softmax(out) return out
训练CNN
# 训练 def train_crack_captcha_cnn(): import time start_time=time.time() output = crack_captcha_cnn() # loss #loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(output, Y)) loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output, labels=Y)) # 最后一层用来分类的softmax和sigmoid有什么不同? # optimizer 为了加快训练 learning_rate应该开始大,然后慢慢衰 optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss) predict = tf.reshape(output, [-1, 1, type_num]) max_idx_p = tf.argmax(predict, 2) max_idx_l = tf.argmax(tf.reshape(Y, [-1, 1, type_num]), 2) correct_pred = tf.equal(max_idx_p, max_idx_l) accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) saver = tf.train.Saver() with tf.Session() as sess: #with tf.device("/gpu:1"): sess.run(tf.global_variables_initializer()) step = 0 while True: batch_x, batch_y = get_next_batch(20) _, loss_ = sess.run([optimizer, loss], feed_dict={X: batch_x, Y: batch_y, keep_prob: 0.75}) print (time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())),step, loss_) # 每100 step计算一次准确率 if step % 100 == 0: batch_x_test, batch_y_test = get_next_batch(20) acc = sess.run(accuracy, feed_dict={X: batch_x_test, Y: batch_y_test, keep_prob: 1.}) print (u'***************************************************************第%s次的准确率为%s'%(step, acc)) # 如果准确率大于50%,保存模型,完成训练 if acc > 0.95: ##我这里设了0.9,设得越大训练要花的时间越长,如果设得过于接近1,很难达到。如果使用cpu,花的时间很长,cpu占用很高电脑发烫。 logs_train_dir = './model/' checkpoint_path = os.path.join(logs_train_dir, 'crack_capcha.model') saver.save(sess, checkpoint_path, global_step=step) print (time.time()-start_time) break step += 1 train_crack_captcha_cnn()
输出结果
019-07-22 02:18:31 298 0.11127849 2019-07-22 02:18:31 299 0.14433172 2019-07-22 02:18:32 300 0.093606435 ***************************************************************第300次的准确率为1.0 226.61262154579163 Process finished with exit code 0
验证模型
验证的过程中,新建一个CNN网络,参数取自刚刚生成的模型
# -*- coding: utf-8 -*- """ Created on Wed Aug 29 15:56:38 2018 @author: Administrator """ import tensorflow as tf import os #import random import numpy as np from PIL import Image import cv2 import matplotlib.pyplot as plt IMAGE_HEIGHT = 60 IMAGE_WIDTH = 160 type_num = 2 #################################################################### ch_list=['no','yes'] X = tf.placeholder(tf.float32, [None, IMAGE_HEIGHT * IMAGE_WIDTH]) Y = tf.placeholder(tf.float32, [None, 1 * type_num]) keep_prob = tf.placeholder(tf.float32) # dropout # 定义CNN def crack_captcha_cnn(w_alpha=0.01, b_alpha=0.1): x = tf.reshape(X, shape=[-1, IMAGE_HEIGHT, IMAGE_WIDTH, 1]) # w_c1_alpha = np.sqrt(2.0/(IMAGE_HEIGHT*IMAGE_WIDTH)) # # w_c2_alpha = np.sqrt(2.0/(3*3*32)) # w_c3_alpha = np.sqrt(2.0/(3*3*64)) # w_d1_alpha = np.sqrt(2.0/(8*32*64)) # out_alpha = np.sqrt(2.0/1024) # 3 conv layer w_c1 = tf.Variable(w_alpha * tf.random_normal([3, 3, 1, 32])) b_c1 = tf.Variable(b_alpha * tf.random_normal([32])) conv1 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x, w_c1, strides=[1, 1, 1, 1], padding='SAME'), b_c1)) conv1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv1 = tf.nn.dropout(conv1, keep_prob) w_c2 = tf.Variable(w_alpha * tf.random_normal([3, 3, 32, 64])) b_c2 = tf.Variable(b_alpha * tf.random_normal([64])) conv2 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1, w_c2, strides=[1, 1, 1, 1], padding='SAME'), b_c2)) conv2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv2 = tf.nn.dropout(conv2, keep_prob) w_c3 = tf.Variable(w_alpha * tf.random_normal([3, 3, 64, 64])) b_c3 = tf.Variable(b_alpha * tf.random_normal([64])) conv3 = tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2, w_c3, strides=[1, 1, 1, 1], padding='SAME'), b_c3)) conv3 = tf.nn.max_pool(conv3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME') conv3 = tf.nn.dropout(conv3, keep_prob) # Fully connected layer w_d = tf.Variable(w_alpha * tf.random_normal([8 * 32 * 40, 1024])) b_d = tf.Variable(b_alpha * tf.random_normal([1024])) dense = tf.reshape(conv3, [-1, w_d.get_shape().as_list()[0]]) dense = tf.nn.relu(tf.add(tf.matmul(dense, w_d), b_d)) dense = tf.nn.dropout(dense, keep_prob) w_out = tf.Variable(w_alpha * tf.random_normal([1024, 1 * type_num])) b_out = tf.Variable(b_alpha * tf.random_normal([1 * type_num])) out = tf.add(tf.matmul(dense, w_out), b_out) # out = tf.nn.softmax(out) return out def crack_captcha(captcha_image): output = crack_captcha_cnn() saver = tf.train.Saver() with tf.Session() as sess: model_file=tf.train.latest_checkpoint('.') saver.restore(sess, model_file) predict = tf.argmax(tf.reshape(output, [-1, 1, type_num]), 2) text_list = sess.run(predict, feed_dict={X: [captcha_image], keep_prob: 1}) text = text_list[0].tolist() return text[0] pathname='G:/tf_plate/code_num/2.png' img=Image.open(pathname).convert("RGB") #转换为高60宽160的统一格式 img = img.resize((IMAGE_WIDTH, IMAGE_HEIGHT)) img = np.array(img) # 灰度 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # OTUS二值化 ret3, th3 = cv2.threshold(gray , 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) plate_image=np.array(th3) plt.imshow(plate_image,cmap='Greys_r') plt.show() image = plate_image.flatten() / 255 predict_text = ch_list[crack_captcha(image)] print(predict_text) tf.reset_default_graph()
文档来源:2019山大培训
文档地址:
链接:https://pan.baidu.com/s/1t-GWSCdr92bYr2m2InIkDw 提取码:wji3 复制这段内容后打开百度网盘手机App,操作更方便哦