DAMOYOLO:基于DAMOYOLO训练数据集详细教程

本文分享了DAMOYolo的实际使用经验,包括数据集格式转换、配置文件调整等步骤,并对比了其与YOLOv5的表现差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间yolov7的推出引起一篇热潮,接着rmyolo紧跟潮流,后面阿里的达摩院也推出了自己的yolo算法,怎么说呢,damoyolo推出依旧不少天了,现在才写博客,因为damoyolo给我的体验感不是很好。

先看下DAMOYOLO的文章:

这是DAMOYOLO文章里面速度与map的折线图,从图上看,damoyolo确实很猛

damoyolo的各个模型在COCO上的map.

 damoyolo的网络结构:

 DAMOYOLO的github网址:

https://github.com/tinyvision/DAMO-YOLO

下面介绍下如何使用DAMOYOLO训练自己的数据集:

1、YOLO2COCO

damoyolo的数据集格式是coco格式的,v5、v7都是yolo格式的所以我们需要及进行转换。

转换脚本:

import os
import json
import cv2
import random
import time
from PIL import Image

coco_format_save_path='COCO\\val\\'   #要生成的标准coco格式标签所在文件夹
yolo_format_classes_path='E:\\YoloV67\\YoloV6_P\\AiTodData\\name.txt'     #类别文件,一行一个类
yolo_format_annotation_path='E:\\YoloV67\\YoloV6_P\\AiTodData\\labels\\val\\'  #yolo格式标签所在文件夹
img_pathDir='E:\\YoloV67\\YoloV6_P\\AiTodData\\images\\val\\'    #图片所在文件夹

with open(yolo_format_classes_path,'r') as fr:                               #打开并读取类别文件
    lines1=fr.readlines()
# print(lines1)
categories=[]                                                                 #存储类别的列表
for j,label in enumerate(lines1):
    label=label.strip()
    categories.append({'id':j+1,'name':label,'supercategory':'None'})         #将类别信息添加到categories中
# print(categories)

write_json_context=dict()                                                      #写入.json文件的大字典
write_json_context['info']= {'description': '', 'url': '', 'version': '', 'year': 2022, 'contributor': 'xxx', 'date_created': '2022-07-8'}
write_json_context['licenses']=[{'id':1,'name':None,'url':None}]
write_json_context['categories']=categories
write_json_context['images']=[]
write_json_context['annotations']=[]

#接下来的代码主要添加'images'和'annotations'的key值
imageFileList=os.listdir(img_pathDir)                                           #遍历该文件夹下的所有文件,并将所有文件名添加到列表中
for i,imageFile in enumerate(imageFileList):
    imagePath = os.path.join(img_pathDir,imageFile)                             #获取图片的绝对路径
    image = Image.open(imagePath)                                               #读取图片,然后获取图片的宽和高
    W, H = image.size

    img_context={}                                                              #使用一个字典存储该图片信息
    #img_name=os.path.basename(imagePath)                                       #返回path最后的文件名。如果path以/或\结尾,那么就会返回空值
    img_context['file_name']=imageFile
    img_context['height']=H
    img_context['width']=W
    img_context['date_captured']='2022-07-8'
    img_context['id']=i                                                         #该图片的id
    img_context['license']=1
    img_context['color_url']=''
    img_context['flickr_url']=''
    write_json_context['images'].append(img_context)                            #将该图片信息添加到'image'列表中

    
    if len(imageFile.split('.')) == 2:
        txtFile = imageFile.split('.')[0]+'.txt'
    else:
        print("on")
        exit()
    # txtFile=imageFile[:5]+'.txt'                                               #获取该图片获取的txt文件
    with open(os.path.join(yolo_format_annotation_path,txtFile),'r') as fr:
        lines=fr.readlines()                                                   #读取txt文件的每一行数据,lines2是一个列表,包含了一个图片的所有标注信息
    for j,line in enumerate(lines):

        bbox_dict = {}                                                          #将每一个bounding box信息存储在该字典中
        # line = line.strip().split()
        # print(line.strip().split(' '))

        class_id,x,y,w,h=line.strip().split(' ')                                          #获取每一个标注框的详细信息
        class_id,x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)       #将字符串类型转为可计算的int和float类型

        xmin=(x-w/2)*W                                                                    #坐标转换
        ymin=(y-h/2)*H
        xmax=(x+w/2)*W
        ymax=(y+h/2)*H
        w=w*W
        h=h*H

        bbox_dict['id']=i*10000+j                                                         #bounding box的坐标信息
        bbox_dict['image_id']=i
        bbox_dict['category_id']=class_id+1                                               #注意目标类别要加一
        bbox_dict['iscrowd']=0
        height,width=abs(ymax-ymin),abs(xmax-xmin)
        bbox_dict['area']=height*width
        bbox_dict['bbox']=[xmin,ymin,w,h]
        bbox_dict['segmentation']=[[xmin,ymin,xmax,ymin,xmax,ymax,xmin,ymax]]
        write_json_context['annotations'].append(bbox_dict)                               #将每一个由字典存储的bounding box信息添加到'annotations'列表中

