图像处理学习——2-读detector.py-掌握模型输出值的含义

Tensor总结

(1)Tensor 和 Numpy都是矩阵,区别是前者可以在GPU上运行,后者只能在CPU上;

(2)Tensor和Numpy互相转化很方便,类型也比较兼容

(3)Tensor可以直接通过print显示数据类型,而Numpy不可以

 


 
Detector这个类在初始化的时候定义了许多成员变量:
def __init__(self, classes, anchor_num, load_param, export_onnx = False):
        super(Detector, self).__init__()
        out_depth = 72
        stage_out_channels = [-1, 24, 48, 96, 192]

        self.export_onnx = export_onnx
        self.backbone = ShuffleNetV2(stage_out_channels, load_param)
        self.fpn = LightFPN(stage_out_channels[-2] + stage_out_channels[-1], stage_out_channels[-1], out_depth)

        self.output_reg_layers = nn.Conv2d(out_depth, 4 * anchor_num, 1, 1, 0, bias=True)
        self.output_obj_layers = nn.Conv2d(out_depth, anchor_num, 1, 1, 0, bias=True)
        self.output_cls_layers = nn.Conv2d(out_depth, classes, 1, 1, 0, bias=True)
各个成员变量的解释如下:
  • backbone:网络结构中的特征提取部分。卷积神经网络的结构通常可以分成两大部分,一部分用于特征提取,称为"backbone",另一部分就基于提取出的特征做一些事情,比如说加上一个全连接层做分类、加上一些卷积层(a.k.a 检测头)做目标检测等。
  • fpn特征金字塔,一种特殊结构,暂时不用理解。感兴趣的话,搜一下fpn
  • output_reg_layers:卷积层,输出每一个网格的坐标预测结果。假设batch size是64,网格划分为13x13,那么输出的形状就是(64, 13, 13, 4 * anchor_num)每一个anchor都会预测一个(x, y, w, h),所以通道数是4 * anchor_num。
  • output_obj_layers:卷积层,输出每一个网格的置信度预测结果。假设batch size是64,网格划分为13x13,那么输出的形状就是(64, 13, 13, 1 * anchor_num)每一个anchor都会预测一个置信度,所以通道数是1 * anchor_num。
  • output_cls_layers:卷积层,输出每一个网格的类别预测结果。classes是类别数。这边输出通道数并不是classes * anchor_num,说明所有anchor预测的类别结果是一样的。假设batch size是64,网格划分为13x13,那么输出的形状就是(64, 13, 13, classes)

接着是forward函数:

 def forward(self, x):
        C2, C3 = self.backbone(x)
        cls_2, obj_2, reg_2, cls_3, obj_3, reg_3 = self.fpn(C2, C3)
        
        out_reg_2 = self.output_reg_layers(reg_2)
        out_obj_2 = self.output_obj_layers(obj_2)
        out_cls_2 = self.output_cls_layers(cls_2)

        out_reg_3 = self.output_reg_layers(reg_3)
        out_obj_3 = self.output_obj_layers(obj_3)
        out_cls_3 = self.output_cls_layers(cls_3)
        
        if self.export_onnx:
            #lxq说不用看
            
        else:
            return out_reg_2, out_obj_2, out_cls_2, out_reg_3, out_obj_3, out_cls_3
只需要看关键部分就行。通过上面的解析咱们可以确定out_reg/obj/cls_2/3这6个变量的形状。然后在训练时,这6个变量会作为一个长度为6的元组返回(参考: python多个返回值的函数)。
在目标检测算法中,有个概念叫"多尺度检测",对于大的目标,用13x13网格划分去预测就行,而对于小目标,网格划分就应该更细致一些,比如说用19x19。
这6个变量,每3个为一组,代表了某一个尺度(某一种划分方式)的预测结果。总共有两个尺度。
 

torch.from_numpy()函数

简单说一下,就是torch.from_numpy()方法把数组转换成张量,且二者共享内存,对张量进行修改比如重新赋值,那么原始数组也会相应发生改变

Example:

>>> a = numpy.array([1, 2, 3])
>>> t = torch.from_numpy(a)
>>> t
tensor([ 1, 2, 3])
>>> t[0] = -1
>>> a
array([-1, 2, 3])

 

posted @ 2022-12-31 16:10  Yuxi001  阅读(16)  评论(0编辑  收藏  举报