NanodetPlus网络结构(纯水文)

根据 GitHub - RangiLyu/nanodet: NanoDet-Plus⚡Super fast and lightweight anchor-free object detection model. 🔥Only 980 KB(int8) / 1.8MB (fp16) and run 97FPS on cellphone🔥

打印调试得出

NanoDetPlus(
  (backbone): ShuffleNetV2(
    (conv1): Sequential(
      (0): Conv2d(3, 24, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
      (1): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
      (2): LeakyReLU(negative_slope=0.1, inplace=True)
    )
    (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
    (stage2): Sequential(
      (0): ShuffleV2Block(
        (branch1): Sequential(
          (0): Conv2d(24, 24, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=24, bias=False)
          (1): BatchNorm2d(24, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): Conv2d(24, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (3): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (4): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (branch2): Sequential(
          (0): Conv2d(24, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(58, 58, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=58, bias=False)
          (4): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (1): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(58, 58, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=58, bias=False)
          (4): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (2): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(58, 58, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=58, bias=False)
          (4): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (3): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(58, 58, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=58, bias=False)
          (4): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(58, 58, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(58, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
    )
    (stage3): Sequential(
      (0): ShuffleV2Block(
        (branch1): Sequential(
          (0): Conv2d(116, 116, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=116, bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (3): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (4): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (1): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (2): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (3): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (4): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (5): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (6): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (7): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(116, 116, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=116, bias=False)
          (4): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(116, 116, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(116, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
    )
    (stage4): Sequential(
      (0): ShuffleV2Block(
        (branch1): Sequential(
          (0): Conv2d(232, 232, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=232, bias=False)
          (1): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (3): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (4): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (branch2): Sequential(
          (0): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(232, 232, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), groups=232, bias=False)
          (4): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (1): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(232, 232, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=232, bias=False)
          (4): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (2): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(232, 232, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=232, bias=False)
          (4): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (3): ShuffleV2Block(
        (branch1): Sequential()
        (branch2): Sequential(
          (0): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (1): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (2): LeakyReLU(negative_slope=0.1, inplace=True)
          (3): Conv2d(232, 232, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=232, bias=False)
          (4): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (5): Conv2d(232, 232, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (6): BatchNorm2d(232, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (7): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
    )
  )
  (fpn): GhostPAN(
    (upsample): Upsample(scale_factor=2.0, mode=bilinear)
    (reduce_layers): ModuleList(
      (0): ConvModule(
        (conv): Conv2d(116, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): ConvModule(
        (conv): Conv2d(232, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (2): ConvModule(
        (conv): Conv2d(464, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (top_down_blocks): ModuleList(
      (0): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
      (1): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
    )
    (downsamples): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (bottom_up_blocks): ModuleList(
      (0): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
      (1): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
    )
    (extra_lvl_in_conv): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (extra_lvl_out_conv): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
  )
  (head): NanoDetPlusHead(
    (distribution_project): Integral()
    (loss_qfl): QualityFocalLoss()
    (loss_dfl): DistributionFocalLoss()
    (loss_bbox): GIoULoss()
    (cls_convs): ModuleList(
      (0): ModuleList(
        (0): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (1): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (1): ModuleList(
        (0): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (1): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (2): ModuleList(
        (0): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (1): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
      (3): ModuleList(
        (0): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
        (1): DepthwiseConvModule(
          (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=96, bias=False)
          (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
          (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
          (act): LeakyReLU(negative_slope=0.1, inplace=True)
        )
      )
    )
    (gfl_cls): ModuleList(
      (0): Conv2d(96, 52, kernel_size=(1, 1), stride=(1, 1))
      (1): Conv2d(96, 52, kernel_size=(1, 1), stride=(1, 1))
      (2): Conv2d(96, 52, kernel_size=(1, 1), stride=(1, 1))
      (3): Conv2d(96, 52, kernel_size=(1, 1), stride=(1, 1))
    )
  )
  (aux_fpn): GhostPAN(
    (upsample): Upsample(scale_factor=2.0, mode=bilinear)
    (reduce_layers): ModuleList(
      (0): ConvModule(
        (conv): Conv2d(116, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): ConvModule(
        (conv): Conv2d(232, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (2): ConvModule(
        (conv): Conv2d(464, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (bn): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (top_down_blocks): ModuleList(
      (0): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
      (1): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
    )
    (downsamples): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (bottom_up_blocks): ModuleList(
      (0): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
      (1): GhostBlocks(
        (blocks): Sequential(
          (0): GhostBottleneck(
            (ghost1): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(192, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): LeakyReLU(negative_slope=0.1, inplace=True)
              )
            )
            (ghost2): GhostModule(
              (primary_conv): Sequential(
                (0): Conv2d(96, 48, kernel_size=(1, 1), stride=(1, 1), bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
              (cheap_operation): Sequential(
                (0): Conv2d(48, 48, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=48, bias=False)
                (1): BatchNorm2d(48, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
                (2): Sequential()
              )
            )
            (shortcut): Sequential(
              (0): Conv2d(192, 192, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2), groups=192, bias=False)
              (1): BatchNorm2d(192, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
              (2): Conv2d(192, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
              (3): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
            )
          )
        )
      )
    )
    (extra_lvl_in_conv): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (extra_lvl_out_conv): ModuleList(
      (0): DepthwiseConvModule(
        (depthwise): Conv2d(96, 96, kernel_size=(5, 5), stride=(2, 2), padding=(2, 2), groups=96, bias=False)
        (pointwise): Conv2d(96, 96, kernel_size=(1, 1), stride=(1, 1), bias=False)
        (dwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (pwnorm): BatchNorm2d(96, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
  )
  (aux_head): SimpleConvHead(
    (relu): ReLU(inplace=True)
    (cls_convs): ModuleList(
      (0): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (2): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (3): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (reg_convs): ModuleList(
      (0): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (1): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (2): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
      (3): ConvModule(
        (conv): Conv2d(192, 192, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
        (gn): GroupNorm(32, 192, eps=1e-05, affine=True)
        (act): LeakyReLU(negative_slope=0.1, inplace=True)
      )
    )
    (gfl_cls): Conv2d(192, 20, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (gfl_reg): Conv2d(192, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (scales): ModuleList(
      (0): Scale()
      (1): Scale()
      (2): Scale()
      (3): Scale()
    )
  )
)
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值