name = os.path.join(coco_format_save_path,"val"+ '.json')
with open(name,'w') as fw:                                                                #将字典信息写入.json文件中
    json.dump(write_json_context,fw,indent=2)

最终的数据集格式如下所示:其中annotations为三个json文件(train、val、test),test、train、val为图片文件夹。

 数据集制作完成,接下来配置文件。

打开damo/config/paths_catalog.py  按照一下进行配置:

 再打开base.py  配置一下预训练模型:我使用的是s预训练模型

打开config/damoyolo_tinynasL25_S.py  进行参数微调,比如修改输入图像的尺寸,迭代次数。。。。

接下来,,,,大家按照官网创建一个新的虚拟环境,记住版本啥的都要和官网的对应上。(我之前试过用py3.9进行训练的结果卡在了第17轮就不动了)

下面就是damoyolo 的训练过程,,,说实话速度贼慢(s是真的慢,早上10点多开训的,距离此时此刻训练了300轮不到),而且同样的数据集v5表现比他好(收敛速度快)

v5训练:

 只能这么说damoyolo改动的地方很多,比如repfpn、zerohead、nas..........但是我还是选择v5!!!!!!!!!!!!!!!!

更新:真是操蛋!!!!!!!!!!!

卡在185轮不动了。。。。。。已经卡了4 5个小时了。

而且训着训着直接报错了。。。。runtimeout 。已经改成1000000了还是不行。。不是卡住就是报错。

 最开始的时候我以为v6刚出来那会的bug已经够多了,没想到DAMOYOLO更牛逼,这是谁的部将,为何如此勇猛!  DAMOYOLO再见!再也不见!!!!

更新:从新git代码,训练一波,但是效果确实不好。。。。

 同样的数据集,v5我用repvgg做主干网络,map50 = 0.923,damoyolo却很低。。。。。

再次更新,这应该是我最后一次DAMOYOLO得更新了,之前训练自己得数据集map很低得情况也和官方人员进行了沟通,在官方人员的指导下关闭了mosaic,发现更低了(map=0.28)。。。。。

 累了,也许DAMOYOLO并不适合小目标数据集,表现很差,,,,,,,

