Zynqnet(四)fgpa_top模块的weights.bin和input.bin的结构 VS darknet中权值和输入的结构

本文详细探讨了Zynqnet FPGA加速模块中weights.bin和input.bin的存储结构,并与Darknet中的权值和输入结构进行了对比。input.bin的存储方式是先存储所有通道同一坐标位置的元素,而weights.bin则是先存储所有卷积核的同一通道元素。针对Darknet的l.weights,其存储顺序为卷积核、通道、行、列。文章旨在帮助理解如何将Darknet的权值和输入转换为Zynqnet所接受的格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:对于FPGA加速模块的使用,除了知道如何设置一些宏变量和全局变量之外,对于卷积核权值的存储和输入数据的存储顺序是另外一个非常重要的问题。为了尽快将其源码移植到自己的项目中,需要构造这两个部分,原论文中是使用的python脚本将caffermode转化成相应的weight.bin。那么,如果对于非caffemodel,或者想对自己的CNN程序进行局部加速,怎么办?这里就需要搞清楚weights.bin和input.bin二者是如何排列的。

方法:搜索作者github->issue,发现蛛丝马迹

(一)首先对于input.bin的结构 https://github.com/dgschwend/zynqnet/issues/4

研读代码之后发现,

    for y in range(H):
        for x in range(W):
            for c in range(CH):
                pixel = data[c,x,y]
                if pixel is None: pixel = 99999
                pixels.append(pixel);

对于input的存储并不是,按照每个通道,一个通道一个通道来存储的。而是先存储所有通道的(0,0)坐标位置的元素,再存储(0,1)坐标的元素,再存储(0,2)的元素,直到(0,w),然后是(1,0),(1,1),……(1,w)直到(h,w)。这样则完成了所有通道的输入。

(二)对于weights.bin的结构 https://github.com/dgschwend/zynqnet/issues/12

# Functions 
### 如何导出图像识别模型 `weights.bin` 文件 对于不同框架下的模型,导出权重文件的方式有所不同。以下是针对几种常见情况的说明。 #### TensorFlow/Keras 模型转换至 OpenCV DNN 支持格式 当使用TensorFlow或Keras构建并训练好图像识别模型之后,可以先将其保存为 `.pb` 或者 `.h5` 格式的文件[^1]。为了使该模型能够在OpenCV环境中运行,则需进一步处理成适合DNN模块加载的形式——通常是`.prototxt`(网络结构定义)加上对应的权值文件(`.caffemodel`, `.pb`, 或其他),而不是直接生成`weights.bin`这种特定于某些平台/工具链的二进制格式。不过,在实际应用中如果确实遇到了需要创建名为`weights.bin`的情况,这可能意味着目标环境期望的是某种自定义或者专有的存储方式。 对于从 Keras 转换到 OpenCV 可用形式的操作流程如下: 1. 将已训练好的 Keras 模型保存下来; 2. 使用官方提供的脚本或者其他第三方库(比如 tf2onnx)把上述模型转写成为 ONNX (.onnx) 格式; 3. 利用 opencv 的 dnn.readNetFromONNX 函数来读入此 .onnx 文件;此时并不涉及单独提取所谓的 "weights.bin". ```python import tensorflow as tf from keras.models import load_model model = load_model('path_to_your_keras_model.h5') tf.saved_model.save(model, 'saved_model/') !tensorflow-onnx/tf2onnx.convert --opset 11 -i saved_model --output model.onnx ``` 需要注意的是,以上过程并没有显式地提到任何有关 `weights.bin` 的操作,因为这不是标准做法的一部分。然而,如果有特殊需求要获得这样的文件,那么就需要了解具体的应用场景以及所使用的软件栈的具体要求。 #### Darknet/YOLO 类型模型的 Weights 导出 另一种可能是涉及到像Darknet这样专门用于物体检测的任务框架。在这种情况下,通常会通过编译后的程序直接输出 `.weights` 文件作为最终产物之一[^2]。而这些 `.weights` 文件本质上就是包含了神经网络参数在内的纯数据流表示法,它们可以直接被后续推理阶段调用而不必再经历复杂的解析步骤。 假设是在 Python 中利用 PyTorch 实现了一个类似的 YOLOv3 架构,并希望模仿 darknet 那样的行为写出自己的 `.weights` 文件,下面给出了一种实现方案: ```python def save_weights(self, path): with open(path, 'wb') as f: # Write header information (version etc.) version = [0, 2, 5] np.array(version, dtype=np.int32).tofile(f) seen = self.seen.numpy() np.array(seen, dtype=np.int64).tofile(f) for module in self.module_list: if isinstance(module[0], nn.Conv2d): conv_layer = module[0] # If batch norm exists, write its parameters first. if isinstance(module[1], nn.BatchNorm2d): bn_layer = module[1] bn_layer.bias.data.cpu().numpy().astype(np.float32).tofile(f) bn_layer.weight.data.cpu().numpy().astype(np.float32).tofile(f) bn_layer.running_mean.data.cpu().numpy().astype(np.float32).tofile(f) bn_layer.running_var.data.cpu().numpy().astype(np.float32).tofile(f) else: # Otherwise just the biases of convolutional layer itself. conv_layer.bias.data.cpu().numpy().astype(np.float32).tofile(f) # Finally always dump out the weights from convolutional layers regardless whether there's a BN or not. conv_layer.weight.permute(2, 3, 1, 0).contiguous().view(-1).cpu().data.numpy().astype(np.float32).tofile(f) ``` 这段代码展示了如何遍历整个网络图谱并将各层的相关数值序列化到磁盘上形成一个连续的数据块。请注意这里的例子是以PyTorch为基础设计出来的,因此具体的细节可能会因原始开发语言的不同有所变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值