位置: IT常识 - 正文

YOLOV7改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU(yolov5增加检测层)

编辑:rootadmin
YOLOV7改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU 在YoloV7中添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU.

推荐整理分享YOLOV7改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU(yolov5增加检测层),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:yolov3改进算法,yolov3改进算法,yolov4增加检测层,yolov5改进bifpn,yolov5改进bifpn,yolov2改进,yolov4如何改进,yolov4如何改进,内容如对您有帮助,希望把文章链接给更多的朋友!

YOLOV7改进-添加EIoU,SIoU,AlphaIoU,FocalEIoU,Wise-IoU(yolov5增加检测层)

yolov7中box_iou其默认用的是CIoU,其中代码还带有GIoU,DIoU, AlphaIoU,文件路径:utils/general.py,函数名为:bbox_iou

重磅!!!!! YOLO模型改进集合指南-CSDNdef bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False, eps=1e-7): # Returns the IoU of box1 to box2. box1 is 4, box2 is nx4 box2 = box2.T # Get the coordinates of bounding boxes if x1y1x2y2: # x1, y1, x2, y2 = box1 b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3] b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3] else: # transform from xywh to xyxy b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2 b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2 b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2 b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2 # Intersection area inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \ (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0) # Union Area w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps union = w1 * h1 + w2 * h2 - inter + eps iou = inter / union if GIoU or DIoU or CIoU: cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1) # convex (smallest enclosing box) width ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1) # convex height if CIoU or DIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1 c2 = cw ** 2 + ch ** 2 + eps # convex diagonal squared rho2 = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4 # center distance squared if DIoU: return iou - rho2 / c2 # DIoU elif CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47 v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2 / (h2 + eps)) - torch.atan(w1 / (h1 + eps)), 2) with torch.no_grad(): alpha = v / (v - iou + (1 + eps)) return iou - (rho2 / c2 + v * alpha) # CIoU else: # GIoU https://arxiv.org/pdf/1902.09630.pdf c_area = cw * ch + eps # convex area return iou - (c_area - union) / c_area # GIoU else: return iou # IoU

我们可以看到函数顶部,有GIoU,DIoU,CIoU的bool参数可以选择,如果全部为False的时候,其会返回最普通的Iou,如果其中一个为True的时候,即返回设定为True的那个Iou。

那么重点来了,我们怎么在这个函数里面添加EIoU,SIoU,AlphaIoU,FocalEIoU呢?

我们只需要把上面提及到的这个函数替换成以下,代码出自:github链接,这个github上还有一些yolov5的改进源码和一些常用的脚本,有兴趣可以去看看,请各位也帮忙点个star支持下,谢谢!

