Hello,my code is similar to the sample of sampleFasterRCNN https://docs.nvidia.com/deeplearning/sdk/tensorrt-developer-guide/index.html#fasterrcnn_sample,for the reason of using the API of createSSDPriorBoxPlugin,we only create the class of IPluginFactoryExt as follows:
class PluginFactory : public nvinfer1::IPluginFactory,public nvcaffeparser1::IPluginFactoryExt { public: virtual nvinfer1::IPlugin* createPlugin(const char* layerName, const nvinfer1::Weights* weights, int nbWeights) override; nvinfer1::IPlugin* createPlugin(const char* layerName,const void* seriaData,size_t seriaLength)override; // caffe parser plugin implementation bool isPlugin(const char* name) override { return isPluginExt(name); } bool isPluginExt(const char* name) override ; void destroyPlugin(); void (*pluginDeleter)( nvinfer1::plugin::INvPlugin*) {[]( nvinfer1::plugin::INvPlugin* ptr) {ptr->destroy();}}; //priorbox layer std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> Inception3_conv_priorbox1_layer{nullptr, pluginDeleter}; std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> Inception3_conv_priorbox2_layer{nullptr, pluginDeleter}; std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> Inception3_conv_priorbox3_layer{nullptr, pluginDeleter}; std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> conv6_priorbox_layer{nullptr, pluginDeleter}; std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> conv7_priorbox_layer{nullptr, pluginDeleter}; //detection output layer std::unique_ptr< nvinfer1::plugin::INvPlugin, decltype(pluginDeleter)> mDetection_out{nullptr, pluginDeleter}; }; void caffeToGIEModel(const std::string& deployFile, // name for caffe prototxt const std::string& modelFile, // name for model const std::vector<std::string>& outputs, // network outputs unsigned int maxBatchSize,// batch size - NB must be at least as large as the batch we want to run with) nvcaffeparser1::IPluginFactoryExt* pluginFactory, //factory for plugin layers IHostMemory *&gieModelStream) // output buffer for the GIE model { // create the builder IBuilder* builder = createInferBuilder(gLogger); // parse the caffe model to populate the network, then set the outputs INetworkDefinition* network = builder->createNetwork(); ICaffeParser* parser = createCaffeParser(); parser->setPluginFactoryExt(pluginFactory); std::cout << "=========parse caffe model start==========" << std::endl; //if platform support fp16 calculation,change the data tpye bool useFp16 = builder->platformHasFastFp16(); DataType modelDataType = useFp16?DataType::kHALF:DataType::kFLOAT; const IBlobNameToTensor* blobNameToTensor = parser->parse(locateFile(deployFile, directories).c_str(),locateFile(modelFile, directories).c_str(), *network, modelDataType); std::cout << "=========parse caffe model done==========useFp16:" << useFp16 << std::endl; // specify which tensors are outputs for (auto& s : outputs) { network->markOutput(*blobNameToTensor->find(s.c_str())); } // Build the engine builder->setMaxBatchSize(maxBatchSize); builder->setMaxWorkspaceSize(2 << 20); builder->setFp16Mode(useFp16); ICudaEngine* engine = builder->buildCudaEngine(*network); assert(engine); std::cout << "=========build cuda engine done==========" << std::endl; // we don't need the network any more, and we can destroy the parser network->destroy(); parser->destroy(); // serialize the engine, then close everything down gieModelStream = engine->serialize(); engine->destroy(); builder->destroy(); shutdownProtobufLibrary(); }
my caffe model as follows:
name: "FaceBoxes" input: "data" input_shape { dim: 1 dim: 3 dim: 1024 dim: 1024 } #conv1 layer { name: "conv1" type: "Convolution" bottom: "data" top: "conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } convolution_param { num_output: 24 pad: 0 kernel_size: 7 stride: 4 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv1/bn" type: "BatchNorm" bottom: "conv1" top: "conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv1/neg" type: "Power" bottom: "conv1" top: "conv1/neg" power_param { power: 1 scale: -1.0 shift: 0 } } layer { name: "conv1/concat" type: "Concat" bottom: "conv1" bottom: "conv1/neg" top: "conv1_CR" } layer { name: "conv1/scale" type: "Scale" bottom: "conv1_CR" top: "conv1_CR" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 2.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv1/relu" type: "ReLU" bottom: "conv1_CR" top: "conv1_CR" } layer { name: "pool1" type: "Pooling" bottom: "conv1_CR" top: "pool1" pooling_param { pool: MAX kernel_size: 3 stride: 2 } } #conv2 layer { name: "conv2" type: "Convolution" bottom: "pool1" top: "conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } convolution_param { num_output: 64 pad: 0 kernel_size: 5 stride: 2 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv2/bn" type: "BatchNorm" bottom: "conv2" top: "conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv2/neg" type: "Power" bottom: "conv2" top: "conv2/neg" power_param { power: 1 scale: -1.0 shift: 0 } } layer { name: "conv2/concat" type: "Concat" bottom: "conv2" bottom: "conv2/neg" top: "conv2_CR" } layer { name: "conv2/scale" type: "Scale" bottom: "conv2_CR" top: "conv2_CR" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 2.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv2/relu" type: "ReLU" bottom: "conv2_CR" top: "conv2_CR" } layer { name: "pool2" type: "Pooling" bottom: "conv2_CR" top: "pool2" pooling_param { pool: MAX kernel_size: 3 stride: 2 } } #Inception1 layer { name: "conv3/incep0/conv" type: "Convolution" bottom: "pool2" top: "conv3/incep0/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv3/incep0/bn" type: "BatchNorm" bottom: "conv3/incep0/conv" top: "conv3/incep0/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep0/bn_scale" type: "Scale" bottom: "conv3/incep0/conv" top: "conv3/incep0/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep0/relu" type: "ReLU" bottom: "conv3/incep0/conv" top: "conv3/incep0/conv" } layer { name: "conv3/incep1/conv1" type: "Convolution" bottom: "pool2" top: "conv3/incep1/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv3/incep1/bn1" type: "BatchNorm" bottom: "conv3/incep1/conv1" top: "conv3/incep1/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep1/bn_scale1" type: "Scale" bottom: "conv3/incep1/conv1" top: "conv3/incep1/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep1/relu1" type: "ReLU" bottom: "conv3/incep1/conv1" top: "conv3/incep1/conv1" } layer { name: "conv3/incep1/conv2" type: "Convolution" bottom: "conv3/incep1/conv1" top: "conv3/incep1/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv3/incep1/bn2" type: "BatchNorm" bottom: "conv3/incep1/conv2" top: "conv3/incep1/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep1/bn_scale2" type: "Scale" bottom: "conv3/incep1/conv2" top: "conv3/incep1/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep1/relu2" type: "ReLU" bottom: "conv3/incep1/conv2" top: "conv3/incep1/conv2" } layer { name: "conv3/incep2/conv1" type: "Convolution" bottom: "pool2" top: "conv3/incep2/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv3/incep2/bn1" type: "BatchNorm" bottom: "conv3/incep2/conv1" top: "conv3/incep2/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep2/bn_scale1" type: "Scale" bottom: "conv3/incep2/conv1" top: "conv3/incep2/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep2/relu1" type: "ReLU" bottom: "conv3/incep2/conv1" top: "conv3/incep2/conv1" } layer { name: "conv3/incep2/conv2" type: "Convolution" bottom: "conv3/incep2/conv1" top: "conv3/incep2/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv3/incep2/bn2" type: "BatchNorm" bottom: "conv3/incep2/conv2" top: "conv3/incep2/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep2/bn_scale2" type: "Scale" bottom: "conv3/incep2/conv2" top: "conv3/incep2/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep2/relu2" type: "ReLU" bottom: "conv3/incep2/conv2" top: "conv3/incep2/conv2" } layer { name: "conv3/incep2/conv3" type: "Convolution" bottom: "conv3/incep2/conv2" top: "conv3/incep2/conv3" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv3/incep2/bn3" type: "BatchNorm" bottom: "conv3/incep2/conv3" top: "conv3/incep2/conv3" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep2/bn_scale3" type: "Scale" bottom: "conv3/incep2/conv3" top: "conv3/incep2/conv3" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep2/relu3" type: "ReLU" bottom: "conv3/incep2/conv3" top: "conv3/incep2/conv3" } layer { name: "conv3/incep3/pool" type: "Pooling" bottom: "pool2" top: "conv3/incep3/pool" pooling_param { pool: MAX kernel_size: 3 stride: 1 pad: 1 } } layer { name: "conv3/incep3/conv" type: "Convolution" bottom: "conv3/incep3/pool" top: "conv3/incep3/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv3/incep3/bn" type: "BatchNorm" bottom: "conv3/incep3/conv" top: "conv3/incep3/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv3/incep3/bn_scale" type: "Scale" bottom: "conv3/incep3/conv" top: "conv3/incep3/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv3/incep3/relu" type: "ReLU" bottom: "conv3/incep3/conv" top: "conv3/incep3/conv" } layer { name: "conv3/incep" type: "Concat" bottom: "conv3/incep0/conv" bottom: "conv3/incep1/conv2" bottom: "conv3/incep2/conv3" bottom: "conv3/incep3/conv" top: "conv3/incep" } #Inception2 layer { name: "conv4/incep0/conv" type: "Convolution" bottom: "conv3/incep" top: "conv4/incep0/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv4/incep0/bn" type: "BatchNorm" bottom: "conv4/incep0/conv" top: "conv4/incep0/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep0/bn_scale" type: "Scale" bottom: "conv4/incep0/conv" top: "conv4/incep0/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep0/relu" type: "ReLU" bottom: "conv4/incep0/conv" top: "conv4/incep0/conv" } layer { name: "conv4/incep1/conv1" type: "Convolution" bottom: "conv3/incep" top: "conv4/incep1/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv4/incep1/bn1" type: "BatchNorm" bottom: "conv4/incep1/conv1" top: "conv4/incep1/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep1/bn_scale1" type: "Scale" bottom: "conv4/incep1/conv1" top: "conv4/incep1/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep1/relu1" type: "ReLU" bottom: "conv4/incep1/conv1" top: "conv4/incep1/conv1" } layer { name: "conv4/incep1/conv2" type: "Convolution" bottom: "conv4/incep1/conv1" top: "conv4/incep1/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv4/incep1/bn2" type: "BatchNorm" bottom: "conv4/incep1/conv2" top: "conv4/incep1/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep1/bn_scale2" type: "Scale" bottom: "conv4/incep1/conv2" top: "conv4/incep1/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep1/relu2" type: "ReLU" bottom: "conv4/incep1/conv2" top: "conv4/incep1/conv2" } layer { name: "conv4/incep2/conv1" type: "Convolution" bottom: "conv3/incep" top: "conv4/incep2/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv4/incep2/bn1" type: "BatchNorm" bottom: "conv4/incep2/conv1" top: "conv4/incep2/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep2/bn_scale1" type: "Scale" bottom: "conv4/incep2/conv1" top: "conv4/incep2/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep2/relu1" type: "ReLU" bottom: "conv4/incep2/conv1" top: "conv4/incep2/conv1" } layer { name: "conv4/incep2/conv2" type: "Convolution" bottom: "conv4/incep2/conv1" top: "conv4/incep2/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv4/incep2/bn2" type: "BatchNorm" bottom: "conv4/incep2/conv2" top: "conv4/incep2/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep2/bn_scale2" type: "Scale" bottom: "conv4/incep2/conv2" top: "conv4/incep2/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep2/relu2" type: "ReLU" bottom: "conv4/incep2/conv2" top: "conv4/incep2/conv2" } layer { name: "conv4/incep2/conv3" type: "Convolution" bottom: "conv4/incep2/conv2" top: "conv4/incep2/conv3" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv4/incep2/bn3" type: "BatchNorm" bottom: "conv4/incep2/conv3" top: "conv4/incep2/conv3" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep2/bn_scale3" type: "Scale" bottom: "conv4/incep2/conv3" top: "conv4/incep2/conv3" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep2/relu3" type: "ReLU" bottom: "conv4/incep2/conv3" top: "conv4/incep2/conv3" } layer { name: "conv4/incep3/pool" type: "Pooling" bottom: "conv3/incep" top: "conv4/incep3/pool" pooling_param { pool: MAX kernel_size: 3 stride: 1 pad: 1 } } layer { name: "conv4/incep3/conv" type: "Convolution" bottom: "conv4/incep3/pool" top: "conv4/incep3/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv4/incep3/bn" type: "BatchNorm" bottom: "conv4/incep3/conv" top: "conv4/incep3/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv4/incep3/bn_scale" type: "Scale" bottom: "conv4/incep3/conv" top: "conv4/incep3/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv4/incep3/relu" type: "ReLU" bottom: "conv4/incep3/conv" top: "conv4/incep3/conv" } layer { name: "conv4/incep" type: "Concat" bottom: "conv4/incep0/conv" bottom: "conv4/incep1/conv2" bottom: "conv4/incep2/conv3" bottom: "conv4/incep3/conv" top: "conv4/incep" } layer { name: "conv5/incep0/conv" type: "Convolution" bottom: "conv4/incep" top: "conv5/incep0/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv5/incep0/bn" type: "BatchNorm" bottom: "conv5/incep0/conv" top: "conv5/incep0/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep0/bn_scale" type: "Scale" bottom: "conv5/incep0/conv" top: "conv5/incep0/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep0/relu" type: "ReLU" bottom: "conv5/incep0/conv" top: "conv5/incep0/conv" } layer { name: "conv5/incep1/conv1" type: "Convolution" bottom: "conv4/incep" top: "conv5/incep1/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv5/incep1/bn1" type: "BatchNorm" bottom: "conv5/incep1/conv1" top: "conv5/incep1/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep1/bn_scale1" type: "Scale" bottom: "conv5/incep1/conv1" top: "conv5/incep1/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep1/relu1" type: "ReLU" bottom: "conv5/incep1/conv1" top: "conv5/incep1/conv1" } layer { name: "conv5/incep1/conv2" type: "Convolution" bottom: "conv5/incep1/conv1" top: "conv5/incep1/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv5/incep1/bn2" type: "BatchNorm" bottom: "conv5/incep1/conv2" top: "conv5/incep1/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep1/bn_scale2" type: "Scale" bottom: "conv5/incep1/conv2" top: "conv5/incep1/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep1/relu2" type: "ReLU" bottom: "conv5/incep1/conv2" top: "conv5/incep1/conv2" } layer { name: "conv5/incep2/conv1" type: "Convolution" bottom: "conv4/incep" top: "conv5/incep2/conv1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 24 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv5/incep2/bn1" type: "BatchNorm" bottom: "conv5/incep2/conv1" top: "conv5/incep2/conv1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep2/bn_scale1" type: "Scale" bottom: "conv5/incep2/conv1" top: "conv5/incep2/conv1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep2/relu1" type: "ReLU" bottom: "conv5/incep2/conv1" top: "conv5/incep2/conv1" } layer { name: "conv5/incep2/conv2" type: "Convolution" bottom: "conv5/incep2/conv1" top: "conv5/incep2/conv2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv5/incep2/bn2" type: "BatchNorm" bottom: "conv5/incep2/conv2" top: "conv5/incep2/conv2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep2/bn_scale2" type: "Scale" bottom: "conv5/incep2/conv2" top: "conv5/incep2/conv2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep2/relu2" type: "ReLU" bottom: "conv5/incep2/conv2" top: "conv5/incep2/conv2" } layer { name: "conv5/incep2/conv3" type: "Convolution" bottom: "conv5/incep2/conv2" top: "conv5/incep2/conv3" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 1 } } layer { name: "conv5/incep2/bn3" type: "BatchNorm" bottom: "conv5/incep2/conv3" top: "conv5/incep2/conv3" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep2/bn_scale3" type: "Scale" bottom: "conv5/incep2/conv3" top: "conv5/incep2/conv3" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep2/relu3" type: "ReLU" bottom: "conv5/incep2/conv3" top: "conv5/incep2/conv3" } layer { name: "conv5/incep3/pool" type: "Pooling" bottom: "conv4/incep" top: "conv5/incep3/pool" pooling_param { pool: MAX kernel_size: 3 stride: 1 pad: 1 } } layer { name: "conv5/incep3/conv" type: "Convolution" bottom: "conv5/incep3/pool" top: "conv5/incep3/conv" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 32 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv5/incep3/bn" type: "BatchNorm" bottom: "conv5/incep3/conv" top: "conv5/incep3/conv" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv5/incep3/bn_scale" type: "Scale" bottom: "conv5/incep3/conv" top: "conv5/incep3/conv" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv5/incep3/relu" type: "ReLU" bottom: "conv5/incep3/conv" top: "conv5/incep3/conv" } layer { name: "conv5/incep" type: "Concat" bottom: "conv5/incep0/conv" bottom: "conv5/incep1/conv2" bottom: "conv5/incep2/conv3" bottom: "conv5/incep3/conv" top: "conv5/incep" } layer { name: "Inception3/conv/loc1" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/loc1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 4 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/loc1/perm" type: "Permute" bottom: "Inception3/conv/loc1" top: "Inception3/conv/loc1/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/loc1/flat" type: "Flatten" bottom: "Inception3/conv/loc1/perm" top: "Inception3/conv/loc1/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/conf1" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/conf1" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 2 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/conf1/perm" type: "Permute" bottom: "Inception3/conv/conf1" top: "Inception3/conv/conf1/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/conf1/flat" type: "Flatten" bottom: "Inception3/conv/conf1/perm" top: "Inception3/conv/conf1/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/priorbox1" type: "PriorBox" bottom: "conv5/incep" bottom: "data" top: "Inception3/conv/priorbox1" prior_box_param { min_size: 32 aspect_ratio: 1 flip: true clip: true variance: 0.1 variance: 0.1 variance: 0.2 variance: 0.2 } } layer { name: "Inception3/conv/loc2" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/loc2" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 4 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/loc2/perm" type: "Permute" bottom: "Inception3/conv/loc2" top: "Inception3/conv/loc2/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/loc2/flat" type: "Flatten" bottom: "Inception3/conv/loc2/perm" top: "Inception3/conv/loc2/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/conf2" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/conf2" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 2 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/conf2/perm" type: "Permute" bottom: "Inception3/conv/conf2" top: "Inception3/conv/conf2/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/conf2/flat" type: "Flatten" bottom: "Inception3/conv/conf2/perm" top: "Inception3/conv/conf2/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/priorbox2" type: "PriorBox" bottom: "conv5/incep" bottom: "data" top: "Inception3/conv/priorbox2" prior_box_param { min_size: 64 aspect_ratio: 1 flip: true clip: true variance: 0.1 variance: 0.1 variance: 0.2 variance: 0.2 } } layer { name: "Inception3/conv/loc3" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/loc3" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 4 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/loc3/perm" type: "Permute" bottom: "Inception3/conv/loc3" top: "Inception3/conv/loc3/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/loc3/flat" type: "Flatten" bottom: "Inception3/conv/loc3/perm" top: "Inception3/conv/loc3/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/conf3" type: "Convolution" bottom: "conv5/incep" top: "Inception3/conv/conf3" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 2 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "Inception3/conv/conf3/perm" type: "Permute" bottom: "Inception3/conv/conf3" top: "Inception3/conv/conf3/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "Inception3/conv/conf3/flat" type: "Flatten" bottom: "Inception3/conv/conf3/perm" top: "Inception3/conv/conf3/flat" flatten_param { axis: 1 } } layer { name: "Inception3/conv/priorbox3" type: "PriorBox" bottom: "conv5/incep" bottom: "data" top: "Inception3/conv/priorbox3" prior_box_param { min_size: 128 aspect_ratio: 1 flip: true clip: true variance: 0.1 variance: 0.1 variance: 0.2 variance: 0.2 } } layer { name: "conv6_1" type: "Convolution" bottom: "conv5/incep" top: "conv6_1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 128 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv6/bn1" type: "BatchNorm" bottom: "conv6_1" top: "conv6_1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv6/bn_scale1" type: "Scale" bottom: "conv6_1" top: "conv6_1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv6/relu1" type: "ReLU" bottom: "conv6_1" top: "conv6_1" } layer { name: "conv6_2" type: "Convolution" bottom: "conv6_1" top: "conv6_2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 256 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 2 } } layer { name: "conv6/bn2" type: "BatchNorm" bottom: "conv6_2" top: "conv6_2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv6/bn_scale2" type: "Scale" bottom: "conv6_2" top: "conv6_2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv6/relu2" type: "ReLU" bottom: "conv6_2" top: "conv6_2" } layer { name: "conv6/loc" type: "Convolution" bottom: "conv6_2" top: "conv6/loc" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 4 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv6/loc/perm" type: "Permute" bottom: "conv6/loc" top: "conv6/loc/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "conv6/loc/perm/flat" type: "Flatten" bottom: "conv6/loc/perm" top: "conv6/loc/perm/flat" flatten_param { axis: 1 } } layer { name: "conv6/conf" type: "Convolution" bottom: "conv6_2" top: "conv6/conf" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 2 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv6/conf/perm" type: "Permute" bottom: "conv6/conf" top: "conv6/conf/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "conv6/conf/perm/flat" type: "Flatten" bottom: "conv6/conf/perm" top: "conv6/conf/perm/flat" flatten_param { axis: 1 } } layer { name: "conv6/priorbox" type: "PriorBox" bottom: "conv6_2" bottom: "data" top: "conv6/priorbox" prior_box_param { min_size: 256 aspect_ratio: 1 flip: true clip: true variance: 0.1 variance: 0.1 variance: 0.2 variance: 0.2 } } layer { name: "conv7_1" type: "Convolution" bottom: "conv6_2" top: "conv7_1" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 128 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 0 kernel_size: 1 stride: 1 } } layer { name: "conv7/bn1" type: "BatchNorm" bottom: "conv7_1" top: "conv7_1" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv7/bn_scale1" type: "Scale" bottom: "conv7_1" top: "conv7_1" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv7/relu1" type: "ReLU" bottom: "conv7_1" top: "conv7_1" } layer { name: "conv7_2" type: "Convolution" bottom: "conv7_1" top: "conv7_2" param { lr_mult: 1.0 decay_mult: 1.0 } convolution_param { num_output: 256 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } pad: 1 kernel_size: 3 stride: 2 } } layer { name: "conv7/bn2" type: "BatchNorm" bottom: "conv7_2" top: "conv7_2" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } batch_norm_param { use_global_stats: false } } layer { name: "conv7/bn_scale2" type: "Scale" bottom: "conv7_2" top: "conv7_2" param { lr_mult: 1.0 decay_mult: 0 } param { lr_mult: 1.0 decay_mult: 0 } scale_param { bias_term: true } } layer { name: "conv7/relu2" type: "ReLU" bottom: "conv7_2" top: "conv7_2" } layer { name: "conv7/loc" type: "Convolution" bottom: "conv7_2" top: "conv7/loc" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 4 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv7/loc/perm" type: "Permute" bottom: "conv7/loc" top: "conv7/loc/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "conv7/loc/perm/flat" type: "Flatten" bottom: "conv7/loc/perm" top: "conv7/loc/perm/flat" flatten_param { axis: 1 } } layer { name: "conv7/conf" type: "Convolution" bottom: "conv7_2" top: "conv7/conf" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } convolution_param { num_output: 2 pad: 1 kernel_size: 3 stride: 1 weight_filler { type: "xavier" } bias_filler { type: "constant" value: 0 } } } layer { name: "conv7/conf/perm" type: "Permute" bottom: "conv7/conf" top: "conv7/conf/perm" permute_param { order: 0 order: 2 order: 3 order: 1 } } layer { name: "conv7/conf/perm/flat" type: "Flatten" bottom: "conv7/conf/perm" top: "conv7/conf/perm/flat" flatten_param { axis: 1 } } layer { name: "conv7/priorbox" type: "PriorBox" bottom: "conv7_2" bottom: "data" top: "conv7/priorbox" prior_box_param { min_size: 512 aspect_ratio: 1 flip: true clip: true variance: 0.1 variance: 0.1 variance: 0.2 variance: 0.2 } } layer { name: "mbox_loc" type: "Concat" bottom: "Inception3/conv/loc1/flat" bottom: "Inception3/conv/loc2/flat" bottom: "Inception3/conv/loc3/flat" bottom: "conv6/loc/perm/flat" bottom: "conv7/loc/perm/flat" top: "mbox_loc" concat_param { axis: 1 } } layer { name: "mbox_conf" type: "Concat" bottom: "Inception3/conv/conf1/flat" bottom: "Inception3/conv/conf2/flat" bottom: "Inception3/conv/conf3/flat" bottom: "conv6/conf/perm/flat" bottom: "conv7/conf/perm/flat" top: "mbox_conf" concat_param { axis: 1 } } layer { name: "mbox_priorbox" type: "Concat" bottom: "Inception3/conv/priorbox1" bottom: "Inception3/conv/priorbox2" bottom: "Inception3/conv/priorbox3" bottom: "conv6/priorbox" bottom: "conv7/priorbox" top: "mbox_priorbox" concat_param { axis: 2 } } layer { name: "detection_out" type: "DetectionOutput" bottom: "mbox_loc" bottom: "mbox_conf" bottom: "mbox_priorbox" top: "detection_out" include { phase: TEST } detection_output_param { num_classes: 2 share_location: true background_label_id: 0 nms_param { nms_threshold: 0.45 top_k: 100 } code_type: CENTER_SIZE keep_top_k: 100 confidence_threshold: 0.5 } }