草庐IT

Yolov5训练指南—CoCo格式数据集

Arvin Ou 2023-04-04 原文

Yolov5训练指南—CoCo格式数据集

1 准备工作

  1. 训练Yolo模型要准备的文件及文件格式如下:

    /trianing # 根目录
    	/datasets # 数据集目录(可以任意取名)
    		/images
    			/train
    			/val
    		/labels
    			/train
    			/val
    	/yolov5
    
  2. 先创建一个training文件夹mkdir training/

  3. 在training文件夹下使用git clone把yolov5克隆下来并安装依赖
    cd training

    git clone clone https://github.com/ultralytics/yolov5

    pip install -qr requirements.txt

  4. 检查pytorch和torchvision的版本

    pip install --upgrade torch

    pip install --upgrade torchvision

  5. 检查label是否连续,如不连续需要重新编码

  6. 使用Weights & Bias进行可视化,其中login的API可以在Weights & Biases上获取。
    %load_ext tensorboard
    %tensorboard --logdir /kaggle/training/yolov5/runs
    %pip install -q --upgrade wandb

    import wandb
    wandb.login()
    

2 将coco数据集转换为yolo数据集

  1. 使用json.load(open(file_path,'r'))读取数据

  2. 创建一个csv存放图片的id和文件名

  3. 读取2创建的csv,用train_test_split来切分训练集和验证集

  4. 在切分出来的trian和test文件中分别新增一列,用来标记该图片为训练图片还是测试图片
    train['split']='train'
    val['split']='val'
    df = pd.concat([trian,val],axis=0).rest_index(drop=True)

  5. 将每张图片的标签单独存放到各自的.txt文件中,其中coco数据集的annotation是[lowest_x,lowest_y,w,h],而yolo的annotation要求[center_x,center_y,w,h],使用以下函数:

    def coco2yolo(image_w,image_h,annotation):
        """Convert coco format data into yolo format data.
        Note: x,y in coco format are lowest left x and y. x,y in yolo format are center x,y.
        """
        x,y,w,h = annotation['bbox']
        
        x = (x+w)/2.0
        y = (y+h)/2.0
        
        return (x/image_w,y/image_h,w/image_w,h/image_h)
    
  6. 在training目录下创建dataset文件夹
    os.makedirs('/kaggle/training/cowboy/images/train', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/images/test', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/labels/train', exist_ok=True)

    os.makedirs('/kaggle/training/cowboy/labels/test', exist_ok=True)

  7. 将对应的图片和标签复制到train和test文件夹下

  8. 创建一个.ymal文件,该文件用于存放:
    1)训练数据和测试数据的路径
    2)类别总数
    3)类别对应的名称

    data_yaml = dict(train='/kaggle/training/cowboy/images/train/'
                     ,val='/kaggle/training/cowboy/images/test/'
                     ,nc=5
                     ,names=['belt', 'sunglasses', 'boot', 'cowboy_hat', 'jacket'])
    with open('/kaggle/training/yolov5/data/data.yaml', 'w') as outfile:
        yaml.dump(data_yaml, outfile, default_flow_style=True)
    

3 训练参数定义

参数如下:

lr0: 0.01  # initial learning rate (SGD=1E-2, Adam=1E-3)
lrf: 0.2  # final OneCycleLR learning rate (lr0 * lrf)
momentum: 0.937  # SGD momentum/Adam beta1
weight_decay: 0.0005  # optimizer weight decay 5e-4
warmup_epochs: 3.0  # warmup epochs (fractions ok)
warmup_momentum: 0.8  # warmup initial momentum
warmup_bias_lr: 0.1  # warmup initial bias lr
box: 0.05  # box loss gain
cls: 0.5  # cls loss gain
cls_pw: 1.0  # cls BCELoss positive_weight
obj: 1.0  # obj loss gain (scale with pixels)
obj_pw: 1.0  # obj BCELoss positive_weight
iou_t: 0.20  # IoU training threshold
anchor_t: 4.0  # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)
fl_gamma: 0.0  # focal loss gamma (efficientDet default gamma=1.5)
hsv_h: 0.015  # image HSV-Hue augmentation (fraction)
hsv_s: 0.7  # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4  # image HSV-Value augmentation (fraction)
degrees: 0.0  # image rotation (+/- deg)
translate: 0.1  # image translation (+/- fraction)
scale: 0.5  # image scale (+/- gain)
shear: 0.0  # image shear (+/- deg)
perspective: 0.0  # image perspective (+/- fraction), range 0-0.001
flipud: 0.0  # image flip up-down (probability)
fliplr: 0.5  # image flip left-right (probability)
mosaic: 1.0  # image mosaic (probability)
mixup: 0.0  # image mixup (probability)
copy_paste: 0.0  # segment copy-paste (probability)

4 训练模型

选择模型的时候,可以选择不同大小的模型:Yolov5

BATCH_SIZE = 32 # wisely choose, use the largest size that can feed up all your gpu ram
EPOCHS = 5
MODEL = 'yolov5m.pt'  # 5s, 5m 5l
name = f'{MODEL}_BS_{BATCH_SIZE}_EP_{EPOCHS}'

# 在yolov5目录下
!python train.py --batch {BATCH_SIZE} \
                 --epochs {EPOCHS} \
                 --data data.yaml \
                 --weights {MODEL} \
                 --save-period 1 \
                 --project /kaggle/working/kaggle-cwoboy \
                 --name {name} \
                 -- workers 4

5 预测

  1. 训练好的模型存放在W&B中,把最好的模型下载下来并上传到kaggle

  2. 将测试图片放到VALID_PATH文件夹下

  3. 回到yolov5路径下跑下面这行代码进行预测

    !python detect.py --weights {MODEL_PATH} \
    	                  --source {VALID_PATH} \
    	                  --conf 0.546 \
    	                  --iou-thres 0.5 \
    	                  --save-txt \
    	                  --save-conf \
    	                  --augment
    

最终预测结果在/kaggle/training/yolov5/runs/detect/exp/labels/

  1. 若要转换成coco的坐标使用下面这个函数

    def yolo2cc_bbox(img_width, img_height, bbox):
        x = (bbox[0] - bbox[2] * 0.5) * img_width
        y = (bbox[1] - bbox[3] * 0.5) * img_height
        w = bbox[2] * img_width
        h = bbox[3] * img_height
        
        return (x, y, w, h)
    
  2. 若之前对标签进行了编码,要把标签再映射回去

  3. 若要可视化结果可以使用Opencv或PIL读取yolov5/runs/detect/exp/下的照片。

    m = Image.open('/kaggle/training/yolov5/runs/detect/exp/0007c3f55f707547.jpg')
    im
    

有关Yolov5训练指南—CoCo格式数据集的更多相关文章

  1. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  4. ruby-on-rails - 将 Ruby 中的日期/时间格式化为 YYYY-MM-DD HH :MM:SS - 2

    这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build

  5. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  6. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  7. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