在 Python 中未安装 caffe 的情况下从 .caffemodel 中提取权重

Extracting weights from .caffemodel without caffe installed in Python

是否有一种相对简单的方法可以从 Caffe Zoo WITHOUT CAFFE(也不是 pyCaffe)中的众多预训练模型之一中提取 Python 中的权重?即将 .caffemodel 解析为 hdf5/numpy 或 Python 可以读取的任何格式?

我找到的所有答案都使用带有 caffe 类 或 Pycaffe 的 C++ 代码。 我看过 pycaffe 的代码,看起来你真的需要 caffe 来理解二进制文件是唯一的解决方案吗?

现在caffe可以将权重保存为两种格式:BINARYPROTO,或者HDF5。扩展名为 .caffemodel 的二进制权重文件为 BINARYPROTO 格式,而扩展名为 .caffemodel.h5 的为 HDF5 格式。由于最近 caffe 引入了 HDF5 格式,我希望您目前在 "model zoo" 中遇到的大多数模型都是 "traditional" BINARYPROTO 格式。

如果权重以 HDF5 格式存储,您可以使用 h5py 包来选择它们。

但是,BINARYPROTO 格式基于 google 协议缓冲区格式的二进制序列化,该格式由 caffe.proto 定义。我不是协议缓冲区方面的专家,但我怀疑如果没有明确 "compiling" caffe.proto protobuf 定义文件(其中是咖啡构建的一部分)。

我认为选择权重的最简单方法是安装 caffe 并使用它的 python/C++ 界面。你为什么不那样做?

我不明白你为什么要在没有 caffe/pycaffe 的情况下这样做,也许你厌倦了在新机器上部署 caffe?但是由于caffemodel是caffe特殊的二进制数据类型,使用别人的工具并不容易。

如果你坚持要这样做,还有另一个框架:Mocha on Julia,它提供了将caffemodel提取到hdf5的方法。希望对你有帮助。

碰巧,ethereon 制作了一个名为 caffe-tensorflow 的很棒的库,用于将 caffe 模型转换为 Tensorflow 代码,但这还不是全部!它还允许用户将 .caffemodel 个文件转换为 .npy 个文件,而无需构建 pycaffe!它测试是否构建了 caffe,如果没有,它会回退到纯 google protobuf 实现。

我刚才必须解决那个确切的问题。假设你有一个 .caffemodel(二进制原型格式),事实证明它非常简单。

  1. 下载最新的caffe.proto

  2. 编译成python库: 协议 --python_out=。 caffe.proto

  3. 导入和解析

下面的示例代码

import numpy as np
import sys, os
import argparse
import caffe_pb2 as cq

f = open('VGG_ILSVRC_16_layers.caffemodel', 'r')
cq2 = cq.NetParameter()
cq2.ParseFromString(f.read())
f.close()
print "name 1st layer: " + cq2.layers[0].name 

为我生产:

name 1st layer: conv1_1

显然,您可以从对象中提取任何您想要的东西。我只是打印了第一层的名称作为示例。 此外,您的模型可能在图层数组(已弃用)或图层(无 's')数组中表达图层,但您明白了要点。