0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个使用YoloV5的深度指南,使用WBF进行性能提升

新机器视觉 来源:AI公园 作者:AI公园 2021-04-18 10:05 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

导读

一个使用YoloV5的深度指南,使用WBF进行性能提升。

网上有大量的YoloV5教程,本文的目的不是复制内容,而是对其进行扩展。我最近在做一个目标检测竞赛,虽然我发现了大量创建基线的教程,但我没有找到任何关于如何扩展它的建议。此外,我想强调一下YoloV5配置中影响性能的最重要部分,因为毕竟数据科学主要是关于实验和超参数调整。

在这之前,我想说使用目标检测模型和使用图像分类模型在框架和库的工作方式上是不同的。这是我注意到的,我花了很长时间才弄明白。大多数流行的目标检测模型(如YoloV5、EfficientDet)使用命令行接口来训练和评估,而不是使用编码方法。这意味着,你所需要做的就是获取特定格式的数据(COCO或VOC),并将命令指向它。这通常与使用代码训练和评估模型的图像分类模型不同。

数据预处理

YoloV5期望你有两个目录,一个用于训练,一个用于验证。在这两个目录中,你需要另外两个目录,“Images”和“Labels”。Images包含实际的图像,每个图像的标签都应该有一个带有该图像标注的.txt文件,文本文件应该有与其对应的图像相同的名称。

标注格式如下:

<'class_id'><'x_center'><'y_center'><'height'>

要在代码中做到这一点,你可能需要一个类似的函数,在原始数据帧中有图像项,它们的类id和它们的边界框:

defcreate_file(df,split_df,train_file,train_folder,fold): os.makedirs('labels/train/',exist_ok=True) os.makedirs('images/train/',exist_ok=True) os.makedirs('labels/val/',exist_ok=True) os.makedirs('images/val/',exist_ok=True) list_image_train=split_df[split_df[f'fold_{fold}']==0]['image_id'] train_df=df[df['image_id'].isin(list_image_train)].reset_index(drop=True) val_df=df[~df['image_id'].isin(list_image_train)].reset_index(drop=True) fortrain_imgintqdm(train_df.image_id.unique()): withopen('labels/train/{train_img}.txt','w+')asf: row=train_df[train_df['image_id']==train_img] [['class_id','x_center','y_center','width','height']].values row[:,1:]/=SIZE#Imagesize,512here row=row.astype('str') forboxinrange(len(row)): text=''.join(row[box]) f.write(text) f.write(' ') shutil.copy(f'{train_img}.png', f'images/train/{train_img}.png') forval_imgintqdm(val_df.image_id.unique()): withopen(f'{labels/val/{val_img}.txt','w+')asf: row=val_df[val_df['image_id']==val_img] [['class_id','x_center','y_center','width','height']].values row[:,1:]/=SIZE row=row.astype('str') forboxinrange(len(row)): text=''.join(row[box]) f.write(text) f.write(' ') shutil.copy(f'{val_img}.png', f'images/val/{val_img}.png')

注意:不要忘记保存在标签文本文件中的边界框的坐标**必须被归一化(从0到1)。**这非常重要。另外,如果图像有多个标注,在文本文件中,每个标注(预测+边框)将在单独的行上。

在此之后,你需要一个配置文件,其中包含标签的名称、类的数量以及训练和验证的路径。

