深度学习YOLOv5车辆颜色识别检测 - python opencv 计算机竞赛

文章目录

  • 1 前言
  • 2 实现效果
  • 3 CNN卷积神经网络
  • 4 Yolov5
  • 6 数据集处理及模型训练
  • 5 最后

1 前言

🔥 优质竞赛项目系列,今天要分享的是

🚩 **基于深度学习YOLOv5车辆颜色识别检测 **

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

2 实现效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3 CNN卷积神经网络

卷积神经网络(CNN),是由多层卷积结构组成的一种神经网络。卷积结构可以减少网络的内存占用、参数和模型的过拟合。卷积神经网络是一种典型的深度学习算法。广泛应用于视觉处理和人工智能领域,特别是在图像识别和人脸识别领域。与完全连接的神经网络相比,CNN输入是通过交换参数和局部感知来提取图像特征的图像。卷积神经网络是由输入层、卷积层、池化层、全连接层和输出层五层结构组成。其具体模型如下图所示。
在这里插入图片描述

(1)输入层(Input
layer):输入层就是神经网络的输入端口,就是把输入传入的入口。通常传入的图像的R,G,B三个通道的数据。数据的输入一般是多维的矩阵向量,其中矩阵中的数值代表的是图像对应位置的像素点的值。

(2)卷积层(Convolution layer):卷积层在CNN中主要具有学习功能,它主要提取输入的数据的特征值。

(3)池化层(Pooling
layer):池化层通过对卷积层的特征值进行压缩来获得自己的特征值,减小特征值的矩阵的维度,减小网络计算量,加速收敛速度可以有效避免过拟合问题。

(4)全连接层(Full connected
layer):全连接层主要实现是把经过卷积层和池化层处理的数据进行集合在一起,形成一个或者多个的全连接层,该层在CNN的功能主要是实现高阶推理计算。

(5)输出层(Output layer):输出层在全连接层之后,是整个神经网络的输出端口即把处理分析后的数据进行输出。

cnn卷积神经网络的编写如下,编写卷积层、池化层和全连接层的代码

conv1_1 = tf.layers.conv2d(x, 16, (3, 3), padding='same', activation=tf.nn.relu, name='conv1_1')
conv1_2 = tf.layers.conv2d(conv1_1, 16, (3, 3), padding='same', activation=tf.nn.relu, name='conv1_2')
pool1 = tf.layers.max_pooling2d(conv1_2, (2, 2), (2, 2), name='pool1')
conv2_1 = tf.layers.conv2d(pool1, 32, (3, 3), padding='same', activation=tf.nn.relu, name='conv2_1')
conv2_2 = tf.layers.conv2d(conv2_1, 32, (3, 3), padding='same', activation=tf.nn.relu, name='conv2_2')
pool2 = tf.layers.max_pooling2d(conv2_2, (2, 2), (2, 2), name='pool2')
conv3_1 = tf.layers.conv2d(pool2, 64, (3, 3), padding='same', activation=tf.nn.relu, name='conv3_1')
conv3_2 = tf.layers.conv2d(conv3_1, 64, (3, 3), padding='same', activation=tf.nn.relu, name='conv3_2')
pool3 = tf.layers.max_pooling2d(conv3_2, (2, 2), (2, 2), name='pool3')
conv4_1 = tf.layers.conv2d(pool3, 128, (3, 3), padding='same', activation=tf.nn.relu, name='conv4_1')
conv4_2 = tf.layers.conv2d(conv4_1, 128, (3, 3), padding='same', activation=tf.nn.relu, name='conv4_2')
pool4 = tf.layers.max_pooling2d(conv4_2, (2, 2), (2, 2), name='pool4')

flatten = tf.layers.flatten(pool4)
fc1 = tf.layers.dense(flatten, 512, tf.nn.relu)
fc1_dropout = tf.nn.dropout(fc1, keep_prob=keep_prob)
fc2 = tf.layers.dense(fc1, 256, tf.nn.relu)
fc2_dropout = tf.nn.dropout(fc2, keep_prob=keep_prob)
fc3 = tf.layers.dense(fc2, 2, None)

4 Yolov5

