Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jantic
GitHub Repository: jantic/deoldify
Path: blob/master/fastai/vision/models/darknet.py
781 views
1
from ...torch_core import *
2
from ...layers import *
3
4
__all__ = ['Darknet', 'ResLayer']
5
6
def conv_bn_lrelu(ni:int, nf:int, ks:int=3, stride:int=1)->nn.Sequential:
7
"Create a seuence Conv2d->BatchNorm2d->LeakyReLu layer."
8
return nn.Sequential(
9
nn.Conv2d(ni, nf, kernel_size=ks, bias=False, stride=stride, padding=ks//2),
10
nn.BatchNorm2d(nf),
11
nn.LeakyReLU(negative_slope=0.1, inplace=True))
12
13
class ResLayer(Module):
14
"Resnet style layer with `ni` inputs."
15
def __init__(self, ni:int):
16
self.conv1 = conv_bn_lrelu(ni, ni//2, ks=1)
17
self.conv2 = conv_bn_lrelu(ni//2, ni, ks=3)
18
19
def forward(self, x): return x + self.conv2(self.conv1(x))
20
21
class Darknet(Module):
22
"https://github.com/pjreddie/darknet"
23
def make_group_layer(self, ch_in:int, num_blocks:int, stride:int=1):
24
"starts with conv layer - `ch_in` channels in - then has `num_blocks` `ResLayer`"
25
return [conv_bn_lrelu(ch_in, ch_in*2,stride=stride)
26
] + [(ResLayer(ch_in*2)) for i in range(num_blocks)]
27
28
def __init__(self, num_blocks:Collection[int], num_classes:int, nf=32):
29
"create darknet with `nf` and `num_blocks` layers"
30
layers = [conv_bn_lrelu(3, nf, ks=3, stride=1)]
31
for i,nb in enumerate(num_blocks):
32
layers += self.make_group_layer(nf, nb, stride=2-(i==1))
33
nf *= 2
34
layers += [nn.AdaptiveAvgPool2d(1), Flatten(), nn.Linear(nf, num_classes)]
35
self.layers = nn.Sequential(*layers)
36
37
def forward(self, x): return self.layers(x)
38
39