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

    文章

    96

    浏览量

    12409
  • 目标检测
    +关注

    关注

    0

    文章

    230

    浏览量

    16375
  • 迁移学习
    +关注

    关注

    0

    文章

    74

    浏览量

    5837

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

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

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

    yolov5训练部署全链路教程

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

    使用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

    RV1126 yolov8训练部署教程

    YOLOv8 是 ultralytics 公司在 2023 年 1月 10 号开源的基于YOLOV5进行更新的 下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,鉴于
    的头像 发表于 04-16 14:53 1131次阅读
    RV1126 <b class='flag-5'>yolov</b>8训练部署教程

    labview调用yolo目标检测、分割、分类、obb

    labview调用yolo目标检测、分割、分类、obb、pose深度学习,支持CPU和GPU推理,32/64位labview均可使用。 (yolov5~yolov12)
    发表于 03-31 16:28

    请问如何在imx8mplus上部署和运行YOLOv5训练的模型?

    我正在从事 imx8mplus yocto 项目。我已经在自定义数据集上的 YOLOv5 上训练了对象检测模型。它在 ubuntu 电脑上运行良好。现在我想在我的 imx8mplus 板上运行该模型
    发表于 03-25 07:23

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸致吗?致会达到更好的效果?

    YOLOv5类中rgb888p_size这个参数要与模型推理和训练的尺寸致吗,致会达到更好的效果
    发表于 03-11 08:12

    yolov5转onnx在cubeAI进行部署,部署失败的原因?

    一个我是转onnx时 想把权重文件变小点 就用了半精度 --half,则说17版本不支持半精度 后面则是没有缩小的单精度 但是显示哪里溢出了···· 也不说是哪里、、。。。 到底能不能部署yolov5这种东西啊?? 也没看见几个部署在这上面..............
    发表于 03-07 11:38

    【米尔RK3576开发板评测】+项目名称YOLOV5目标检测

    /examples/yolov5/model ./download_model.sh 下载的是ONNX格式的神经网络模型,但发现它无法在瑞芯微系统中直接运行。为了解决这个问题,您计划使用特定
    发表于 02-15 13:24

    什么是YOLO?RK3568+YOLOv5是如何实现物体识别的?起来了解下!

    、产品简介TL3568-PlusTEB人工智能实验箱国产高性能处理器64位4核低功耗2.0GHz超高主频1T超高算力NPU兼容鸿蒙等国产操作系统二、实验目的1、了解YOLOv5模型的用途及流程;2
    的头像 发表于 12-19 19:04 1648次阅读
    什么是YOLO?RK3568+<b class='flag-5'>YOLOv5</b>是如何实现物体识别的?<b class='flag-5'>一</b>起来了解<b class='flag-5'>一</b>下!