IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 深度学习之基于CNN实现车牌识别 -> 正文阅读

[人工智能]深度学习之基于CNN实现车牌识别

本篇博客与验证码识别的操作大同小异,只不过在网络结构以及优化器的处理上有所不同。
注:本博客所实现的车牌识别不足以作为一个课设或者毕设,仅使用了CNN,若想做到精确的识别,还需要用到别的模型

1.导入库

import tensorflow as tf
import matplotlib.pyplot as plt
import os,PIL,random,pathlib
import numpy as np
from tensorflow.keras import datasets,layers,models

2.导入数据

data_dir = "E:\\tmp\\.keras\\datasets\\ch_photos"
data_dir = pathlib.Path(data_dir)

pic_paths = list(data_dir.glob('*'))
pic_paths = [str(path) for path in pic_paths]
pic_paths后三张图片的路径
['E:\\tmp\\.keras\\datasets\\ch_photos\\000000000_川W9BR26.jpg', 'E:\\tmp\\.keras\\datasets\\ch_photos\\000000000_藏WP66B0.jpg', 'E:\\tmp\\.keras\\datasets\\ch_photos\\000000001_沪E264UD.jpg']
图片总数:13675
#获取数据标签
all_label_names = [path.split("_")[2].split(".")[0] for path in pic_paths]
#数据可视化
plt.figure(figsize=(10, 5))
plt.suptitle("数据示例", fontsize=15)

for i in range(20):
    plt.subplot(5, 4, i + 1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)

    # 显示图片
    images = plt.imread(pic_paths[i])
    plt.imshow(images)
    # 显示标签
    plt.xlabel(all_label_names[i], fontsize=13)

plt.show()

图片如下所示:
在这里插入图片描述

3.标签数字化

char_enum = ["京","沪","津","渝","冀","晋","蒙","辽","吉","黑","苏","浙","皖","闽","赣","鲁","豫","鄂","湘","粤","桂","琼","川","贵","云","藏","陕","甘","青","宁","新","军","使"]
number = [str(i) for i in range(0,10)]#0-9的数字
alt = [chr(i) for i in range(65,91)]#A-Z的字母
char_set = char_enum+number+alt
char_set_len = len(char_set)
label_name_len = len(all_label_names[0])
#数字可视化
#首先生成一个全为0的label_name_len*char_set_len的二维数组,将标签中出现的字符所在的位置标记为1,这样将一个标签字符串转换为了一个二维数组。
def text2vec(text):
    print(text)
    vector = np.zeros([label_name_len,char_set_len])
    for i ,c in enumerate(text):
        idx = char_set.index(c)
        vector[i][idx] = 1.0
    return vector
all_labels = [text2vec(i) for i in all_label_names]

4.构建一个tf.data.Dataset

#加载数据
path_ds = tf.data.Dataset.from_tensor_slices(pic_paths)
image_ds = path_ds.map(load_and_preprocess_image,num_parallel_calls=tf.data.experimental.AUTOTUNE)
label_ds = tf.data.Dataset.from_tensor_slices(all_labels)

image_label_ds = tf.data.Dataset.zip((image_ds,label_ds))
# print(image_label_ds)
train_ds = image_label_ds.take(5000).shuffle(5000)
test_ds = image_label_ds.skip(5000).shuffle(1000)

batch_size = 32
#使用prefetch()可显著减少空闲时间
train_ds = train_ds.batch(batch_size)
train_ds = train_ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)#减少空闲时间
test_ds = test_ds.batch(batch_size)
test_ds = test_ds.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)#减少空闲时间

5.搭建CNN网络

网络结构为:三层卷积池化+Flatten+两层Dense

model = models.Sequential([
    tf.keras.layers.Conv2D(32,(3,3),activation='relu',input_shape=(50,200,1)),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(64,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Conv2D(128,(3,3),activation='relu'),
    tf.keras.layers.MaxPooling2D((2,2)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(1000,activation='relu'),
    tf.keras.layers.Dense(label_name_len*char_set_len),
    tf.keras.layers.Reshape([label_name_len,char_set_len]),
    tf.keras.layers.Softmax()
])

优化器的构建(参考K同学啊的博客):

learning_rate是影响模型准确率的一个重要因素。
①学习率大
优点:学习速率加快、有助于跳出局部最优值
缺点:模型训练不收敛、模型不精确
②学习率小
优点:有助于模型收敛,模型细化、提高模型精度
缺点:收敛缓慢,很难跳出局部最优值
动态学习率:指数衰减型(ExponentialDecay)。在每一个epoch开始前,学习率(learning_rate)都将会重置为初始学习率(initial_learning_rate),然后再重新开始衰减。
计算公式如下:

learning_rate =initial_learning_rate * decay_rate ^ (step / decay_steps)
#设置优化器
#起始学习率
init_learning_rate = 1e-3
lr_sch = tf.keras.optimizers.schedules.ExponentialDecay(
    initial_learning_rate=init_learning_rate,
    decay_steps=50,
    decay_rate=0.96,
    staircase=True
)

模型编译&&训练

epochs = 10
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=lr_sch),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)
history = model.fit(
    train_ds,
    validation_data=test_ds,
    epochs=epochs
)

结果如下所示:
在这里插入图片描述
训练集的模型准确率达到了100%,但是测试集的准确率就有些低了,在70%左右。

6.模型加载&&预测

模型保存:

model.save('E:/tmp/.keras/datasets/ch_photos/ch_model.h5')

模型加载:

new_model = tf.keras.models.load_model('E:/tmp/.keras/datasets/ch_model.h5')

选取6张图片进行预测:

    plt.figure(figsize=(10, 8))  # 图形的宽为10高为8

    for images, labels in test_ds.take(1):
        images = tf.squeeze(images, axis=3)  # 裁掉一维
        for i in range(6):
            ax = plt.subplot(5, 2, i + 1)
            # 显示图片
            plt.imshow(images[i])

            # 需要给图片增加两个维度
            img_array = tf.expand_dims(images[i], 0)
            img_array = tf.expand_dims(img_array, -1)
            # 使用模型预测
            predictions = new_model.predict(img_array)
            plt.title(vec2text(np.argmax(predictions, axis=2)[0]), fontsize=15)

            plt.axis("off")
plt.show()

结果如下:
在这里插入图片描述
总结:
模型的准确率不高有一下几点:
1.图片模糊,根据上图来看,有的图片本身就存在不清楚、歪斜、缺失等特点,导致训练效果不好。
2.某些字形近,例如0和Q、2和Z、1和I、V和Y等,单纯的利用卷积去识别它们的特征很困难,这里和手写数字识别是不一样的。
进一步提高准确率的方式:
1.对图片做锐化处理,使其特征更加明显,在模型训练时可以更轻松的提取特征。
2.采用分割的方式将车牌分割为7个字符,然后分别对这7个字符进行处理,而不是统一处理。这一操作就需要引入别的字符分割的模型了。
3.修改网络,包括超参数的修改和网络结构的修改,但是这一步所能提高的准确率很有限。
努力加油a啊

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-05 17:21:26  更:2021-08-05 17:23:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 19:05:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码