简介

我们选择当下YOLO最新的卷积神经网络YOLOv5来进行火焰识别检测。6月9日,Ultralytics公司开源了YOLOv5,离上一次YOLOv4发布不到50天。而且这一次的YOLOv5是完全基于PyTorch实现的!在我们还对YOLOv4的各种高端操作、丰富的实验对比惊叹不已时,YOLOv5又带来了更强实时目标检测技术。按照官方给出的数目,现版本的YOLOv5每个图像的推理时间最快0.007秒,即每秒140帧(FPS),但YOLOv5的权重文件大小只有YOLOv4的1/9。

目标检测架构分为两种,一种是two-stage,一种是one-stage,区别就在于 two-stage 有region
proposal过程,类似于一种海选过程,网络会根据候选区域生成位置和类别,而one-stage直接从图片生成位置和类别。今天提到的 YOLO就是一种
one-stage方法。YOLO是You Only Look Once的缩写,意思是神经网络只需要看一次图片,就能输出结果。YOLO
一共发布了五个版本,其中 YOLOv1 奠定了整个系列的基础,后面的系列就是在第一版基础上的改进,为的是提升性能。

YOLOv5有4个版本性能如图所示:
在这里插入图片描述

网络架构图

在这里插入图片描述

YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。主要的改进思路如下所示:

输入端

在模型训练阶段,提出了一些改进思路,主要包括Mosaic数据增强、自适应锚框计算、自适应图片缩放;

Mosaic数据增强
:Mosaic数据增强的作者也是来自YOLOv5团队的成员,通过随机缩放、随机裁剪、随机排布的方式进行拼接,对小目标的检测效果很不错
在这里插入图片描述

基准网络

融合其它检测算法中的一些新思路,主要包括:Focus结构与CSP结构;

Neck网络

在目标检测领域,为了更好的提取融合特征,通常在Backbone和输出层,会插入一些层,这个部分称为Neck。Yolov5中添加了FPN+PAN结构,相当于目标检测网络的颈部,也是非常关键的。

在这里插入图片描述
在这里插入图片描述

FPN+PAN的结构
在这里插入图片描述
这样结合操作,FPN层自顶向下传达强语义特征(High-Level特征),而特征金字塔则自底向上传达强定位特征(Low-
Level特征),两两联手,从不同的主干层对不同的检测层进行特征聚合。

FPN+PAN借鉴的是18年CVPR的PANet,当时主要应用于图像分割领域,但Alexey将其拆分应用到Yolov4中,进一步提高特征提取的能力。

Head输出层

输出层的锚框机制与YOLOv4相同,主要改进的是训练时的损失函数GIOU_Loss,以及预测框筛选的DIOU_nms。

对于Head部分,可以看到三个紫色箭头处的特征图是40×40、20×20、10×10。以及最后Prediction中用于预测的3个特征图:


①==>40×40×255

②==>20×20×255

③==>10×10×255

在这里插入图片描述

  • 相关代码

    class Detect(nn.Module):
      stride = None  # strides computed during build
      onnx_dynamic = False  # ONNX export parameter
        
      def __init__(self, nc=80, anchors=(), ch=(), inplace=True):  # detection layer
          super().__init__()
          self.nc = nc  # number of classes
          self.no = nc + 5  # number of outputs per anchor
          self.nl = len(anchors)  # number of detection layers
          self.na = len(anchors[0]) // 2  # number of anchors
          self.grid = [torch.zeros(1)] * self.nl  # init grid
          self.anchor_grid = [torch.zeros(1)] * self.nl  # init anchor grid
        self.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2))  # shape(nl,na,2)
          self.m = nn.ModuleList(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv
          self.inplace = inplace  # use in-place ops (e.g. slice assignment)
        
      def forward(self, x):
          z = []  # inference output
          for i in range(self.nl):
            x[i] = self.m[i](x[i])  # conv
              bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
              x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
        
    
              if not self.training:  # inference
                  if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                      self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
        
                  y = x[i].sigmoid()
                  if self.inplace:
                      y[..., 0:2] = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                      y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                  else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                      wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, y[..., 4:]), -1)
                  z.append(y.view(bs, -1, self.no))
        
          return x if self.training else (torch.cat(z, 1), x)
    
      def _make_grid(self, nx=20, ny=20, i=0):
          d = self.anchors[i].device
          if check_version(torch.__version__, '1.10.0'):  # torch>=1.10.0 meshgrid workaround for torch>=0.7 compatibility
              yv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)], indexing='ij')
          else:
              yv, xv = torch.meshgrid([torch.arange(ny).to(d), torch.arange(nx).to(d)])
          grid = torch.stack((xv, yv), 2).expand((1, self.na, ny, nx, 2)).float()
          anchor_grid = (self.anchors[i].clone() * self.stride[i]) \
              .view((1, self.na, 1, 1, 2)).expand((1, self.na, ny, nx, 2)).float()
          return grid, anchor_grid
    

