探索实践低光照场景下YOLOv5s模型上限,融合CBAM注意力机制开发构建基于改进YOLOv5s的低光照条件下目标检测识别分析系统

news/2024/7/10 3:12:14 标签: 目标检测, YOLO, 人工智能

在现实生活场景里面,很多场景下光线光照条件都是比较差的,比如夜晚、室内等,这时候以往的目标检测模型是否还能够胜任我们所需的目标检测任务呢?这里主要的想法就是基于地光线条件下的数据集来开发构建目标检测系统,探索分析传统轻量级的检测模型在这样场景下是否还具备竞争力。

首先看下效果图:

简单看下数据集,数据集来源于网络源:

 可以看到:整体数据的光线光照条件都是很一般的。

标注文件如下所示:

 实例标注内容如下:

4 0.344675 0.89645 0.204142 0.100592
11 0.702663 0.885602 0.156805 0.094675
7 0.840237 0.894477 0.189349 0.100592
6 0.230769 0.822485 0.053254 0.031558
8 0.482249 0.861933 0.100592 0.051282
0 0.428994 0.844181 0.065089 0.043393

 这里主要的基准模型是yolov5s,如下:

# Parameters
nc: 12
depth_multiple: 0.33
width_multiple: 0.50


anchors:
  - [10,13, 16,30, 33,23]
  - [30,61, 62,45, 59,119] 
  - [116,90, 156,198, 373,326]



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
  ]



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)
  ]

加入CBAM注意力机制的改进模型如下:

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license

# Parameters
nc: 12  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # 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



#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
  ]



#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)
   [-1, 1, CBAM, [1024]], 

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

默认都是100次epoch的迭代计算,看下模型对比结果。

原生YOLOv5s模型结果如下:

 

改进后的YOLOv5s模型结果如下:

这里着重对比的就是模型的F1和PR曲线,这是能够比较全面综合体现模型性能指标的,但是不够直观不够立体,这里绘制对比曲线来进行详细对比。

首先是模型的F1值对比曲线,如下:

 可以看到:最初的时候改进模型略占下风,之后和原生模型部分伯仲,最终超出原生模型。

接下来是精确率曲线:

 接下来是召回率对比曲线:

最后我们还对比分析了两款模型整体训练-验证loss曲线,如下:

 整体呈现出来的规律都是接近或者是相似的。

轻量级的YOLOv5s表现出来的性能已经是相对可以的了。

这里突然想到,m系列的模型是否会更好呢,这里我也同样做了原始YOLOv5m和改进版YOLOv5m的模型,整体的构建原理与YOLOv5s是一致的,这里就不再赘述了,直接看下最终的对比结果好了。

 从图表数据呈现出来的结果来看:m系列的模型要更胜一筹,不过本身m的参数量级就更大,结果好也是预料之中的事情,感兴趣的话可以继续坐下l系列和x系列的模型,相信结果会更好的。


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

相关文章

【opencv】图像数字化——认识OpenCV中的Mat类(4 访问单通道Mat对象中的值)

4 访问单通道Mat对象中的值 4.1使用成员函数at() 格式&#xff1a;m.at(r,c)&#xff0c;访问第r行c列 #include <opencv2/core/core.hpp> #include<iostream> using namespace std; using namespace cv; int main() {//构造矩阵Mat m (Mat_<int>(3,…

java面试热点

1 说说你对MVC的理解 得分点 mvc概念,model、view、controller模块功能 标准回答 MVC是一种设计模式,在这种模式下软件被分为三层,即Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;。Model代表的是数据,Vie…

通过遍历结果构造二叉树

⭐️前言⭐️ 本篇文章主要总结通过前序遍历、中序遍历、后序遍历中的两个遍历结果&#xff0c;来构造二叉树的过程&#xff0c;通过本篇文章的总结&#xff0c;可以解决一下问题。 LeetCode难度654. 最大二叉树&#x1f7e0;105. 从前序与中序遍历序列构造二叉树&#x1f7e…

【C】Process Control

系列连载 【python / C / C】 参考 《C语言程序设计&#xff08;第四版&#xff09;谭浩强》【C语言】C语言视频教程《郝斌 C 语言自学教程》 文章目录1 什么是流程控制2 流程控制的分类2.1 顺序执行2.2 选择执行2.3 循环执行2.3.1 for2.3.2 while2.3.3 do...while2.3.4 swi…

Oracle子查询保姆级讲解

子查询 N行N列的概念 根据查询行数与列数的不同&#xff0c;简单分为以下四种查询结果 1.单行单列 无论是在行还是在列上&#xff0c;都只有一个 例&#xff1a;查询整个公司的最高薪资 select max(sal) from EMP; 2.多行查询 查询结果中仅有一列数据&#xff0c;不过行数上不…

从工程的角度谈一谈工具体系的规划

从工程的角度谈一谈工具体系的规划 工具总论 遵循基本规则&#xff1a;现状与指标、方案、实施、结果和监控。 工具体系的目标 首先考虑&#xff1a;我们对工具本身的要求是什么&#xff1f; 1.考虑到工程行为都是团队合作&#xff0c;我们对工具最基本的要求就是&#xff…

计算机网络 实验五

⭐计网实验专栏&#xff0c;欢迎订阅与关注&#xff01; ★观前提示&#xff1a;本篇内容为计算机网络实验。内容可能会不符合每个人实验的要求&#xff0c;因此以下内容建议仅做思路参考。 一、实验目的 理解DNS的域名解析机制&#xff0c;理解DHCP的工作机制熟悉WEB应用及超…

函数栈帧的创建与销毁

魔王的介绍&#xff1a;&#x1f636;‍&#x1f32b;️一名双非本科大一小白。魔王的目标&#xff1a;&#x1f92f;努力赶上周围卷王的脚步。魔王的主页&#xff1a;&#x1f525;&#x1f525;&#x1f525;大魔王.&#x1f525;&#x1f525;&#x1f525; ❤️‍&#x1…