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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
| class LUMAYOLOBackbone(nn.Module): """ LUMA-YOLO 骨干网络 基于YOLO26优化: 1. 减少深层冗余层 2. 使用深度可分离卷积 3. 融合光照自适应模块 """ def __init__(self, in_channels: int = 3, base_channels: int = 32): super().__init__() self.iam = IlluminationAdaptiveModule(in_channels) self.stem = nn.Sequential( nn.Conv2d(in_channels, base_channels, 3, stride=2, padding=1), nn.BatchNorm2d(base_channels), nn.SiLU() ) self.stage1 = self._make_stage(base_channels, base_channels*2, 1) self.stage2 = self._make_stage_ds(base_channels*2, base_channels*4, 2) self.stage3 = self._make_stage_ds(base_channels*4, base_channels*8, 2) self.stage4 = nn.Sequential( self._make_stage_ds(base_channels*8, base_channels*16, 1), self._spp_block(base_channels*16) ) def _make_stage(self, in_ch, out_ch, num_blocks): layers = [nn.Sequential( nn.Conv2d(in_ch, out_ch, 3, stride=2, padding=1), nn.BatchNorm2d(out_ch), nn.SiLU() )] for _ in range(num_blocks): layers.append(nn.Sequential( nn.Conv2d(out_ch, out_ch, 3, padding=1), nn.BatchNorm2d(out_ch), nn.SiLU() )) return nn.Sequential(*layers) def _make_stage_ds(self, in_ch, out_ch, num_blocks): """深度可分离卷积stage""" layers = [nn.Sequential( nn.Conv2d(in_ch, in_ch, 3, stride=2, padding=1, groups=in_ch), nn.Conv2d(in_ch, out_ch, 1), nn.BatchNorm2d(out_ch), nn.SiLU() )] for _ in range(num_blocks): layers.append(nn.Sequential( nn.Conv2d(out_ch, out_ch, 3, padding=1, groups=out_ch), nn.Conv2d(out_ch, out_ch, 1), nn.BatchNorm2d(out_ch), nn.SiLU() )) return nn.Sequential(*layers) def _spp_block(self, channels): """SPP模块""" return nn.Sequential( nn.Conv2d(channels, channels//2, 1), nn.SiLU(), nn.AdaptiveAvgPool2d(1), nn.Conv2d(channels//2, channels, 1), nn.Sigmoid() ) def forward(self, x): x, light_level = self.iam(x) c1 = self.stem(x) c2 = self.stage1(c1) c3 = self.stage2(c2) c4 = self.stage3(c3) c5 = self.stage4(c4) return [c2, c3, c4, c5], light_level
|