最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

YOLO?v5引入解耦頭部完整步驟

 更新時間:2023年05月22日 10:43:22   作者:小啊磊_Runing  
網(wǎng)上有很多添加解耦頭的博客,在此記錄下我使用解耦頭對YOLOv5改進,下面這篇文章主要給大家介紹了關(guān)于YOLO?v5引入解耦頭部的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

前言

在 YOLO x中,使用了解耦頭部的方法,從而加快網(wǎng)絡(luò)收斂速度和提高精度,因此解耦頭被廣泛應(yīng)用于目標檢測算法任務(wù)中。因此也想在YOLO v5的檢測頭部引入了解耦頭部的方法,從而來提高檢測精度和加快網(wǎng)絡(luò)收斂,但這里與 YOLO x 解耦頭部使用的檢測方法稍微不同,在YOLO v5中引入的解耦頭部依舊還是基于 anchor 檢測的方法。

一、解耦頭部示意圖

在YOLO x中,使用了解耦頭部的方法,具體論文請參考:https://arxiv.org/pdf/2107.08430.pdf

于是按照論文中的介紹就可以簡單的畫出解耦頭部,在YOLO v5中引入的解耦頭部最終還是基于 anchor 檢測的方法。

二、在YOLO v5 中引入解耦頭部

1.修改common.py文件

在common.py文件中加入以下代碼。

class DecoupledHead(nn.Module):
    def __init__(self, ch=256, nc=80, anchors=()):
        super().__init__()
        self.nc = nc  # number of classes
        self.nl = len(anchors)  # number of detection layers
        self.na = len(anchors[0]) // 2  # number of anchors
        self.merge = Conv(ch, 256, 1, 1)
        self.cls_convs1 = Conv(256, 256, 3, 1, 1)
        self.cls_convs2 = Conv(256, 256, 3, 1, 1)
        self.reg_convs1 = Conv(256, 256, 3, 1, 1)
        self.reg_convs2 = Conv(256, 256, 3, 1, 1)
        self.cls_preds = nn.Conv2d(256, self.nc * self.na, 1)
        self.reg_preds = nn.Conv2d(256, 4 * self.na, 1)
        self.obj_preds = nn.Conv2d(256, 1 * self.na, 1)
    def forward(self, x):
        x = self.merge(x)
        x1 = self.cls_convs1(x)
        x1 = self.cls_convs2(x1)
        x1 = self.cls_preds(x1)
        x2 = self.reg_convs1(x)
        x2 = self.reg_convs2(x2)
        x21 = self.reg_preds(x2)
        x22 = self.obj_preds(x2)
        out = torch.cat([x21, x22, x1], 1)
        return out

2.修改yolo.py文件

修改后common.py文件后,需要修改yolo.py文件,主要修改兩個部分:

1.在model函數(shù),只需修改一句代碼,修改后如下:

if isinstance(m, Detect) or isinstance(m, Decoupled_Detect):

2.在parse_model函數(shù)中,修改后代碼如下:

3.在yolo.py增加Decoupled_Detect代碼

class Decoupled_Detect(nn.Module):
    stride = None  # strides computed during build
    onnx_dynamic = False  # ONNX export parameter
    export = False  # export mode
    def __init__(self, nc=80, anchors=(), ch=(), inplace=True):  # detection layer
        super().__init__()
        self.nc = nc  # number of classes
        self.no = nc + 5  # number of outputs per anchor
        self.nl = len(anchors)  # number of detection layers
        self.na = len(anchors[0]) // 2  # number of anchors
        self.grid = [torch.zeros(1)] * self.nl  # init grid
        self.anchor_grid = [torch.zeros(1)] * self.nl  # init anchor grid
        self.register_buffer('anchors', torch.tensor(anchors).float().view(self.nl, -1, 2))  # shape(nl,na,2)
        self.m = nn.ModuleList(DecoupledHead(x, nc, anchors) for x in ch)
        self.inplace = inplace  # use in-place ops (e.g. slice assignment)
    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            x[i] = self.m[i](x[i])  # conv
            bs, _, ny, nx = x[i].shape  # x(bs,255,20,20) to x(bs,3,20,20,85)
            x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
            if not self.training:  # inference
                if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]:
                    self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
                y = x[i].sigmoid()
                if self.inplace:
                    y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]  # xy
                    y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                else:  # for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953
                    xy, wh, conf = y.split((2, 2, self.nc + 1), 4)  # y.tensor_split((2, 4, 5), 4)  # torch 1.8.0
                    xy = (xy * 2 + self.grid[i]) * self.stride[i]  # xy
                    wh = (wh * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, conf), 4)
                z.append(y.view(bs, -1, self.no))
        return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x)
    def _make_grid(self, nx=20, ny=20, i=0):
        d = self.anchors[i].device
        t = self.anchors[i].dtype
        shape = 1, self.na, ny, nx, 2  # grid shape
        y, x = torch.arange(ny, device=d, dtype=t), torch.arange(nx, device=d, dtype=t)
        if check_version(torch.__version__, '1.10.0'):  # torch>=1.10.0 meshgrid workaround for torch>=0.7 compatibility
            yv, xv = torch.meshgrid(y, x, indexing='ij')
        else:
            yv, xv = torch.meshgrid(y, x)
        grid = torch.stack((xv, yv), 2).expand(shape) - 0.5  # add grid offset, i.e. y = 2.0 * x - 0.5
        anchor_grid = (self.anchors[i] * self.stride[i]).view((1, self.na, 1, 1, 2)).expand(shape)
        return grid, anchor_grid

