从 Darknet 的预训练权重中获取权重值的方法?

Approach to get the weight values from the pre-trained weights from Darknet?

我目前正在尝试在 C 中实现 YOLOv3 对象检测模型(仅检测,不训练)。

我用任意值测试了我的卷积方法,它似乎按我预期的那样工作。

在堆叠多个方法调用以进行前向传播之前,我认为使用实际的预训练权重文件数据进行测试是安全的。

当我查看 Darknet 的预训练权重文件时,它是一大堆二进制文件。我尝试将其转换为十六进制和小数,但要确定要使用的值的哪一部分看起来仍然并不简单。

所以,我的问题是,我应该怎么做才能提取权重或过滤器值的十进制数,以便我可以按照 YOLOv3 中发生的前向传播的相同顺序使用它们?

*我目前正在尝试使用 https://www.itread01.com/content/1541167345.html

中显示的结构图像构建我的 YOLOv3 的 c 版本

*我的 C 代码将 运行 与其他 HDL 代码一起放在名为 MicroZed 的 FPGA 板上。

*我试图将一些 printf 函数插入 Darknet 代码的某些地方,以查看当 YOLOv3 运行s 时哪些类型的数据在移动,然而,当我 运行 它在 Linux 终端,它没有显示任何新内容并一直输出相同的结果。

任何帮助或建议将不胜感激。谢谢!

我不太确定是否有直接读取暗网权重的方法,但您可以将其转换为.h5格式并从中获取权重值

您可以使用 this 存储库中的适当命令将暗网 yolov3 权重转换为 .h5 格式(由 keras 使用)。

您可以根据您的 Yolo 版本从链接存储库的自述文件中显示的列表中选择命令。对于标准的yolov3,转换的命令是

python tools/model_converter/convert.py cfg/yolov3.cfg weights/yolov3.weights weights/yolov3.h5 获得 .h5 权重后,您可以使用以下代码片段获取 来自权重的值。 credit/source

import h5py

path = "<path to weights>.h5"
weights = {}
keys = []
with h5py.File(path, 'r') as f: # open file
  f.visit(keys.append) # append all keys to list
  for key in keys:
      if ':' in key: # contains data if ':' in key
          param_name = f[key].name
          weights[f[key].name] = f[key].value
          print(param_name,weights[f[key].name])