6 数据集处理及模型训练

数据集准备

由于目前汽车颜色图片并没有现成的数据集,我们使用Python爬虫利用关键字在互联网上获得的图片数据,编写程序爬了1w张,筛选后用于训练。

深度学习图像标注软件众多,按照不同分类标准有多中类型,本文使用LabelImg单机标注软件进行标注。LabelImg是基于角点的标注方式产生边界框,对图片进行标注得到xml格式的标注文件,由于边界框对检测精度的影响较大因此采用手动标注,并没有使用自动标注软件。

考虑到有的朋友时间不足,博主提供了标注好的数据集和训练好的模型,需要请联系。

数据标注简介

通过pip指令即可安装


pip install labelimg

在命令行中输入labelimg即可打开

在这里插入图片描述
后续课查看其他标注教程,不难。

开始训练模型

处理好数据集和准备完yaml文件,就可以开始yolov5的训练了。首先我们找到train.py这个py文件。

然后找到主函数的入口,这里面有模型的主要参数。修改train.py中的weights、cfg、data、epochs、batch_size、imgsz、device、workers等参数
在这里插入图片描述

至此,就可以运行train.py函数训练自己的模型了。

训练代码成功执行之后会在命令行中输出下列信息,接下来就是安心等待模型训练结束即可。
在这里插入图片描述

5 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

最新AI创作系统ChatGPT系统运营源码/支持最新GPT-4-Turbo模型/支持DALL-E3文生图

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

高级数据结构——树状数组

树状数组(Binary Index Tree, BIT),是一种一般用来处理单点修改和区间求和操作类型的题目的数据结构,时间复杂度为O(log n)。 对于普通数组来说,单点修改的时间复杂度是 O(1),但区间求和的时间复杂度是 O(n…

【创作活动】作为程序员的那些愚蠢瞬间

作为一名程序员,我相信你一定遇到过这种情况:在写代码的时候,遇到了一些bug,在当下怎么检查都查不出问题出现在哪,等过几天后突然发现困扰自己的问题原来这么简单,突然觉得自己很蠢。这种情况在我身上也发生…

人工智能-深度学习之序列模型

想象一下有人正在看网飞(Netflix,一个国外的视频网站)上的电影。 一名忠实的用户会对每一部电影都给出评价, 毕竟一部好电影需要更多的支持和认可。 然而事实证明,事情并不那么简单。 随着时间的推移,人们对…

漏洞分析 | 漏洞调试的捷径:精简代码加速分析与利用

0x01前言 近期,Microsoft威胁情报团队曝光了DEV-0950(Lace Tempest)组织利用SysAid的事件。随后,SysAid安全团队迅速启动了应急响应,以应对该组织的攻击手法。然而,在对漏洞的分析和复现过程中&#xff0c…

使用Microsoft Dynamics AX 2012 - 1. 什么是Microsoft Dynamics AX?

Dynamics AX是Microsoft的核心业务管理解决方案,旨在满足中型公司和跨国组织的要求。基于 DynamicsAX基于最先进的体系结构和深度集成,在确保高可用性的同时,展现了全面的功能。 在AX 2012版中,Dynamics AX显示了大量新功能和增强…

Postman内置动态参数以及自定义的动态参数

近期在复习Postman的基础知识,在小破站上跟着百里老师系统复习了一遍,也做了一些笔记,希望可以给大家一点点启发。 一)内置动态参数 {{$timestamp}} 生成当前时间的时间戳{{$randomInt}} 生成0-1000之间的随机数{{$guid}} 生成随…

