PKaushik commited on
Commit
6d070d6
·
1 Parent(s): 331b555
Files changed (1) hide show
  1. yolov6/models/reppan.py +108 -0
yolov6/models/reppan.py ADDED
@@ -0,0 +1,108 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import torch
2
+ from torch import nn
3
+ from yolov6.layers.common import RepBlock, SimConv, Transpose
4
+
5
+
6
+ class RepPANNeck(nn.Module):
7
+ """RepPANNeck Module
8
+ EfficientRep is the default backbone of this model.
9
+ RepPANNeck has the balance of feature fusion ability and hardware efficiency.
10
+ """
11
+
12
+ def __init__(
13
+ self,
14
+ channels_list=None,
15
+ num_repeats=None
16
+ ):
17
+ super().__init__()
18
+
19
+ assert channels_list is not None
20
+ assert num_repeats is not None
21
+
22
+ self.Rep_p4 = RepBlock(
23
+ in_channels=channels_list[3] + channels_list[5],
24
+ out_channels=channels_list[5],
25
+ n=num_repeats[5],
26
+ )
27
+
28
+ self.Rep_p3 = RepBlock(
29
+ in_channels=channels_list[2] + channels_list[6],
30
+ out_channels=channels_list[6],
31
+ n=num_repeats[6]
32
+ )
33
+
34
+ self.Rep_n3 = RepBlock(
35
+ in_channels=channels_list[6] + channels_list[7],
36
+ out_channels=channels_list[8],
37
+ n=num_repeats[7],
38
+ )
39
+
40
+ self.Rep_n4 = RepBlock(
41
+ in_channels=channels_list[5] + channels_list[9],
42
+ out_channels=channels_list[10],
43
+ n=num_repeats[8]
44
+ )
45
+
46
+ self.reduce_layer0 = SimConv(
47
+ in_channels=channels_list[4],
48
+ out_channels=channels_list[5],
49
+ kernel_size=1,
50
+ stride=1
51
+ )
52
+
53
+ self.upsample0 = Transpose(
54
+ in_channels=channels_list[5],
55
+ out_channels=channels_list[5],
56
+ )
57
+
58
+ self.reduce_layer1 = SimConv(
59
+ in_channels=channels_list[5],
60
+ out_channels=channels_list[6],
61
+ kernel_size=1,
62
+ stride=1
63
+ )
64
+
65
+ self.upsample1 = Transpose(
66
+ in_channels=channels_list[6],
67
+ out_channels=channels_list[6]
68
+ )
69
+
70
+ self.downsample2 = SimConv(
71
+ in_channels=channels_list[6],
72
+ out_channels=channels_list[7],
73
+ kernel_size=3,
74
+ stride=2
75
+ )
76
+
77
+ self.downsample1 = SimConv(
78
+ in_channels=channels_list[8],
79
+ out_channels=channels_list[9],
80
+ kernel_size=3,
81
+ stride=2
82
+ )
83
+
84
+ def forward(self, input):
85
+
86
+ (x2, x1, x0) = input
87
+
88
+ fpn_out0 = self.reduce_layer0(x0)
89
+ upsample_feat0 = self.upsample0(fpn_out0)
90
+ f_concat_layer0 = torch.cat([upsample_feat0, x1], 1)
91
+ f_out0 = self.Rep_p4(f_concat_layer0)
92
+
93
+ fpn_out1 = self.reduce_layer1(f_out0)
94
+ upsample_feat1 = self.upsample1(fpn_out1)
95
+ f_concat_layer1 = torch.cat([upsample_feat1, x2], 1)
96
+ pan_out2 = self.Rep_p3(f_concat_layer1)
97
+
98
+ down_feat1 = self.downsample2(pan_out2)
99
+ p_concat_layer1 = torch.cat([down_feat1, fpn_out1], 1)
100
+ pan_out1 = self.Rep_n3(p_concat_layer1)
101
+
102
+ down_feat0 = self.downsample1(pan_out1)
103
+ p_concat_layer2 = torch.cat([down_feat0, fpn_out0], 1)
104
+ pan_out0 = self.Rep_n4(p_concat_layer2)
105
+
106
+ outputs = [pan_out2, pan_out1, pan_out0]
107
+
108
+ return outputs