欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

yolov5中head修改為decouple?head詳解

 更新時(shí)間:2022年06月11日 15:12:49   作者:qq_34496674  
現(xiàn)成的YOLOv5代碼真的很香,不管口碑怎么樣,我用著反正是挺爽的,下面這篇文章主要給大家介紹了關(guān)于yolov5中head修改為decouple?head的相關(guān)資料,需要的朋友可以參考下

yolov5的head修改為decouple head

yolox的decoupled head結(jié)構(gòu)

本來(lái)想將yolov5的head修改為decoupled head,與yolox的decouple head對(duì)齊,但是沒(méi)注意,該成了如下結(jié)構(gòu):

感謝少年肩上楊柳依依的指出,如還有問(wèn)題歡迎指出

1.修改models下的yolo.py文件中的Detect

class Detect(nn.Module):
    stride = None  # strides computed during build
    onnx_dynamic = False  # ONNX export parameter

    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(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv
        self.m_box = nn.ModuleList(nn.Conv2d(256, 4 * self.na, 1) for x in ch)  # output conv
        self.m_conf = nn.ModuleList(nn.Conv2d(256, 1 * self.na, 1) for x in ch)  # output conv
        self.m_labels = nn.ModuleList(nn.Conv2d(256, self.nc * self.na, 1) for x in ch)  # output conv
        self.base_conv = nn.ModuleList(BaseConv(in_channels = x, out_channels = 256, ksize = 1, stride = 1) for x in ch)
        self.cls_convs = nn.ModuleList(BaseConv(in_channels = 256, out_channels = 256, ksize = 3, stride = 1) for x in ch)
        self.reg_convs = nn.ModuleList(BaseConv(in_channels = 256, out_channels = 256, ksize = 3, stride = 1) for x in ch)
        
        # self.m = nn.ModuleList(nn.Conv2d(x, 4 * self.na, 1) for x in ch, nn.Conv2d(x, 1 * self.na, 1) for x in ch,nn.Conv2d(x, self.nc * self.na, 1) for x in ch)
        self.inplace = inplace  # use in-place ops (e.g. slice assignment)self.ch = ch

    def forward(self, x):
        z = []  # inference output
        for i in range(self.nl):
            # # x[i] = self.m[i](x[i])  # convs
            # print("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&", i)
            # print(x[i].shape)
            # print(self.base_conv[i])
            # print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%")
            
            
            
            x_feature = self.base_conv[i](x[i])
            # x_feature = x[i]
            
            cls_feature = self.cls_convs[i](x_feature)
            reg_feature = self.reg_convs[i](x_feature)
            # reg_feature = x_feature
            
            m_box = self.m_box[i](reg_feature)
            m_conf = self.m_conf[i](reg_feature)
            m_labels = self.m_labels[i](cls_feature)
            x[i] = torch.cat((m_box,m_conf, m_labels),1)
            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 - 0.5 + 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 = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, y[..., 4:]), -1)
                z.append(y.view(bs, -1, self.no))

        return x if self.training else (torch.cat(z, 1), x)

2.在yolo.py中添加

def get_activation(name="silu", inplace=True):
    if name == "silu":
        module = nn.SiLU(inplace=inplace)
    elif name == "relu":
        module = nn.ReLU(inplace=inplace)
    elif name == "lrelu":
        module = nn.LeakyReLU(0.1, inplace=inplace)
    else:
        raise AttributeError("Unsupported act type: {}".format(name))
    return module



class BaseConv(nn.Module):
    """A Conv2d -> Batchnorm -> silu/leaky relu block"""

    def __init__(
        self, in_channels, out_channels, ksize, stride, groups=1, bias=False, act="silu"
    ):
        super().__init__()
        # same padding
        pad = (ksize - 1) // 2
        self.conv = nn.Conv2d(
            in_channels,
            out_channels,
            kernel_size=ksize,
            stride=stride,
            padding=pad,
            groups=groups,
            bias=bias,
        )
        self.bn = nn.BatchNorm2d(out_channels)
        self.act = get_activation(act, inplace=True)

    def forward(self, x):
        # print(self.bn(self.conv(x)).shape)
        return self.act(self.bn(self.conv(x)))
        # return self.bn(self.conv(x))

    def fuseforward(self, x):
        return self.act(self.conv(x))

decouple head的特點(diǎn):

由于訓(xùn)練模型時(shí),應(yīng)該是channels = 256的地方改成了channels = x(失誤),所以在decoupled head的部分參數(shù)量比yolox要大一些,以下的結(jié)果是在channels= x的情況下得出

比yolov5s參數(shù)多,計(jì)算量大,在我自己的2.5萬(wàn)的數(shù)據(jù)量下map提升了3%多

1.模型給出的目標(biāo)cls較高,需要將conf的閾值設(shè)置較大(0.5),不然準(zhǔn)確率較低

parser.add_argument('--conf-thres', type=float, default=0.5, help='confidence threshold')

2.對(duì)于少樣本的檢測(cè)效果較好,召回率的提升比準(zhǔn)確率多

3.在conf設(shè)置為0.25時(shí),召回率比yolov5s高,但是準(zhǔn)確率低;在conf設(shè)置為0.5時(shí),召回率與準(zhǔn)確率比yolov5s高

4.比yolov5s參數(shù)多,計(jì)算量大,在2.5萬(wàn)的數(shù)據(jù)量下map提升了3%多

對(duì)于decouple head的改進(jìn)

