nathbns commited on
Commit
2cbd8d9
·
verified ·
1 Parent(s): d2d77fc

Update model.py

Browse files
Files changed (1) hide show
  1. model.py +88 -96
model.py CHANGED
@@ -1,110 +1,102 @@
1
  import torch
2
  import torch.nn as nn
3
 
4
- class CNN(nn.Module):
5
- """
6
- **kwargs tous les autre args, sous forme de dict,
7
- couche de convolution, bias=False parce que l'on batchNorm (il a son propre biais),
8
- leaky relue: si x > 0 -> x, sinon -> 0.1 * x
9
- """
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10
  def __init__(self, in_channels, out_channels, **kwargs):
11
- super().__init__()
12
  self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
13
  self.batchnorm = nn.BatchNorm2d(out_channels)
14
- self.leakyrelue = nn.LeakyReLU(0.1)
15
-
16
  def forward(self, x):
17
- return self.leakyrelue(self.batchnorm(self.conv(x)))
18
 
19
 
20
  class Yolo_V1(nn.Module):
21
- def __init__(self, in_channels=3, split_size=7, num_boxes=2, num_classes=20):
22
  super(Yolo_V1, self).__init__()
23
-
24
- # Darknet model, mais from scratch
25
- self.conv1 = CNN(in_channels, 64, kernel_size=7, stride=2, padding=3)
26
- self.maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2)
27
-
28
- self.conv2 = CNN(64, 192, kernel_size=3, stride=1, padding=1)
29
- self.maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2)
30
-
31
- self.conv3 = CNN(192, 128, kernel_size=1, stride=1, padding=0)
32
- self.conv4 = CNN(128, 256, kernel_size=3, stride=1, padding=1)
33
- self.conv5 = CNN(256, 256, kernel_size=1, stride=1, padding=0)
34
- self.conv6 = CNN(256, 512, kernel_size=3, stride=1, padding=1)
35
- self.maxpool3 = nn.MaxPool2d(kernel_size=2, stride=2)
36
-
37
- # Bloc répété 4 fois: (1x1 256) -> (3x3 512)
38
- self.conv7 = CNN(512, 256, kernel_size=1, stride=1, padding=0)
39
- self.conv8 = CNN(256, 512, kernel_size=3, stride=1, padding=1)
40
- self.conv9 = CNN(512, 256, kernel_size=1, stride=1, padding=0)
41
- self.conv10 = CNN(256, 512, kernel_size=3, stride=1, padding=1)
42
- self.conv11 = CNN(512, 256, kernel_size=1, stride=1, padding=0)
43
- self.conv12 = CNN(256, 512, kernel_size=3, stride=1, padding=1)
44
- self.conv13 = CNN(512, 256, kernel_size=1, stride=1, padding=0)
45
- self.conv14 = CNN(256, 512, kernel_size=3, stride=1, padding=1)
46
-
47
- self.conv15 = CNN(512, 512, kernel_size=1, stride=1, padding=0)
48
- self.conv16 = CNN(512, 1024, kernel_size=3, stride=1, padding=1)
49
- self.maxpool4 = nn.MaxPool2d(kernel_size=2, stride=2)
50
-
51
- # Bloc répété 2 fois: (1x1 512) -> (3x3 1024)
52
- self.conv17 = CNN(1024, 512, kernel_size=1, stride=1, padding=0)
53
- self.conv18 = CNN(512, 1024, kernel_size=3, stride=1, padding=1)
54
- self.conv19 = CNN(1024, 512, kernel_size=1, stride=1, padding=0)
55
- self.conv20 = CNN(512, 1024, kernel_size=3, stride=1, padding=1)
56
-
57
- self.conv21 = CNN(1024, 1024, kernel_size=3, stride=1, padding=1)
58
- self.conv22 = CNN(1024, 1024, kernel_size=3, stride=2, padding=1)
59
- self.conv23 = CNN(1024, 1024, kernel_size=3, stride=1, padding=1)
60
- self.conv24 = CNN(1024, 1024, kernel_size=3, stride=1, padding=1)
61
-
62
- # Head du modele
63
- S, B, C = split_size, num_boxes, num_classes
64
- self.fc1 = nn.Linear(1024 * S * S, 496)
65
- self.dropout = nn.Dropout(0.0)
66
- self.leaky = nn.LeakyReLU(0.1)
67
- self.fc2 = nn.Linear(496, S * S * (C + B * 5))
68
 
69
  def forward(self, x):