importyaml classes=[‘Aorticenlargement’, ‘Atelectasis’, ‘Calcification’, ‘Cardiomegaly’, ‘Consolidation’, ‘ILD’, ‘Infiltration’, ‘LungOpacity’, ‘Nodule/Mass’, ‘Otherlesion’, ‘Pleuraleffusion’, ‘Pleuralthickening’, ‘Pneumothorax’, ‘Pulmonaryfibrosis’] data=dict( train=‘../vinbigdata/images/train’,#trainingimagespath val=‘../vinbigdata/images/val’,#validationimagespath nc=14,#numberofclasses names=classes ) withopen(‘./yolov5/vinbigdata.yaml’,‘w’)asoutfile: yaml.dump(data,outfile,default_flow_style=False)

现在,你需要做的就是运行这个命令:

pythontrain.py—img640—batch16—epochs30—data./vinbigdata.yaml—cfgmodels/yolov5x.yaml—weightsyolov5x.pt

从经验中需要注意的事情:

好了,现在我们已经浏览了基本知识,让我们来看看重要的东西:

别忘了归一化坐标。

如果你的初始性能比预期的差得多,那么最可能的原因(我在许多其他参赛者身上看到过这种情况)是你在预处理方面做错了什么。这看起来很琐碎,但有很多细节你必须注意,特别是如果这是你的第一次。

YoloV5有多种型号(yolov5s、yolov5m、yolov5l、yolov5x),不要只选择最大的一个,因为它可能会过拟合。从一个基线开始,比如中等大小的,然后试着改善它。

虽然我是在512尺寸的图像上训练的,但我发现用640来infer可以提高性能。

不要忘记加载预训练的权重(-weights标志)。迁移学习将大大提高你的性能,并将为你节省大量的训练时间(在我的例子中,大约50个epoch,每个epoch大约需要20分钟!)

Yolov5x需要大量的内存,当训练尺寸为512,批大小为4时,它需要大约14GB的GPU内存(大多数GPU大约8GB内存)。

YoloV5已经使用了数据增强,你可以选择喜欢或不喜欢的增强,你所需要做的就是使用yolov5/data/hyp.scratch.yml文件去调整。

默认的yolov5训练脚本使用weights and biases,说实话,这非常令人印象深刻,它在模型训练时保存所有度量。但是,如果你想关闭它,只需在训练脚本标记中添加WANDB_MODE= " dryrun "即可。

我希望早就发现的一件事是,YoloV5将大量有用的指标保存到目录YoloV5 /runs/train/exp/中。训练之后,你可以找到“confusion_matrix.png”和“results.png”,其中的result .png应该是这样的:

729b6c24-9fbb-11eb-8b86-12bb97331649.png

使用WBF预处理

好了,现在你已经调整了超参数,升级了你的模型,测试了多种图像大小和交叉验证。现在是介绍一些提高性能的技巧的时候了。

加权框融合是一种在训练前(清理数据集)或训练后(使预测更准确)动态融合框的方法。如果你想知道更多,你可以在这里查看我的文章:

WBF:优化目标检测,融合过滤预测框 (qq.com)

要使用它对数据集进行预处理,这将大多数参赛者的性能提高了大约10-20%,你可以这样使用:

fromensemble_boxesimport* forimage_idintqdm(df['image_id'],leave=False): image_df=df[df['image_id']==image_id].reset_index(drop=True) h,w=image_df.loc[0,['height','width']].values boxes=image_df[['x_min','y_min','x_max','y_max']].values.tolist() #Normalisealltheboundingboxes(bydividingthembysize-1 boxes=[[j/(size-1)forjini]foriinboxes] scores=[1.0]*len(boxes)#setallofthescoresto1sinceweonlyhave1modelhere labels=[float(i)foriinimage_df['class_id'].values] boxes,scores,labels=weighted_boxes_fusion([boxes],[scores],[labels],weights=None,iou_thr=iou_thr, skip_box_thr=skip_box_thr) list_image.extend([image_id]*len(boxes)) list_h.extend([h]*len(boxes)) list_w.extend([w]*len(boxes)) list_boxes.extend(boxes) list_cls.extend(labels.tolist()) #bringtheboundingboxesbacktotheiroriginalsize(bymultiplyingbysize-1)list_boxes=[[int(j*(size-1))forjini]foriinlist_boxes] new_df['image_id']=list_image new_df['class_id']=list_cls new_df['h']=list_h new_df['w']=list_w #Unpackthecoordinatesfromtheboundingboxes new_df['x_min'],new_df['y_min'], new_df['x_max'],new_df['y_max']=np.transpose(list_boxes)

这意味着要在将边框坐标保存到标注文件之前完成。你还可以尝试在用YoloV5以同样的方式预测边界框之后使用它。

首先,在训练YoloV5之后,运行:

!pythondetect.py—weights/runs/train/exp/weights —img640 —conf0.005 —iou0.45 —source$test_dir —save-txt—save-conf—exist-ok

然后提取框、分数和标签:

runs/detect/exp/labels

然后传递到:

boxes,scores,labels=weighted_boxes_fusion([boxes],[scores],[labels],weights=None,iou_thr=iou_thr, skip_box_thr=skip_box_thr)

最后的思考

我希望你已经学到了一些关于扩展你的基线YoloV5的知识,我认为最重要的事情总是要考虑的是迁移学习,图像增强,模型复杂性,预处理和后处理技术。这些是你可以轻松控制和使用YoloV5来提高性能的大部分方面。

责任编辑:lq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像分类
    +关注

    关注

    0

    文章

    97

    浏览量

    12531
  • 目标检测
    +关注

    关注

    0

    文章

    234

    浏览量

    16544
  • 迁移学习
    +关注

    关注

    0

    文章

    74

    浏览量

    5856

原文标题:高级YoloV5指南,使用WBF来提升目标检测性能

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    米尔RK3576+Hailo-8突破6 TOPS极限,让高帧率摄像头真正“实时”

    测试发现,当****4路YOLOv5模型同时推理时,NPU负载率已超过75%。旦增加到第5路, 整体延迟急剧飙升 ,系统响应明显劣化。 在单路推理场景下,YOLOv5(640×640
    发表于 04-02 18:03

    从直流到高频:深度解析电流探头的关键性能指标与选型指南

    深度解析电流探头的关键性能指标与选型指南
    的头像 发表于 12-17 14:54 520次阅读

    【NPU实战】在迅为RK3588上玩转YOLOv8:目标检测与语义分割站式部署指南

    【NPU实战】在迅为RK3588上玩转YOLOv8:目标检测与语义分割站式部署指南
    的头像 发表于 12-12 14:30 6407次阅读
    【NPU实战】在迅为RK3588上玩转<b class='flag-5'>YOLOv</b>8:目标检测与语义分割<b class='flag-5'>一</b>站式部署<b class='flag-5'>指南</b>

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程

    基于迅为RK3588开发板实现高性能机器狗主控解决方案- AI能力实战:YOLOv5目标检测例程
    的头像 发表于 11-28 11:32 1712次阅读
    基于迅为RK3588开发板实现高<b class='flag-5'>性能</b>机器狗主控解决方案- AI能力实战:<b class='flag-5'>YOLOv5</b>目标检测例程

    迅为如何在RK3576上部署YOLOv5;基于RK3576构建智能门禁系统

    迅为如何在RK3576开发板上部署YOLOv5;基于RK3576构建智能门禁系统
    的头像 发表于 11-25 14:06 1976次阅读
    迅为如何在RK3576上部署<b class='flag-5'>YOLOv5</b>;基于RK3576构建智能门禁系统

    提升蜂鸟E203性能的方法:乘除法器优化

    性能十分低下。 对于乘法操作,为了减少乘法操作所需的周期数, MDV 对乘法采用基 (Radix-4 ) 的Booth 编码,进行次乘法操作需要17时钟周期。 对于除法操作,采用
    发表于 10-27 07:16

    使用ROCm™优化并部署YOLOv8模型

    作者:AVNET 李鑫杰 YOLOv8介绍? YOLOv8 由 Ultralytics 于 2023 年 1 月 10 日发布,在准确性和速度方面提供了前沿的性能
    的头像 发表于 09-24 18:32 994次阅读
    使用ROCm™优化并部署<b class='flag-5'>YOLOv</b>8模型

    技术分享 | RK3588基于Yolov5的目标识别演示

    YOLO是种基于深度神经网络的目标检测算法,用在图像或视频中实时识别和定位多个对象。在其各个版本的迭代中,YOLOv5凭借易用性和性能平衡在工业、医疗、农业、零售等领域被广泛的应用。
    的头像 发表于 09-18 17:27 1453次阅读
    技术分享 | RK3588基于<b class='flag-5'>Yolov5</b>的目标识别演示

    基于瑞芯微RK3576的 yolov5训练部署教程

    的网络结构分为输入端BackboneNeck、Head 四部分。 本教程针对目标检测算法yolov5的训练和部署到EASY-EAI-Orin-nano(RK3576)进行说明,而数据标注方法可以参考我们往期的文章。
    的头像 发表于 09-11 16:43 3217次阅读
    基于瑞芯微RK3576的 <b class='flag-5'>yolov5</b>训练部署教程

    树莓派5超频指南:安全高效地提升性能

    为什么要对树莓派5进行超频?对树莓派进行超频,可通过提高CPU和GPU的时钟频率来释放额外的性能。在需要额外处理能力以提高响应速度、减少延迟或处理更繁重工作负载的场景中,超频尤其有益。
    的头像 发表于 08-14 17:45 2888次阅读
    树莓派<b class='flag-5'>5</b>超频<b class='flag-5'>指南</b>:安全高效地<b class='flag-5'>提升</b><b class='flag-5'>性能</b>!

    在k230上使用yolov5检测图像卡死,怎么解决?

    0.99以上 模型转换指令 再将该模型放到k230设备上使用yolo大作战中yolov5检测示例,检测就会卡死,打印出的检测结果会超过1。 目前无从下手,大佬们求救!
    发表于 08-11 07:41

    yolov5训练部署全链路教程

    m、YOLOv5l、YOLOv5x四模型。YOLOv5相比YOLOv4而言,在检测平均精度降低不多的基础上,具有均值权重文件更小,训练时间
    的头像 发表于 07-25 15:22 2033次阅读
    <b class='flag-5'>yolov5</b>训练部署全链路教程

    【Milk-V Duo S 开发板免费体验】5 - 使用YOLOv11进行目标检测

    ,0.89229],[1456.2,683.29,1645.21,774.082,2,0.594712],] 共检测出两物体,一个是公共汽车(编号5),另
    发表于 07-24 14:57

    使用yolov5转为kmodel之后,运行MicroPython报错误:IndexError: index is out of bounds怎么解决?

    ] img,img_ori=read_img(img_path) rgb888p_size=[img.shape[2],img.shape[1]] # 初始化YOLOv5实例 yolo=YOLOv5
    发表于 06-06 06:23

    在K230上部署yolov5时 出现the array is too big的原因?

    重现步骤 1将yolov5的kmodel放入k230的data数据 2使用yolo大作战里的视频流推理代码 3运行 期待结果和实际结果 期待的结果 将目标检测的框圈起来 实际看到的结果
    发表于 05-28 07:47