基于CRNN的中文车牌识别

2023-10-27

1、概述

       目前HyperLRP是一个开源的、基于深度学习高性能中文车牌识别库,本文主要在其基础上进行改动,自己训练一个crnn车牌识别模型。

2、可识别的车牌类型

  •  单行蓝牌
  •  单行黄牌
  •  新能源车牌
  •  白色警用车牌
  •  使馆/港澳车牌
  •  教练车牌

3、可识别的车牌类型 

         此处我们有依旧采用HyperLPR的

  • cascade.xml 车牌检测模型 - 目前效果最好的cascade检测模型
    PlateDetection::PlateDetection(std::string filename_cascade)
    {
    	cascade.load(filename_cascade);
    };
    
    void PlateDetection::plateDetectionRough(cv::Mat InputImage, std::vector<PlateInfo>  &plateInfos, int min_w, int max_w) 
    {
    	cv::Mat processImage;
    	cv::cvtColor(InputImage, processImage, cv::COLOR_BGR2GRAY);
    	std::vector<cv::Rect> platesRegions;
    	cv::Size minSize(min_w, min_w / 4);
    	cv::Size maxSize(max_w, max_w / 4);
    	cascade.detectMultiScale(processImage, platesRegions, 1.1, 3, cv::CASCADE_SCALE_IMAGE, minSize, maxSize);
    	for (auto plate : platesRegions)
    	{
            //此处稍微调整了一下,放大车牌截图
    		int zeroadd_x = static_cast<int>(plate.width * 0.1);
    		int zeroadd_y = static_cast<int>(plate.height * 0.4);
    		int zeroadd_w = static_cast<int>(plate.width * 0.2);
    		int zeroadd_h = static_cast<int>(plate.height * 0.8);
    		plate.x -= zeroadd_x;
    		plate.y -= zeroadd_y;
    		plate.height += zeroadd_h;
    		plate.width += zeroadd_w;
    		cv::Mat plateImage = util::cropFromImage(InputImage, plate);
    		PlateInfo plateInfo(plateImage, plate);
    		plateInfos.push_back(plateInfo);
    	}
    }
  • crnn.onnx端到端的车牌识别模型
  • 车牌识别模型训练可参考:crnn-pytorch: crnn字符识别
PlateRecognizer::PlateRecognizer(std::string filename_crnn)
{
	net = cv::dnn::readNet(filename_crnn);
	net.setPreferableBackend(cv::dnn::DNN_BACKEND_OPENCV);
	//net.setPreferableBackend(cv::dnn::DNN_BACKEND_INFERENCE_ENGINE);
	net.setPreferableTarget(cv::dnn::DNN_TARGET_CPU);
}

inline float PlateRecognizer::Sigmoid(float x, std::vector<float> line_num)
{
	float sum = 0.f;
	for (int i = 0; i < line_num.size(); i++)
		sum += exp(line_num[i]);
	return static_cast<float>(exp(x) / sum);
}

std::pair<std::string, float> PlateRecognizer::getPlateName(cv::Mat &plateImg)
{
	cv::Mat srcImg = plateImg.clone();
	if (plateImg.channels() == 3) {
		cvtColor(plateImg, srcImg, CV_BGR2GRAY);
	}
   cv::Mat blob = cv::dnn::blobFromImage(srcImg, 0.007843, cv::Size(128, 32), 127.5, false, false, CV_32F);
	net.setInput(blob);
	cv::Mat res = net.forward();
	std::string plate, temp_C = "-";
	float confidence = 0.0;
	int length = 0;
	std::vector<float> temp;
	for (int r = 0; r < res.size[0]; r++)
	{
		cv::Mat slice = cv::Mat(1, res.size[2], CV_32F, res.ptr<float>(r));
		float *line = (float*)res.ptr<float>(r);
		for (int i = 0; i < slice.size[1]; i++) {
			temp.push_back(line[i]);
		}
		cv::Point p; double m;
		cv::minMaxLoc(slice, 0, &m, 0, &p);
		std::string c = p.x > 0 ? alphabet[p.x - 1] : "-";
		if (c != "-")
		{
			if (temp_C != c) {
				plate += alphabet[p.x - 1];
			}
			length++;
			confidence += Sigmoid((float)m, temp);
		}
		temp_C = c;
		temp.clear();
	}
	std::pair<std::string, float> plate_conf("none", 0.f);
	if (length > 0){
		plate_conf.first = plate;
		plate_conf.second = confidence / length;
	}
	return plate_conf;
}

