• Multi-Adapter RGBT Tracking代码学习(一)


    1.module/MANet3x1x1_IC.py:
    ①torch.cat:
    字面理解:torch.cat是将两个张量(tensor)拼接在一起,cat是concatenate的意思,即拼接,联系在一起。

    >>> import torch
    >>> A=torch.ones(2,3) #2x3的张量(矩阵)                                     
    >>> A
    tensor([[ 1.,  1.,  1.],
            [ 1.,  1.,  1.]])
    >>> B=2*torch.ones(4,3)#4x3的张量(矩阵)                                    
    >>> B
    tensor([[ 2.,  2.,  2.],
            [ 2.,  2.,  2.],
            [ 2.,  2.,  2.],
            [ 2.,  2.,  2.]])
    >>> C=torch.cat((A,B),0)#按维数0(行)拼接
    >>> C
    tensor([[ 1.,  1.,  1.],
             [ 1.,  1.,  1.],
             [ 2.,  2.,  2.],
             [ 2.,  2.,  2.],
             [ 2.,  2.,  2.],
             [ 2.,  2.,  2.]])
    >>> C.size()
    torch.Size([6, 3])
    >>> D=2*torch.ones(2,4) #2x4的张量(矩阵)
    >>> C=torch.cat((A,D),1)#按维数1(列)拼接
    >>> C
    tensor([[ 1.,  1.,  1.,  2.,  2.,  2.,  2.],
            [ 1.,  1.,  1.,  2.,  2.,  2.,  2.]])
    >>> C.size()
    torch.Size([2, 7])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    上面给出了两个张量A和B,分别是2行3列,4行3列。即他们都是2维张量。因为只有两维,这样在用torch.cat拼接的时候就有两种拼接方式:按行拼接和按列拼接。即所谓的维数0和维数1.
    C=torch.cat((A,B),0)就表示按维数0(行)拼接A和B,也就是竖着拼接,A上B下。此时需要注意:列数必须一致,即维数1数值要相同,这里都是3列,方能列对齐。拼接后的C的第0维是两个维数0数值和,即2+4=6.
    C=torch.cat((A,B),1)就表示按维数1(列)拼接A和B,也就是横着拼接,A左B右。此时需要注意:行数必须一致,即维数0数值要相同,这里都是2行,方能行对齐。拼接后的C的第1维是两个维数1数值和,即3+4=7.
    从2维例子可以看出,使用torch.cat((A,B),dim)时,除拼接维数dim数值可不同外其余维数数值需相同,方能对齐。

    实例:
    在深度学习处理图像时,常用的有3通道的RGB彩色图像及单通道的灰度图。张量size为cxhxw,即通道数x图像高度x图像宽度。在用torch.cat拼接两张图像时一般要求图像大小一致而通道数可不一致,即h和w同,c可不同。

    参考博客:PyTorch的torch.cat

    ②raise:
    raise用于在程序的指定位置手动抛出一个异常
    raise 语句的基本语法格式为:

    raise [exceptionName [(reason)]]

    其中,用 [] 括起来的为可选参数,其作用是指定抛出的异常名称,以及异常信息的相关描述。如果可选参数全部省略,则 raise 会把当前错误原样抛出;如果仅省略 (reason),则在抛出异常时,将不附带任何的异常描述信息。
    也就是说,raise 语句有如下三种常用的用法:
    1、raise:单独一个 raise。该语句引发当前上下文中捕获的异常(比如在 except 块中),或默认引发 RuntimeError 异常。
    2、raise 异常类名称:raise 后带一个异常类名称,表示引发执行类型的异常。
    3、raise 异常类名称(描述信息):在引发指定类型的异常的同时,附带异常的描述信息。
    当然,我们手动让程序引发异常,很多时候并不是为了让其崩溃。事实上,raise 语句引发的异常通常用 try except(else finally)异常处理结构来捕获并进行处理。例如:
    1、

    try:
        a = input("输入一个数:")
        #判断用户输入的是否为数字
        if(not a.isdigit()):
            raise ValueError("a 必须是数字")
    except ValueError as e:
        print("引发异常:",repr(e))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结果如下:
    在这里插入图片描述
    2、

    try:
        a = input("输入一个数:")
        if(not a.isdigit()):
            raise ValueError("a 必须是数字")
    except ValueError as e:
        print("引发异常:",repr(e))
        raise
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    结果如下:
    在这里插入图片描述
    3、

    try:
        a = input("输入一个数:")
        if(not a.isdigit()):
            raise
    except RuntimeError as e:
        print("引发异常:",repr(e))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    结果如下:
    在这里插入图片描述

    参考博客:Python中raise的用法

    ③论文中的self.type的含义:

    # sample generation#样本生成,type是指生成哪一种分布的包围盒。
                    #包围盒的生成就是围绕第一帧中边界框的位置生成的。
            if self.type == 'gaussian':
                samples[:, :2] += self.trans * np.mean(bb[2:]) * np.clip(0.5 * np.random.randn(n, 2), -1, 1)
                samples[:, 2:] *= self.scale ** np.clip(0.5 * np.random.randn(n, 1), -1, 1)
    
            elif self.type == 'uniform':
                samples[:, :2] += self.trans * np.mean(bb[2:]) * (np.random.rand(n, 2) * 2 - 1)
                samples[:, 2:] *= self.scale ** (np.random.rand(n, 1) * 2 - 1)
    
            elif self.type == 'whole':
                m = int(2 * np.sqrt(n))
                xy = np.dstack(np.meshgrid(np.linspace(0, 1, m), np.linspace(0, 1, m))).reshape(-1, 2)
                xy = np.random.permutation(xy)[:n]
                samples[:, :2] = bb[2:] / 2 + xy * (self.img_size - bb[2:] / 2 - 1)
                samples[:, 2:] *= self.scale ** (np.random.rand(n, 1) * 2 - 1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    测试代码:

    a = np.array([1,2,3,4],float)
    print("原边界框值为:\n",a)
    b = np.tile(a,(5,1))
    # print("原数组\n",a)
    # a[1:3,:] *=2
    print("变换后的边界框值为:")
    b[:, :2] += 0.1 * np.mean(a[2:]) * np.clip(0.5 * np.random.rand(5, 2),- 1,1)
    b[:, 2:] += 1.3 * (np.random.rand(5, 2) * 2 - 1)
    print(b)
    
    '''
    原边界框值为:
     [1. 2. 3. 4.]
    变换后的边界框值为:
    [[1.11710068 2.08603053 1.75637201 4.59238912]
     [1.13884457 2.1012902  4.06181353 3.45955397]
     [1.02445187 2.00988633 3.84430355 3.60715309]
     [1.01910657 2.03918938 3.23991653 4.44748657]
     [1.07313621 2.16288305 3.61764105 4.80797056]]
    '''
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    从输出结果可以看出,随机生成的样本,其实就是围绕第一帧边界框中的位置做变换,上下或者左右浮动一点,以生成正样本。

    参考博客:
    py-MDNet/modules/sample_generator中样本生成部分

    ④model.load_state_dict(checkpoint, strict=True)引发的学习:
    在这里插入图片描述
    参考博文:pytorch冻结参数训练参数 pytorch 实现冻结部分参数训练另一部分

  • 相关阅读:
    uni-app 之 tabBar 底部切换按钮
    03_ElasticSearch下载安装
    OpenCV4 图像处理与视频分析实战教程 笔记
    《Linux篇》超详细安装FinalShell并连接Linux教程
    API简介,如何运用API接口获取商品数据(淘宝/天猫、1688、拼多多、京东等二十多个海内外电商平台)
    【老生谈算法】matlab实现小波分析源码——小波分析
    pytorch深度学习实战19
    自学Python第十天- 异常
    Docker 入门篇(一)-- 简介与安装教程(Windows和Linux)
    Git系列之Git入门级(带你走进Git的世界)
  • 原文地址:https://blog.csdn.net/qq_45104603/article/details/126089607