def bbox_iou(box1, box2, x1y1x2y2=True, GIoU=False, DIoU=False, CIoU=False, SIoU=False, EIoU=False, Focal=False, alpha=1, gamma=0.5, eps=1e-7): # Returns the IoU of box1 to box2. box1 is 4, box2 is nx4 box2 = box2.T # Get the coordinates of bounding boxes if x1y1x2y2: # x1, y1, x2, y2 = box1 b1_x1, b1_y1, b1_x2, b1_y2 = box1[0], box1[1], box1[2], box1[3] b2_x1, b2_y1, b2_x2, b2_y2 = box2[0], box2[1], box2[2], box2[3] else: # transform from xywh to xyxy b1_x1, b1_x2 = box1[0] - box1[2] / 2, box1[0] + box1[2] / 2 b1_y1, b1_y2 = box1[1] - box1[3] / 2, box1[1] + box1[3] / 2 b2_x1, b2_x2 = box2[0] - box2[2] / 2, box2[0] + box2[2] / 2 b2_y1, b2_y2 = box2[1] - box2[3] / 2, box2[1] + box2[3] / 2 # Intersection area inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \ (torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0) # Union Area w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps union = w1 * h1 + w2 * h2 - inter + eps # IoU # iou = inter / union # ori iou iou = torch.pow(inter/(union + eps), alpha) # alpha iou if CIoU or DIoU or GIoU or EIoU or SIoU: cw = b1_x2.maximum(b2_x2) - b1_x1.minimum(b2_x1) # convex (smallest enclosing box) width ch = b1_y2.maximum(b2_y2) - b1_y1.minimum(b2_y1) # convex height if CIoU or DIoU or EIoU or SIoU: # Distance or Complete IoU https://arxiv.org/abs/1911.08287v1 c2 = (cw ** 2 + ch ** 2) ** alpha + eps # convex diagonal squared rho2 = (((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 + (b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2) / 4) ** alpha # center dist ** 2 if CIoU: # https://github.com/Zzh-tju/DIoU-SSD-pytorch/blob/master/utils/box/box_utils.py#L47 v = (4 / math.pi ** 2) * (torch.atan(w2 / h2) - torch.atan(w1 / h1)).pow(2) with torch.no_grad(): alpha_ciou = v / (v - iou + (1 + eps)) if Focal: return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha)), torch.pow(inter/(union + eps), gamma) # Focal_CIoU else: return iou - (rho2 / c2 + torch.pow(v * alpha_ciou + eps, alpha)) # CIoU elif EIoU: rho_w2 = ((b2_x2 - b2_x1) - (b1_x2 - b1_x1)) ** 2 rho_h2 = ((b2_y2 - b2_y1) - (b1_y2 - b1_y1)) ** 2 cw2 = torch.pow(cw ** 2 + eps, alpha) ch2 = torch.pow(ch ** 2 + eps, alpha) if Focal: return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2), torch.pow(inter/(union + eps), gamma) # Focal_EIou else: return iou - (rho2 / c2 + rho_w2 / cw2 + rho_h2 / ch2) # EIou elif SIoU: # SIoU Loss https://arxiv.org/pdf/2205.12740.pdf s_cw = (b2_x1 + b2_x2 - b1_x1 - b1_x2) * 0.5 + eps s_ch = (b2_y1 + b2_y2 - b1_y1 - b1_y2) * 0.5 + eps sigma = torch.pow(s_cw ** 2 + s_ch ** 2, 0.5) sin_alpha_1 = torch.abs(s_cw) / sigma sin_alpha_2 = torch.abs(s_ch) / sigma threshold = pow(2, 0.5) / 2 sin_alpha = torch.where(sin_alpha_1 > threshold, sin_alpha_2, sin_alpha_1) angle_cost = torch.cos(torch.arcsin(sin_alpha) * 2 - math.pi / 2) rho_x = (s_cw / cw) ** 2 rho_y = (s_ch / ch) ** 2 gamma = angle_cost - 2 distance_cost = 2 - torch.exp(gamma * rho_x) - torch.exp(gamma * rho_y) omiga_w = torch.abs(w1 - w2) / torch.max(w1, w2) omiga_h = torch.abs(h1 - h2) / torch.max(h1, h2) shape_cost = torch.pow(1 - torch.exp(-1 * omiga_w), 4) + torch.pow(1 - torch.exp(-1 * omiga_h), 4) if Focal: return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha), torch.pow(inter/(union + eps), gamma) # Focal_SIou else: return iou - torch.pow(0.5 * (distance_cost + shape_cost) + eps, alpha) # SIou if Focal: return iou - rho2 / c2, torch.pow(inter/(union + eps), gamma) # Focal_DIoU else: return iou - rho2 / c2 # DIoU c_area = cw * ch + eps # convex area if Focal: return iou - torch.pow((c_area - union) / c_area + eps, alpha), torch.pow(inter/(union + eps), gamma) # Focal_GIoU https://arxiv.org/pdf/1902.09630.pdf else: return iou - torch.pow((c_area - union) / c_area + eps, alpha) # GIoU https://arxiv.org/pdf/1902.09630.pdf if Focal: return iou, torch.pow(inter/(union + eps), gamma) # Focal_IoU else: return iou # IoU注意事项我认为Focal_EIoU的思想是可以用作与其他IoU的变种,因此我对里面所有的IoU都支持Focal_EIoU的思想,只需要设定Focal参数为True即可,我自己测试的过程中,除了Focal_SIoU出现loss为inf之外,其他的都正常,不过这个不同的数据集可能出现不一样,具体可以自行测试下。gamma参数是Focal_EIoU中的gamma参数,一般就是为0.5,有需要可以自行更改。alpha参数为AlphaIoU中的alpha参数,默认为1,1的意思就是跟正常的IoU一样,如果想采用AlphaIoU的话,论文alpha默认值为3。(比如我不想使用AlphaIoU的特性,我就把alpha设置为1就可以,如果我想使用AlphaIoU的特性,我可以设置alpha为3)。跟Focal_EIoU一样,我认为AlphaIoU的思想同样可以用在其他的IoU变种上,简单来说就是如果你设置了alpha为3,其他IoU设定的参数(GIoU,DIoU,CIoU,EIoU,SIoU)为False的时候,那就是AlphaIoU,如果你设置了alpha为3,CIoU为True的时候,那就是AlphaCIoU,效果的话就因数据集和模型而已,具体可以自行测试下。想用那个IoU变种,就直接设置参数为True即可。AlphaIoU理论上与Focal_EIoU没有直接的冲突,但是作者这边没有详细测试过,这两者一起用会是什么效果,有兴趣可以自行测试下。除了以上这个函数替换,还需要在utils/loss.py中ComputeLoss Class中的__call__和ComputeLossOTA Class中的__call__函数中修改一下:

