中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

什么公司可以做網(wǎng)站等級(jí)保護(hù)宣傳方式

什么公司可以做網(wǎng)站等級(jí)保護(hù),宣傳方式,asp網(wǎng)站一打開(kāi)就是download,b2b網(wǎng)站名稱和網(wǎng)址有哪些前言 Hello,大家好,我是cv君,最近開(kāi)始在空閑之余,經(jīng)常更新文章啦!除目標(biāo)檢測(cè)、分類、分隔、姿態(tài)估計(jì)等任務(wù)外,還會(huì)涵蓋圖像增強(qiáng)領(lǐng)域,如超分辨率、畫(huà)質(zhì)增強(qiáng)、降噪、夜視增強(qiáng)、去霧去雨、ISP、?!?article class="baidu_pl">

前言

Hello,大家好,我是cv君,最近開(kāi)始在空閑之余,經(jīng)常更新文章啦除目標(biāo)檢測(cè)、分類、分隔、姿態(tài)估計(jì)等任務(wù)外,還會(huì)涵蓋圖像增強(qiáng)領(lǐng)域,如超分辨率、畫(huà)質(zhì)增強(qiáng)、降噪、夜視增強(qiáng)、去霧去雨、ISP、海思高通成像ISP等、AI-ISP、還會(huì)有多模態(tài)、文本nlp領(lǐng)域、視覺(jué)語(yǔ)言大模型、lora、chatgpt等理論與實(shí)踐文章更新,更新將變成一周2-3更,一個(gè)月?tīng)?zhēng)取10篇,重回創(chuàng)作巔峰,之前cv君曾在csdn排行前90名總榜,感謝大家觀看點(diǎn)贊和收藏;有任何問(wèn)題可以文末微信聯(lián)系或私聊我。

?本文章涵蓋v8的全解,以及各版本亮點(diǎn)介紹,以及如何進(jìn)行訓(xùn)練,以及如何優(yōu)化,附帶多個(gè)獨(dú)家魔改技巧。

v8優(yōu)化簡(jiǎn)言

Backbone:使用的依舊是CSP的思想,不過(guò)YOLOv5中的C3模塊被替換成了C2f模塊,實(shí)現(xiàn)了進(jìn)一步的輕量化,同時(shí)YOLOv8依舊使用了YOLOv5等架構(gòu)中使用的SPPF模塊;

骨干網(wǎng)絡(luò)和 Neck 部分可能參考了 YOLOv7 ELAN 設(shè)計(jì)思想,將 YOLOv5 的 C3 結(jié)構(gòu)換成了梯度流更豐富的 C2f 結(jié)構(gòu),并對(duì)不同尺度模型調(diào)整了不同的通道數(shù),屬于對(duì)模型結(jié)構(gòu)精心微調(diào),不再是無(wú)腦一套參數(shù)應(yīng)用所有模型,大幅提升了模型性能。不過(guò)這個(gè) C2f 模塊中存在 Split 等操作對(duì)特定硬件部署沒(méi)有之前那么友好了
PAN-FPN:毫無(wú)疑問(wèn)YOLOv8依舊使用了PAN的思想,不過(guò)通過(guò)對(duì)比YOLOv5與YOLOv8的結(jié)構(gòu)圖可以看到,YOLOv8將YOLOv5中PAN-FPN上采樣階段中的卷積結(jié)構(gòu)刪除了,同時(shí)也將C3模塊替換為了C2f模塊;
Decoupled-HeadHead 部分相比 YOLOv5 改動(dòng)較大,換成了目前主流的解耦頭結(jié)構(gòu),將分類和檢測(cè)頭分離,同時(shí)也從 Anchor-Based 換成了 Anchor-Free,YOLOv8走向了Decoupled-Head;
Anchor-Free:YOLOv8拋棄了以往的Anchor-Base,使用了Anchor-Free的思想;
損失函數(shù):YOLOv8使用VFL Loss作為分類損失,使用DFL Loss+CIOU Loss作為分類損失;Loss 計(jì)算方面采用了 TaskAlignedAssigner 正樣本分配策略,并引入了 Distribution Focal Loss
樣本匹配:YOLOv8拋棄了以往的IOU匹配或者單邊比例的分配方式,而是使用了Task-Aligned Assigner匹配方式。

訓(xùn)練的數(shù)據(jù)增強(qiáng)部分引入了 YOLOX 中的最后 10 epoch 關(guān)閉 Mosiac 增強(qiáng)的操作,可以有效地提升精度

下面將按照模型結(jié)構(gòu)設(shè)計(jì)、Loss 計(jì)算、訓(xùn)練數(shù)據(jù)增強(qiáng)、訓(xùn)練策略和模型推理過(guò)程共 5 個(gè)部分詳細(xì)介紹 YOLOv8 目標(biāo)檢測(cè)的各種改進(jìn),實(shí)例分割部分暫時(shí)不進(jìn)行描述。

對(duì)比 YOLOv5 和 YOLOv8 的 yaml 配置文件可以發(fā)現(xiàn)改動(dòng)較小。

骨干網(wǎng)絡(luò)和 Neck 的具體變化

  • 第一個(gè)卷積層的 kernel 從 6x6 變成了 3x3
  • 所有的 C3 模塊換成 C2f,結(jié)構(gòu)如下所示,可以發(fā)現(xiàn)多了更多的跳層連接和額外的 Split 操作

  • 去掉了 Neck 模塊中的 2 個(gè)卷積連接層
  • Backbone 中 C2f 的block 數(shù)從 3-6-9-3 改成了 3-6-6-3
  • 查看 N/S/M/L/X 等不同大小模型,可以發(fā)現(xiàn) N/S 和 L/X 兩組模型只是改了縮放系數(shù),但是 S/M/L 等骨干網(wǎng)絡(luò)的通道數(shù)設(shè)置不一樣,沒(méi)有遵循同一套縮放系數(shù)。如此設(shè)計(jì)的原因應(yīng)該是同一套縮放系數(shù)下的通道設(shè)置不是最優(yōu)設(shè)計(jì),YOLOv7 網(wǎng)絡(luò)設(shè)計(jì)時(shí)也沒(méi)有遵循一套縮放系數(shù)作用于所有模型

