Pyhon基于YOLOV实现的车辆品牌及型号检测项目源码+模型+项目文档

  • 项目运行
  • 运行录屏:

    Pyhon基于YOLOV实现的车辆品牌及型号检测项目运行录屏

  •  完整代码下载地址:Pyhon基于YOLOV实现的车辆品牌及型号检测项目 
  1. 项目背景:

车辆检测及型号识别广泛应用于物业,交通等的管理场景中。通过在停车场出入口,路口,高速卡口等位置采集的图片数据,对车辆的数量型号等进行识别,可以以较高的效率对车型,数量信息等进行采集。通过采集的数据,在不同的场景中可以辅助不同的业务开展。如商场停车位的规划,路况规划,或者公安系统追踪肇事车辆等等。

  1. 项目要求:
  • 使用slim框架来对图片进行分类识别。
  • 掌握使用slim物体检测框架来进行物体的检测和识别。
  • 传入一张图片实现上述两个功能,显示出最终的结果。
  • 项目方案的分析与方案确定
  1. 项目提供的素材:
  • 一个车辆分类的数据集。只是分类数据,内部没有定位信息。共48856张图片其43971张作为训练集,4885张作为验证集。数据已经预先打包成tfrecord格式,数据格式与课程中,分类模型使用的数据格式相同,打包关键代码参考"download_and_convert_flowers.py"。

数据集分类文件labels.txt

  1. 达到项目要求所缺少的因素
  1. 看不到具体的图片,图片已经打包成tfrecord格式,不知道是什么样的图片。
  2. 项目提供的素材,不包括检测的标签,也就是给定的素材不能完成检测网络的训练。
  1. 各种方案可行性对比和方案的确定

因此,经过讨论,我们的首要任务是将tfrecord数据复原出来,并且找到一种合适的方式能实现检测功能。

可能的方案有:

  1. 使用label-image 自己制作检测数据集,在原始图片上进行标注,然后就有了分类标签和检测标签,就可以训练一个端到端的模型。但是缺点是图片太多,而项目周期只有一个月,估计不可能完成。
  2. 使用一个现有的预训练的检测模型,例如YOLO、faster-rcnn、ssd_mobilenet_v1_coco等,他们已经实现了对一些物体的检测功能,其中还都包含小汽车,因此可以利用这种网络完成检测功能,把读取出来的图片一次输入网络中,生成检测的标定数据,然后重新打包tfrecord文件,最终可以训练出一个端到端的检测加分类模型。这样的可行性也比较高,而且感觉工作量不大,唯一一点是感觉代码难度稍微有点大(相比于下面一种方案),万一要是卡住在中间的环节有可能造成时间紧张。不过总体感觉依旧是个可行的方案。
  3. 像上一步一样,找一个现成的检测模型,把输入的图片进行检测,再把检测出来的结果输入到自己训练的分类网络中,就可以实现项目需求了,而且相比于其他方案难度最小,最有可能完成这项任务。但是问题是整个过程经过了两步执行操作,感觉没有一步执行完成效率高。

经过对比,我们最终选择了第三个方案。

  • 方案的实施与计划

最终的方案流程如下:

图3-1 方案流程图

项目实施计划如下:

第一周:

  • 数据探索,复原出原始图片内容,进行数据探索、并分析。
  • 确定最终使用的检测模型 。

第二周:

  • 测试检测模型的效果,编写调用接口。
  • 使用Inception_v4进行分类训练,使之达到85%以上的Top5准确率。

第三周:

  • 完成分类模型项目接口。
  • 与检测模型的接口进行整合。
  • 将功能整合进一个Web服务功能中。

第四周:

  • 文档撰写与完善代码。
  1. 数据探索
  1. 复原原始图片

根据项目提示,图片打包过程参考flower的例子,经过研究源代码打包过程和解包过程,我们完成了图片的复原工作。将图片按照分类放进各自的文件夹中。

      • 3-2 获取原始图片数据
  1. 如图3-2左侧是复原图片过程的输出,可以看到图片的尺寸都是4xx*320,三通道的jpg图片,图片的高都是一样的,宽度略有不同。这个输入到训练之前,会经过一些图片预处理操作。训练时会将图片统一尺寸,做一些裁剪、随机flip翻转、颜色扭曲等如图3-3。
    • 3-3 图片预处理部分
  1. 最后复原出来的图片train集是43972个图片,764个文件夹对应labels.txt中764个分类,训练集的图片数比项目说明中的多了一个,我想可能是因为43971个图片分成4个数据集的取整问题,最后复原的时候可能多了一张重复的,这个没多大关系。
  1. 可以发现训练集中每种品类的汽车都有不同的视角、颜色、背景的图片,看来识别车型的影响因素还挺多的。但是数据的主体都拍照的比较清楚,处于画面正中位置所以应该可以实现不同视角下汽车的分类功能。
  1. 发现的问题:训练集里面还是有一些错误的图片的,比如好几次把现代车放进其他车型的标签下的情况,而且是同一张图片放入多次,但是鉴于这样的错误比例不高,所以训练的时候暂时不做处理。先放进网络中训练试试。
  1. 选择Yolo作为检测网络

