void extractBinaryLayerParams(const caffe::LayerParameter& layer, LayerParams& layerParams) { const std::string &name = layer.name(); int li; for (li = 0; li != netBinary.layer_size(); li++) { const caffe::LayerParameter& binLayer = netBinary.layer(li); // Break if the layer name is the same and the blobs are not cleared if (binLayer.name() == name && binLayer.blobs_size() != 0) break; } if (li == netBinary.layer_size()) return; caffe::LayerParameter* binLayer = netBinary.mutable_layer(li); const int numBlobs = binLayer->blobs_size(); layerParams.blobs.resize(numBlobs); for (int bi = 0; bi < numBlobs; bi++) { blobFromProto(binLayer->blobs(bi), layerParams.blobs[bi]); } binLayer->clear_blobs(); CV_Assert(numBlobs == binLayer->blobs().ClearedCount()); for (int bi = 0; bi < numBlobs; bi++) { delete binLayer->mutable_blobs()->ReleaseCleared(); } }
void addOutput(const caffe::LayerParameter &layer, int layerId, int outNum) { const std::string &name = layer.top(outNum); bool haveDups = false; for (int idx = (int)addedBlobs.size() - 1; idx >= 0; idx--) { if (addedBlobs[idx].name == name) { haveDups = true; break; } } if (haveDups) { bool isInplace = layer.bottom_size() > outNum && layer.bottom(outNum) == name; if (!isInplace) CV_Error(Error::StsBadArg, "Duplicate blobs produced by multiple sources"); } addedBlobs.push_back(BlobNote(name, layerId, outNum)); }
void extractBinaryLayerParms(const caffe::LayerParameter& layer, LayerParams& layerParams) { const std::string &name = layer.name(); int li; for (li = 0; li != netBinary.layer_size(); li++) { if (netBinary.layer(li).name() == name) break; } if (li == netBinary.layer_size() || netBinary.layer(li).blobs_size() == 0) return; const caffe::LayerParameter &binLayer = netBinary.layer(li); layerParams.blobs.resize(binLayer.blobs_size()); for (int bi = 0; bi < binLayer.blobs_size(); bi++) { blobFromProto(binLayer.blobs(bi), layerParams.blobs[bi]); } }