in cvnets/models/detection/ssd.py [0:0]
def profile_model(self, input: Tensor) -> None:
# Note: Model profiling is for reference only and may contain errors.
# It relies heavily on the user to implement the underlying functions accurately.
overall_params, overall_macs = 0.0, 0.0
logger.log('Model statistics for an input of size {}'.format(input.size()))
logger.double_dash_line(dashes=65)
print('{:>35} Summary'.format(self.__class__.__name__))
logger.double_dash_line(dashes=65)
# profile encoder
enc_str = logger.text_colors['logs'] + logger.text_colors['bold'] + 'Encoder ' + logger.text_colors[
'end_color']
print('{:>45}'.format(enc_str))
enc_end_points, encoder_params, encoder_macs = self.encoder.profile_model(input, is_classification=False)
ssd_head_params = ssd_head_macs = 0.0
x = enc_end_points["out_l5"]
for os, ssd_head in zip(self.output_strides, self.ssd_heads):
if os == 8:
_, p, m = module_profile(module=ssd_head, x=enc_end_points["out_l3"])
ssd_head_params += p
ssd_head_macs += m
elif os == 16:
_, p, m = module_profile(module=ssd_head, x=enc_end_points["out_l4"])
ssd_head_params += p
ssd_head_macs += m
elif os == 32:
_, p, m = module_profile(module=ssd_head, x=enc_end_points["out_l5"])
ssd_head_params += p
ssd_head_macs += m
else: # for all other feature maps with os > 32
x, p1, m1 = module_profile(module=self.extra_layers["os_{}".format(os)], x=x)
_, p2, m2 = module_profile(module=ssd_head, x=x)
ssd_head_params += (p1 + p2)
ssd_head_macs += (m1 + m2)
overall_params += (encoder_params + ssd_head_params)
overall_macs += (encoder_macs + ssd_head_macs)
ssd_str = logger.text_colors['logs'] + logger.text_colors['bold'] + 'SSD ' + logger.text_colors[
'end_color']
print('{:>45}'.format(ssd_str))
print(
'{:<15} \t {:<5}: {:>8.3f} M \t {:<5}: {:>8.3f} M'.format(
self.__class__.__name__,
'Params',
round(ssd_head_params / 1e6, 3),
'MACs',
round(ssd_head_macs / 1e6, 3)
)
)
logger.double_dash_line(dashes=65)
print('{:<20} = {:>8.3f} M'.format('Overall parameters', overall_params / 1e6))
# Counting Addition and Multiplication as 1 operation
print('{:<20} = {:>8.3f} M'.format('Overall MACs', overall_macs / 1e6))
overall_params_py = sum([p.numel() for p in self.parameters()])
print('{:<20} = {:>8.3f} M'.format('Overall parameters (sanity check)', overall_params_py / 1e6))
logger.double_dash_line(dashes=65)