4、检测结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于CRNN的中文车牌识别 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 属性对象什么时候创建?

    由于属性实际上只是附加到程序集的元数据 这是否意味着属性对象仅根据请求创建 例如当您调用 GetCustomAttributes 时 或者它们是在创建对象时创建的 或者 前两个的组合 在由于 CLR 的属性扫描而创建对象时创建 从 CLR
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • .Net Core / 控制台应用程序 / 配置 / XML

    我第一次尝试使用新的 ConfigurationBuilder 和选项模式进入 Net Core 库 这里有很多很好的例子 https docs asp net en latest fundamentals configuration ht
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 常见Web安全漏洞

    常见Web安全漏洞 1 越权漏洞 不同权限账户之间的存在越权访问 检测 抓去a用户功能链接 然后登录b用户对此链接进行访问 抓去a用户功能链接 修改id为b的id 查看是否能看b的相关数据 替换不同的cookie进行测试查看 防范 1服务器
  • gin框架29--自定义验证器

    gin框架29 自定义验证器 介绍 案例 说明 介绍 本文介绍了如何在gin框架中自定义验证器 并加以案例说明 案例 源码 package main import net http time github com gin gonic gin
  • JetBrains:推出“新一代 IDE ”!VS Code 对手来了

    近期 JetBrains 在官方博客宣布 推出一款有点不一样的轻量级编辑器 Fleet 并称其为 下一代 IDE 官方地址 https www jetbrains com zh cn fleet 官网介绍中说明 以 20 年的 IDE 开发
  • flink-python的安装

    一 下载flink flink flink python at master apache flink GitHub 二 安装pyflink yum install maven 安装maven 3 1 1以上版本 https ci apac
  • 小程序授权登陆流程

    小程序授权登陆流程 1 当用户进入微信小程序时 首先我们先判断用户是否授权过此小程序 wx getSetting wx getSetting方法获取用户的当前设置 查看是否授权 sucsess res gt 调用成功的回调函数 if res
  • 影视剪辑,PR剪辑软件两个转场教程

    一 古风渐变擦除转场 拖入视频1和视频2 将视频2放到视频1上面的轨道 2者重叠部分就是转场部分 效果 渐变擦除 拖到视频2 在开头K关键帧 效果控件 渐变擦除 过渡完成 K帧调到100 在2段视频交接处 K帧 过渡完成调到0 为了使效果更
  • 数据中台-让数据用起来-8

    文章目录 第八章 数据资产管理 8 1 数据资产的定义和3个特征 8 2 数字资产管理现状和调整 8 3 数据资产管理的4个目标 8 4 数据资产管理在数据中台架构中的位置 8 5 数据治理 8 5 1 数据治理的6个目标 8 5 2 数据
  • 【无人机路径规划】基于IRM和RRTstar进行无人机路径规划(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 文章详细讲解 1 概述 本文将无人机路径规划这一非线性规
  • 2021年最新,解决xgboost安装问题:xgboost.core.XGBoostError: XGBoost Library (xgboost.dll) could not be loaded.

    1 环境 python 3 7版本 64位的 原来 python3 8版本的安装不了 平台不支持 2 直接pip3 install xgboost 3 然后有出错提示xgboost core XGBoostError XGBoost Lib
  • 2020-09-26

    package main 本文通过golang 实现msgpack字节流 参见 https github com hashicorp memberlist git util go decode encode import bytes fmt
  • 打印准考证服务器异常显示,注意了!打印准考证时,你可能遇到这些问题!

    原标题 注意了 打印准考证时 你可能遇到这些问题 2019年研究生准考证下载打印开放时间为 12月14日 12月24日 考生们一定要留心 不要错过打印时间 准考证打印流程 第一步 登录中国研究生招生信息网 并填写用户名和密码 第二步 登录完
  • Docker启动提示:Cannot connect to the Docker daemon...

    执行docker image导入时 提示 Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 执行dock
  • 实战:如何修改vscode作为git默认的编辑器-20211108

    目录 文章目录 目录 实验环境 实验软件 无 1 问题 如何修改vscode作为git默认的编辑器 2 配置方法 1 查看当前环境 2 开始配置 3 验证 关于我 最后 实验环境 win10 git version 2 17 0 windo
  • 硬盘的读写原理

    硬盘的种类主要是SCSI IDE 以及现在流行的SATA等 任何一种硬盘的生产都要一定的标准 随着相应的标准的升级 硬盘生产技术也在升级 比如 SCSI标准已经经历了SCSI 1 SCSI 2 SCSI 3 其中目前咱们经常在服务器网站看到
  • el-date-picker 限制固定开始时间与结束日期,用户只能在此范围内选择

    今天拿到的需求是 开始时间与结束时间是固定的 用户只能在这个范围内选择 为了用户体验好点 我选择了把不能选的日期直接置灰这种实现效果 效果如下 能清楚的看到 2023 01 04 之前的日期都不能选择 当前时间限制 开始范围是2023 01
  • handler机制的原理面试,技术水平真的很重要!真香

    面试如作战 我们看战争影视剧的时候 经常看到这些剧作往往主要聚焦于作战过程 战场战略 对战前准备给的篇幅往往很少 实际上 战前准备也是关键的一环 没有充足的粮草 车马 兵器的准备 别说赢得战争 投入战斗都不可能 这个道理在面试中也是一样 如
  • Linux环境项目以jar包形式启动,指定环境配置文件

    nohup java jar xxx jar spring profiles active DEV gt xxx logs txt
  • 选择排序和冒泡排序算法

    冒泡排序算法 Test public void sort2 int array 1 34 4 56 67 7 89 for int i 0 i lt array length 1 i for int j 0 j lt array lengt
  • 7-16 求符合给定条件的整数集 (15分)

    7 16 求符合给定条件的整数集 15分 给定不超过6的正整数A 考虑从A开始的连续4个数字 请输出所有由它们组成的无重复数字的3位数 输入格式 输入在一行中给出A 输出格式 输出满足条件的的3位数 要求从小到大 每行6个整数 整数间以空格
  • 基于CRNN的中文车牌识别

    1 概述 目前HyperLRP是一个开源的 基于深度学习高性能中文车牌识别库 本文主要在其基础上进行改动 自己训练一个crnn车牌识别模型 2 可识别的车牌类型 单行蓝牌 单行黄牌 新能源车牌 白色警用车牌 使馆 港澳车牌 教练车牌 3 可