首先,Yolo是回归检测的开山之作,检测效果不错mAP~0.58,而且运行速度非常快能够达到45-150帧每秒。另外一个是因为我们团队的黎同学之前研究过这个模型,所以弄起来比较有把握。

  1. 在只有分类的数据集的情况下,我们不能直接使用YOLO模型去进行端到端的训练,因为我们人力有限,为了节约时间成本,我们在网上把开源的YOLO模型拿下来,调用YOLO模型在VOC训练集上训练所得到的预训练参数,写出一个检测程序。

然后我们测试了一下检测的能力:

图3-4 YOLO检测汽车测试

图3-5 YOLO检测更多辆汽车测试

可以看到,YOLO能够出色的完成多辆汽车检测的任务,框选出来的位置很准确。只是会把汽车分成truck、car、bus等分类,这个只需要后期做一下处理都当成汽车就行了。

  1. 使用Inception_v4进行分类网络的训练

下一步就是要进行分类网络的训练,项目要求使用Inception_v4模型。于是我们就读了一下Inception_v4的论文,然后研究了一下slim分类训练里面的代码。

  1. Inception_v4论文

论文中介绍了Inception_v4的网络结构还同时介绍了另外一种加了residual的Inception_v4的结构。 同时还把Inception_v3以及带residual的inception_v3做了对比,得出了一些结论:

Inception_v4在Inception_v3的网络结构上进行了一些结构上的微调,最终的实验结果是

图3-6 四种模型的训练结果

Inception_v4系列比Inception_v3系列相比,准确率方面是更优秀的,Top-5 error减少了1.多,另外加了residual的V3或者V4都比不加的模型训练更快的收敛,但是准确率方面倒没有什么更多的贡献。

  1. 训练Inception_v4,实现分类功能

训练的思路是,先从slim的github上下载预训练的模型

图3-7 Inception_v4

然后对这个模型进行Finetune。过程是这样的:

图3-8 Inception_v4进行finetune

这里指定了train_dir 和dataset_dir,model_name是incption_v4, checkpoint_path是我们下载的checkpoint。然后重要的一点是指定checkpoint_exclude_scopes参数,这里把InceptionV4/Logits,InceptionV4/AuxLogits这两个层排除了,这在slim中会判断没有这两层的话,会根据dataset.py中提供的_NUM_CLASSES参数,从新配置分类的层。而前面的层目前还是保持不变的。尤其注意的是,这里不需要额外指定trainable_scopes参数就行了,否则训练只会训练这里指定的层。我们这里需要将全部的层都参加训练。这样前面特征提取的层在训练中会进行微调,而后面的分类层会着重进行反向传播调整。

训练过程中打开tensorboard,查看过程如下:

可以看到total_loss稳步下降,最终稳定在1.多左右

模型的稀疏度也一直在调整,下降,代表模型的拟合能力在提升。

学习率开始的时候设置的是0.001, 然后中间停止训练改成decay模式,继续训练,可以看到后面学习率在下降一段时间后,保持在我们设置的最小值上。最小值能防止模型失去反向传播的动量,而随着训练的进行减小学习率能够减小模型的震荡,让模型尽快调整到最优点。

Slim训练中有对数据进行预处理的功能,可以将图片进行裁切、反转等操作,增广训练数据,让模型的拟合能力更强。

可以看到各个层的参数都在随着训练进行调整

训练的差不多了,进行一次验证:

验证集上准确率达到了88.7% ,top-5 达到了94.59%,达到了预定的要求。

  1. 代码整合

代码整合是把两个模型的检测程序连接起来,通过YOLO网络检测出Car,Bus,Truck类的坐标,然后根据坐标将原图裁剪,将裁剪后的数据送入inceptionV4分类网络中,得到类别,最后通过得到的类别,坐标信息在原图上标记并显示原图。

  1. 模型导出,与功能的对接
  • 将检测出的标定框裁切(标定为Truck,Car,Bus 类别的)
  • 将切出来的图片送入分类网络
  • 在图片上标出目标以及分类结果

单个目标的识别结果很好

单个目标的结果1

单目标检测结果2

多个目标的情况会受图片质量,以及车辆遮挡的影响

多个目标的情况,前面的车结果正确,后面两个车明显不对

这种情况就更不行了