3.在model函數(shù)中,修改Build strides, anchors部分代碼,修改后代碼如下:

# Build strides, anchors
        m = self.model[-1]  # Detect()
        if isinstance(m, Detect) or isinstance(m, Decoupled_Detect):
            s = 256  # 2x min stride
            m.inplace = self.inplace
            m.stride = torch.tensor([s / x.shape[-2] for x in self.forward(torch.zeros(1, ch, s, s))])  # forward
            check_anchor_order(m)  # must be in pixel-space (not grid-space)
            m.anchors /= m.stride.view(-1, 1, 1)
            self.stride = m.stride
            # self._initialize_biases()  # only run once
            try :
                self._initialize_biases()  # only run once
                LOGGER.info('initialize_biases done')
            except :
                LOGGER.info('decoupled no biase ')
        initialize_weights(self)
        self.info()
        LOGGER.info('')

3.修改模型的yaml文件

在模型的yaml文件中,修改最后一層檢測的頭的結(jié)構(gòu),我修改yolo v5s模型的最后一層檢測結(jié)構(gòu)如下:

 [[17, 20, 23], 1, Decoupled_Detect, [nc, anchors]],         # Detect(P3, P4, P5)

總結(jié)

至于單獨的增加解耦頭部,我還沒有對自己的數(shù)據(jù)集進行單獨的訓(xùn)練,一般都是解耦頭部和其他模型結(jié)合在一起進行訓(xùn)練,如果后期在訓(xùn)練的時候map有提升的話,我在把實驗結(jié)果放在上面,最近也在跑實驗結(jié)果對比。

到此這篇關(guān)于YOLO v5引入解耦頭部的文章就介紹到這了,更多相關(guān)YOLO v5引入解耦頭部內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python入門jupyter基礎(chǔ)操作及文本用法

    python入門jupyter基礎(chǔ)操作及文本用法

    這篇文章主要介紹了python入門-jupyter基礎(chǔ)操作及文本用法,適合入門的python小白閱讀,有需要的朋友可以借鑒參考下,希望可以有所幫助,感謝閱讀
    2021-09-09
  • Python獲取女友聊天記錄詳細流程

    Python獲取女友聊天記錄詳細流程

    就在前段時間,在大學(xué)睡我上鋪的兄弟,在兄嘚群里討論,說:他發(fā)現(xiàn)女朋友這幾天只要下班就坐在電腦前,不是工作原因。而且只要他靠近一點就會立即退出頁面,所以他一直很懷疑,在群里問我們這一個個單身狗。然后就出現(xiàn)下面這一段對話
    2021-10-10
  • Python中數(shù)字類型內(nèi)置方法詳解

    Python中數(shù)字類型內(nèi)置方法詳解

    在?Python?編程里,數(shù)字類型是極為基礎(chǔ)且關(guān)鍵的數(shù)據(jù)類型,本文將深入介紹?Python?數(shù)字類型的內(nèi)置方法,同時輔以詳細的代碼示例,需要的可以了解下
    2025-04-04
  • 基于python的socket實現(xiàn)單機五子棋到雙人對戰(zhàn)

    基于python的socket實現(xiàn)單機五子棋到雙人對戰(zhàn)

    這篇文章主要為大家詳細介紹了基于python的socket實現(xiàn)單機五子棋到雙人對戰(zhàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • 解決pycharm:unused import statement錯誤的問題

    解決pycharm:unused import statement錯誤的問題

    這篇文章主要介紹了解決pycharm:unused import statement錯誤的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用

    Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用

    Python,numpy都有自己的一套數(shù)據(jù)格式,本文主要介紹了Pandas數(shù)據(jù)類型轉(zhuǎn)換df.astype()及數(shù)據(jù)類型查看df.dtypes的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • 基于python分布式爬蟲并解決假死的問題

    基于python分布式爬蟲并解決假死的問題

    這篇文章主要介紹了基于python分布式爬蟲并解決假死的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Python colormap庫的安裝和使用詳情

    Python colormap庫的安裝和使用詳情

    這篇文章主要介紹了Python colormap庫的安裝和使用詳情,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 在pycharm 中添加運行參數(shù)的操作方法

    在pycharm 中添加運行參數(shù)的操作方法

    今天小編就為大家分享一篇在pycharm 中添加運行參數(shù)的操作方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python ArgumentParse的subparser用法說明

    Python ArgumentParse的subparser用法說明

    這篇文章主要介紹了Python ArgumentParse的subparser用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

封开县| 沧源| 光泽县| 绥德县| 乐至县| 涟源市| 厦门市| 湘阴县| 陆丰市| 安仁县| 长阳| 永靖县| 霍城县| 咸丰县| 文昌市| 洛阳市| 云和县| 陆良县| 荆州市| 临海市| 阿图什市| 灵武市| 双江| 中阳县| 临武县| 共和县| 吴川市| 洛南县| 洪江市| 裕民县| 齐齐哈尔市| 禄丰县| 辽中县| 垫江县| 象州县| 涟源市| 嘉善县| 上高县| 文登市| 德州市| 东乡|