改進(jìn):

1.將紅色框中的conv去掉,縮小參數(shù)量和計(jì)算量;

2.channels =256 ,512 ,1024是考慮不增加參數(shù),不進(jìn)行featuremap的信息壓縮

class Detect(nn.Module):
    stride = None  # strides computed during build
    onnx_dynamic = False  # ONNX export parameter

    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(nn.Conv2d(x, self.no * self.na, 1) for x in ch)  # output conv
        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 - 0.5 + 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 = (y[..., 0:2] * 2 - 0.5 + self.grid[i]) * self.stride[i]  # xy
                    wh = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]  # wh
                    y = torch.cat((xy, wh, y[..., 4:]), -1)
                z.append(y.view(bs, -1, self.no))

        return x if self.training else (torch.cat(z, 1), x)

特點(diǎn)

1.模型給出的目標(biāo)cls較高,需要將conf的閾值設(shè)置較大(0.4),不然準(zhǔn)確率較低

2.對(duì)于少樣本的檢測(cè)效果較好,準(zhǔn)確率的提升比召回率多

3. 準(zhǔn)確率的提升比召回率多,

該改進(jìn)不如上面的模型提升多,但是參數(shù)量小,計(jì)算量小少9Gflop,占用顯存少

decoupled head指標(biāo)提升的原因:由于yolov5s原本的head不能完全的提取featuremap中的信息,decoupled head能夠較為充分的提取featuremap的信息;

疑問(wèn)

為什么decoupled head目標(biāo)的cls會(huì)比較高,沒(méi)想明白

為什么去掉base_conv,召回率要比準(zhǔn)確率提升少

總結(jié)

到此這篇關(guān)于yolov5中head修改為decouple head的文章就介紹到這了,更多相關(guān)yolov5 head修改為decouple head內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django 使用easy_thumbnails壓縮上傳的圖片方法

    Django 使用easy_thumbnails壓縮上傳的圖片方法

    今天小編就為大家分享一篇Django 使用easy_thumbnails壓縮上傳的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • python打開(kāi)瀏覽器并模擬搜索示例詳解

    python打開(kāi)瀏覽器并模擬搜索示例詳解

    這篇文章主要為大家介紹了python打開(kāi)瀏覽器并模擬搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • python中的TCP(傳輸控制協(xié)議)用法實(shí)例分析

    python中的TCP(傳輸控制協(xié)議)用法實(shí)例分析

    這篇文章主要介紹了python中的TCP(傳輸控制協(xié)議)用法,結(jié)合完整實(shí)例形式分析了Python基于TCP協(xié)議的服務(wù)器端與客戶端相關(guān)實(shí)現(xiàn)技巧及操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 在Linux下調(diào)試Python代碼的各種方法

    在Linux下調(diào)試Python代碼的各種方法

    這篇文章主要介紹了在Linux下調(diào)試Python代碼的各種方法,用于編程后的debug工作,需要的朋友可以參考下
    2015-04-04
  • Python圖像特效之模糊玻璃效果

    Python圖像特效之模糊玻璃效果

    這篇文章主要為大家詳細(xì)介紹了Python圖像特效之模糊玻璃效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Python發(fā)送郵件測(cè)試報(bào)告操作實(shí)例詳解

    Python發(fā)送郵件測(cè)試報(bào)告操作實(shí)例詳解

    這篇文章主要介紹了Python發(fā)送郵件測(cè)試報(bào)告操作,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python郵件發(fā)送相關(guān)模塊使用及操作注意事項(xiàng),需要的朋友可以參考下
    2018-12-12
  • Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)

    Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié)

    使用urllib2模塊進(jìn)行基于url的HTTP請(qǐng)求等操作大家也許都比較熟悉,這里我們?cè)偕钊雭?lái)了解一下urllib2針對(duì)HTTP的異常處理相關(guān)功能,一起來(lái)看一下Python網(wǎng)絡(luò)編程中urllib2模塊的用法總結(jié):
    2016-07-07
  • Python爬蟲(chóng)和反爬技術(shù)過(guò)程詳解

    Python爬蟲(chóng)和反爬技術(shù)過(guò)程詳解

    Python爬蟲(chóng)是當(dāng)下最火的一種獲取數(shù)據(jù)的方式,當(dāng)我們對(duì)一些小型網(wǎng)站進(jìn)行爬取的時(shí)候往往沒(méi)什么阻礙,而當(dāng)我們爬取大型網(wǎng)站的時(shí)候經(jīng)常會(huì)遇到禁止訪問(wèn)、封禁IP的情況,這也是我們觸發(fā)反爬機(jī)制的體現(xiàn),本文來(lái)帶領(lǐng)大家了解幾種簡(jiǎn)單高效的反爬對(duì)策
    2021-09-09
  • python重試裝飾器示例

    python重試裝飾器示例

    python 寫(xiě)一些網(wǎng)絡(luò)服務(wù)的時(shí)候總會(huì)拋出一些異常,當(dāng)前任務(wù)就被終止了,利用@裝飾器,寫(xiě)一個(gè)重試的裝飾器,下面是實(shí)現(xiàn)示例,需要的朋友可以參考下
    2014-02-02
  • Python實(shí)現(xiàn)KPM算法詳解

    Python實(shí)現(xiàn)KPM算法詳解

    大家好,本篇文章主要講的是Python實(shí)現(xiàn)KPM算法詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12

最新評(píng)論