认不清车辆车型品牌种类?AI模型来助力,基于YOLO开发大规模车辆检测识别分析系统

news/2024/7/10 22:49:00 标签: 人工智能, YOLO

随着汽车市场的蓬勃发展,已经涌现诞生了大量的品牌的车型,让人一时间眼花缭乱,很多时候看到一辆汽车只能大概知道这是什么品牌的,但是具体的子品牌详情就不得而知了,有没有可能构建这样的识别模型,让我们在遇上自己想要了解的品牌的车辆的时候通过手机拍照即可实时识别出来呢?

本文的核心目的就是想要基于大规模的车辆车型品牌数据集来开发构建车辆车型识别分析系统,话不多说首先来看实例效果:

接下来简单看下数据集:

通过网络多个数据源整合获取,大概3w的数据量。

接下来就开始筹备模型的开发,首先考虑的是基于完全的检测模型来开发构建整套系统,这个我们完整地尝试了几次,发现实际效果非常非常的差,这个跟目标类别数量巨大且数据样本数少有很大的关系,这个方案宣告不可行,简单的基于检测模型来实现大规模的车辆检测识别是一个非常困难的事情。

接下来我们就开始转变思路,尝试构建基于检测+识别的方案,前端基于YOLO来构建轻量级的检测头,后端基于轻量级的识别骨干网络模型来完成具体类别的识别计算。

这里检测模型直接选用了最为轻量级的n系列的模型,如下所示:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

识别端轻量级的网络骨干核心定义实现如下所示:

def lightNet():
    img_input = Input(shape=(224,224,3))
    x = convBlock(img_input, 32, 1.0, strides=(2, 2))
    x = dwBlock(x, 64, 1.0, 1)
    x = dwBlock(x, 128, 1.0, 1, strides=(2, 2))
    x = dwBlock(x, 128, 1.0, 1)
    x = dwBlock(x, 256, 1.0, 1, strides=(2, 2))
    x = dwBlock(x, 256, 1.0, 1)
    x = dwBlock(x, 512, 1.0, 1, strides=(2, 2))
    x = dwBlock(x, 512, 1.0, 1)
    x = dwBlock(x, 512, 1.0, 1)
    x = dwBlock(x, 512, 1.0, 1)
    x = dwBlock(x, 512, 1.0, 1)
    x = dwBlock(x, 512, 1.0, 1)
    x = dwBlock(x, 1024, 1.0, 1, strides=(2, 2))
    x = dwBlock(x, 1024, 1.0, 1)
    x = GlobalAveragePooling2D()(x)
    shape = (1, 1, int(1024 * 1.0))
    x = Reshape(shape)(x)
    x = Dropout(1e-3)(x)
    x = Conv2D(classes, (1, 1), padding="same")(x)
    x = Activation("softmax")(x)
    x = Reshape((classes,))(x)
    inputs = img_input
    model = Model(inputs, x)
    return model

默认都是100次epoch的迭代计算,接下来看下结果详情:

【Precision曲线】
精确率曲线(Precision-Recall Curve)是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率(Precision)是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率曲线。
根据精确率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察精确率曲线,我们可以根据需求确定最佳的阈值,以平衡精确率和召回率。较高的精确率意味着较少的误报,而较高的召回率则表示较少的漏报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
精确率曲线通常与召回率曲线(Recall Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。

【Recall曲线】
召回率曲线(Recall Curve)是一种用于评估二分类模型在不同阈值下的召回率性能的可视化工具。它通过绘制不同阈值下的召回率和对应的精确率之间的关系图来帮助我们了解模型在不同阈值下的表现。
召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。召回率也被称为灵敏度(Sensitivity)或真正例率(True Positive Rate)。
绘制召回率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的召回率和对应的精确率。
将每个阈值下的召回率和精确率绘制在同一个图表上,形成召回率曲线。
根据召回率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察召回率曲线,我们可以根据需求确定最佳的阈值,以平衡召回率和精确率。较高的召回率表示较少的漏报,而较高的精确率意味着较少的误报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
召回率曲线通常与精确率曲线(Precision Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。

【F1值曲线】
F1值曲线是一种用于评估二分类模型在不同阈值下的性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)、召回率(Recall)和F1分数的关系图来帮助我们理解模型的整体性能。
F1分数是精确率和召回率的调和平均值,它综合考虑了两者的性能指标。F1值曲线可以帮助我们确定在不同精确率和召回率之间找到一个平衡点,以选择最佳的阈值。
绘制F1值曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率、召回率和F1分数。
将每个阈值下的精确率、召回率和F1分数绘制在同一个图表上,形成F1值曲线。
根据F1值曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
F1值曲线通常与接收者操作特征曲线(ROC曲线)一起使用,以帮助评估和比较不同模型的性能。它们提供了更全面的分类器性能分析,可以根据具体应用场景来选择合适的模型和阈值设置。

【PR曲线】
精确率-召回率曲线(Precision-Recall Curve)是一种用于评估二分类模型性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)和召回率(Recall)之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率-召回率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率-召回率曲线。
根据曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
精确率-召回率曲线提供了更全面的模型性能分析,特别适用于处理不平衡数据集和关注正例预测的场景。曲线下面积(Area Under the Curve, AUC)可以作为评估模型性能的指标,AUC值越高表示模型的性能越好。
通过观察精确率-召回率曲线,我们可以根据需求选择合适的阈值来权衡精确率和召回率之间的平衡点。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。

【混淆矩阵】

【batch计算实例】

【准确率曲线和损失值曲线】

实例化推理样例如下所示:

通过可视化系统将整体的推理计算pipeline整合在了一起,感兴趣的话都可以自己尝试下。


http://www.niftyadmin.cn/n/5179310.html

相关文章

Web后端开发_01

Web后端开发 请求响应 SpringBoot提供了一个非常核心的Servlet 》DispatcherServlet,DispatcherServlet实现了servlet中规范的接口 请求响应: 请求(HttpServletRequest):获取请求数据响应(HttpServletRe…

深度学习 植物识别算法系统 计算机竞赛

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核,池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

Vue中组件与插件:究竟有何不同?详细解析带你get到核心差异!

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、组…

设置虚拟机静态IP

1、修改配置文件 /etc/sysconfig/network-scripts/ifcfg-ens160 将BOOTPROTOdhcp改为static,天机IPADDR192.168.10.13 2、重启网络服务 systemctl restart network

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds: ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…

爱上C语言:整型和浮点型在内存中的存储(进制转换,原码,反码,补码以及大小端)

🚀 作者:阿辉不一般 🚀 你说呢:生活本来沉闷,但跑起来就有风 🚀 专栏:爱上C语言 🚀作图工具:draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话,还请…

mysql数据库设计表时的字段命名规则

在设计MySQL数据库表时,字段命名的规则可以遵循以下几点: 使用小写字母:建议字段名使用小写字母。这有助于保持一致性和可读性。 使用下划线:字段名中的单词可以使用下划线(_)分隔,而不是使用空…

7个UI设计师都在看的高质量SVG图标素材网站分享!

之前已经给大家分享过一些图标资源及素材灵感网站,大家的反响是不错的,想着你们可能好需要来点新鲜的高质量SVG图标素材网站,直接就是一整套统一设计风格的图标库,来一个图标系列大合集,帮你更快更好的找到风格适配的图…