How to convert caffe prototype to pytorch model?

So far I have used the pytorch-caffe-darknet-convert repository. After overcoming numerous problems (concat and eltwise layers not convertible) I got something similar to the darknet configuration file:

python caffe2darknet.py my_prototxt.txt my_caffemodel.caffemodel new_net_file.cfg new_model.weights 

Does anyone know how to convert the output of new_net_file.cfg to pytorch? Alternatively, is there another way to convert caffe prototype files to pytorch?
I would like to have the same behavior as caffe-tensorflow I will post both my caffe prototype and the new_net_file.cfg output below as a 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 

configuration file (darknet):

 [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 
+5
source share

Source: https://habr.com/ru/post/1273913/


All Articles