Head 部分變化最大,從原先的耦合頭變成了解耦頭,并且從 YOLOv5 的 Anchor-Based?變成了 Anchor-Free。其結(jié)構(gòu)如下所示:

可以看出,不再有之前的 objectness 分支,只有解耦的分類和回歸分支,并且其回歸分支使用了 Distribution Focal Loss 中提出的積分形式表示法

C2f模塊

C2f模塊是什么?與C3有什么區(qū)別呢,我們先看一下C3模塊的結(jié)構(gòu)圖,然后再對(duì)比與C2f的具體的區(qū)別。針對(duì)C3模塊,其主要是借助CSPNet提取分流的思想,同時(shí)結(jié)合殘差結(jié)構(gòu)的思想,設(shè)計(jì)了所謂的C3 Block,這里的CSP主分支梯度模塊為BottleNeck模塊,也就是所謂的殘差模塊。同時(shí)堆疊的個(gè)數(shù)由參數(shù)n來(lái)進(jìn)行控制,也就是說(shuō)不同規(guī)模的模型,n的值是有變化的。

其實(shí)這里的梯度流主分支,可以是任何之前你學(xué)習(xí)過(guò)的模塊,比如,美團(tuán)提出的YOLOv6中就是用來(lái)重參模塊RepVGGBlock來(lái)替換BottleNeck Block來(lái)作為主要的梯度流分支,而百度提出的PP-YOLOE則是使用了RepResNet-Block來(lái)替換BottleNeck Block來(lái)作為主要的梯度流分支。而YOLOv7則是使用了ELAN Block來(lái)替換BottleNeck Block來(lái)作為主要的梯度流分支。

C2f模塊介紹,通過(guò)C3模塊的代碼以及結(jié)構(gòu)圖可以看到,C3模塊和名字思路一致,在模塊中使用了3個(gè)卷積模塊(Conv+BN+SiLU),以及n個(gè)BottleNeck。

通過(guò)C3代碼可以看出,對(duì)于cv1卷積和cv2卷積的通道數(shù)是一致的,而cv3的輸入通道數(shù)是前者的2倍,因?yàn)閏v3的輸入是由主梯度流分支(BottleNeck分支)依舊次梯度流分支(CBS,cv2分支)cat得到的,因此是2倍的通道數(shù),而輸出則是一樣的。

不妨我們?cè)倏匆幌耏OLOv7中的模塊

YOLOv7通過(guò)并行更多的梯度流分支,放ELAN模塊可以獲得更豐富的梯度信息,進(jìn)而或者更高的精度和更合理的延遲。

C2f模塊的結(jié)構(gòu)圖如下:

我們可以很容易的看出,C2f模塊就是參考了C3模塊以及ELAN的思想進(jìn)行的設(shè)計(jì),讓YOLOv8可以在保證輕量化的同時(shí)獲得更加豐富的梯度流信息。

C3模塊以及RepBlock替換為了C2f,同時(shí)細(xì)心可以發(fā)現(xiàn),相對(duì)于YOLOv5和YOLOv6,YOLOv8選擇將上采樣之前的1×1卷積去除了,將Backbone不同階段輸出的特征直接送入了上采樣操作。

yolov8是將C3替換為C2F網(wǎng)絡(luò)結(jié)構(gòu),我們先不要著急看C2F,我們先介紹一下chunk函數(shù),因?yàn)樵贑2F中會(huì)用到該函數(shù),如果你對(duì)該函數(shù)很了解那么可以略去該函數(shù)的講解。chunk函數(shù),就是可以將張量A沿著某個(gè)維度dim,分割成指定的張量塊。可以看個(gè)示例:

假設(shè)我的輸入張量x的shape為[1,3,640,640],經(jīng)過(guò)一個(gè)1x1的卷積后,輸出shape為[1,16,640,640],如下:

可以看到通過(guò)chunk函數(shù)將輸出通道為16,平均分成了2份后,每個(gè)tensor的shape均為[1,8,640,640]。這里只是補(bǔ)充了一下torch.chunk函數(shù)的知識(shí)~

接下來(lái)我們繼續(xù)看C2F模塊。結(jié)構(gòu)圖如下:我這里是參考C2F代碼來(lái)繪制的。

C2F就是由兩個(gè)卷積層和n個(gè)Bottleneck層組成。與yolov5 C3結(jié)構(gòu)很像,只不過(guò)C3中的Feat1和Feat2是通過(guò)兩個(gè)卷積實(shí)現(xiàn)的,而C2F中通過(guò)chunk函數(shù)將一個(gè)卷積的輸出進(jìn)行分塊得到,這樣的一個(gè)好處就是減少參數(shù)和計(jì)算量。

SPPF

上圖中,左邊是SPP,右邊是SPPF。

Head

