So far I was using the pytorch-caffe-darknet-convert repository. After overcoming numerous problems (concat and eltwise layers not convertible) I ended up with something that looks like a darknet config file:
python caffe2darknet.py my_prototxt.txt my_caffemodel.caffemodel new_net_file.cfg new_model.weights
Does someone know how to convert the output new_net_file.cfg
into pytorch? Alternatively is there another way of converting caffe prototxt files into pytorch?
I would like to have the same behaviour as caffe-tensorflow
I'll post both my caffe prototxt and the output new_net_file.cfg
below as reference.
my_prototxt:
input: "data"
input_shape {
dim: 1
dim: 240
dim: 144
dim: 240
}
layer {
name: "conv1_1"
type: "Convolution"
bottom: "data"
top: "conv1_1"
convolution_param {
num_output: 16
pad: 3
pad: 3
pad: 3
kernel_size: 7
kernel_size: 7
kernel_size: 7
stride: 2
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
engine: CUDNN
axis: 1
}
}
layer {
name: "relu1_1"
type: "ReLU"
bottom: "conv1_1"
top: "conv1_1"
}
layer {
name: "reduction2_1"
type: "Convolution"
bottom: "conv1_1"
top: "reduction2_1"
convolution_param {
num_output: 32
bias_term: false
pad: 0
kernel_size: 1
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "conv2_1"
type: "Convolution"
bottom: "conv1_1"
top: "conv2_1"
convolution_param {
num_output: 32
pad: 1
pad: 1
pad: 1
kernel_size: 3
kernel_size: 3
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
engine: CUDNN
axis: 1
}
}
layer {
name: "relu2_1"
type: "ReLU"
bottom: "conv2_1"
top: "conv2_1"
}
layer {
name: "conv2_2"
type: "Convolution"
bottom: "conv2_1"
top: "conv2_2"
convolution_param {
num_output: 32
pad: 1
pad: 1
pad: 1
kernel_size: 3
kernel_size: 3
kernel_size: 3
stride: 1
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
axis: 1
}
}
layer {
name: "res2_2"
type: "Eltwise"
bottom: "reduction2_1"
bottom: "conv2_2"
top: "res2_2"
eltwise_param { operation: SUM }
}
layer {
name: "add2_2"
type: "ReLU"
bottom: "res2_2"
top: "res2_2"
}
layer {
name: "pool2"
type: "Pooling"
bottom: "res2_2"
top: "pool2"
pooling_param {
pool: MAX
kernel_size: 2
stride: 2
engine: CUDNN
}
}
[...] # I cropped it here, since file is too lengthy
the (darknet) config file:
[net]
batch=1
channels=240
height=144
width=240
[convolutional]
filters=16
size=['7', '7', '7']
stride=2
pad=1
activation=relu
[convolutional]
filters=32
size=1
stride=1
pad=1
activation=linear
[route]
layers=-2
[convolutional]
filters=32
size=['3', '3', '3']
stride=1
pad=1
activation=relu
[convolutional]
filters=32
size=['3', '3', '3']
stride=1
pad=1
activation=linear
[shortcut]
from=-4
activation=relu
[maxpool]
size=2
stride=2
[...] # I cropped it here, since file is too lengthy