原本的__call__函数如下: 主要对上述两个红框部分替换为以下代码:

if type(iou) is tuple: lbox += (iou[1].detach() * (1 - iou[0])).mean() iou = iou[0]else: lbox += (1.0 - iou).mean() # iou loss原因是因为yolov7中的yaml配置文件有一个loss_ota的参数会选择采用哪一个Loss(ComputeLoss,ComputeLossOTA),为了避免有一个不记得修改,就两个都一起修改即可。

最后修改参数就在调用bbox_iou中进行修改即可,比如上面的代码就是使用了CIoU,如果你想使用Focal_EIoU那么你可以修改为下:iou = bbox_iou(pbox.T, selected_tbox, x1y1x2y2=False, EIoU=True, Focal=True)最后希望这篇文章可以帮助到大家。博文求点赞,github求star,谢谢啦!
本文链接地址:https://www.jiuchutong.com/zhishi/299754.html 转载请保留说明!

上一篇:Web自动化测试怎么做?Web自动化测试的详细流程和步骤(web 自动化测试)

下一篇:反射填充详解ReflectionPad2d(padding)(反射dll)

  • word设置文字环绕方式(word2019文字环绕在哪里设置)

    word设置文字环绕方式(word2019文字环绕在哪里设置)

  • oppor17屏幕(oppor17屏幕刷新率)

    oppor17屏幕(oppor17屏幕刷新率)

  • 以太网交换机的每一个端口可以看做(以太网交换机的自学是指)

    以太网交换机的每一个端口可以看做(以太网交换机的自学是指)

  • 手机wlan打不开怎么办(手机WLAN打不开修理费)

    手机wlan打不开怎么办(手机WLAN打不开修理费)

  • 手机热点上网会留下记录吗(手机热点会掉线吗)

    手机热点上网会留下记录吗(手机热点会掉线吗)

  • icloud是干啥的(icloud到底是什么东西有什么用)

    icloud是干啥的(icloud到底是什么东西有什么用)

  • 微信对方账号异常已被限制登录是什么意思(微信对方账号异常还能聊天吗)

    微信对方账号异常已被限制登录是什么意思(微信对方账号异常还能聊天吗)

  • 剪映可以加速视频吗(剪映能不能把视频加速)

    剪映可以加速视频吗(剪映能不能把视频加速)

  • 朋友消息验证啥意思(朋友消息验证是什么来源)

    朋友消息验证啥意思(朋友消息验证是什么来源)

  • 同一类的文件图标相同吗(同一类的文件图标不同)

    同一类的文件图标相同吗(同一类的文件图标不同)

  • 对方qq卸载了显示什么(对方qq卸载了显示怎么办)

    对方qq卸载了显示什么(对方qq卸载了显示怎么办)

  • vivo手机耗电快怎么办(vivo手机耗电快是怎么回事)

    vivo手机耗电快怎么办(vivo手机耗电快是怎么回事)

  • 图像数据压缩的目的是(文件图片压缩怎么压缩)

    图像数据压缩的目的是(文件图片压缩怎么压缩)

  • 手机膜分几种(手机膜分为哪几类)

    手机膜分几种(手机膜分为哪几类)

  • 芒果tv会员手机和电视可以同时登录吗(芒果tv会员手机端可以几个人用)

    芒果tv会员手机和电视可以同时登录吗(芒果tv会员手机端可以几个人用)

  • 坚果pro3屏幕尺寸多大(坚果pro屏幕尺寸)

    坚果pro3屏幕尺寸多大(坚果pro屏幕尺寸)

  • 微信电话静音对面知道吗(微信电话静音对面会有显示吗)

    微信电话静音对面知道吗(微信电话静音对面会有显示吗)

  • cad中平方怎么打(cad里的平方怎么打)

    cad中平方怎么打(cad里的平方怎么打)

  • 荣耀20pro有防水功能么(荣耀20Pro有防水吗)

    荣耀20pro有防水功能么(荣耀20Pro有防水吗)

  • 易企秀怎么保存到本地(易企秀怎么保存图片)

    易企秀怎么保存到本地(易企秀怎么保存图片)

  • 怎样清除热点资讯(怎样清除热点资讯内容)

    怎样清除热点资讯(怎样清除热点资讯内容)

  • WEB核心【案例:文件下载,案例:点击切换验证码,几种获取properties资源方式】第十二章(web核心的三个标准)

    WEB核心【案例:文件下载,案例:点击切换验证码,几种获取properties资源方式】第十二章(web核心的三个标准)

  • phpcms和Dreamweaver区别(phpcms rce)

    phpcms和Dreamweaver区别(phpcms rce)

  • 公司给员工代办失业证
  • 股东撤资涉及到哪些税如何缴纳?
  • 征信高风险是什么意思
  • 金税四期主要监管什么
  • 付款人常驻国家(地区)代码及名称RU
  • 个人收取借款利息增值税
  • 增值税进项加计扣除计入哪个科目
  • 企业所得税弥补亏损年限
  • 应纳税所得额就是企业所得税吗
  • 资产损失申报扣除
  • 个体工商户怎么注销
  • 预提利息属于费用吗
  • 申报过的印花税怎么删除
  • 电子设备折旧率一般多少
  • 总公司的哪些费用要交税
  • 营改增后建筑业税率变化情况
  • 2016年的发票2020年可以认证吗
  • 查账征收的成本费用
  • 制造业领用材料规章制度的好处
  • 个人取得的股票转让所得暂不征收个人所得税
  • 出纳应做到
  • 不超过500万元的固定资产
  • win7如何取消关机
  • efi bios u盘启动
  • 本月损益类怎么结转
  • 软件开发行业的现状
  • 人力资源服务收入计入什么科目
  • linux 隐藏权限
  • 子公司之间交易抵消
  • php-cp
  • 免征增值税的跨境服务
  • 单目标优化函数
  • 银行存放同业的钱安全吗
  • 交易性金融资产的入账价值怎么算
  • joomla安装教程
  • php ajax请求
  • php session实例
  • 内存分配理解是什么
  • 工程完工收到工程发票
  • 收到员工的社保费用记什么科目
  • 企业规定
  • 营业执照上的注册资金可以改吗
  • 利息支出会计科目
  • 购买加油卡如何做会计分录
  • 分公司要所得税汇算吗
  • mongodb建立索引的命令
  • hashmap的使用场景
  • 归属净利润和扣非净利润看哪一个
  • 公司优秀党员奖章
  • 企业增资相关知识点
  • 机械租赁开票内容
  • 企业存货核算范围
  • 税控服务费减免月底怎样结转
  • 并购 投资
  • 公司库存商品科目余额太大怎么办
  • 进项税税额是多少
  • 买车保险返现是什么意思
  • 会计制度和会计准则科目转换
  • 货物破损怎么写会计分录
  • 收到保险公司的赔款怎么做账
  • 未达起征点可以申请一次性创业补贴吗
  • 收到客户提供代付发票
  • 小企业建账选哪种会计制度
  • 如何审核原始凭证的正确性
  • MySQL ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) 的原因分解决办法
  • centOS7安装MySQL数据库
  • centos7.0镜像下载
  • win10系统环境设置
  • XP系统怎么设置双屏幕
  • macmini ubuntu
  • win7更新显卡驱动后黑屏的解决方法
  • js 判断一个数字是否相等
  • 下列有关javascript中call和apply
  • node.js基础入门
  • android开源软件
  • css上下间距怎么设置
  • 数据库的基本操作实验报告
  • 安卓xml存储方式
  • 税务局执法不规范整改
  • 2021年房产税收新政
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设