原因:

  1. 图片质量差,即使是人也看不准车型
  2. 车辆被遮挡,导致截图后送入分类网络中不同种车的特征混合到一起了
  3. 训练还不够,训练数据量少
  • 遇到的问题与解决
  1. 读取tfrecord时,开始导出的图片是花的,后来发现是图片的col和row分别对应的是width,height,因此在生成图片的时候数据获取不对。这点修正以后就好了。

图4-1 图片的宽高对应col和row问题

  1. Inception_v4模型训练的时候,要指定checkpoint_exclude_scopes参数,把InceptionV4/Logits,InceptionV4/AuxLogits这两个层排除,这在slim中会判断没有这两层的话,会根据dataset.py中提供的_NUM_CLASSES参数,从新配置分类的层。而前面的层目前还是保持不变的。尤其注意的是,这里不需要额外指定trainable_scopes参数就行了,否则训练只会训练这里指定的层。开始的时候,我指定了:

trainable_scopes=InceptionV4/Logits,InceptionV4/AuxLogits

这样,模型训练的时候,将只训练最后这分类的两层。导致我们出现了如下问题:

在6-8小时训练过后也没有在验证集上达到top1 80% 准确率;

训练了53万步依然在4和5之间摇摆

Tensorboard上相关数据:

可以看到我们的正则项损失趋向平缓,说明模型参数好像没有继续拟合了。

学习率在finetune的过程中我修改过几次,好像对模型影响效果不明显。

在tensorboard中这两个参数一直没有改变,看demo的话好像是把这两个节点是给排除的。

经过分析之后,感觉是训练出现了问题,于是寻找答案,发现slim上给出的finetune模式是这样的:

即第一步是只训练线性分类那两层,第二步是把所有参数一起训练,即就是修改这API中这两个参数。 我这里最终是在之前自己训练的基础上,继续把所有参数加入进去进行了训练,得到了上一节中达到的效果。

  1. 关于识别到车辆信息后,将识别到的汽车数据截取出来送进分类网络进行识别。有时会出现汽车的位置重叠,或者同一辆车得到了两个检测识别框。有两种方案:
  1. 直接选择置信度最高的框显示和识别。
  2. 通过IOU计算,将不同重叠情况的框进行合并处理

合并处理方案

  • 还可以改进的地方
  1. 训练集中有许多错误的图片,应该进行数据筛选,提升识别的准确率。条件允许的情况下,增加训练集,进行更多的训练。
  2. 优化模型运行速度,将参数提取读取出来,在传入图片之后,直接进入计算步骤。现在车辆识别的步骤是经过多个session的,可以通过合并成一个session来增加程序运行的速度。
  3. 还想尝试同时分类和检测数据集一起训练的模式,不知道结果会怎样。
  4. 猜想:能不能把两个网络连接成一个网络,两个网络中应该有一些参数可以是共享的,有没有可能把这些参数实现共享。实现共享后可以减少重复参数,增加网络检测速度。
  5. 批量识别的功能可以通过添加batch实现一次检测多幅图片。
  6. 也可以增加视频检测功能。

完整代码下载地址:Pyhon基于YOLOV实现的车辆品牌及型号检测项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/217754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PTA刷题+代码+详解】求二叉树度为1的结点个数(递归法)

文章目录 题目C代码详解 题目 在二叉树T中,其度为1的结点是指某结点只有左孩子或只有右孩子。利用递归方法求二叉树T的度为1的结点个数。 1)如果TNULL,则是空树,度为1的结点个数为0,返回值为0; 2&#xff0…

上海亚商投顾:沪指收复3000点,房地产板块集体走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日窄幅震荡,创业板指走势较弱,科创50指数跌近1%。房地产板块集体走强&#xff0…

深度学习中的各类评价指标

深度学习中的各类评价指标 1 Dice Loss2 Precision(精度)3 Recall(召回率)4 F-Score5 mAP 1 Dice Loss Dice Loss,也叫Soft Dice Coefficient,是一种用于图像分割任务的损失函数。它基于目标分割图像与模型…

Apache Flink(十一):Flink集群部署-Standalone集群部署

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. 节点划分

设计模式——原型模式(创建型)

引言 原型模式是一种创建型设计模式, 使你能够复制已有对象, 而又无需使代码依赖它们所属的类。 问题 如果你有一个对象, 并希望生成与其完全相同的一个复制品, 你该如何实现呢? 首先, 你必须新建一个属于…

C#基础——语法学习

C#的基本语法 在介绍基本语法之前我们先来大概讲一下创建好的这些文件都是做什么的 .sln文件:将项目和解决方案项结合到一起 .vs文件夹:用来存储当前解决方案中关于用户的设置和自定义项,比如断点,主题等。(一般都将其…

飞天使-linux操作的一些技巧与知识点2-TCP的三次握手以及四次挥手以及转换状态

文章目录 TCP 的三次握手四次挥手转换状态 TCP 的三次握手 第一次,客户端与服务端建立链接,需要发送请求连接的消息 第二次,服务端接口到数据后,返回一个确认的操作*(至此客户端和服务端链路建立成功) 第三…

