基于Yolov5的道路缺陷识别,加入CVPR2023 InceptionNeXt、华为诺亚2023 VanillaNet、ASFF、EVC、Decoupled_Detect、TSCODE、WIoU优化

article/2025/8/6 6:38:59

目录

1.数据集介绍

1.1数据增强,扩充数据集

1.1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt

1.1.2 通过voc_label.py得到适合yolov5训练需要的

2.基于yolov5的道路缺陷识别

2.1配置 crack.yaml

2.2 修改yolov5s_crack.yaml

2.3训练道路缺陷模型

3.性能评价

3.1 加入ASFF特征金字塔融合

3.2 ECVBlock

3.3 解耦头Decoupled_Detect

3.4 GSConv+Slim Neck

 3.4.1 slimneck-yolov5s.yaml 

 3.4.2 GSConv-yolov5s.yaml​编辑

1.数据集介绍

缺陷类型:crack 

数据集数量:195张

1.1数据增强,扩充数据集

通过medianBlur、GaussianBlur、Blur3倍扩充得到780张图片

按照train、val、test进行8:1:1进行划分

1.1.1 通过split_train_val.py得到trainval.txt、val.txt、test.txt

# coding:utf-8import os
import random
import argparseparser = argparse.ArgumentParser()
#xml文件的地址,根据自己的数据进行修改 xml一般存放在Annotations下
parser.add_argument('--xml_path', default='Annotations', type=str, help='input xml label path')
#数据集的划分,地址选择自己数据下的ImageSets/Main
parser.add_argument('--txt_path', default='ImageSets/Main', type=str, help='output txt label path')
opt = parser.parse_args()trainval_percent = 0.9
train_percent = 0.8
xmlfilepath = opt.xml_path
txtsavepath = opt.txt_path
total_xml = os.listdir(xmlfilepath)
if not os.path.exists(txtsavepath):os.makedirs(txtsavepath)num = len(total_xml)
list_index = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list_index, tv)
train = random.sample(trainval, tr)file_trainval = open(txtsavepath + '/trainval.txt', 'w')
file_test = open(txtsavepath + '/test.txt', 'w')
file_train = open(txtsavepath + '/train.txt', 'w')
file_val = open(txtsavepath + '/val.txt', 'w')for i in list_index:name = total_xml[i][:-4] + '\n'if i in trainval:file_trainval.write(name)if i in train:file_train.write(name)else:file_val.write(name)else:file_test.write(name)file_trainval.close()
file_train.close()
file_val.close()
file_test.close()

1.1.2 通过voc_label.py得到适合yolov5训练需要的

# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwdsets = ['train', 'val']
classes = ["crack"]   # 改成自己的类别
abs_path = os.getcwd()
print(abs_path)def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open('Annotations/%s.xml' % (image_id), encoding='UTF-8')out_file = open('labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').text#difficult = obj.find('Difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')wd = getcwd()
for image_set in sets:if not os.path.exists('labels/'):os.makedirs('labels/')image_ids = open('ImageSets/Main/%s.txt' % (image_set)).read().strip().split()list_file = open('%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/images/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

2.基于yolov5的道路缺陷识别

2.1配置 crack.yaml

train: ./data/crack/train.txt
val: ./data/crack/val.txt# number of classes
nc: 1# class names
names: ["crack"]

2.2 修改yolov5s_crack.yaml

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters
nc: 1  # 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# 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)]

2.3训练道路缺陷模型

配置train.py超参数

def parse_opt(known=False):parser = argparse.ArgumentParser()parser.add_argument('--weights', type=str, default=ROOT / 'weights/yolov5s.pt', help='initial weights path')parser.add_argument('--cfg', type=str, default='models/yolov5s_crack.yaml', help='model.yaml path')parser.add_argument('--data', type=str, default=ROOT / 'data/crack.yaml', help='dataset.yaml path')parser.add_argument('--hyp', type=str, default=ROOT / 'data/hyps/hyp.scratch-low.yaml', help='hyperparameters path')parser.add_argument('--epochs', type=int, default=100, help='total training epochs')parser.add_argument('--batch-size', type=int, default=16, help='total batch size for all GPUs, -1 for autobatch')parser.add_argument('--imgsz', '--img', '--img-size', type=int, default=640, help='train, val image size (pixels)')parser.add_argument('--rect', action='store_true', help='rectangular training')parser.add_argument('--resume', nargs='?', const=True, default=False, help='resume most recent training')parser.add_argument('--nosave', action='store_true', help='only save final checkpoint')parser.add_argument('--noval', action='store_true', help='only validate final epoch')parser.add_argument('--noautoanchor', action='store_true', help='disable AutoAnchor')parser.add_argument('--noplots', action='store_true', help='save no plot files')parser.add_argument('--evolve', type=int, nargs='?', const=300, help='evolve hyperparameters for x generations')parser.add_argument('--bucket', type=str, default='', help='gsutil bucket')parser.add_argument('--cache', type=str, nargs='?', const='ram', help='image --cache ram/disk')parser.add_argument('--image-weights', action='store_true', help='use weighted image selection for training')parser.add_argument('--device', default='2', help='cuda device, i.e. 0 or 0,1,2,3 or cpu')parser.add_argument('--multi-scale', action='store_true', help='vary img-size +/- 50%%')parser.add_argument('--single-cls', action='store_true', help='train multi-class data as single-class')parser.add_argument('--optimizer', type=str, choices=['SGD', 'Adam', 'AdamW'], default='SGD', help='optimizer')parser.add_argument('--sync-bn', action='store_true', help='use SyncBatchNorm, only available in DDP mode')parser.add_argument('--workers', type=int, default=0, help='max dataloader workers (per RANK in DDP mode)')parser.add_argument('--project', default=ROOT / 'runs/train_crack', help='save to project/name')parser.add_argument('--name', default='exp', help='save to project/name')parser.add_argument('--exist-ok', action='store_true', help='existing project/name ok, do not increment')parser.add_argument('--quad', action='store_true', help='quad dataloader')parser.add_argument('--cos-lr', action='store_true', help='cosine LR scheduler')parser.add_argument('--label-smoothing', type=float, default=0.0, help='Label smoothing epsilon')parser.add_argument('--patience', type=int, default=100, help='EarlyStopping patience (epochs without improvement)')parser.add_argument('--freeze', nargs='+', type=int, default=[0], help='Freeze layers: backbone=10, first3=0 1 2')parser.add_argument('--save-period', type=int, default=-1, help='Save checkpoint every x epochs (disabled if < 1)')parser.add_argument('--seed', type=int, default=0, help='Global training seed')parser.add_argument('--local_rank', type=int, default=-1, help='Automatic DDP Multi-GPU argument, do not modify')

开启python train.py

3.性能评价

原始map 0.954

3.1 加入ASFF特征金字塔融合

博客地址:https://blog.csdn.net/m0_63774211/article/details/129619356

 

map 从0.954上升到0.973

3.2 ECVBlock

基于YoloV5 ECVBlock的小目标检测(CFPNet即插即用,助力检测涨点,YOLOv7/YOLOv5均有效)_AI&CV的博客-CSDN博客

 

 EVC在道路缺陷crack提升效果不明显

3.3 解耦头Decoupled_Detect

涨点技巧:Detect系列---Yolov5/Yolov7加入解耦头Decoupled_Detect,涨点明显_AI&CV的博客-CSDN博客

 

map 从0.954上升到0.962

3.4 GSConv+Slim Neck

涨点神器:Yolov5引入GSConv+Slim Neck,提升小目标检测精度_AI&CV的博客-CSDN博客

 3.4.1 slimneck-yolov5s.yaml 

map 从0.954上升到0.961

 3.4.2 GSConv-yolov5s.yaml

 map 从0.954上升到0.966

 3.4.2 yolov5s_InceptionDWConv2d.yaml

https://cv2023.blog.csdn.net/article/details/129946896?spm=1001.2014.3001.5502

  map 从0.954上升到0.967

depth=2,map 从0.954上升到0.974

3.5 WIoU: Bounding Box Regression Loss with Dynamic Focusing Mechanism 

https://cv2023.blog.csdn.net/article/details/130198660?spm=1001.2014.3001.5502

 map 从0.954上升到0.968 

3.6 TSCODE解耦头

https://cv2023.blog.csdn.net/article/details/130267277?spm=1001.2014.3001.5502

 map 从0.954上升到0.976

3.7 困难样本挖掘 Loss Rank Mining

https://cv2023.blog.csdn.net/article/details/130343340

 map 从0.954上升到0.982

3.8 自注意机制MobileViTAttention

https://cv2023.blog.csdn.net/article/details/130898507

原始map 0.954提升至0.982

3.9 VanillaBlock 华为诺亚提出VanillaNet2023

https://cv2023.blog.csdn.net/article/details/130900471

 map 0.954提升至 0.979

 


http://chatgpt.dhexx.cn/article/dd9FAhV1.shtml

相关文章

【Decouple】《Improving Semantic Segmentation via Decoupled Body and Edge Supervision》

ECCV-2020 作者分享&#xff1a;https://www.techbeat.net/talk-info?id462 Code&#xff1a;https://github.com/lxtGH/DecoupleSegNets 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Decoupled segmentation framework4.2 …

【CVPR2021】Decoupled dynamic filter networks

论文&#xff1a;https://thefoxofsky.github.io/files/ddf.pdf 代码&#xff1a;https://github.com/thefoxofsky/ddfnet 主页&#xff1a;https://thefoxofsky.github.io/project_pages/ddf 先从论文首页的图说起。第一行为普通静态卷积&#xff0c;对于道路、车辆、建筑使用…

阅读Decoupled Spatial-Temporal Attention Network for Skeleton-Based Action Recognition

基于骨骼动作识别的解耦时空注意网络 paper&#xff1a;https://arxiv.org/abs/2007.03263 文章目录 AbstractIntroductionMethod3.1 Spatial-temporal attention module 3.2 Decoupled Position encoding3.3 Spatial global regularization3.4 Complete attention module3.5 O…

[论文评析]Decoupled Knowledge Distillation, CVPR2022

[论文评析]Decoupled Knowledge Distillation&#xff0c; CVPR2022 文章信息动机方法Basic notionsKL Loss重要发现伪码 思考References 文章信息 题目&#xff1a;Decoupled Knowledge Distillation 发表&#xff1a; CVPR ,2022 作者&#xff1a;Borui Zhao 11&#xff0c;…

Decoupled head(解耦合头)和Coupled head(耦合头)

&#x1f47b;解耦合头和耦合头是目标检测中常见的两种头部设计&#xff0c;用于从检测网络的特征图中提取目标位置和类别信息。 &#xff08;先看概念&#xff0c;概念看不懂可以直接看图一定能懂&#x1f601;&#xff09; 文章目录 耦合头&#xff08;Coupled head&#xf…

#Reading Paper# 【序列推荐】SIGIR 2022 Decoupled Side Information Fusion for Sequential Recommendation

#论文题目&#xff1a;【序列推荐】Decoupled Side Information Fusion for Sequential Recommendation&#xff08;DIF-SR&#xff1a;用于序列推荐的辅助信息解耦&#xff09; #论文地址&#xff1a;https://arxiv.org/pdf/2204.11046.pdf #论文源码开源地址&#xff1a;http…

yolox Head-Decoupled head源码解读

目录 前言 yolox网络结构 yolox head网络结构 head组件及对应源码 解码 前言 yolox backbone部分介绍 yolox neck部分介绍 yolox:https://github.com/Megvii-BaseDetection/YOLOX yolox详细解读可参考&#xff1a;https://jishuin.proginn.com/p/763bfbd628ce yolox网络…

Decoupled Knowledge Distillation——目标分布与非目标分布相解耦

通过传统知识蒸馏的解耦分析&#xff0c;DKD&#xff08;Decoupled Knowledge Distillation&#xff09;重新审视了暗知识的本质&#xff0c;并通过蒸馏损失函数的改进、获得DKD loss&#xff0c;显著改善了任务相关知识迁移的效果&#xff1a; Paper地址&#xff1a;https://a…

【GCN-CTR】DC-GNN: Decoupled GNN for Improving and Accelerating Large-Scale E-commerce Retrieval WWW22

《DC-GNN: Decoupled Graph Neural Networks for Improving and Accelerating Large-Scale E-commerce Retrieval》(WWW’22) 在工业场景中&#xff0c;数百亿节点和数千亿的边直接端到端的GNN-based CTR模型开销太大&#xff0c;文章把整个GNN框架解耦成三阶段&#xff1a;预…

(2019.01, iclr) Decoupled Weight Decay Regularization

code: https://github.com/loshchil/AdamW-and-SGDW 除了纯SGD, L2 ! weight_decay 背景知识&#xff1a; sgd with momentum和adam&#xff0c;详见《深度学习》: L2 regulization and weight decay: https://benihime91.github.io/blog/machinelearning/deeplearning/python3…

Decoupled Novel Object Captioner

Decoupled Novel Object Captioner AbstractIntroductionMethodsPreliminariesZero-Shot Novel Object Captioning.Sequence Model with the PlaceholderKey-Value Object MemoryFramework OverviewTraining Reference Reference[原文]: Joselynzhao.top & 夏木青 | Decoup…

Video Anomaly Detection by Solving Decoupled Spatio-Temp

Video Anomaly Detection by Solving Decoupled Spatio-Temp 什么是SSL? Self-Supervised Learning&#xff0c;又称为自监督学习什么是多标签分类问题: 一个数据有多个标签pretext 任务&#xff1a; 简单的来说&#xff0c;通过另一个任务简介完成主任务 比如&#xff0c;要训…

魔改YOLOv5/YOLOv7高阶版——改进之结合解耦头Decoupled_Detect

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨

Distilling Object Detectors via Decoupled Features

Abstract 相比于图像分类而言&#xff0c;目标检测器更加复杂&#xff0c;具有多个损失函数。而目前的的检测中&#xff0c;其主要将注意力集中在对象的区域中&#xff0c;但本文指出&#xff0c;从背景中提取的特征信息对于学生模型的学习也是必不可少的。且由于目标区域和背…

Decoupled Attention Network for Text Recognition

摘要&#xff1a; 最流行的文字检测的方法是注意力机制&#xff0c;但是大多数的注意力机制方法由于循环的对齐操作会导致严重的对齐问题。因为对齐操作依赖于历史解码信息。 本文提出的DAN将对齐操作与历史解码信息解耦。 原理&#xff1a; Connectionist temporal classifi…

涨点技巧:Detect系列---Yolov5/Yolov7加入解耦头Decoupled_Detect,涨点明显

目录 1. Decoupled Head介绍 2.Yolov5加入Decoupled_Detect 2.1 DecoupledHead加入common.py中&#xff1a; 2.2 Decoupled_Detect加入yolo.py中&#xff1a; 2.3修改yolov5s_decoupled.yaml 3.数据集下验证性能 &#x1f3c6; &#x1f3c6;&#x1f3c6;&#x1f3c6;&…

Decoupled Contrastive Learning 论文解读和感想

本文首先提出了当前对比学习的三大痛点&#xff1a; 1、当前的sota方法结构都过于复杂 2、对比学习要想取得效果&#xff0c;必须要用大batch 3、超参敏感(个人认为这里说的超参是指数据增强方式) 然后本文以SimCLR为例&#xff0c;通过对对比损失的梯度进行分析&#xff0c;发…

DECOUPLED WEIGHT DECAY REGULARIZATION

引言 Adam作为一个常用的深度学习优化方法&#xff0c;提出来的时候论文里的数据表现都非常好&#xff0c;但实际在使用中发现了不少问题&#xff0c;在许多数据集上表现都不如SGDM这类方法。 后续有许多工作针对Adam做了研究&#xff0c;之前整理过关于优化算法的发展历程&am…

Decoupled Dynamic Filter Networks

转载自:https://www.cnblogs.com/liuyangcode/p/14755924.html 对depth-wise的改进&#xff0c;将卷积核的参数改为根据输入变化的方式 Introduction 卷积缺点在于&#xff1a;内容不变&#xff0c;计算量高动态filter可以根据内容自适应&#xff0c;但是会提高计算量。depth…

Analyzing and Leveraging Decoupled L1 Caches in GPUs

introduction 我们都知道L1/L2/L3cache解决了内存墙的问题&#xff0c;但是作者分析出现有的缓存架构有着天然缺陷&#xff0c; 作者列出的many to few communication&#xff0c;也就是L1ache中大量的数据传输到L2cache中&#xff0c;可能对于L1cache的带宽使用率不是很高&a…