yolov8的head和yolov5的區(qū)別是,v5采用的是耦合頭,v8采用的解耦頭。什么叫耦合頭呢?其實(shí)就是在網(wǎng)絡(luò)最終輸出的時(shí)候是把bbox、obj、cls三個(gè)部分耦合在一起(比如coco數(shù)據(jù)集,我們知道輸出的其中有一個(gè)維度是85=5+80,比如有個(gè)特征層的shape為【bs,80,80,3,85】,80x80是特征圖的高和寬,3是三種anchors,85就是),而v8是將head做了拆分,解耦成了box和cls。

    def forward(self, x):z = []  # inference outputfor i in range(self.nl):x[i] = self.m[i](x[i])  # convbs, _, ny, nx = x[i].shape# x(bs,255,20,20) to x(bs,3,20,20,85)# self.no = nc + 5 x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()self.cv2 = nn.ModuleList(nn.Sequential(Conv(x, c2, 3), Conv(c2, c2, 3), nn.Conv2d(c2, 4 * self.reg_max, 1)) for x in ch)# cv3最后一個(gè)卷積out_channels是類別的數(shù)量self.cv3 = nn.ModuleList(nn.Sequential(Conv(x, c3, 3), Conv(c3, c3, 3), nn.Conv2d(c3, self.nc, 1)) for x in ch)self.dfl = DFL(self.reg_max) if self.reg_max > 1 else nn.Identity()    
def forward(self, x):"""Concatenates and returns predicted bounding boxes and class probabilities."""shape = x[0].shape  # BCHWfor i in range(self.nl): # self.nl=3x[i] = torch.cat((self.cv2[i](x[i]), self.cv3[i](x[i])), 1)if self.training:return xelif self.dynamic or self.shape != shape:self.anchors, self.strides = (x.transpose(0, 1) for x in make_anchors(x, self.stride, 0.5))self.shape = shapex_cat = torch.cat([xi.view(shape[0], self.no, -1) for xi in x], 2)box, cls = x_cat.split((self.reg_max * 4, self.nc), 1)

yolov5 head解碼部分代碼和對(duì)應(yīng)結(jié)構(gòu)圖:

先看一下YOLOv5本身的Head(Coupled-Head):

而YOLOv8則是使用了Decoupled-Head,同時(shí)由于使用了DFL 的思想,因此回歸頭的通道數(shù)也變成了4*reg_max的形式:

損失函數(shù)

分類回歸

這里的分類回歸損失函數(shù)采用的是VFL。這里的損失其實(shí)還是在BCE上面進(jìn)行的改進(jìn),代碼如下:

# 分類loss
class VarifocalLoss(nn.Module):"""Varifocal loss by Zhang et al.https://arxiv.org/abs/2008.13367."""def __init__(self):"""Initialize the VarifocalLoss class."""super().__init__()@staticmethoddef forward(pred_score, gt_score, label, alpha=0.75, gamma=2.0):"""Computes varfocal loss."""weight = alpha * pred_score.sigmoid().pow(gamma) * (1 - label) + gt_score * labelwith torch.cuda.amp.autocast(enabled=False):loss = (F.binary_cross_entropy_with_logits(pred_score.float(), gt_score.float(), reduction='none') *weight).mean(1).sum()return loss

位置回歸

位置回歸采用ciou+dfl,代碼如下:

# 位置回歸loss
class BboxLoss(nn.Module):"""Criterion class for computing training losses during training."""def __init__(self, reg_max, use_dfl=False):"""Initialize the BboxLoss module with regularization maximum and DFL settings."""super().__init__()self.reg_max = reg_maxself.use_dfl = use_dfldef forward(self, pred_dist, pred_bboxes, anchor_points, target_bboxes, target_scores, target_scores_sum, fg_mask):"""IoU loss."""weight = target_scores.sum(-1)[fg_mask].unsqueeze(-1)iou = bbox_iou(pred_bboxes[fg_mask], target_bboxes[fg_mask], xywh=False, CIoU=True)loss_iou = ((1.0 - iou) * weight).sum() / target_scores_sum# DFL lossif self.use_dfl:target_ltrb = bbox2dist(anchor_points, target_bboxes, self.reg_max)loss_dfl = self._df_loss(pred_dist[fg_mask].view(-1, self.reg_max + 1), target_ltrb[fg_mask]) * weightloss_dfl = loss_dfl.sum() / target_scores_sumelse:loss_dfl = torch.tensor(0.0).to(pred_dist.device)return loss_iou, loss_dfl

樣本的匹配

標(biāo)簽分配是目標(biāo)檢測(cè)非常重要的一環(huán),在YOLOv5的早期版本中使用了MaxIOU作為標(biāo)簽分配方法。然而,在實(shí)踐中發(fā)現(xiàn)直接使用邊長(zhǎng)比也可以達(dá)到一阿姨你的效果。而YOLOv8則是拋棄了Anchor-Base方法使用Anchor-Free方法,找到了一個(gè)替代邊長(zhǎng)比例的匹配方法,TaskAligned。

為與NMS搭配,訓(xùn)練樣例的Anchor分配需要滿足以下兩個(gè)規(guī)則:

  1. 正常對(duì)齊的Anchor應(yīng)當(dāng)可以預(yù)測(cè)高分類得分,同時(shí)具有精確定位;

  2. 不對(duì)齊的Anchor應(yīng)當(dāng)具有低分類得分,并在NMS階段被抑制?;谏鲜鰞蓚€(gè)目標(biāo),TaskAligned設(shè)計(jì)了一個(gè)新的Anchor alignment metric 來(lái)在Anchor level 衡量Task-Alignment的水平。并且,Alignment metric 被集成在了 sample 分配和 loss function里來(lái)動(dòng)態(tài)的優(yōu)化每個(gè) Anchor 的預(yù)測(cè)。

特征圖可視化

MMYOLO 中提供了一套完善的特征圖可視化工具,可以幫助用戶可視化特征的分布情況。

以 YOLOv8-s 模型為例,第一步需要下載官方權(quán)重,然后將該權(quán)重通過(guò)https://github.com/open-mmlab/mmyolo/blob/dev/tools/model_converters/yolov8_to_mmyolo.py?腳本將去轉(zhuǎn)換到 MMYOLO 中,注意必須要將腳本置于官方倉(cāng)庫(kù)下才能正確運(yùn)行,假設(shè)得到的權(quán)重名字為 mmyolov8s.pth