如何利用宝塔面板和docker快速部署网站

当你有了一台服务器,就会折腾往这台服务器上部署各种好玩的网站。市面上有许多开源的网站项目,通过docker技术可以快速部署并使用,本文将以部署filebrowser举例介绍网站部署的基本流程。 1. 安装宝塔面板 宝塔面板是一款开源的网站运维工具…

部署Kubernetes(k8s)集群,可视化部署kuboard

所需机器 主机名地址角色配置k8s-master192.168.231.134主节点2核4G,centos7k8s-node1192.168.231.135工作节点2核4G,centos7k8s-node2192.168.231.136工作节点2核4G,centos7 主节点CPU核数必须是 ≥2核且内存要求必须≥2G,否则k8s无法启动 1. 集群环境部署【三台…

【JVM从入门到实战】(四)类的生命周期

什么是类的生命周期 类的生命周期描述了一个类加载、连接、初始化、使用、卸载的整个过程 一个类完整的生命周期如下: 加载阶段 加载阶段第一步是类加载器根据类的全限定名通过不同的渠道以二进制流的方式获取字节码信息。 程序员可以使用Java代码拓展的不同的渠道…

java开发的智能聊天机器人_超级AI_支持自动绘画功能

支持Web、Android、IOS、H5等多终端应用。它使用OpenAI的ChatGPT模型实现智能聊天机器人,并支持绘图自动生成Vincent图。未来还将接入国内大型AI模型,如文心一言、统一千问、MOSS等模型,并不断更新以满足用户需求。 AI大脑软件中的AI绘画功能…

HuggingFists-低代码玩转LLM RAG(2) --Query

继上一篇文章我们探讨了如何使用HuggingFists实现文本的Embedding后。这一次我们将介绍如何使用HuggingFists实现LLM RAG的查询部分。 首先我们回顾一下RAG的结构,如下图: 基于向量数据库的RAG结构图 我们在上篇文章中介绍了如何使用HuggingFists实现结构…

GNN 学习笔记

稍微看一下之后备用。 【图神经网络综述】GNN原理+落地应用实现框架全解_gnn实现-CSDN博客 GNN相比CNN最大的区别在于数据结构,CNN一般作用在二维、三维数据里,如图像、表格数据等,可以进行卷积操作。而GNN作用在一个由节点和边…

PaddleSpeech的TTSAndroid编译armv7版本

1.下载docker镜像 docker pull paddlepaddle/paddle-lite:2.0.0_beta2.克隆代码 git clone https://github.com/PaddlePaddle/Paddle-Lite.git3.运行容器 docker run -it --name paddlelite_docker -v $PWD/Paddle-Lite:/Paddle-Lite --nethost paddlepaddle/paddle-lite …

ISP去噪(1)

#灵感# 因为理解的2DNR、3DNR 和当前调试平台标注的2DNR、3DNR 作用有很大差异,所以在网上广撒网,搜集知识。 目前收集出来一个这样的文章,有点像大学生的论文“取其精华,合成糟粕”。------权当一个记录册 目录 运动阈值&…

【华为鸿蒙系统学习】- HarmonyOS4.0开发工具和环境配置问题总结|自学篇

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 官方链接 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 安装教程 (…

[GFCTF 2021]文件查看器

文章目录 前置知识可调用对象数组对方法的调用GC回收机制phar修改签名 解题步骤 前置知识 可调用对象数组对方法的调用 我们先来看下面源码 <?phperror_reporting(0);class User{public $username;public $password;public function check(){if($this->username"…

flutter的ListView和SingleChildScrollView有什么区别?他们的使用场景有什么不一样?

文章目录 简介ListViewSingleChildScrollView使用场景的不同 简介 ListView和SingleChildScrollView都是在Flutter中用于处理滚动内容的组件&#xff0c;但它们有一些关键的区别。 ListView 多个子元素&#xff1a; ListView是一个滚动的可滚动组件&#xff0c;通常用于包含多…

接口管理——Swagger

Swagger是一个用于设计、构建和文档化API的工具集。它包括一系列工具&#xff0c;如Swagger Editor&#xff08;用于编辑Swagger规范&#xff09;、Swagger UI&#xff08;用于可视化API文档&#xff09;和Swagger Codegen&#xff08;用于根据API定义生成客户端库、server stu…

Web安全之XXE漏洞原理及实践学习

一、原理&#xff1a; XXE漏洞全称即XML外部实体注入漏洞。 攻击者强制XML解析器去访问攻击者指定的资源内容(可能是系统上本地文件亦或是远程系统上的文件)&#xff0c;导致可加载恶意外部文件&#xff0c;利用file协议造成文件读取、命令执行、内网端口扫描、攻击内网网站等…