⑩【MySQL】存储引擎详解, InnoDB、MyISAM、Memory。

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ 存储引擎 ⑩【MySQL存储引擎】1. MySQL体系结构…

隐私协议 Secret Network 宣布使用 Octopus Network 构建的 NEAR-IBC 连接 NEAR 生态

2023年11月 NearCon2023 活动期间,基于 Cosmos SDK 构建的隐私协议 Secret Network,宣布使用 Octopus Network 开发的 NEAR-IBC,于2024年第一季度实现 Secret Network 与 NEAR Protocol 之间的跨链交互。 这将会是Cosmos 生态与 NEAR 之间的首…

java VR全景商城免费搭建 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

一个开源的汽修rbac后台管理系统项目,基于若依框架,实现了activiti工作流,附源码

文章目录 前言&源码项目参考图: e店邦O2O平台项目总结一、springboot1.1、springboot自动配置原理1.2、springboot优缺点1.3、springboot注解 二、rbac2.1、概括2.2、三个元素的理解 三、数据字典3.1、概括与作用3.2、怎么设计3.3、若依中使用字典 四、工作流—…

STM32CubeIDE报“xxx is not implemented and will always fail”解决方法

本文介绍STM32CubeIDE报“xxx is not implemented and will always fail”解决方法。 最近用STM32CubeIDE开发STM32程序时,编译报警告: warning: _close is not implemented and will always fail warning: _lseek is not implemented and will always…

idea中把spring boot项目打成jar包

打jar包 打开项目,右击项目选中Open Module Settings进入project Structure 选中Artifacts,点击中间的加号(Project Settings->Artifacts->JAR->From modules with dependencies ) 弹出Create JAR from Modules&#…

想转行互联网行业,是选择网络安全还是人工智能?

随着数字时代的到来,网络安全和人工智能成了科技创新产业的重要组成部分。也逐渐成了大多数人心中热门的行业选择。那么该如何抉择呢? 首先我们来了解下人工智能的发展前景: 如今,人工智能技术无论是在核心技术方面&#xff0c…

系列四、本地接口(Native Interface)

一、概述 本地接口的作用是融合不同的编程语言为Java所用,它的初衷是融合C/C程序,Java诞生的时候正是C/C横行的时候,要想立足,必须要调用C/C的程序,于是Java就在内存中开辟了一块区域专门用于处理标记为native的代码&a…

wpf devexpress数据统计

GridControl允许显示总结信息关于单个数据行分组。例如,你可以显示记录数量,最小和最大值。这个统计信息可以叫做数据统计。 创建统计 GridControl 支持总结和分组统计: 总结统计 - 一个总结函数值计算对于所有列和视图显示统计面板和固定统…

2023最受推荐的五款项目管理工具

1、进度猫 进度猫是国内一款轻量级项目管理工具,适用于实时协作的团队。 以甘特图为向导,基于任务清单todolist,支持多用户协作; 甘特图显示具体任务清单、时间和任务的进度; 对未完成任务、已完成任务进行分类管…

深度学习OCR中文识别 - opencv python 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习OCR中文识别系统 ** 该项目较为新颖,适合作为竞赛课题方向,…

【Spring进阶系列丨第二篇】Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)

前言 我们都知道Spring 框架主要的优势是在 简化开发 和 框架整合 上,至于如何实现就是我们要学习Spring 框架的主要内容,今天我们就来一起学习Spring中的两大核心技术IoC(控制反转)与DI(依赖注入)。 文章目…

【BIM入门实战】高程点无法放置的解决方法

文章目录 一、问题提出二、解决办法1. 检查模型图形样式2. 高程点可以放置的图元一、问题提出 在平面图中添加高程点时有时会遇到无法在楼板等平面构件上放置高程点,应如何设置才能使高程点正常放置? 如下图所示,楼板上无法放置高程点: 二、解决办法 1. 检查模型图形样式…