解决方案:Yolov5+图像分割+百度AI接口——车牌实时检测识别系统
优采云 发布时间: 2022-11-22 00:21解决方案:Yolov5+图像分割+百度AI接口——车牌实时检测识别系统
大家好!这两天一直在做肝项目,都是关于计算机视觉的,所以这两天都没有更新(真的不是我偷懒)!在这个过程中,对Yolov5有了更深入的了解,在原来的Yolov5框架中加入了图像分割功能,可以在原来识别的基础上切出目标,进而进行更准确的识别,百度AI叫上传图片然后接受返回值是不是很好吃?因此本文采用Yolov5+图像分割+调用百度AI接口实现车牌实时监控识别的效果,识别效果非常好。接下来,我们就一起来看看这篇文章吧。如果你感兴趣,
目录
一、Yolov5介绍
之前的一些文章-《Yolov5:超乎你想象的强大──新冠疫情下的口罩检测》,详细链接为:Yolov5:超乎你想象的强大──新冠疫情下的口罩检测,其中收录
Yolov5简介,我通过这两天的学习,对Yolov5有了更深入的了解。在知网上查阅了很多资料。总结一下:
YOLOv5算法整体主要由三部分组成:Backbone、Neck和Prediction。以YOLOv5s模型为例,整体算法结构如下。Backbone主要由Conv、C3和SPPF基础网络模块组成。其主要功能是提取图像特征信息,C3模块使用了残差网络结构,可以学到更多的特征信息。SPPF模块是空间金字塔池化,也是Backbone网络的输出。主要功能是将提取的任意大小的特征信息转换为固定大小的特征向量。Neck网络采用FPN+PAN的特征金字塔结构网络,可以实现不同尺寸目标特征信息的传递,可以有效解决多尺度问题。预测使用三个损失函数分别计算目标分类损失、目标定位损失和置信度损失,并通过NMS提高网络检测的准确性。模型默认输入图像大小为640×640的3通道图像,最终输出格式为3×(5+ncls),其中ncls表示目标检测类别数。
总的来说,YOLO算法是一种单阶段的端到端anchor-free检测算法。将图片输入网络进行特征提取融合后,得到检测目标的预测框位置和类别概率。与前几代相比,YOLOv5的YOLO算法,模型更小,部署更灵活,具有更好的检测精度和速度。适用于实时目标检测。YOLOv5根据模型深度不同,特征图宽度不同,分为四种模型:YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x。其中,YOLOv5s是最小的模型,本文的车牌检测使用的是YOLOv5s模型。
2.图像分割
图像分割是将图像划分为若干具有独特属性的特定区域并提出感兴趣对象的技术和过程。这是从图像处理到图像分析的关键步骤。现有的图像分割方法主要分为以下几类:基于阈值的分割方法、基于区域的分割方法、基于边缘的分割方法和基于特定理论的分割方法。从数学的角度来看,图像分割是将数字图像划分为相互不相交的区域的过程。图像分割的过程也是一个标记过程,即属于同一区域的像素点被赋予相同的编号。
主要使用opencv进行矩阵切割,
img = cv2.imread('图片.jpg')
dst = img[num1:num2,num3:num4] #裁剪坐标为[y0:y1, x0:x1]
来看一个demo,还记得我们之前写的人脸识别算法吗?我们来做一些改进,之前的效果是:
我们来优化一下代码,不仅要在原图上用红框标记,还要裁剪掉。代码如下:
import cv2 as cv
def face_detect_demo(img):
img = cv.resize(img, dsize=(800, 800))
gary = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier("D:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
face = face_detect.detectMultiScale(gary, 1.004, 28, 0, (40, 40), (50, 50))
count = 1
for x, y, w, h in face:
cv.rectangle(img, (x, y), (x + w, y + h), color=(0, 0, 225), thickness=4)
dst = img[y:y + h, x:x + w]
# cv.imshow("demo",dst)
cv.imwrite("temp/face_{0}.jpg".format(count), dst)
count += 1
cv.imshow("result", img)
# img.save("result.jpg") # 保存图片
cv.imwrite(r"final_result.jpg", img)
img = cv.imread("photo.jpg")
face_detect_demo(img) # 检测单个图片
while True:
if ord("q") == cv.waitKey(1):
break
cv.destroyAllWindows()
<p>
" />
</p>
检测结果如下,我们将对所有的人脸进行分割!
3.百度AI
百度智能云AR开放平台提供领先的AR技术能力和一站式平台工具,开放感知追踪、人机交互等40+技术能力。提供了人脸识别、文字识别、语言识别等多种技术接口。
这次我们使用文字识别接口来识别我们本地图片上的文字。详细教程可以参考本博主:百度AI调优界面教程。对了,大家记得去百度申领免费优惠哦,不然程序运行起来会报错。别问我怎么知道的。两个半小时的工作才总结出来的。这个过程可以理解为调用百度文字识别的函数,传入一张本地图片,可以返回本地图片上的文字。只是这个功能没有内置,需要配置一下才能使用。代码如下:
# 测试百度在线图片文本识别包
# 导入百度的OCR包
from aip import AipOcr
if __name__ == "__main__":
# 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
# 创建ocr对象
ocr = AipOcr(appId, apiKey, secretKey)
with open('D:/cartarget/result_1.png', 'rb') as fin:
img = fin.read()
res = ocr.basicGeneral(img)
print(res['words_result'][0]['words'])
这里的appId、apiKey、secretKey需要换成自己的,图片检测的位置也换成自己的。我想下载SDK运行,你也可以试试其他方法。
4. Yolov5+图像分割+百度AI车牌实时检测识别系统4.1流程图
Visio浅浅地画了一张流程图来表达整个项目的逻辑:
4.2 数据集下载
首先是下载数据集。我使用 CCPD2020 数据集。CCPD2020数据集的采集方式应该与CCPD2019数据集类似。CCPD2020只有新能源车牌图片,包括不同亮度、不同倾斜角度、不同天气情况的车牌。CCPD2020中的图片被拆分为train/val/test数据集,train/val/test数据集中的图片数量分别为5769/1001/5006张。当我使用它时,我进行了 100 次训练、80 次验证和 20 次测试。我也会分享CCPD2020数据集(数据大小865.7MB)的下载链接,谢谢!链接: 提取码:5rvf
4.3 Yolov5模型训练
然后是Yolov5模型的训练。详细代码可以参考之前关于口罩检测的文章。你只需要改变这几个配置文件。
数据集的配置文件: mask_data.yaml:修改train的路径 注意/(反斜杠)修改val的路径 modify category nc: 1, 2 names ["label name 1", "label name 2"]具体few 查看你的类别有多少个模型配置文件:yolov5s.yaml 修改类别数nc:1、2
测试数据贴在这里。由于是用CPU运行,考虑到时间问题,我这里只训练了20次,耗时40分钟左右。
可以看出,识别准确率在80%左右,相当可观。通过增加epoch的值,可以调整到100,识别率达到95%。没有问题。
4.3 PyQt5可视化界面
点击上传图片按钮上传图片,在本地选择一张图片。
然后点击开始检测,调用训练好的pt模型进行识别。
" />
左边是原创
图像,右边是检测后的图像。可以看到这辆车的车牌已经被选中和标记了。
4.4opencv切割图片
我自定义了一个split.py,里面只有一个split功能,目的是切图,这里是封装思想的使用。在windows.py文件中导入即可直接使用该功能。以下是split.py文件内容。
import cv2 as cv
def split(list_1,img,i):
dst = img[int(list_1[1]):int(list_1[3]),int(list_1[0]):int(list_1[2])] # 裁剪坐标为[y0:y1, x0:x1] xyxy
cv.imwrite("D:/cartarget/result_{0}.png".format(i+1), dst)
# list_1 =[231,1391,586,1518]
# img = cv.imread('train_25.jpg')
# split(list_1,img,0)
然后需要修改windows.py,在检测图片的detect_img函数中,添加
tem_list = []
tem_list.append(int(xyxy[0]))
tem_list.append(int(xyxy[1]))
tem_list.append(int(xyxy[2]))
tem_list.append(int(xyxy[3]))
print("准备切割!")
split.split(tem_list, im0,count_1)
count_1 += 1
print("切割完成!")
这样,当Yolov5检测到多个目标时,会多次调用split方法,切出若干个子图。由于这张图中只有一辆车,所以检测目标只有一个,所以只会得到一个车牌。
4.5 调用百度AI进行图像检测
这个逻辑很好理解!把上面的图片丢给百度文字识别就可以识别内容了!
if __name__ == "__main__":
# 此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
appId, apiKey, secretKey = ['28509942', 'HbB3GChFwWENkXEI7uCuNG5V', 'IRnFhizLzlXnYFiNoq3VcyLxRHaj2dZU']
# 创建ocr对象
ocr = AipOcr(appId, apiKey, secretKey)
with open('name.png', 'rb') as fin:
img = fin.read()
res = ocr.basicGeneral(img)
print(res['words_result'][0]['words'])
可以看到识别完全正确!你完成了!
五、总结
这套车牌识别系统正式到此为止!我觉得自己收获了很多。对Yolov5的理解更深,Opencv的使用更熟练,对PyQt5也比较熟悉。目标检测、图像分割、图像搜索、增强和特效、动作识别等等,渐渐觉得这些功能更像是拼图。如果你想完成一个更大的项目,你需要把小的功能拼凑起来。
机器学习的路还很长,很多知识都没搞懂,其中涉及的数学原理就更没搞懂了。未来的路还很长,人工智能的领域依然广阔而精彩。车牌检测项目只是一个载体。项目本身并不重要。重要的是项目背后学到的知识。只有经常总结才能更好的接受知识!好了,今天的分享就到这里!
解决方案:纯采集的内容聚合站还有前途吗?
文章聚合切分软件可以自动对我们的文章内容进行采集
、分类、聚合、编辑、切分。通过关键词采集
和指定问答采集
,实现文章分类素材采集
。聚合功能支持聚合随机文章,或全部,或直接一篇文章,然后段落可以打乱。
采集
解决用户需求的问题答案可以使用文章问答聚合切分软件,同样可以帮助我们聚合各种问题和文章。通过软件自带的SEO模板,我们可以进行目录自动生成、同义词替换、敏感词删除、段落重组、语言翻译、图片替换等多种图文编辑操作【如图】。
" />
如果没有人查看,那么设计精美的网站也毫无用处。反之亦然:如果我们有一个一流的网站,但它的设计方式很差、无趣或难以理解,访问者就会离开它,甚至不会考虑它。另一方面,如果我们使用市场进行销售,请考虑遵循一些更具体的 SEO 策略。难怪网页设计师是当今最热门的专家,而网页设计师职业是薪酬最高、需求量最大的工作之一。这一切都是因为公司和企业需要其产品和服务的数字页面来帮助他们取得成功。
搜索浏览器 使用搜索引擎友好的网站轻松拖动您网站上的每个页面。他们还可以提出内容并将其记录在他们的数据库中。就像那样,通过使用带有这种 SEO 方法的排名跟踪工具,网络访问者和网络排名会上升。但不要忘记 SEO 是由撰稿人、设计师和开发人员管理的。这些人需要在团队中工作来构建 SEO 网站。
" />
许多人会花几分钟时间想知道 SEO 和网页设计之间的关系。但两人的关系比许多人想象的要轻松得多。网页设计是关于网站的视觉效果和策略,而 SEO 提供网站的“流行度”和可见性。一个成功的网站会向其流量提出他们想要的建议。所以,如果我们认为 SEO 和网站设计没有相互联系,那我们就错了。
一些创业者认为好的网站设计可以弥补差的SEO,或者相反,这意味着两者可以相互弥补,互相填补空白。但经验表明这是错误的。一个好的搜索引擎优化会吸引流量到一个公司的网站,一个专业的设计会让他们对它感兴趣。
两者对于网站的成功都至关重要。但是,让我们最终澄清什么是网页设计中的SEO?允许搜索引擎读取整个站点的页面:这就是我们这个时代需要 SEO 友好网站的原因。开发一个 SEO 就绪的网站需要我们有一个战略和架构方法。网站是我们产品或服务在数字空间中的门面,因此它可以很好地说明我们提供或销售的产品和服务的质量,因此在完美的网站上提供详细信息至关重要。