tensorflow 车牌识别项目(一)

前言

车牌识别主要分成两个步骤,一是定位车牌位置。二是识别出车牌字符。
此博客仅记录自己摸索的过程中的一些基本过程,后续优化后的最终的结果:识别率达到99%以上,集成定位+识别模型移植到Android端的单张测试速度32ms,完全达到了商用级别,这个就不公开了。

本节内容为车牌定位
所有代码:
链接:https://pan.baidu.com/s/1JPmy684xxsIXJge8CJ1HTg
提取码:xd7r

一 数据解析

  1. 关于车牌数据形式:原数据是以json文件存储,图像以base64编码在json文件中,所以第一步就是从json文件中解析出图像和标签。标签为车牌的4个角点。
    运行gen_raw_img.py,将划分训练集和测试集,共生成4个文件,训练集和测试集图像和记录图像路径的txt文件。4个角点一共8个值
    在这里插入图片描述
    运行check_landmark.py检查下数据,从测试集中随机选取5个图像显示。图像大小为960*540,这里截图太大直截取了一部分。确认无误就可进行下一步

    在这里插入图片描述

二 level 1训练

  1. 首先生成level1的训练数据。进入train目录运行gen_tfrecord.py,将生成各个阶段训练需要的数据。所以需要在gen_tfrecord.py文件中修改level='l1'。运行完成后会在level_1\l1_tfrecord_data目录下生成tensorflow 的tfrecord文件。
    在这里插入图片描述

  2. 网络结构在train/model.py中,没用Mobilinet,用这个网络发现效果变好了,(这里??大写的黑人问号),为了简单起见,我两个阶段的网络都是一样的,后续可以考虑优化

# -*- coding: utf-8 -*-
"""
Created on Sun Apr 26 00:13:09 2020

@author: Ke
"""

import tensorflow as tf
from tensorflow.contrib import slim

def level1_net(inputs):
    with slim.arg_scope([slim.conv2d],
                        weights_initializer=slim.xavier_initializer(),
                        biases_initializer=tf.zeros_initializer(),
                        weights_regularizer=slim.l2_regularizer(0.0005),                        
                        padding='same'):

        net = slim.conv2d(inputs, num_outputs=16, kernel_size=[3,3], stride=2, scope="conv1")#24
        net = slim.conv2d(net,num_outputs=24,kernel_size=[3,3],stride=2,scope="conv2")
        net = slim.conv2d(net,num_outputs=24,kernel_size=[3,3],stride=1,scope="conv3")#12
        net = slim.conv2d(net,num_outputs=32,kernel_size=[3,3],stride=2,scope="conv4")
        net = slim.conv2d(net,num_outputs=32,kernel_size=[3,3],stride=1,scope="conv5")#6     
        net = slim.conv2d(net,num_outputs=64,kernel_size=[3,3],stride=2,scope="conv6")
        net = slim.conv2d(net,num_outputs=64,kernel_size=[3,3],stride=1,scope="conv7")#3
        fc_flatten = slim.flatten(net)
        fc1 = slim.fully_connected(fc_flatten, num_outputs=256,scope="fc1")
        fc2 = slim.fully_connected(fc1, num_outputs=8,scope="fc2")
        return fc2

