1. 磐创AI首页
  2. Medium

印度车牌识别程序

要完成此任务,让我们了解一下体系结构。我们需要识别车牌,这里特别是印度,所有的国家都有不同类型的车牌字符和车牌形状。因此,总的来说,我们需要首先检测车牌,然后再识别字符。在这方面我们还有一个分叉,即所有的车辆都有不同形状和大小的车牌。在这项任务中,我们只关注汽车,以及任何形状和大小与印度汽车车牌相同的车牌。一旦我们识别了车牌,我们就必须识别车牌的字符。最后,我们必须将这些识别的数字输入API,该API可以给我们提供车辆信息。

工作流程:

模型创建:

Image→HaarCascade Indian_License_Platform→提取的车牌→字符分割→印度车牌字符的数据集→CNN模型训练→模型预测(字符分割)→提取的车牌号码indian_license_plate DataSet of characters of Indian License Plate

在这里,HaarCascade将只检测与汽车号牌相关的大小和形状的车牌。

模型测试:

导入模型和必要函数→新车牌→Haar级联→提取车牌→字符分割→模型预测(分割字符)→接口

最终的视频流WebApp

导入模型和必要函数→从用户→获取每一帧的视频→HaarCascade→提取车牌→字符分割→模型预测(分割字符)→→网页最终输出

获取车辆信息的接口

http://www.carregistrationapi.in/http://www.carregistrationapi.in/

如何训练模特?

如前所述,我们必须训练模型来识别车牌的字符,即字母和数字。创建这样一个模型需要做的事情很少,这里将对此进行说明。从图像中提取任何对象的标准程序是通过查找轮廓。

什么是等高线?

等高线可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和目标检测与识别的有用工具。

  • 为获得更好的准确性,请使用二进制图像。因此,在找到轮廓之前,应用阈值或精明边缘检测。从OpenCV 3.2及更高版本开始,findContours()不再修改图像源。
  • 在OpenCV中,查找轮廓就像从黑色背景中查找白色对象一样。所以请记住,要找到的物体应该是白色的,背景应该是黑色的。

欲了解更多信息,请访问:https://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.htmlhttps://docs.opencv.org/4.5.2/d4/d73/tutorial_py_contours_begin.html

段字符:

现在,我们知道我们必须首先将图像转换为二值图像,然后对其进行阈值处理。一旦我们做到这一点,我们甚至必须使我们的字符在黑色背景下生长得完美。为此,我们在CV2模块中设置了阈值函数。

什么是门槛?

对于每个像素,应用相同的阈值。如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。函数cv.Threshold用于应用阈值。第一个参数是源图像,它应该是灰度,第二个参数是用于对像素值进行分类的阈值,第三个参数是分配给超过阈值的像素值的最大值。OpenCV提供了第四个参数中给出的不同类型的阈值。在我们的例子中,我们一起使用了BINARY和OTSU。二进制将在图像上创建完美的黑白对比度,而OTSU将从图像中去除所有噪声。

欲了解更多信息,请访问:https://docs.opencv.org/4.5.2/d7/d4d/tutorial_py_thresholding.htmlhttps://docs.opencv.org/4.5.2/d7/d4d/tutorial_py_thresholding.html

什么是侵蚀和膨胀?

我们已经对图像进行了阈值处理,现在要设置图像中所有的字符都是明亮的,并且有完美的边缘和曲线,我们需要进行形态学操作。这两个形态学操作将帮助我们使字符变得更加清晰。例句:D不会显示为O

腐蚀和膨胀是最基本的形态学操作,形态学操作是基于形状处理图像的一组操作,形态学操作将结构元素应用于输入图像并生成输出图像。腐蚀和膨胀有广泛的用途:

  • 消除噪音
  • 分离单个元素并在图像中加入不同的元素。
  • 在图像中发现强度凸起或孔洞。

扩张:

该操作包括将图像A与某个核B进行卷积,核B可以具有任何形状或大小,通常是正方形或圆形。执行此操作时,图像的较亮部分会增长。

侵蚀:

这与膨胀正好相反,它在给定核的面积上计算局部最小值。

欲了解更多信息,请访问:https://docs.opencv.org/3.4/db/df6/tutorial_erosion_dilatation.htmlhttps://docs.opencv.org/3.4/db/df6/tutorial_erosion_dilatation.html

F1的比分是多少?

这只是一个衡量标准,我们可以用它来衡量我们模型的准确性。那么,精确度指标有什么问题呢?答案很简单,比方说,在我们的数据集中,值/记录是这样的,它更有利于积极的一面,而不是消极的一面。用外行的话说,我们可能有80%的数据支持我们的预测,只有20%的数据反对,所以很明显我们的模型会偏向1。在这些情况下,我们可能会得到更多的假阳性和假阴性。总体而言,我们需要避免类型1的错误多于类型2的错误。要做到这一点,我们有F1分数。F1分数是准确率和召回率的调和平均值。

欲了解更多信息,请访问:https://towardsdatascience.com/f-beta-score-in-keras-part-i-86ad190a252fhttps://towardsdatascience.com/f-beta-score-in-keras-part-i-86ad190a252f

什么是Dropout Layer?

Dropout层随机地将输入单位设置为0,并在训练期间的每一步使用Rate频率,这有助于防止过度拟合。未设置为0的输入按1/(1-Rate)放大,以便所有输入的总和保持不变。请注意,仅当Training设置为True时,才会应用Dropout层,以便在推理过程中不会丢弃任何值。使用model.fit时,Training将自动适当地设置为True,而在其他上下文中,您可以在调用层时将kwarg显式设置为True。简而言之,Dropout层是一个掩码,它使一些神经元对下一层的贡献无效,并使所有其他神经元保持不变。我们可以将Dropout层应用于输入向量,在这种情况下,它会使其某些特征无效;但我们也可以将其应用于隐藏层,在这种情况下,它会使一些隐藏的神经元无效。丢弃层在训练CNN中很重要,因为它们防止了对训练数据的过度拟合。如果它们不存在,第一批训练样本会以不成比例的方式影响学习。这反过来又会阻止学习仅在以后的样品或批次中出现的特征。

按照以下步骤编码:

模型培训:代码code

模型测试:代码code

最终视频流测试:代码code

最终WebApp:代码code

演示视频:

视频链接Video Link

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/08/10/%e5%8d%b0%e5%ba%a6%e8%bd%a6%e7%89%8c%e8%af%86%e5%88%ab%e7%a8%8b%e5%ba%8f/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息