70
- x = self.conv1(x)
71
- x = self.maxpool1(x)
72
-
73
- x = self.conv2(x)
74
- x = self.maxpool2(x)
75
-
76
- x = self.conv3(x)
77
- x = self.conv4(x)
78
- x = self.conv5(x)
79
- x = self.conv6(x)
80
- x = self.maxpool3(x)
81
-
82
- x = self.conv7(x)
83
- x = self.conv8(x)
84
- x = self.conv9(x)
85
- x = self.conv10(x)
86
- x = self.conv11(x)
87
- x = self.conv12(x)
88
- x = self.conv13(x)
89
- x = self.conv14(x)
90
-
91
- x = self.conv15(x)
92
- x = self.conv16(x)
93
- x = self.maxpool4(x)
94
-
95
- x = self.conv17(x)
96
- x = self.conv18(x)
97
- x = self.conv19(x)
98
- x = self.conv20(x)
99
-
100
- x = self.conv21(x)
101
- x = self.conv22(x)
102
- x = self.conv23(x)
103
- x = self.conv24(x)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
- x = torch.flatten(x, start_dim=1)
106
- x = self.fc1(x)
107
- x = self.dropout(x)
108
- x = self.leaky(x)
109
- x = self.fc2(x)
110
- return x
 
 
1
  import torch
2
  import torch.nn as nn
3
 
4
+ architecture_config = [
5
+ (7, 64, 2, 3),
6
+ "M",
7
+ (3, 192, 1, 1),
8
+ "M",
9
+ (1, 128, 1, 0),
10
+ (3, 256, 1, 1),
11
+ (1, 256, 1, 0),
12
+ (3, 512, 1, 1),
13
+ "M",
14
+ [(1, 256, 1, 0), (3, 512, 1, 1), 4],
15
+ (1, 512, 1, 0),
16
+ (3, 1024, 1, 1),
17
+ "M",
18
+ [(1, 512, 1, 0), (3, 1024, 1, 1), 2],
19
+ (3, 1024, 1, 1),
20
+ (3, 1024, 2, 1),
21
+ (3, 1024, 1, 1),
22
+ (3, 1024, 1, 1),
23
+ ]
24
+
25
+
26
+ class CNNBlock(nn.Module):
27
  def __init__(self, in_channels, out_channels, **kwargs):
28
+ super(CNNBlock, self).__init__()
29
  self.conv = nn.Conv2d(in_channels, out_channels, bias=False, **kwargs)
30
  self.batchnorm = nn.BatchNorm2d(out_channels)
31
+ self.leakyrelu = nn.LeakyReLU(0.1)
32
+
33
  def forward(self, x):
34
+ return self.leakyrelu(self.batchnorm(self.conv(x)))
35
 
36
 
37
  class Yolo_V1(nn.Module):
38
+ def __init__(self, in_channels=3, **kwargs):
39
  super(Yolo_V1, self).__init__()
40
+ self.architecture = architecture_config
41
+ self.in_channels = in_channels
42
+ self.darknet = self._create_conv_layers(self.architecture)
43
+ self.fcs = self._create_fcs(**kwargs)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  def forward(self, x):
46
+ x = self.darknet(x)
47
+ return self.fcs(torch.flatten(x, start_dim=1))
48
+
49
+ def _create_conv_layers(self, architecture):
50
+ layers = []
51
+ in_channels = self.in_channels
52
+
53
+ for x in architecture:
54
+ if type(x) == tuple:
55
+ layers += [
56
+ CNNBlock(
57
+ in_channels, x[1], kernel_size=x[0], stride=x[2], padding=x[3],
58
+ )
59
+ ]
60
+ in_channels = x[1]
61
+
62
+ elif type(x) == str:
63
+ layers += [nn.MaxPool2d(kernel_size=(2, 2), stride=(2, 2))]
64
+
65
+ elif type(x) == list:
66
+ conv1 = x[0]
67
+ conv2 = x[1]
68
+ num_repeats = x[2]
69
+
70
+ for _ in range(num_repeats):
71
+ layers += [
72
+ CNNBlock(
73
+ in_channels,
74
+ conv1[1],
75
+ kernel_size=conv1[0],
76
+ stride=conv1[2],
77
+ padding=conv1[3],
78
+ )
79
+ ]
80
+ layers += [
81
+ CNNBlock(
82
+ conv1[1],
83
+ conv2[1],
84
+ kernel_size=conv2[0],
85
+ stride=conv2[2],
86
+ padding=conv2[3],
87
+ )
88
+ ]
89
+ in_channels = conv2[1]
90
+
91
+ return nn.Sequential(*layers)
92
+
93
+ def _create_fcs(self, split_size, num_boxes, num_classes):
94
+ S, B, C = split_size, num_boxes, num_classes
95
 
96
+ return nn.Sequential(
97
+ nn.Flatten(),
98
+ nn.Linear(1024 * S * S, 496),
99
+ nn.Dropout(0.0),
100
+ nn.LeakyReLU(0.1),
101
+ nn.Linear(496, S * S * (C + B * 5)),
102
+ )