def level2_net(inputs):
    with slim.arg_scope([slim.conv2d],
                        weights_initializer=slim.xavier_initializer(),
                        biases_initializer=tf.zeros_initializer(),
                        weights_regularizer=slim.l2_regularizer(0.0005),                        
                        padding='same'):

        net = slim.conv2d(inputs, num_outputs=16, kernel_size=[3,3], stride=2, scope="conv1")#24
        net = slim.conv2d(net,num_outputs=24,kernel_size=[3,3],stride=2,scope="conv2")
        net = slim.conv2d(net,num_outputs=24,kernel_size=[3,3],stride=1,scope="conv3")#12
        net = slim.conv2d(net,num_outputs=32,kernel_size=[3,3],stride=2,scope="conv4")
        net = slim.conv2d(net,num_outputs=32,kernel_size=[3,3],stride=1,scope="conv5")#6     
        net = slim.conv2d(net,num_outputs=64,kernel_size=[3,3],stride=2,scope="conv6")
        net = slim.conv2d(net,num_outputs=64,kernel_size=[3,3],stride=1,scope="conv7")#3
        fc_flatten = slim.flatten(net)
        fc1 = slim.fully_connected(fc_flatten, num_outputs=256,scope="fc1")
        fc2 = slim.fully_connected(fc1, num_outputs=8,scope="fc2")
        return fc2

  1. 训练在train/train.py文件中修改为level='l1',第一阶段的训练。
    训练情况如下
    在这里插入图片描述
  2. 训练结束后就是生成训练level2的数据。我们根据level1的预测结果,生成一个最小矩形框,然后将矩形框扩张50个像素点,(这个值也可以更改)超过图像范围的就取图像边界。
    运行level_1下的gen_l2_data.py,将生成l1_result文件夹,图像如下。
    在这里插入图片描述
    (可选)为了更好地观察预测结果,我只将测试集的图像在原图中画出真实角点,预测角点,以及预测角点向外拓展的最小矩形框。结果保存在draw_l1_result中。(训练集有可以这样做,但数据量太大了,我嫌麻烦)
    在这里插入图片描述
    红色为真实坐标、绿色为预测坐标、绿色矩形为裁剪范围。

我们将所有数据都预测并裁剪作为level2的输入

三 level 2训练

  1. 同样运行目录train中的gen_tfrecord.py,注意修改level='l2'。将在level_2中生成l2_tfrecord_data
    在这里插入图片描述
  2. 同样train.py中修改level='l2',然后运行train.py

在这里插入图片描述

四 测试

为了能测试各个阶段的结果。可以运行train中的evaluate.py,同样也要修改是测试哪一阶段
比如测试level1的结果,显示的就是原图
在这里插入图片描述
第二阶段的结果是在crop后的图像上测试,显示的部分图
在这里插入图片描述

五 demo

最后我将两个模型结合起来,代码在Detect文件夹中,百度找了张网图运行demo.py。识别出角点后对倾斜的车牌矫正。
在这里插入图片描述
emmm,还行把。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
TensorFlow可以用于车牌识别任务。首先,我们需要将车牌识别问题转化为字符识别问题。通过使用TensorFlow的机器学习方法,我们可以训练一个模型来识别车牌上的字符。 在TensorFlow中,我们可以创建一个数据流图,将数据以张量的形式存储在图中进行计算。节点表示数学操作,边表示节点之间的联系。训练模型,张量会在节点之间流动。 在之前的博文中,我们演示了如何使用TensorFlow进行车牌识别,但是当使用的是MNIST数字手写体数据集,只能分类0-9共10个数字,无法识别省份简称和字母。为了解决这个问题,我们需要使用更大的数据集,包含更多的字符样本。 通过使用更大的数据集和适当的模型架构,我们可以训练一个能够识别车牌上的字符的模型。这个模型可以通过输入一张有车牌的图片,然后输出车牌号码的字符序列。 总结起来,使用TensorFlow进行车牌识别需要以下步骤: 1. 准备一个包含车牌字符样本的数据集。 2. 创建一个数据流图,并将数据以张量的形式存储在图中。 3. 使用适当的模型架构进行训练,以识别车牌上的字符。 4. 输入一张有车牌的图片,通过模型输出车牌号码的字符序列。 这样,我们就可以使用TensorFlow进行车牌识别了。\[2\]\[3\] #### 引用[.reference_title] - *1* [TensorFlow进阶:车牌号识别项目](https://blog.csdn.net/Mu_yongheng/article/details/116269693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Tensorflow车牌识别完整项目(含完整源代码及训练集)](https://blog.csdn.net/weixin_43881394/article/details/123848906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [TensorFlow车牌识别完整版(含车牌数据集)](https://blog.csdn.net/ShadowN1ght/article/details/78571187)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值