假設(shè)想可視化 backbone 輸出的 3 個(gè)特征圖效果,則只需要

cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean


需要特別注意,為了確保特征圖和圖片疊加顯示能對(duì)齊效果,需要先將原先的 test_pipeline 替換為如下:

test_pipeline = [dict(type='LoadImageFromFile',file_client_args=_base_.file_client_args),dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 這里將 LetterResize 修改成 mmdet.Resizedict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),dict(type='mmdet.PackDetInputs',meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape','scale_factor'))
]


從上圖可以看出不同輸出特征圖層主要負(fù)責(zé)預(yù)測(cè)不同尺度的物體。

我們也可以可視化 Neck 層的 3 個(gè)輸出層特征圖:

cd mmyolo # dev 分支
python demo/featmap_vis_demo.py demo/demo.jpg configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py mmyolov8s.pth --channel-reductio squeeze_mean --target-layers neck

從上圖可以發(fā)現(xiàn)物體處的特征更加聚焦。

魔改技巧

除了常見(jiàn)的調(diào)參外,cv君提供幾個(gè)優(yōu)質(zhì)的魔改方法和獨(dú)家秘方

Yolov8優(yōu)化:CoordAttention

CoordAttention 簡(jiǎn)稱CA,已經(jīng)有點(diǎn)年頭了,還是比較高效,是一種注意力機(jī)制,在計(jì)算機(jī)視覺(jué)中被廣泛應(yīng)用。它可以捕捉特定位置的空間關(guān)系,并在注意力計(jì)算中加以利用。與常規(guī)的注意力機(jī)制不同,CoordAttention在計(jì)算注意力時(shí),不僅會(huì)考慮輸入的特征信息,還會(huì)考慮每個(gè)像素點(diǎn)的位置信息,從而更好地捕捉空間上的局部關(guān)系和全局關(guān)系。這種注意力機(jī)制可以應(yīng)用于許多計(jì)算機(jī)視覺(jué)任務(wù),如圖像分類、目標(biāo)檢測(cè)和語(yǔ)義分割等。

效果較好。

基于Yolov8的CoordAttention實(shí)現(xiàn)

加入yolov8?modules.py中

