企业网站建设与推广范文,做公众号策划的网站,青岛制作网站企业,网站建设后的效果评估#x1f4a1;#x1f4a1;#x1f4a1;本文内容#xff1a;教会你用自己数据集训练YOLOv9模型 YOLOv9魔术师专栏
☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
包含注意力机制魔… 本文内容教会你用自己数据集训练YOLOv9模型 YOLOv9魔术师专栏
☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
包含注意力机制魔改、卷积魔改、检测头创新、损失IOU优化、block优化多层特征融合、 轻量级网络设计、24年最新顶会改进思路、原创自研paper级创新等
☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️
✨✨✨ 新开专栏暂定免费限时开放后续每月调价一次✨✨✨ 本项目持续更新 | 更新完结保底≥50 冲刺100 联系WX: AI_CV_0624 欢迎交流 YOLOv9魔改注意力机制、检测头、blcok魔改、自研原创等 YOLOv9魔术师
全网独家首发创新原创适合paper 2024年计算机视觉顶会创新点适用于Yolov5、Yolov7、Yolov8等各个Yolo系列专栏文章提供每一步步骤和源码轻松带你上手魔改网络
重点通过本专栏的阅读后续你也可以设计魔改网络在网络不同位置Backbone、head、detect、loss等进行魔改实现创新 1.YOLOv9原理介绍 论文 2402.13616.pdf (arxiv.org)
代码GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information摘要 如今的深度学习方法重点关注如何设计最合适的目标函数从而使得模型的预测结果能够最接近真实情况。同时必须设计一个适当的架构可以帮助获取足够的信息进行预测。然而现有方法忽略了一个事实即当输入数据经过逐层特征提取和空间变换时大量信息将会丢失。因此YOLOv9 深入研究了数据通过深度网络传输时数据丢失的重要问题即信息瓶颈和可逆函数。作者提出了可编程梯度信息programmable gradient informationPGI的概念来应对深度网络实现多个目标所需要的各种变化。PGI 可以为目标任务计算目标函数提供完整的输入信息从而获得可靠的梯度信息来更新网络权值。此外研究者基于梯度路径规划设计了一种新的轻量级网络架构即通用高效层聚合网络Generalized Efficient Layer Aggregation NetworkGELAN。该架构证实了 PGI 可以在轻量级模型上取得优异的结果。研究者在基于 MS COCO 数据集的目标检测任务上验证所提出的 GELAN 和 PGI。结果表明与其他 SOTA 方法相比GELAN 仅使用传统卷积算子即可实现更好的参数利用率。对于 PGI 而言它的适用性很强可用于从轻型到大型的各种模型。我们可以用它来获取完整的信息从而使从头开始训练的模型能够比使用大型数据集预训练的 SOTA 模型获得更好的结果。对比结果如图1所示。 1.1 YOLOv9框架介绍
YOLOv9各个模型介绍 models/detect/yolov9.yaml ELAN models.common.RepNCSPELAN4:
从模块名字不难看出核心是Re-parameter CSPNet ELAN。 ELAN-SPP models.common.SPPELAN:
该模块与早前yolo版本中的SPPF结构基本一致如下图。 ADown models.common.ADown:
该模块在yolov9-c.yaml与yolov9-e.yaml结构中出现替代了模型中部分CBS模块。 来自YOLOv9结构详解 - 知乎 (zhihu.com)
2.NEU-DET数据集介绍
NEU-DET钢材表面缺陷共有六大类一共1800张
类别分别为crazing,inclusion,patches,pitted_surface,rolled-in_scale,scratches 2.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, defaultAnnotations, typestr, helpinput xml label path)
#数据集的划分地址选择自己数据下的ImageSets/Main
parser.add_argument(--txt_path, defaultImageSets/Main, typestr, helpoutput 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] \nif 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()
2.2 通过voc_label.py生成txt
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import os
from os import getcwdsets [train, val, test]
classes [crazing,inclusion,patches,pitted_surface,rolled-in_scale,scratches] # 改成自己的类别
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), encodingUTF-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.YOLOv9训练自己的数据集
2.1 修改NEU-DET.yaml
path推荐使用全路径
path: ./data/NEU-DET # dataset root dir
train: train.txt # train images (relative to path) 118287 images
val: val.txt # val images (relative to path) 5000 images# number of classes
nc: 6# class names
names:0: crazing1: inclusion2: patches3: pitted_surface4: rolled-in_scale 5: scratches
2.2 修改train.py
def parse_opt(knownFalse):parser argparse.ArgumentParser()# parser.add_argument(--weights, typestr, defaultROOT / yolo.pt, helpinitial weights path)# parser.add_argument(--cfg, typestr, default, helpmodel.yaml path)parser.add_argument(--weights, typestr, defaultweights/yolov9-c.pt, helpinitial weights path)parser.add_argument(--cfg, typestr, defaultmodels/detect/yolov9-c.yaml, helpmodel.yaml path)parser.add_argument(--data, typestr, defaultROOT / data/NEU-DET/NEU-DET.yaml, helpdataset.yaml path)parser.add_argument(--hyp, typestr, defaultROOT / data/hyps/hyp.scratch-high.yaml, helphyperparameters path)parser.add_argument(--epochs, typeint, default100, helptotal training epochs)parser.add_argument(--batch-size, typeint, default16, helptotal batch size for all GPUs, -1 for autobatch)parser.add_argument(--imgsz, --img, --img-size, typeint, default640, helptrain, val image size (pixels))
2.3 开启训练 python train_dual.py
2.4 训练可视化