<think>好的,我现在需要处理用户关于大模型与YOLO的比较问题。首先,用户希望了解两者的差异、应用场景以及性能对比。根据用户提供的引用内容,我需要结合YOLO的特点和已有资料来展开分析。 首先,我需要明确什么是大模型和YOLO。大模型通常指参数规模庞大、需要大量计算资源的模型,如GPT-3、BERT等,它们通常在广泛的数据集上预训练,适用于多种任务。而YOLO(You Only Look Once)是专门用于目标检测的模型,以实时处理和高效率著称,如引用中提到的YOLO优化架构设计以实现快速处理[^1]。 接下来,差异方面。架构上,大模型可能使用Transformer结构,而YOLO基于CNN,特别是最新的版本可能结合了新技术,如DAMOYOLO系列在精度和速度上的优势[^2]。应用场景方面,YOLO适用于需要实时性的场景如自动驾驶,而大模型更多用于NLP任务,但多模态大模型可能也涉及图像处理。性能上,YOLO注重速度和准确性的平衡,而大模型可能更注重泛化能力,但计算资源需求高。 然后,应用场景对比。根据引用[1],YOLO在智能监控和自动驾驶中有应用,因其实时性。大模型可能用于更复杂的任务,比如图像生成或理解,但需要更多资源。例如,DAMOYOLO系列在目标检测上表现优异[^2],而工业界多用YOLOv5因其部署方便[^3]。 性能方面需要比较速度和准确性。YOLO系列,尤其是优化后的版本,如DAMOYOLO,在保持速度的同时提升精度。大模型可能在特定任务上精度更高,但速度慢,不适合实时应用。 可能用户还想知道两者是否可以结合,比如用大模型增强YOLO的性能,或者YOLO在处理速度上的优势如何补充大模型的不足。需要检查引用中是否有相关信息,引用[3]提到YOLO在工业部署中的普及,说明其易用性和效率,这可能与大模型形成对比。 最后,生成相关问题时要考虑用户可能的后续疑问,比如技术原理差异、实际应用中的选择标准、或者结合两者的可能性。 总结思考后,我需要组织答案的结构,分差异、应用场景、性能三部分,并引用提供的资料来支持观点。同时确保使用正确的中文表达和LaTeX格式,如数学公式用$符号包裹,独立公式用$$,并生成相关问题。</think>### 大模型 vs YOLO: 差异、应用场景及性能对比 #### 一、核心差异 1. **任务定义与模型定位** - **大模型**(如GPT-4、PaLM等):参数规模通常在百亿至千亿级别,以通用性为核心目标,通过大规模预训练学习跨领域知识,适用于文本生成、多模态理解等复杂任务。 - **YOLO**:专为目标检测设计的轻量级模型,参数规模较小(如YOLOv8仅数千万参数),强调实时性(如YOLO的推理速度可达30-100 FPS)和效率[^1]。 2. **架构设计** - **大模型**:多基于Transformer架构,依赖自注意力机制捕捉长距离依赖,计算复杂度为$O(n^2)$(n为输入序列长度)。 - **YOLO**:基于卷积神经网络(CNN),结合特征金字塔网络(FPN)和检测头,计算复杂度为$O(w \cdot h \cdot c)$(w、h、c为特征图宽、高、通道数)。 3. **资源需求** - **大模型**:训练需数千块GPU,推理依赖高性能计算集群(如云端服务器)。 - **YOLO**:可部署于移动设备或边缘计算设备,仅需单块GPU即可实现实时检测[^1]。 --- #### 二、应用场景对比 | **场景** | **大模型适用性** | **YOLO适用性** | |------------------|---------------------------------|------------------------------| | 实时目标检测 | 低(延迟高) | 高(如自动驾驶、无人机避障) | | 自然语言交互 | 高(如对话系统) | 不适用 | | 多模态任务 | 高(图文生成、跨模态检索) | 低(仅视觉任务) | | 边缘设备部署 | 低(模型体积大) | 高(如手机端人脸检测) | --- #### 三、性能对比 1. **精度与速度权衡** - **YOLO**:通过优化网络设计(如CSPDarkNet骨干网络)和训练策略(如数据增强),在保持高速度(>30 FPS)下实现AP(平均精度)>50%。 - **大模型**:在目标检测任务中(如ViTDet),可能达到更高AP(如60%+),但推理速度显著下降(<10 FPS)。 2. **泛化能力** - **大模型**:依赖海量数据预训练,对未见过的任务有一定泛化能力(如零样本学习)。 - **YOLO**:需针对特定场景微调(如工业缺陷检测),泛化性较弱。 3. **能效比** - **YOLO**:单位计算资源下能效更高,适合功耗敏感场景(如移动端)。 - **大模型**:单次推理能耗可能比YOLO高100倍以上。 --- #### 四、协同与互补 1. **大模型辅助YOLO**:利用大模型的语义理解能力生成合成训练数据,提升YOLO在长尾类别(如罕见物体)的检测性能。 2. **YOLO赋能大模型**:在视频分析任务中,YOLO可快速提取目标区域,再由大模型进行细粒度分析(如行为识别)。 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mrs.Gril

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值