?######################  CoordAtt  ####     start   by  AI&CV  ###############################
import torch
import torch.nn as nn
import torch.nn.functional as Fclass h_sigmoid(nn.Module):def __init__(self, inplace=True):super(h_sigmoid, self).__init__()self.relu = nn.ReLU6(inplace=inplace)def forward(self, x):return self.relu(x + 3) / 6class h_swish(nn.Module):def __init__(self, inplace=True):super(h_swish, self).__init__()self.sigmoid = h_sigmoid(inplace=inplace)def forward(self, x):return x * self.sigmoid(x)class CoordAtt(nn.Module):def __init__(self, inp, reduction=32):super(CoordAtt, self).__init__()self.pool_h = nn.AdaptiveAvgPool2d((None, 1))self.pool_w = nn.AdaptiveAvgPool2d((1, None))mip = max(8, inp // reduction)self.conv1 = nn.Conv2d(inp, mip, kernel_size=1, stride=1, padding=0)self.bn1 = nn.BatchNorm2d(mip)self.act = h_swish()self.conv_h = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)self.conv_w = nn.Conv2d(mip, inp, kernel_size=1, stride=1, padding=0)def forward(self, x):identity = xn, c, h, w = x.size()x_h = self.pool_h(x)x_w = self.pool_w(x).permute(0, 1, 3, 2)y = torch.cat([x_h, x_w], dim=2)y = self.conv1(y)y = self.bn1(y)y = self.act(y)x_h, x_w = torch.split(y, [h, w], dim=2)x_w = x_w.permute(0, 1, 3, 2)a_h = self.conv_h(x_h).sigmoid()a_w = self.conv_w(x_w).sigmoid()out = identity * a_w * a_hreturn out
######################  CoordAtt  ####     end   by  AI&CV  ###############################

2.2 yolov8_coordAtt.yaml

# Ultralytics YOLO  , GPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 4  # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]]  # 0-P1/2- [-1, 1, Conv, [128, 3, 2]]  # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]]  # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 3, CoordAtt, [256]] - [-1, 1, Conv, [512, 3, 2]]  # 6-P4/16- [-1, 6, C2f, [512, True]]- [-1, 3, CoordAtt, [512]] - [-1, 1, Conv, [1024, 3, 2]]  # 9-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 3, CoordAtt, [1024]] - [-1, 1, SPPF, [1024, 5]]  # 12# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 7], 1, Concat, [1]]  # cat backbone P4- [-1, 3, C2f, [512]]  # 15- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 4], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C2f, [256]]  # 18 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 15], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 21 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 12], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 24 (P5/32-large)- [[18, 21, 24], 1, Detect, [nc]]  # Detect(P3, P4, P5)

V8沒(méi)有modules.py了 自己新建一個(gè),然后在tasks.py進(jìn)行定義注冊(cè)使用

Yolov8優(yōu)化:DoubleAttention

雙重注意力網(wǎng)絡(luò)(Double Attention Networks)是一種用于計(jì)算機(jī)視覺(jué)任務(wù)的神經(jīng)網(wǎng)絡(luò)架構(gòu),旨在有效地捕獲圖像中的全局和局部信息,以提高任務(wù)的性能。它是建立在注意力機(jī)制的基礎(chǔ)上的,通過(guò)兩個(gè)注意力模塊來(lái)分別關(guān)注全局和局部信息。以下是關(guān)于Double Attention Networks的詳細(xì)解釋

注意力機(jī)制: 注意力機(jī)制是一種模仿人類視覺(jué)系統(tǒng)的方法,它允許神經(jīng)網(wǎng)絡(luò)在處理輸入數(shù)據(jù)時(shí)集中注意力在最相關(guān)的部分上。在計(jì)算機(jī)視覺(jué)中,這意味著網(wǎng)絡(luò)可以動(dòng)態(tài)地選擇關(guān)注圖像的不同部分,從而提高任務(wù)的性能。

雙重注意力: 雙重注意力網(wǎng)絡(luò)引入了兩個(gè)注意力模塊,分別用于全局和局部信息。這兩個(gè)模塊分別關(guān)注圖像的整體結(jié)構(gòu)和局部細(xì)節(jié),從而充分利用了圖像中的各種信息。

全局注意力模塊: 全局注意力模塊負(fù)責(zé)捕獲圖像中的全局信息。它通常采用全局池化(global pooling)操作,將整個(gè)特征圖進(jìn)行壓縮,然后通過(guò)一系列的神經(jīng)網(wǎng)絡(luò)層來(lái)學(xué)習(xí)全局上下文信息。這個(gè)模塊能夠幫助網(wǎng)絡(luò)理解圖像的整體語(yǔ)義結(jié)構(gòu)。

局注意力模塊: 局部注意力模塊專注于捕獲圖像中的局部信息。它通常采用一種局部感知機(jī)制(local perception),通過(guò)對(duì)圖像進(jìn)行分塊或者使用卷積操作來(lái)提取局部特征,并且通過(guò)注意力機(jī)制來(lái)選擇最相關(guān)的局部信息。這個(gè)模塊有助于網(wǎng)絡(luò)在處理具有局部結(jié)構(gòu)的圖像時(shí)更加準(zhǔn)確。

特征融合: 在雙重注意力網(wǎng)絡(luò)中,全局和局部注意力模塊學(xué)習(xí)到的特征需要被合并起來(lái)以供最終任務(wù)使用。這通常通過(guò)簡(jiǎn)單地將兩個(gè)模塊的輸出進(jìn)行融合,例如連接或者加權(quán)求和操作。這種特征融合使得網(wǎng)絡(luò)能夠綜合利用全局和局部信息來(lái)完成任務(wù)。

通過(guò)以上的雙重注意力網(wǎng)絡(luò)架構(gòu),神經(jīng)網(wǎng)絡(luò)可以更有效地利用圖像中的全局和局部信息,從而在各種計(jì)算機(jī)視覺(jué)任務(wù)中取得更好的性能。

將DoubleAttention添加到Y(jié)OLOv8中

關(guān)鍵步驟一:將下面代碼粘貼到在/ultralytics/ultralytics/nn/modules/conv.py中,并在該文件的all中添加“DoubleAttentionLayer”

from torch import nn
import torch
from torch.autograd import Variable
import torch.nn.functional as Fclass DoubleAttentionLayer(nn.Module):"""Implementation of Double Attention Network. NIPS 2018"""def __init__(self, in_channels: int, c_m: int, c_n: int, reconstruct=False):"""Parameters----------in_channelsc_mc_nreconstruct: `bool` whether to re-construct output to have shape (B, in_channels, L, R)"""super(DoubleAttentionLayer, self).__init__()self.c_m = c_mself.c_n = c_nself.in_channels = in_channelsself.reconstruct = reconstructself.convA = nn.Conv2d(in_channels, c_m, kernel_size=1)self.convB = nn.Conv2d(in_channels, c_n, kernel_size=1)self.convV = nn.Conv2d(in_channels, c_n, kernel_size=1)if self.reconstruct:self.conv_reconstruct = nn.Conv2d(c_m, in_channels, kernel_size=1)def forward(self, x: torch.Tensor):"""Parameters----------x: `torch.Tensor` of shape (B, C, H, W)Returns-------"""batch_size, c, h, w = x.size()assert c == self.in_channels, 'input channel not equal!'A = self.convA(x)  # (B, c_m, h, w) because kernel size is 1B = self.convB(x)  # (B, c_n, h, w)V = self.convV(x)  # (B, c_n, h, w)tmpA = A.view(batch_size, self.c_m, h * w)attention_maps = B.view(batch_size, self.c_n, h * w)attention_vectors = V.view(batch_size, self.c_n, h * w)

雙重注意力網(wǎng)絡(luò)的主要過(guò)程涉及以下幾個(gè)關(guān)鍵步驟:

輸入圖像的特征提取: 首先,輸入的圖像經(jīng)過(guò)一個(gè)預(yù)訓(xùn)練的卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型,例如ResNet、VGG等,以提取圖像的特征。這些特征通常是一個(gè)高維度的張量,表示了圖像在不同層次上的抽象特征信息。

全局注意力模塊: 對(duì)于提取的圖像特征,首先通過(guò)全局注意力模塊進(jìn)行處理。這個(gè)模塊通常包括以下幾個(gè)步驟:

使用全局池化操作(如全局平均池化)將特征圖進(jìn)行降維,得到全局上下文信息。

將降維后的全局特征通過(guò)一個(gè)全連接網(wǎng)絡(luò)(FCN)進(jìn)行處理,以學(xué)習(xí)全局信息的表示。

使用激活函數(shù)(如ReLU)來(lái)增加網(wǎng)絡(luò)的非線性表示能力。

局部注意力模塊: 接下來(lái),提取的特征經(jīng)過(guò)局部注意力模塊的處理。這個(gè)模塊主要負(fù)責(zé)捕獲圖像中的局部信息,并結(jié)合全局信息進(jìn)行處理。其主要步驟包括:

將特征圖分成不同的區(qū)域或者使用卷積操作來(lái)提取局部特征。

對(duì)每個(gè)局部特征使用注意力機(jī)制,計(jì)算其與全局信息的相關(guān)程度,以得到局部的重要性權(quán)重。

使用得到的權(quán)重對(duì)局部特征進(jìn)行加權(quán)合并,以得到最終的局部表示。

更改init.py文件

關(guān)鍵步驟二:修改modules文件夾下的__init__.py文件,先導(dǎo)入函數(shù)

然后在下面的__all__中聲明函數(shù)

在task.py中進(jìn)行注冊(cè)

關(guān)鍵步驟三:在parse_model函數(shù)中進(jìn)行注冊(cè),添加DoubleAttentionLayer,

添加yaml文件

關(guān)鍵步驟四:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_DANet.yaml文件,粘貼下面的內(nèi)容

# Ultralytics YOLO  , AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see Detect
?
# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs
?
# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, DoubleAttentionLayer, [128,1]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9
?
# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 12
?- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)

