2017-05-15 3 views
1

Je dispose d'un fichier .prototxt et un fichier .caffemodel, pour un réseau que je construit et formé dans py-caffe, en utilisant des couches auto développé Python .Caffe - Utiliser fichier « .caffemodel » avec Python-> C++ fichier couches traduites

Plus tard, j'ai implémenté les mêmes couches pour la version C++ de Caffe.

La question est de savoir s'il est possible de modifier uniquement les types de couches (de ceux Python à ceux C++) dans le fichier .prototxt, tout en utilisant le même fichier .caffemodel déjà formé, afin de charger et utiliser le réseau formé , cette fois avec les couches C++?

+0

votre calque possède-t-il des paramètres internes? c'est-à-dire, avez-vous utilisé 'self.blobs.add_blob()' dans votre implémentation de couche "Python"? – Shai

+1

Je ne l'ai pas fait. Cela signifie-t-il que je peux simplement implémenter les méthodes C++ pour faire la même chose que les Python? En fait c'est logique car le schéma est défini dans le fichier '.prototxt' et non dans l'implémentation de la couche – SomethingSomething

+1

si vous n'avez pas de paramètres internes que le calque n'a aucun effet sur le chargement de' .caffemodel' vous devriez bien le convertir de python à cpp. Je suppose que vous serez encore mieux d'avoir une implémentation GPU (implémentation '.cu' ...) – Shai

Répondre

1

Oui, bien sûr que c'est possible. Dans le cas où vous avez des paramètres de couche, vous devez ajouter un nouveau message layer_param à caffe.proto, et les lire en conséquence dans votre couche cpp.
Par exemple, PVANet caffe repository a une implémentation pour la couche de proposition Python d'origine.
Comme vous pouvez le voir dans caffe.proto, un nouveau message a été ajouté pour maintenir les paramètres de la couche Python -
// message que les paramètres stocke utilisés par ProposalLayer

message ProposalParameter { 
    optional uint32 feat_stride = 1 [default = 16]; 
    optional uint32 base_size = 2 [default = 16]; 
    optional uint32 min_size = 3 [default = 16]; 
    repeated float ratio = 4; 
    repeated float scale = 5; 
    optional uint32 pre_nms_topn = 6 [default = 6000]; 
    optional uint32 post_nms_topn = 7 [default = 300]; 
    optional float nms_thresh = 8 [default = 0.7]; 
} 

Le prototxt train/test original contient la couche suivante:

layer { 
    name: 'proposal' 
    type: 'Python' 
    bottom: 'rpn_cls_prob_reshape' 
    bottom: 'rpn_bbox_pred' 
    bottom: 'im_info' 
    top: 'rpn_rois' 
    top: 'rpn_scores' 
    include { phase: TRAIN } 
    python_param { 
    module: 'rpn.proposal_layer' 
    layer: 'ProposalLayer' 
    param_str: "{'feat_stride': 16, 'ratios': [0.333, 0.5, 0.667, 1, 1.5, 2, 3], 'scales': [2, 3, 5, 9, 16, 32]}" 
    } 
} 

Lorsque le nouveau cpp ressemble:

layer { 
    name: 'proposal' 
    type: 'proposal' 
    bottom: 'rpn_cls_prob_reshape' 
    bottom: 'rpn_bbox_pred' 
    bottom: 'im_info' 
    top: 'rpn_rois' 
    top: 'rpn_scores' 
    include { phase: TRAIN } 
    proposal_param { 
    feat_stride: 16 
    ratios: 0.333, 0.5, 0.667, 1, 1.5, 2, 3 
    scales: 2, 3, 5, 9, 16, 32 
    } 
} 

etc.