基于CRNN的中文车牌识别

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、检测结果

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
目标识别是计算机视觉一个重要的研究领域,由此延伸出的车辆型号识别具有重 要的实际应用价值,特别是在当今交通状况复杂的大城市,智能交通系统成为发展趋 势,这离不开对车辆型号进行识别和分类的工作,本文围绕如何利用计算机视觉的方 法进行车辆型号的识别和分类展开了一系列研究: 本文对当前的目标识别和分类的特征和算法做了总结和归纳。分析比较了作为图 像特征描述常见的特征算子,总结归纳了他们的提取方法、特征性能以及相互之间的 关联。另外,介绍了在目标识别工作中常用的分类方法,阐述了他们各自的原理和工作 方法。研究了深度神经网络的理论依据,分析比较了深度神经网络不同的特征学习方 法,以及卷积神经网络的训练方法。分析比较不同特征学习方法的特点选取 k-means 作为本文使用的特征学习方法,利用卷积神经网络结构搭建深度学习模型,进行车辆 车型识别工作。 本文为了测试基于深度学习的车辆型号分类算法的性能在 30 个不同型号共 7158 张图片上进行实验;并在相同数据上利用改进了的 SIFT 特征匹配的算法进行对比实验; 进过实验测试,深度学习方法在进行车型分类的实验中取得 94%的正确率,并在与 SIFT 匹配实验结果对比后进一步证实:深度学习的方法能够应用在车辆型号识别领域

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值