溫馨提示:因?yàn)楸疚闹皇菍?duì)yolov8n基礎(chǔ)上添加模塊,如果要對(duì)yolov8n/l/m/x進(jìn)行添加則只需要指定對(duì)應(yīng)的depth_multiple 和 width_multiple?;蛘咧付硞€(gè)模型即可

# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple

2.5 執(zhí)行程序

關(guān)鍵步驟五:在ultralytics文件中新建train.py,將model的參數(shù)路徑設(shè)置為yolov8_DANet.yaml的路徑即可

from ultralytics import YOLO# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_DANet.yaml')  # build from YAML and transfer weights# Train the model
model.train(device = [3], batch=16)

建議大家寫(xiě)絕對(duì)路徑,確保一定能找到

運(yùn)行程序,如果出現(xiàn)下面的內(nèi)容則說(shuō)明添加成功

雙重注意力網(wǎng)絡(luò)是一種用于計(jì)算機(jī)視覺(jué)任務(wù)的神經(jīng)網(wǎng)絡(luò)架構(gòu),旨在通過(guò)注意力機(jī)制有效地捕獲圖像中的全局和局部信息,從而提高任務(wù)性能。該網(wǎng)絡(luò)引入了兩個(gè)關(guān)鍵的注意力模塊,分別用于全局和局部信息的關(guān)注,全局模塊通過(guò)全局池化操作學(xué)習(xí)圖像的整體語(yǔ)義結(jié)構(gòu),而局部模塊則專注于提取圖像的局部特征并通過(guò)局部感知機(jī)制選擇最相關(guān)的信息。這兩個(gè)模塊學(xué)習(xí)到的特征最終被融合起來(lái)以供任務(wù)使用,通常通過(guò)連接或加權(quán)求和的方式進(jìn)行特征融合。雙重注意力網(wǎng)絡(luò)通過(guò)端到端的訓(xùn)練和優(yōu)化,使用適當(dāng)?shù)膿p失函數(shù)和正則化技術(shù)來(lái)提高模型的泛化能力和訓(xùn)練穩(wěn)定性。這種架構(gòu)使得神經(jīng)網(wǎng)絡(luò)能夠更全面地利用圖像中的全局和局部信息,從而在各種計(jì)算機(jī)視覺(jué)任務(wù)中取得更好的性能表現(xiàn)。

YOLOV8改進(jìn):EMA

?本文提出了一種新的跨空間學(xué)習(xí)方法,并設(shè)計(jì)了一個(gè)多尺度并行子網(wǎng)絡(luò)來(lái)建立短和長(zhǎng)依賴關(guān)系。小目標(biāo)漲點(diǎn)明顯

EMA加入yolov8

論文地址:https://arxiv.org/abs/2305.13563v1
模型講解和代碼實(shí)現(xiàn),即插即用提升性能
概述
通過(guò)通道降維來(lái)建??缤ǖ狸P(guān)系可能會(huì)給提取深度視覺(jué)帶來(lái)副作用。因此提出了一種新的高效的多尺度注意力(EMA)模塊。以保留每個(gè)通道上的信息和降低計(jì)算開(kāi)銷(xiāo)為目標(biāo),將部分通道重塑為批量維度,并將通道維度分組為多個(gè)子特征,使空間語(yǔ)義特征在每個(gè)特征組中均勻分布。

左圖為CA注意力機(jī)制模型圖,右圖為EMA注意力機(jī)制模型圖

模型優(yōu)點(diǎn)
(1) 我們考慮一種通用方法,將部分通道維度重塑為批量維度,以避免通過(guò)通用卷積進(jìn)行某種形式的降維。
(2) 除了在不進(jìn)行通道降維的情況下在每個(gè)并行子網(wǎng)絡(luò)中構(gòu)建局部的跨通道交互外,我們還通過(guò)跨空間學(xué)習(xí)方法融合兩個(gè)并行子網(wǎng)絡(luò)的輸出特征圖。
(3) 與CBAM、NAM[16]、SA、ECA和CA相比,EMA不僅取得了更好的結(jié)果,而且在所需參數(shù)方面效率更高。

代碼實(shí)現(xiàn)
在ultralytics-8.2.0\ultralytics\nn\文件夾下新建attention.py

