YOLOv9热力图绘制报错问题解决:TypeError: list indices must be integers or slices, not tuple

之前的很多项目中在使用YOLOv9系列的模型来绘制热力图的时候我选择的是GELAN系列的模型来计算的,后处理部分如下:

def postProcess(self, result):
    logits_ = result[:, 4:]
    boxes_ = result[:, :4]
    sorted, indices = torch.sort(logits_.max(1)[0], descending=True)
    return torch.transpose(logits_[0], dim0=0, dim1=1)[indices[0]], torch.transpose(boxes_[0], dim0=0, dim1=1)[indices[0]], xywh2xyxy(torch.transpose(boxes_[0], dim0=0, dim1=1)[indices[0]]).cpu().detach().numpy()

今天我训练了官方新发布的yolov9-t和hyolov9-s系列的模型之后,想要实践分析下轻量级的检测模型热力图的效果,但是在直接计算的时候报错,如下:

报错内容如下:

TypeError: list indices must be integers or slices, not tuple

这个猜测可能是因为YOLOv9模型多了一个分支造成的,这里考虑的解决办法应该有两种:

1、基于YOLOv9系列的模型重新改造后处理逻辑

2、重参数化处理

这里我选择的是第二种,因为基本上不需要改动已有的代码,只需要将训练好的yolov9-t和yolov9-s系列的模型重参数化转化处理即可。

这里我们以yolov9-s为例看下,重参数化的处理方式:

ckpt = torch.load(weights)
model.names = ckpt['model'].names
model.nc = ckpt['model'].nc
idx = 0
for k, v in model.state_dict().items():
    if "model.{}.".format(idx) in k:
        if idx < 22:
            kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.cv2.".format(idx) in k:
            kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.cv3.".format(idx) in k:
            kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.dfl.".format(idx) in k:
            kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
    else:
        while True:
            idx += 1
            if "model.{}.".format(idx) in k:
                break
        if idx < 22:
            kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.cv2.".format(idx) in k:
            kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.cv3.".format(idx) in k:
            kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
        elif "model.{}.dfl.".format(idx) in k:
            kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7))
            model.state_dict()[k] -= model.state_dict()[k]
            model.state_dict()[k] += ckpt['model'].state_dict()[kr]
            print(k, "perfectly matched!!")
_ = model.eval()
m_ckpt = {'model': model.half(),
          'optimizer': None,
          'best_fitness': None,
          'ema': None,
          'updates': None,
          'opt': None,
          'git': None,
          'date': None,
          'epoch': -1}
torch.save(m_ckpt, "yolov9-s.pt")

前后对比如下:

这之后直接加载重参数处理后的yolov9-s-converted.pt权重即可完成热力图的绘制了。

实例效果如下所示:

感兴趣的话也可以自行实践下!

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 08:38:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 08:38:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 08:38:04       62 阅读
  4. Python语言-面向对象

    2024-07-16 08:38:04       72 阅读

热门阅读

  1. GitHub热门开源项目-2024版

    2024-07-16 08:38:04       28 阅读
  2. 浅谈微服务

    2024-07-16 08:38:04       20 阅读
  3. 深入理解MySQL中的MyISAM与InnoDB存储引擎

    2024-07-16 08:38:04       23 阅读
  4. 值的注意React中的一些默认行为和优化(一)

    2024-07-16 08:38:04       23 阅读
  5. 【机器学习】马尔可夫模型与隐马尔科夫模型

    2024-07-16 08:38:04       19 阅读
  6. 如何快速学习 Oracle 数据库?

    2024-07-16 08:38:04       19 阅读
  7. uniapp 截取两条数据 进行页面翻页滚动

    2024-07-16 08:38:04       25 阅读
  8. 【Git 学习笔记】第六章 从仓库中提取有用信息

    2024-07-16 08:38:04       28 阅读
  9. Ant 风格的路径模式和 MVC 风格的路径模式 是什么

    2024-07-16 08:38:04       21 阅读