Unverified 提交 8aa2085a authored 作者: Glenn Jocher's avatar Glenn Jocher 提交者: GitHub

Refactor modules (#7823)

上级 f0007141
...@@ -78,9 +78,7 @@ class Ensemble(nn.ModuleList): ...@@ -78,9 +78,7 @@ class Ensemble(nn.ModuleList):
super().__init__() super().__init__()
def forward(self, x, augment=False, profile=False, visualize=False): def forward(self, x, augment=False, profile=False, visualize=False):
y = [] y = [module(x, augment, profile, visualize)[0] for module in self]
for module in self:
y.append(module(x, augment, profile, visualize)[0])
# y = torch.stack(y).max(0)[0] # max ensemble # y = torch.stack(y).max(0)[0] # max ensemble
# y = torch.stack(y).mean(0) # mean ensemble # y = torch.stack(y).mean(0) # mean ensemble
y = torch.cat(y, 1) # nms ensemble y = torch.cat(y, 1) # nms ensemble
...@@ -102,8 +100,7 @@ def attempt_load(weights, map_location=None, inplace=True, fuse=True): ...@@ -102,8 +100,7 @@ def attempt_load(weights, map_location=None, inplace=True, fuse=True):
t = type(m) t = type(m)
if t in (nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU, Detect, Model): if t in (nn.Hardswish, nn.LeakyReLU, nn.ReLU, nn.ReLU6, nn.SiLU, Detect, Model):
m.inplace = inplace # torch 1.7.0 compatibility m.inplace = inplace # torch 1.7.0 compatibility
if t is Detect: if t is Detect and not isinstance(m.anchor_grid, list):
if not isinstance(m.anchor_grid, list): # new Detect Layer compatibility
delattr(m, 'anchor_grid') delattr(m, 'anchor_grid')
setattr(m, 'anchor_grid', [torch.zeros(1)] * m.nl) setattr(m, 'anchor_grid', [torch.zeros(1)] * m.nl)
elif t is Conv: elif t is Conv:
...@@ -113,7 +110,6 @@ def attempt_load(weights, map_location=None, inplace=True, fuse=True): ...@@ -113,7 +110,6 @@ def attempt_load(weights, map_location=None, inplace=True, fuse=True):
if len(model) == 1: if len(model) == 1:
return model[-1] # return model return model[-1] # return model
else:
print(f'Ensemble created with {weights}\n') print(f'Ensemble created with {weights}\n')
for k in 'names', 'nc', 'yaml': for k in 'names', 'nc', 'yaml':
setattr(model, k, getattr(model[0], k)) setattr(model, k, getattr(model[0], k))
......
...@@ -362,7 +362,7 @@ class TFModel: ...@@ -362,7 +362,7 @@ class TFModel:
conf_thres=0.25): conf_thres=0.25):
y = [] # outputs y = [] # outputs
x = inputs x = inputs
for i, m in enumerate(self.model.layers): for m in self.model.layers:
if m.f != -1: # if not from previous layer if m.f != -1: # if not from previous layer
x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers x = y[m.f] if isinstance(m.f, int) else [x if j == -1 else y[j] for j in m.f] # from earlier layers
...@@ -377,7 +377,6 @@ class TFModel: ...@@ -377,7 +377,6 @@ class TFModel:
scores = probs * classes scores = probs * classes
if agnostic_nms: if agnostic_nms:
nms = AgnosticNMS()((boxes, classes, scores), topk_all, iou_thres, conf_thres) nms = AgnosticNMS()((boxes, classes, scores), topk_all, iou_thres, conf_thres)
return nms, x[1]
else: else:
boxes = tf.expand_dims(boxes, 2) boxes = tf.expand_dims(boxes, 2)
nms = tf.image.combined_non_max_suppression(boxes, nms = tf.image.combined_non_max_suppression(boxes,
...@@ -388,7 +387,6 @@ class TFModel: ...@@ -388,7 +387,6 @@ class TFModel:
conf_thres, conf_thres,
clip_boxes=False) clip_boxes=False)
return nms, x[1] return nms, x[1]
return x[0] # output only first tensor [1,6300,85] = [xywh, conf, class0, class1, ...] return x[0] # output only first tensor [1,6300,85] = [xywh, conf, class0, class1, ...]
# x = x[0][0] # [x(1,6300,85), ...] to x(6300,85) # x = x[0][0] # [x(1,6300,85), ...] to x(6300,85)
# xywh = x[..., :4] # x(6300,4) boxes # xywh = x[..., :4] # x(6300,4) boxes
...@@ -444,10 +442,10 @@ class AgnosticNMS(keras.layers.Layer): ...@@ -444,10 +442,10 @@ class AgnosticNMS(keras.layers.Layer):
def representative_dataset_gen(dataset, ncalib=100): def representative_dataset_gen(dataset, ncalib=100):
# Representative dataset generator for use with converter.representative_dataset, returns a generator of np arrays # Representative dataset generator for use with converter.representative_dataset, returns a generator of np arrays
for n, (path, img, im0s, vid_cap, string) in enumerate(dataset): for n, (path, img, im0s, vid_cap, string) in enumerate(dataset):
input = np.transpose(img, [1, 2, 0]) im = np.transpose(img, [1, 2, 0])
input = np.expand_dims(input, axis=0).astype(np.float32) im = np.expand_dims(im, axis=0).astype(np.float32)
input /= 255 im /= 255
yield [input] yield [im]
if n >= ncalib: if n >= ncalib:
break break
......
...@@ -197,7 +197,7 @@ class Model(nn.Module): ...@@ -197,7 +197,7 @@ class Model(nn.Module):
m(x.copy() if c else x) m(x.copy() if c else x)
dt.append((time_sync() - t) * 100) dt.append((time_sync() - t) * 100)
if m == self.model[0]: if m == self.model[0]:
LOGGER.info(f"{'time (ms)':>10s} {'GFLOPs':>10s} {'params':>10s} {'module'}") LOGGER.info(f"{'time (ms)':>10s} {'GFLOPs':>10s} {'params':>10s} module")
LOGGER.info(f'{dt[-1]:10.2f} {o:10.2f} {m.np:10.0f} {m.type}') LOGGER.info(f'{dt[-1]:10.2f} {o:10.2f} {m.np:10.0f} {m.type}')
if c: if c:
LOGGER.info(f"{sum(dt):10.2f} {'-':>10s} {'-':>10s} Total") LOGGER.info(f"{sum(dt):10.2f} {'-':>10s} {'-':>10s} Total")
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论