import torch
from torch import nnclass EMA(nn.Module):def __init__(self, channels, c2=None, factor=32):super(EMA, self).__init__()self.groups = factorassert channels // self.groups > 0self.softmax = nn.Softmax(-1)self.agp = nn.AdaptiveAvgPool2d((1, 1))self.pool_h = nn.AdaptiveAvgPool2d((None, 1))self.pool_w = nn.AdaptiveAvgPool2d((1, None))self.gn = nn.GroupNorm(channels // self.groups, channels // self.groups)self.conv1x1 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=1, stride=1, padding=0)self.conv3x3 = nn.Conv2d(channels // self.groups, channels // self.groups, kernel_size=3, stride=1, padding=1)def forward(self, x):b, c, h, w = x.size()group_x = x.reshape(b * self.groups, -1, h, w) ?# b*g,c//g,h,wx_h = self.pool_h(group_x)x_w = self.pool_w(group_x).permute(0, 1, 3, 2)hw = self.conv1x1(torch.cat([x_h, x_w], dim=2))x_h, x_w = torch.split(hw, [h, w], dim=2)x1 = self.gn(group_x * x_h.sigmoid() * x_w.permute(0, 1, 3, 2).sigmoid())x2 = self.conv3x3(group_x)x11 = self.softmax(self.agp(x1).reshape(b * self.groups, -1, 1).permute(0, 2, 1))x12 = x2.reshape(b * self.groups, c // self.groups, -1) ?# b*g, c//g, hwx21 = self.softmax(self.agp(x2).reshape(b * self.groups, -1, 1).permute(0, 2, 1))x22 = x1.reshape(b * self.groups, c // self.groups, -1) ?# b*g, c//g, hwweights = (torch.matmul(x11, x12) + torch.matmul(x21, x22)).reshape(b * self.groups, 1, h, w)return (group_x * weights.sigmoid()).reshape(b, c, h, w)


在ultralytics-8.2.0\ultralytics\nn\tasks.py文件的parse_model()函數(shù)中添加如下代碼

在ultralytics-8.2.0\ultralytics\cfg\models\v8目錄下新建yolov8_EMA.yaml,代碼如下

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]
# ?n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers, ?3157200 parameters, ?3157184 gradients, ? 8.9 GFLOPs
# ?s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients, ?28.8 GFLOPsm: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients, ?79.3 GFLOPs
# ?l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
# ?x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPsbackbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] ?# 0-P1/2- [-1, 1, Conv, [128, 3, 2]] ?# 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] ?# 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] ?# 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] ?# 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] ?# 9# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 12- [-1, 1, EMA, [8]] #13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 15 (P3/8-small)- [-1, 1, EMA, [8]] #16- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2f, [512]] # 19 (P4/16-medium)- [-1, 1, EMA, [8]] # 20- [-1, 1, Conv, [512, 3, 2]]- [[-1, 9], 1, Concat, [1]] # cat head P5- [-1, 3, C2f, [1024]] # 23 (P5/32-large)- [-1, 1, EMA, [8]] #24- [[17, 21, 25], 1, Detect, [nc]] # Detect(P3, P4, P5)


在主目錄下新建main.py文件

我使用yolov8的yolov8m加載權(quán)重,main.py代碼如下

from ultralytics import YOLO
def train_model():model = YOLO("yolov8_EMA.yaml").load('yolov8m.pt')model.train(data="rail_defects.yaml", epochs=300)if __name__ == '__main__':train_model()



運(yùn)行結(jié)果

? ? ? ? ? ? ? ?from ?n ? ?params ?module ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arguments ? ? ? ? ? ? ? ? ? ??0 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ?1392 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [3, 48, 3, 2] ? ? ? ? ? ? ? ??1 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? 41664 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [48, 96, 3, 2] ? ? ? ? ? ? ? ?2 ? ? ? ? ? ? ? ? ?-1 ?2 ? ?111360 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [96, 96, 2, True] ? ? ? ? ? ??3 ? ? ? ? ? ? ? ? ?-1 ?1 ? ?166272 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [96, 192, 3, 2] ? ? ? ? ? ? ??4 ? ? ? ? ? ? ? ? ?-1 ?4 ? ?813312 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [192, 192, 4, True] ? ? ? ? ??5 ? ? ? ? ? ? ? ? ?-1 ?1 ? ?664320 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [192, 384, 3, 2] ? ? ? ? ? ? ?6 ? ? ? ? ? ? ? ? ?-1 ?4 ? 3248640 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [384, 384, 4, True] ? ? ? ? ??7 ? ? ? ? ? ? ? ? ?-1 ?1 ? 1991808 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [384, 576, 3, 2] ? ? ? ? ? ? ?8 ? ? ? ? ? ? ? ? ?-1 ?2 ? 3985920 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [576, 576, 2, True] ? ? ? ? ??9 ? ? ? ? ? ? ? ? ?-1 ?1 ? ?831168 ?ultralytics.nn.modules.block.SPPF ? ? ? ? ? ?[576, 576, 5] ? ? ? ? ? ? ? ??10 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ? ? 0 ?torch.nn.modules.upsampling.Upsample ? ? ? ? [None, 2, 'nearest'] ? ? ? ? ?11 ? ? ? ? ? ? [-1, 6] ?1 ? ? ? ? 0 ?ultralytics.nn.modules.conv.Concat ? ? ? ? ? [1] ? ? ? ? ? ? ? ? ? ? ? ? ??12 ? ? ? ? ? ? ? ? ?-1 ?2 ? 1993728 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [960, 384, 2] ? ? ? ? ? ? ? ??13 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ?1488 ?ultralytics.nn.attention.EMA ? ? ? ? ? ? ? ? [384, 8] ? ? ? ? ? ? ? ? ? ? ?14 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ? ? 0 ?torch.nn.modules.upsampling.Upsample ? ? ? ? [None, 2, 'nearest'] ? ? ? ? ?15 ? ? ? ? ? ? [-1, 4] ?1 ? ? ? ? 0 ?ultralytics.nn.modules.conv.Concat ? ? ? ? ? [1] ? ? ? ? ? ? ? ? ? ? ? ? ??16 ? ? ? ? ? ? ? ? ?-1 ?2 ? ?517632 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [576, 192, 2] ? ? ? ? ? ? ? ??17 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ? 384 ?ultralytics.nn.attention.EMA ? ? ? ? ? ? ? ? [192, 8] ? ? ? ? ? ? ? ? ? ? ?18 ? ? ? ? ? ? ? ? ?-1 ?1 ? ?332160 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [192, 192, 3, 2] ? ? ? ? ? ? ?19 ? ? ? ? ? ?[-1, 13] ?1 ? ? ? ? 0 ?ultralytics.nn.modules.conv.Concat ? ? ? ? ? [1] ? ? ? ? ? ? ? ? ? ? ? ? ??20 ? ? ? ? ? ? ? ? ?-1 ?2 ? 1846272 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [576, 384, 2] ? ? ? ? ? ? ? ??21 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ?1488 ?ultralytics.nn.attention.EMA ? ? ? ? ? ? ? ? [384, 8] ? ? ? ? ? ? ? ? ? ? ?22 ? ? ? ? ? ? ? ? ?-1 ?1 ? 1327872 ?ultralytics.nn.modules.conv.Conv ? ? ? ? ? ? [384, 384, 3, 2] ? ? ? ? ? ? ?23 ? ? ? ? ? ? [-1, 9] ?1 ? ? ? ? 0 ?ultralytics.nn.modules.conv.Concat ? ? ? ? ? [1] ? ? ? ? ? ? ? ? ? ? ? ? ??24 ? ? ? ? ? ? ? ? ?-1 ?2 ? 4207104 ?ultralytics.nn.modules.block.C2f ? ? ? ? ? ? [960, 576, 2] ? ? ? ? ? ? ? ??25 ? ? ? ? ? ? ? ? ?-1 ?1 ? ? ?3312 ?ultralytics.nn.attention.EMA ? ? ? ? ? ? ? ? [576, 8] ? ? ? ? ? ? ? ? ? ? ?26 ? ? ? ?[17, 21, 25] ?1 ? 3776854 ?ultralytics.nn.modules.head.Detect ? ? ? ? ? [2, [192, 384, 576]] ? ? ? ? ?
YOLOv8_EMA summary: 327 layers, 25864150 parameters, 25864134 gradients, 79.6 GFLOPs

