-
Notifications
You must be signed in to change notification settings - Fork 23
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
22 changed files
with
1,802 additions
and
0 deletions.
There are no files selected for viewing
Empty file.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,140 @@ | ||
# YOLOv5 experimental modules | ||
|
||
import numpy as np | ||
import torch | ||
import torch.nn as nn | ||
|
||
from models.common import Conv, DWConv | ||
from utils.google_utils import attempt_download | ||
|
||
|
||
class CrossConv(nn.Module): | ||
# Cross Convolution Downsample | ||
def __init__(self, c1, c2, k=3, s=1, g=1, e=1.0, shortcut=False): | ||
# ch_in, ch_out, kernel, stride, groups, expansion, shortcut | ||
super(CrossConv, self).__init__() | ||
c_ = int(c2 * e) # hidden channels | ||
self.cv1 = Conv(c1, c_, (1, k), (1, s)) | ||
self.cv2 = Conv(c_, c2, (k, 1), (s, 1), g=g) | ||
self.add = shortcut and c1 == c2 | ||
|
||
def forward(self, x): | ||
return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x)) | ||
|
||
|
||
class Sum(nn.Module): | ||
# Weighted sum of 2 or more layers https://arxiv.org/abs/1911.09070 | ||
def __init__(self, n, weight=False): # n: number of inputs | ||
super(Sum, self).__init__() | ||
self.weight = weight # apply weights boolean | ||
self.iter = range(n - 1) # iter object | ||
if weight: | ||
self.w = nn.Parameter(-torch.arange(1., n) / 2, requires_grad=True) # layer weights | ||
|
||
def forward(self, x): | ||
y = x[0] # no weight | ||
if self.weight: | ||
w = torch.sigmoid(self.w) * 2 | ||
for i in self.iter: | ||
y = y + x[i + 1] * w[i] | ||
else: | ||
for i in self.iter: | ||
y = y + x[i + 1] | ||
return y | ||
|
||
|
||
class GhostConv(nn.Module): | ||
# Ghost Convolution https://github.com/huawei-noah/ghostnet | ||
def __init__(self, c1, c2, k=1, s=1, g=1, act=True): # ch_in, ch_out, kernel, stride, groups | ||
super(GhostConv, self).__init__() | ||
c_ = c2 // 2 # hidden channels | ||
self.cv1 = Conv(c1, c_, k, s, None, g, act) | ||
self.cv2 = Conv(c_, c_, 5, 1, None, c_, act) | ||
|
||
def forward(self, x): | ||
y = self.cv1(x) | ||
return torch.cat([y, self.cv2(y)], 1) | ||
|
||
|
||
class GhostBottleneck(nn.Module): | ||
# Ghost Bottleneck https://github.com/huawei-noah/ghostnet | ||
def __init__(self, c1, c2, k=3, s=1): # ch_in, ch_out, kernel, stride | ||
super(GhostBottleneck, self).__init__() | ||
c_ = c2 // 2 | ||
self.conv = nn.Sequential(GhostConv(c1, c_, 1, 1), # pw | ||
DWConv(c_, c_, k, s, act=False) if s == 2 else nn.Identity(), # dw | ||
GhostConv(c_, c2, 1, 1, act=False)) # pw-linear | ||
self.shortcut = nn.Sequential(DWConv(c1, c1, k, s, act=False), | ||
Conv(c1, c2, 1, 1, act=False)) if s == 2 else nn.Identity() | ||
|
||
def forward(self, x): | ||
return self.conv(x) + self.shortcut(x) | ||
|
||
|
||
class MixConv2d(nn.Module): | ||
# Mixed Depthwise Conv https://arxiv.org/abs/1907.09595 | ||
def __init__(self, c1, c2, k=(1, 3), s=1, equal_ch=True): | ||
super(MixConv2d, self).__init__() | ||
groups = len(k) | ||
if equal_ch: # equal c_ per group | ||
i = torch.linspace(0, groups - 1E-6, c2).floor() # c2 indices | ||
c_ = [(i == g).sum() for g in range(groups)] # intermediate channels | ||
else: # equal weight.numel() per group | ||
b = [c2] + [0] * groups | ||
a = np.eye(groups + 1, groups, k=-1) | ||
a -= np.roll(a, 1, axis=1) | ||
a *= np.array(k) ** 2 | ||
a[0] = 1 | ||
c_ = np.linalg.lstsq(a, b, rcond=None)[0].round() # solve for equal weight indices, ax = b | ||
|
||
self.m = nn.ModuleList([nn.Conv2d(c1, int(c_[g]), k[g], s, k[g] // 2, bias=False) for g in range(groups)]) | ||
self.bn = nn.BatchNorm2d(c2) | ||
self.act = nn.LeakyReLU(0.1, inplace=True) | ||
|
||
def forward(self, x): | ||
return x + self.act(self.bn(torch.cat([m(x) for m in self.m], 1))) | ||
|
||
|
||
class Ensemble(nn.ModuleList): | ||
# Ensemble of models | ||
def __init__(self): | ||
super(Ensemble, self).__init__() | ||
|
||
def forward(self, x, augment=False): | ||
y = [] | ||
for module in self: | ||
y.append(module(x, augment)[0]) | ||
# y = torch.stack(y).max(0)[0] # max ensemble | ||
# y = torch.stack(y).mean(0) # mean ensemble | ||
y = torch.cat(y, 1) # nms ensemble | ||
return y, None # inference, train output | ||
|
||
|
||
def attempt_load(weights, map_location=None, inplace=True): | ||
from models.yolo import Detect, Model | ||
|
||
# Loads an ensemble of models weights=[a,b,c] or a single model weights=[a] or weights=a | ||
model = Ensemble() | ||
for w in weights if isinstance(weights, list) else [weights]: | ||
ckpt = torch.load(attempt_download(w), map_location=map_location) # load | ||
model.append(ckpt['ema' if ckpt.get('ema') else 'model'].float().fuse().eval()) # FP32 model | ||
|
||
# Compatibility updates | ||
for m in model.modules(): | ||
if type(m) in [nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU, Detect, Model]: | ||
m.inplace = inplace # pytorch 1.7.0 compatibility | ||
elif type(m) is Conv: | ||
m._non_persistent_buffers_set = set() # pytorch 1.6.0 compatibility | ||
|
||
if len(model) == 1: | ||
print("Condition one: model length is 1") | ||
|
||
return model[-1] # return model | ||
else: | ||
print("Condition two: model length is large than one") | ||
|
||
print(f'Ensemble created with {weights}\n') | ||
for k in ['names']: | ||
setattr(model, k, getattr(model[-1], k)) | ||
model.stride = model[torch.argmax(torch.tensor([m.stride.max() for m in model])).int()].stride # max stride | ||
return model # return ensemble |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
# Default YOLOv5 anchors for COCO data | ||
|
||
|
||
# P5 ------------------------------------------------------------------------------------------------------------------- | ||
# P5-640: | ||
anchors_p5_640: | ||
- [ 10,13, 16,30, 33,23 ] # P3/8 | ||
- [ 30,61, 62,45, 59,119 ] # P4/16 | ||
- [ 116,90, 156,198, 373,326 ] # P5/32 | ||
|
||
|
||
# P6 ------------------------------------------------------------------------------------------------------------------- | ||
# P6-640: thr=0.25: 0.9964 BPR, 5.54 anchors past thr, n=12, img_size=640, metric_all=0.281/0.716-mean/best, past_thr=0.469-mean: 9,11, 21,19, 17,41, 43,32, 39,70, 86,64, 65,131, 134,130, 120,265, 282,180, 247,354, 512,387 | ||
anchors_p6_640: | ||
- [ 9,11, 21,19, 17,41 ] # P3/8 | ||
- [ 43,32, 39,70, 86,64 ] # P4/16 | ||
- [ 65,131, 134,130, 120,265 ] # P5/32 | ||
- [ 282,180, 247,354, 512,387 ] # P6/64 | ||
|
||
# P6-1280: thr=0.25: 0.9950 BPR, 5.55 anchors past thr, n=12, img_size=1280, metric_all=0.281/0.714-mean/best, past_thr=0.468-mean: 19,27, 44,40, 38,94, 96,68, 86,152, 180,137, 140,301, 303,264, 238,542, 436,615, 739,380, 925,792 | ||
anchors_p6_1280: | ||
- [ 19,27, 44,40, 38,94 ] # P3/8 | ||
- [ 96,68, 86,152, 180,137 ] # P4/16 | ||
- [ 140,301, 303,264, 238,542 ] # P5/32 | ||
- [ 436,615, 739,380, 925,792 ] # P6/64 | ||
|
||
# P6-1920: thr=0.25: 0.9950 BPR, 5.55 anchors past thr, n=12, img_size=1920, metric_all=0.281/0.714-mean/best, past_thr=0.468-mean: 28,41, 67,59, 57,141, 144,103, 129,227, 270,205, 209,452, 455,396, 358,812, 653,922, 1109,570, 1387,1187 | ||
anchors_p6_1920: | ||
- [ 28,41, 67,59, 57,141 ] # P3/8 | ||
- [ 144,103, 129,227, 270,205 ] # P4/16 | ||
- [ 209,452, 455,396, 358,812 ] # P5/32 | ||
- [ 653,922, 1109,570, 1387,1187 ] # P6/64 | ||
|
||
|
||
# P7 ------------------------------------------------------------------------------------------------------------------- | ||
# P7-640: thr=0.25: 0.9962 BPR, 6.76 anchors past thr, n=15, img_size=640, metric_all=0.275/0.733-mean/best, past_thr=0.466-mean: 11,11, 13,30, 29,20, 30,46, 61,38, 39,92, 78,80, 146,66, 79,163, 149,150, 321,143, 157,303, 257,402, 359,290, 524,372 | ||
anchors_p7_640: | ||
- [ 11,11, 13,30, 29,20 ] # P3/8 | ||
- [ 30,46, 61,38, 39,92 ] # P4/16 | ||
- [ 78,80, 146,66, 79,163 ] # P5/32 | ||
- [ 149,150, 321,143, 157,303 ] # P6/64 | ||
- [ 257,402, 359,290, 524,372 ] # P7/128 | ||
|
||
# P7-1280: thr=0.25: 0.9968 BPR, 6.71 anchors past thr, n=15, img_size=1280, metric_all=0.273/0.732-mean/best, past_thr=0.463-mean: 19,22, 54,36, 32,77, 70,83, 138,71, 75,173, 165,159, 148,334, 375,151, 334,317, 251,626, 499,474, 750,326, 534,814, 1079,818 | ||
anchors_p7_1280: | ||
- [ 19,22, 54,36, 32,77 ] # P3/8 | ||
- [ 70,83, 138,71, 75,173 ] # P4/16 | ||
- [ 165,159, 148,334, 375,151 ] # P5/32 | ||
- [ 334,317, 251,626, 499,474 ] # P6/64 | ||
- [ 750,326, 534,814, 1079,818 ] # P7/128 | ||
|
||
# P7-1920: thr=0.25: 0.9968 BPR, 6.71 anchors past thr, n=15, img_size=1920, metric_all=0.273/0.732-mean/best, past_thr=0.463-mean: 29,34, 81,55, 47,115, 105,124, 207,107, 113,259, 247,238, 222,500, 563,227, 501,476, 376,939, 749,711, 1126,489, 801,1222, 1618,1227 | ||
anchors_p7_1920: | ||
- [ 29,34, 81,55, 47,115 ] # P3/8 | ||
- [ 105,124, 207,107, 113,259 ] # P4/16 | ||
- [ 247,238, 222,500, 563,227 ] # P5/32 | ||
- [ 501,476, 376,939, 749,711 ] # P6/64 | ||
- [ 1126,489, 801,1222, 1618,1227 ] # P7/128 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# parameters | ||
nc: 80 # number of classes | ||
depth_multiple: 1.0 # model depth multiple | ||
width_multiple: 1.0 # layer channel multiple | ||
|
||
# anchors | ||
anchors: | ||
- [10,13, 16,30, 33,23] # P3/8 | ||
- [30,61, 62,45, 59,119] # P4/16 | ||
- [116,90, 156,198, 373,326] # P5/32 | ||
|
||
# darknet53 backbone | ||
backbone: | ||
# [from, number, module, args] | ||
[[-1, 1, Conv, [32, 3, 1]], # 0 | ||
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2 | ||
[-1, 1, Bottleneck, [64]], | ||
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4 | ||
[-1, 2, Bottleneck, [128]], | ||
[-1, 1, Conv, [256, 3, 2]], # 5-P3/8 | ||
[-1, 8, Bottleneck, [256]], | ||
[-1, 1, Conv, [512, 3, 2]], # 7-P4/16 | ||
[-1, 8, Bottleneck, [512]], | ||
[-1, 1, Conv, [1024, 3, 2]], # 9-P5/32 | ||
[-1, 4, Bottleneck, [1024]], # 10 | ||
] | ||
|
||
# YOLOv3-SPP head | ||
head: | ||
[[-1, 1, Bottleneck, [1024, False]], | ||
[-1, 1, SPP, [512, [5, 9, 13]]], | ||
[-1, 1, Conv, [1024, 3, 1]], | ||
[-1, 1, Conv, [512, 1, 1]], | ||
[-1, 1, Conv, [1024, 3, 1]], # 15 (P5/32-large) | ||
|
||
[-2, 1, Conv, [256, 1, 1]], | ||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 8], 1, Concat, [1]], # cat backbone P4 | ||
[-1, 1, Bottleneck, [512, False]], | ||
[-1, 1, Bottleneck, [512, False]], | ||
[-1, 1, Conv, [256, 1, 1]], | ||
[-1, 1, Conv, [512, 3, 1]], # 22 (P4/16-medium) | ||
|
||
[-2, 1, Conv, [128, 1, 1]], | ||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 6], 1, Concat, [1]], # cat backbone P3 | ||
[-1, 1, Bottleneck, [256, False]], | ||
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small) | ||
|
||
[[27, 22, 15], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
# parameters | ||
nc: 80 # number of classes | ||
depth_multiple: 1.0 # model depth multiple | ||
width_multiple: 1.0 # layer channel multiple | ||
|
||
# anchors | ||
anchors: | ||
- [10,14, 23,27, 37,58] # P4/16 | ||
- [81,82, 135,169, 344,319] # P5/32 | ||
|
||
# YOLOv3-tiny backbone | ||
backbone: | ||
# [from, number, module, args] | ||
[[-1, 1, Conv, [16, 3, 1]], # 0 | ||
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 1-P1/2 | ||
[-1, 1, Conv, [32, 3, 1]], | ||
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 3-P2/4 | ||
[-1, 1, Conv, [64, 3, 1]], | ||
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 5-P3/8 | ||
[-1, 1, Conv, [128, 3, 1]], | ||
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 7-P4/16 | ||
[-1, 1, Conv, [256, 3, 1]], | ||
[-1, 1, nn.MaxPool2d, [2, 2, 0]], # 9-P5/32 | ||
[-1, 1, Conv, [512, 3, 1]], | ||
[-1, 1, nn.ZeroPad2d, [[0, 1, 0, 1]]], # 11 | ||
[-1, 1, nn.MaxPool2d, [2, 1, 0]], # 12 | ||
] | ||
|
||
# YOLOv3-tiny head | ||
head: | ||
[[-1, 1, Conv, [1024, 3, 1]], | ||
[-1, 1, Conv, [256, 1, 1]], | ||
[-1, 1, Conv, [512, 3, 1]], # 15 (P5/32-large) | ||
|
||
[-2, 1, Conv, [128, 1, 1]], | ||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 8], 1, Concat, [1]], # cat backbone P4 | ||
[-1, 1, Conv, [256, 3, 1]], # 19 (P4/16-medium) | ||
|
||
[[19, 15], 1, Detect, [nc, anchors]], # Detect(P4, P5) | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
# parameters | ||
nc: 80 # number of classes | ||
depth_multiple: 1.0 # model depth multiple | ||
width_multiple: 1.0 # layer channel multiple | ||
|
||
# anchors | ||
anchors: | ||
- [10,13, 16,30, 33,23] # P3/8 | ||
- [30,61, 62,45, 59,119] # P4/16 | ||
- [116,90, 156,198, 373,326] # P5/32 | ||
|
||
# darknet53 backbone | ||
backbone: | ||
# [from, number, module, args] | ||
[[-1, 1, Conv, [32, 3, 1]], # 0 | ||
[-1, 1, Conv, [64, 3, 2]], # 1-P1/2 | ||
[-1, 1, Bottleneck, [64]], | ||
[-1, 1, Conv, [128, 3, 2]], # 3-P2/4 | ||
[-1, 2, Bottleneck, [128]], | ||
[-1, 1, Conv, [256, 3, 2]], # 5-P3/8 | ||
[-1, 8, Bottleneck, [256]], | ||
[-1, 1, Conv, [512, 3, 2]], # 7-P4/16 | ||
[-1, 8, Bottleneck, [512]], | ||
[-1, 1, Conv, [1024, 3, 2]], # 9-P5/32 | ||
[-1, 4, Bottleneck, [1024]], # 10 | ||
] | ||
|
||
# YOLOv3 head | ||
head: | ||
[[-1, 1, Bottleneck, [1024, False]], | ||
[-1, 1, Conv, [512, [1, 1]]], | ||
[-1, 1, Conv, [1024, 3, 1]], | ||
[-1, 1, Conv, [512, 1, 1]], | ||
[-1, 1, Conv, [1024, 3, 1]], # 15 (P5/32-large) | ||
|
||
[-2, 1, Conv, [256, 1, 1]], | ||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 8], 1, Concat, [1]], # cat backbone P4 | ||
[-1, 1, Bottleneck, [512, False]], | ||
[-1, 1, Bottleneck, [512, False]], | ||
[-1, 1, Conv, [256, 1, 1]], | ||
[-1, 1, Conv, [512, 3, 1]], # 22 (P4/16-medium) | ||
|
||
[-2, 1, Conv, [128, 1, 1]], | ||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 6], 1, Concat, [1]], # cat backbone P3 | ||
[-1, 1, Bottleneck, [256, False]], | ||
[-1, 2, Bottleneck, [256, False]], # 27 (P3/8-small) | ||
|
||
[[27, 22, 15], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# parameters | ||
nc: 80 # number of classes | ||
depth_multiple: 1.0 # model depth multiple | ||
width_multiple: 1.0 # layer channel multiple | ||
|
||
# anchors | ||
anchors: | ||
- [10,13, 16,30, 33,23] # P3/8 | ||
- [30,61, 62,45, 59,119] # P4/16 | ||
- [116,90, 156,198, 373,326] # P5/32 | ||
|
||
# YOLOv5 backbone | ||
backbone: | ||
# [from, number, module, args] | ||
[[-1, 1, Focus, [64, 3]], # 0-P1/2 | ||
[-1, 1, Conv, [128, 3, 2]], # 1-P2/4 | ||
[-1, 3, Bottleneck, [128]], | ||
[-1, 1, Conv, [256, 3, 2]], # 3-P3/8 | ||
[-1, 9, BottleneckCSP, [256]], | ||
[-1, 1, Conv, [512, 3, 2]], # 5-P4/16 | ||
[-1, 9, BottleneckCSP, [512]], | ||
[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 | ||
[-1, 1, SPP, [1024, [5, 9, 13]]], | ||
[-1, 6, BottleneckCSP, [1024]], # 9 | ||
] | ||
|
||
# YOLOv5 FPN head | ||
head: | ||
[[-1, 3, BottleneckCSP, [1024, False]], # 10 (P5/32-large) | ||
|
||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 6], 1, Concat, [1]], # cat backbone P4 | ||
[-1, 1, Conv, [512, 1, 1]], | ||
[-1, 3, BottleneckCSP, [512, False]], # 14 (P4/16-medium) | ||
|
||
[-1, 1, nn.Upsample, [None, 2, 'nearest']], | ||
[[-1, 4], 1, Concat, [1]], # cat backbone P3 | ||
[-1, 1, Conv, [256, 1, 1]], | ||
[-1, 3, BottleneckCSP, [256, False]], # 18 (P3/8-small) | ||
|
||
[[18, 14, 10], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) | ||
] |
Oops, something went wrong.