查看“Tensorflow案例:车牌识别代码内容与注释”的源代码
←
Tensorflow案例:车牌识别代码内容与注释
跳转至:
导航
,
搜索
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
==车牌定位、矫正、筛选== Pycharm中 ,选择python3.5 版本的解释器,下同 ===需要导入的库=== <nowiki>import cv2 as cv import numpy as np from PIL import Image import matplotlib.pyplot as plt import tensorflow as tf</nowiki> ===sobel边缘检测=== ===HSV颜色定位=== ===Sobel与HSV综合定位=== ===偏斜车牌矫正=== ===筛选模型训练(单独新建一个训练)=== <nowiki>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 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 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 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()</nowiki> 文档来源:2019山大培训 文档地址: <nowiki>链接:https://pan.baidu.com/s/1t-GWSCdr92bYr2m2InIkDw 提取码:wji3 复制这段内容后打开百度网盘手机App,操作更方便哦</nowiki>
返回至
Tensorflow案例:车牌识别代码内容与注释
。
导航菜单
个人工具
登录
命名空间
页面
讨论
变种
视图
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
帮助
工具
链入页面
相关更改
特殊页面
页面信息