未完待續(xù)~繼續(xù)更新

http://www.risenshineclean.com/news/54556.html

相關(guān)文章:

  • 網(wǎng)站型銷(xiāo)售怎么做的疫情最新數(shù)據(jù)
  • 天津網(wǎng)站建設(shè)吐魯番地區(qū)百度電腦端入口
  • 網(wǎng)站數(shù)據(jù)采集 源碼個(gè)人網(wǎng)站源碼免費(fèi)下載
  • 公司網(wǎng)站開(kāi)發(fā)制作公司公司網(wǎng)站制作網(wǎng)絡(luò)公司
  • 企業(yè)門(mén)戶網(wǎng)站 意義免費(fèi)推廣網(wǎng)站大全
  • 具有營(yíng)銷(xiāo)價(jià)值好的網(wǎng)站share群組鏈接分享
  • 鄭州商城網(wǎng)站建設(shè)多少錢(qián)一站式網(wǎng)站建設(shè)公司
  • 有沒(méi)有專業(yè)做二維碼連接網(wǎng)站在口碑營(yíng)銷(xiāo)案例簡(jiǎn)短
  • 學(xué)php做網(wǎng)站品牌營(yíng)銷(xiāo)包括哪些方面
  • 網(wǎng)站建設(shè)與網(wǎng)頁(yè)設(shè)計(jì)的論文軟文范例大全800
  • 網(wǎng)站開(kāi)發(fā)算什么費(fèi)用知乎關(guān)鍵詞排名工具
  • 做外商備案的網(wǎng)站百度官方app免費(fèi)下載
  • 免費(fèi)的軟件網(wǎng)站seo運(yùn)營(yíng)學(xué)校
  • 電力建設(shè)期刊網(wǎng)站上海網(wǎng)站推廣廣告
  • 陜西網(wǎng)站制作商學(xué)電腦在哪里報(bào)名
  • 深圳做網(wǎng)站建設(shè)的公司競(jìng)價(jià)交易規(guī)則
  • 網(wǎng)站建設(shè)的公司哪家是上市公司百度搜索推廣產(chǎn)品
  • 攝影網(wǎng)站建設(shè)內(nèi)容濟(jì)南網(wǎng)站優(yōu)化排名推廣
  • 東莞微網(wǎng)站制作網(wǎng)站seo思路
  • 做網(wǎng)站的優(yōu)勢(shì)有哪些國(guó)家域名注冊(cè)服務(wù)網(wǎng)
  • 網(wǎng)站 公眾號(hào) 建設(shè)方案谷歌廣告推廣怎么做
  • 做網(wǎng)站流程、上海抖音推廣
  • 怎么做付款下載網(wǎng)站上海網(wǎng)站建設(shè)方案
  • 蘇州電商網(wǎng)站建設(shè)站長(zhǎng)工具服務(wù)器查詢
  • 百度怎么做自己的網(wǎng)站怎么在百度上發(fā)帖推廣
  • 投票網(wǎng)站開(kāi)發(fā)的背景和意義免費(fèi)網(wǎng)站seo排名優(yōu)化
  • 用淘寶域名做網(wǎng)站什么效果百度口碑網(wǎng)
  • 北京工商注冊(cè)代理記賬最新黑帽seo培訓(xùn)
  • 公司網(wǎng)站在國(guó)外打開(kāi)很慢使用cdn好還是國(guó)外租用服務(wù)器好互聯(lián)網(wǎng)營(yíng)銷(xiāo)推廣公司
  • 電商網(wǎng)站的建設(shè)與維護(hù)域名查詢網(wǎng)址