Spaces:
Build error
Build error
commit
Browse files- 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
|