程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

关注本站官方公众号:程序员总部,领取三大福利!
福利一:python和前端辅导
福利二:进程序员交流微信群,专属于程序员的圈子
福利三:领取全套零基础视频教程(python,java,前端,php)

  价值13000svip视频教程,python大神匠心打造,零基础python开发工程师视频教程全套,基础+进阶+项目实战,包含课件和源码

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2021-10(14)

2021-11(23)

目标检测算法——YOLOv5结合BotNet(Transformer)

发布于2022-08-07 20:44     阅读(228)     评论(0)     点赞(30)     收藏(5)


BoTNet:视觉识别的Bottleneck Transformer !!! 

论文题目:《Bottleneck Transformers for Visual Recognition》

基于Transformer的新backbone来了!!!在ImageNet上高达84.7%的top-1精度,性能远远优于SENet、EfficientNet等主干。

小海带近期实验将YOLOv5算法与BotNet进行创新性有效结合,发现检测效果俱佳!大大提高了模型的检测精度。

简介:BotNet由谷歌出品,BotNet即将ResNet中的第4个block中的bottleneck替换为MHSA(Multi-Head Self-Attention)模块,形成新的模块,取名叫做Bottleneck Transformer (BoT) 。最终由BoT这样的block组合成的网络结构就叫做BotNet。

Transformer中的MHSA和BoTNet中的MHSA的区别:

1.归一化:Transformer使用 Layer Normalization,而BoTNet使用 Batch Normalization。
2.非线性激活:Transformer仅仅使用一个非线性激活在FPN block模块中,BoTNet使用了3个非线性激活。
3.输出投影:Transformer中的MHSA包含一个输出投影,BoTNet则没有。
4.优化器:Transformer使用Adam优化器训练,BoTNet使用sgd+ momentum
————————————————
1.结构对比图

2.MHSA代码段:

  1. class MHSA(nn.Module):
  2. def __init__(self, n_dims, width=14, height=14, heads=4, pos_emb=False):
  3. super(MHSA, self).__init__()
  4. self.heads = heads
  5. self.query = nn.Conv2d(n_dims, n_dims, kernel_size=1)
  6. self.key = nn.Conv2d(n_dims, n_dims, kernel_size=1)
  7. self.value = nn.Conv2d(n_dims, n_dims, kernel_size=1)
  8. self.pos = pos_emb
  9. if self.pos:
  10. self.rel_h = nn.Parameter(torch.randn([1, heads, (n_dims) // heads, 1, int(height)]), requires_grad=True)
  11. self.rel_w = nn.Parameter(torch.randn([1, heads, (n_dims) // heads, int(width), 1]), requires_grad=True)
  12. self.softmax = nn.Softmax(dim=-1)
  13. def forward(self, x):
  14. n_batch, C, width, height = x.size()
  15. q = self.query(x).view(n_batch, self.heads, C // self.heads, -1)
  16. k = self.key(x).view(n_batch, self.heads, C // self.heads, -1)
  17. v = self.value(x).view(n_batch, self.heads, C // self.heads, -1)
  18. # print('q shape:{},k shape:{},v shape:{}'.format(q.shape,k.shape,v.shape)) #1,4,64,256
  19. content_content = torch.matmul(q.permute(0, 1, 3, 2), k) # 1,C,h*w,h*w
  20. # print("qkT=",content_content.shape)
  21. c1, c2, c3, c4 = content_content.size()
  22. if self.pos:
  23. # print("old content_content shape",content_content.shape) #1,4,256,256
  24. content_position = torch.matmul(content_position, q) # ([1, 4, 1024, 256])
  25. content_position = content_position if (
  26. content_content.shape == content_position.shape) else content_position[:, :, :c3, ]
  27. assert (content_content.shape == content_position.shape)
  28. # print('new pos222-> shape:',content_position.shape)
  29. # print('new content222-> shape:',content_content.shape)
  30. energy = content_content + content_position
  31. else:
  32. energy = content_content
  33. attention = self.softmax(energy)
  34. out = torch.matmul(v, attention.permute(0, 1, 3, 2)) # 1,4,256,64
  35. out = out.view(n_batch, C, width, height)
  36. return out

BoTNet是一种简单却功能强大的backbone,该架构将自注意力纳入了多种计算机视觉任务,包括图像分类,目标检测和实例分割。通过仅在ResNet的最后三个bottleneck blocks中用全局自注意力替换空间卷积,并且不进行其他任何更改,该方法在实例分割和目标检测方面显著改善了基线,同时还减少了参数,从而使延迟最小化。

近期较忙,代码咨询的小伙伴请私聊!!!

原文链接:https://blog.csdn.net/m0_53578855/article/details/124187294



所属网站分类: 技术文章 > 博客

作者:today

链接:https://www.pythonheidong.com/blog/article/1645165/d64ce717c85e1ee3b193/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)