Path: blob/master/modules/dnn/src/darknet/darknet_io.cpp
16339 views
/*M///////////////////////////////////////////////////////////////////////////////////////1//2// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.3//4// By downloading, copying, installing or using the software you agree to this license.5// If you do not agree to this license, do not download, install,6// copy or use the software.7//8//9// License Agreement10// For Open Source Computer Vision Library11// (3-clause BSD License)12//13// Copyright (C) 2017, Intel Corporation, all rights reserved.14// Third party copyrights are property of their respective owners.15//16// Redistribution and use in source and binary forms, with or without modification,17// are permitted provided that the following conditions are met:18//19// * Redistributions of source code must retain the above copyright notice,20// this list of conditions and the following disclaimer.21//22// * Redistributions in binary form must reproduce the above copyright notice,23// this list of conditions and the following disclaimer in the documentation24// and/or other materials provided with the distribution.25//26// * Neither the names of the copyright holders nor the names of the contributors27// may be used to endorse or promote products derived from this software28// without specific prior written permission.29//30// This software is provided by the copyright holders and contributors "as is" and31// any express or implied warranties, including, but not limited to, the implied32// warranties of merchantability and fitness for a particular purpose are disclaimed.33// In no event shall copyright holders or contributors be liable for any direct,34// indirect, incidental, special, exemplary, or consequential damages35// (including, but not limited to, procurement of substitute goods or services;36// loss of use, data, or profits; or business interruption) however caused37// and on any theory of liability, whether in contract, strict liability,38// or tort (including negligence or otherwise) arising in any way out of39// the use of this software, even if advised of the possibility of such damage.40//41//M*/4243/*M///////////////////////////////////////////////////////////////////////////////////////44//MIT License45//46//Copyright (c) 2017 Joseph Redmon47//48//Permission is hereby granted, free of charge, to any person obtaining a copy49//of this software and associated documentation files (the "Software"), to deal50//in the Software without restriction, including without limitation the rights51//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell52//copies of the Software, and to permit persons to whom the Software is53//furnished to do so, subject to the following conditions:54//55//The above copyright notice and this permission notice shall be included in all56//copies or substantial portions of the Software.57//58//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR59//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,60//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE61//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER62//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,63//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE64//SOFTWARE.65//66//M*/6768#include "../precomp.hpp"6970#include <iostream>71#include <fstream>72#include <sstream>7374#include "darknet_io.hpp"7576namespace cv {77namespace dnn {78namespace darknet {7980template<typename T>81T getParam(const std::map<std::string, std::string> ¶ms, const std::string param_name, T init_val)82{83std::map<std::string, std::string>::const_iterator it = params.find(param_name);84if (it != params.end()) {85std::stringstream ss(it->second);86ss >> init_val;87}88return init_val;89}9091static const std::string kFirstLayerName = "data";9293class setLayersParams {9495NetParameter *net;96int layer_id;97std::string last_layer;98std::vector<std::string> fused_layer_names;99100public:101setLayersParams(NetParameter *_net) :102net(_net), layer_id(0), last_layer(kFirstLayerName)103{}104105void setLayerBlobs(int i, std::vector<cv::Mat> blobs)106{107cv::dnn::LayerParams ¶ms = net->layers[i].layerParams;108params.blobs = blobs;109}110111cv::dnn::LayerParams getParamConvolution(int kernel, int pad,112int stride, int filters_num)113{114cv::dnn::LayerParams params;115params.name = "Convolution-name";116params.type = "Convolution";117118params.set<int>("kernel_size", kernel);119params.set<int>("pad", pad);120params.set<int>("stride", stride);121122params.set<bool>("bias_term", false); // true only if(BatchNorm == false)123params.set<int>("num_output", filters_num);124125return params;126}127128129void setConvolution(int kernel, int pad, int stride,130int filters_num, int channels_num, int use_batch_normalize, int use_relu)131{132cv::dnn::LayerParams conv_param =133getParamConvolution(kernel, pad, stride, filters_num);134135darknet::LayerParameter lp;136std::string layer_name = cv::format("conv_%d", layer_id);137138// use BIAS in any case139if (!use_batch_normalize) {140conv_param.set<bool>("bias_term", true);141}142143lp.layer_name = layer_name;144lp.layer_type = conv_param.type;145lp.layerParams = conv_param;146lp.bottom_indexes.push_back(last_layer);147last_layer = layer_name;148net->layers.push_back(lp);149150if (use_batch_normalize)151{152cv::dnn::LayerParams bn_param;153154bn_param.name = "BatchNorm-name";155bn_param.type = "BatchNorm";156bn_param.set<bool>("has_weight", true);157bn_param.set<bool>("has_bias", true);158bn_param.set<float>("eps", 1E-6); // .000001f in Darknet Yolo159160darknet::LayerParameter lp;161std::string layer_name = cv::format("bn_%d", layer_id);162lp.layer_name = layer_name;163lp.layer_type = bn_param.type;164lp.layerParams = bn_param;165lp.bottom_indexes.push_back(last_layer);166last_layer = layer_name;167net->layers.push_back(lp);168}169170if (use_relu)171{172cv::dnn::LayerParams activation_param;173activation_param.set<float>("negative_slope", 0.1f);174activation_param.name = "ReLU-name";175activation_param.type = "ReLU";176177darknet::LayerParameter lp;178std::string layer_name = cv::format("relu_%d", layer_id);179lp.layer_name = layer_name;180lp.layer_type = activation_param.type;181lp.layerParams = activation_param;182lp.bottom_indexes.push_back(last_layer);183last_layer = layer_name;184net->layers.push_back(lp);185}186187layer_id++;188fused_layer_names.push_back(last_layer);189}190191void setMaxpool(size_t kernel, size_t pad, size_t stride)192{193cv::dnn::LayerParams maxpool_param;194maxpool_param.set<cv::String>("pool", "max");195maxpool_param.set<int>("kernel_size", kernel);196maxpool_param.set<int>("pad", pad);197maxpool_param.set<int>("stride", stride);198maxpool_param.set<cv::String>("pad_mode", "SAME");199maxpool_param.name = "Pooling-name";200maxpool_param.type = "Pooling";201darknet::LayerParameter lp;202203std::string layer_name = cv::format("pool_%d", layer_id);204lp.layer_name = layer_name;205lp.layer_type = maxpool_param.type;206lp.layerParams = maxpool_param;207lp.bottom_indexes.push_back(last_layer);208last_layer = layer_name;209net->layers.push_back(lp);210layer_id++;211fused_layer_names.push_back(last_layer);212}213214void setAvgpool()215{216cv::dnn::LayerParams avgpool_param;217avgpool_param.set<cv::String>("pool", "ave");218avgpool_param.set<bool>("global_pooling", true);219avgpool_param.name = "Pooling-name";220avgpool_param.type = "Pooling";221darknet::LayerParameter lp;222223std::string layer_name = cv::format("avgpool_%d", layer_id);224lp.layer_name = layer_name;225lp.layer_type = avgpool_param.type;226lp.layerParams = avgpool_param;227lp.bottom_indexes.push_back(last_layer);228last_layer = layer_name;229net->layers.push_back(lp);230layer_id++;231fused_layer_names.push_back(last_layer);232}233234void setSoftmax()235{236cv::dnn::LayerParams softmax_param;237softmax_param.name = "Softmax-name";238softmax_param.type = "Softmax";239darknet::LayerParameter lp;240241std::string layer_name = cv::format("softmax_%d", layer_id);242lp.layer_name = layer_name;243lp.layer_type = softmax_param.type;244lp.layerParams = softmax_param;245lp.bottom_indexes.push_back(last_layer);246last_layer = layer_name;247net->layers.push_back(lp);248layer_id++;249fused_layer_names.push_back(last_layer);250}251252void setConcat(int number_of_inputs, int *input_indexes)253{254cv::dnn::LayerParams concat_param;255concat_param.name = "Concat-name";256concat_param.type = "Concat";257concat_param.set<int>("axis", 1); // channels are in axis = 1258259darknet::LayerParameter lp;260261std::string layer_name = cv::format("concat_%d", layer_id);262lp.layer_name = layer_name;263lp.layer_type = concat_param.type;264lp.layerParams = concat_param;265for (int i = 0; i < number_of_inputs; ++i)266lp.bottom_indexes.push_back(fused_layer_names.at(input_indexes[i]));267268last_layer = layer_name;269net->layers.push_back(lp);270271layer_id++;272fused_layer_names.push_back(last_layer);273}274275void setIdentity(int bottom_index)276{277cv::dnn::LayerParams identity_param;278identity_param.name = "Identity-name";279identity_param.type = "Identity";280281darknet::LayerParameter lp;282283std::string layer_name = cv::format("identity_%d", layer_id);284lp.layer_name = layer_name;285lp.layer_type = identity_param.type;286lp.layerParams = identity_param;287lp.bottom_indexes.push_back(fused_layer_names.at(bottom_index));288289last_layer = layer_name;290net->layers.push_back(lp);291292layer_id++;293fused_layer_names.push_back(last_layer);294}295296void setReorg(int stride)297{298cv::dnn::LayerParams reorg_params;299reorg_params.name = "Reorg-name";300reorg_params.type = "Reorg";301reorg_params.set<int>("reorg_stride", stride);302303darknet::LayerParameter lp;304std::string layer_name = cv::format("reorg_%d", layer_id);305lp.layer_name = layer_name;306lp.layer_type = reorg_params.type;307lp.layerParams = reorg_params;308lp.bottom_indexes.push_back(last_layer);309last_layer = layer_name;310311net->layers.push_back(lp);312313layer_id++;314fused_layer_names.push_back(last_layer);315}316317void setPermute(bool isDarknetLayer = true)318{319cv::dnn::LayerParams permute_params;320permute_params.name = "Permute-name";321permute_params.type = "Permute";322int permute[] = { 0, 2, 3, 1 };323cv::dnn::DictValue paramOrder = cv::dnn::DictValue::arrayInt(permute, 4);324325permute_params.set("order", paramOrder);326327darknet::LayerParameter lp;328std::string layer_name = cv::format("permute_%d", layer_id);329lp.layer_name = layer_name;330lp.layer_type = permute_params.type;331lp.layerParams = permute_params;332lp.bottom_indexes.push_back(last_layer);333last_layer = layer_name;334net->layers.push_back(lp);335336if (isDarknetLayer)337{338layer_id++;339fused_layer_names.push_back(last_layer);340}341}342343void setRegion(float thresh, int coords, int classes, int anchors, int classfix, int softmax, int softmax_tree, float *biasData)344{345cv::dnn::LayerParams region_param;346region_param.name = "Region-name";347region_param.type = "Region";348349region_param.set<float>("thresh", thresh);350region_param.set<int>("coords", coords);351region_param.set<int>("classes", classes);352region_param.set<int>("anchors", anchors);353region_param.set<int>("classfix", classfix);354region_param.set<bool>("softmax_tree", softmax_tree);355region_param.set<bool>("softmax", softmax);356357cv::Mat biasData_mat = cv::Mat(1, anchors * 2, CV_32F, biasData).clone();358region_param.blobs.push_back(biasData_mat);359360darknet::LayerParameter lp;361std::string layer_name = "detection_out";362lp.layer_name = layer_name;363lp.layer_type = region_param.type;364lp.layerParams = region_param;365lp.bottom_indexes.push_back(last_layer);366last_layer = layer_name;367net->layers.push_back(lp);368369layer_id++;370fused_layer_names.push_back(last_layer);371}372373void setYolo(int classes, const std::vector<int>& mask, const std::vector<float>& anchors)374{375cv::dnn::LayerParams region_param;376region_param.name = "Region-name";377region_param.type = "Region";378379const int numAnchors = mask.size();380381region_param.set<int>("classes", classes);382region_param.set<int>("anchors", numAnchors);383region_param.set<bool>("logistic", true);384385std::vector<float> usedAnchors(numAnchors * 2);386for (int i = 0; i < numAnchors; ++i)387{388usedAnchors[i * 2] = anchors[mask[i] * 2];389usedAnchors[i * 2 + 1] = anchors[mask[i] * 2 + 1];390}391392cv::Mat biasData_mat = cv::Mat(1, numAnchors * 2, CV_32F, &usedAnchors[0]).clone();393region_param.blobs.push_back(biasData_mat);394395darknet::LayerParameter lp;396std::string layer_name = cv::format("yolo_%d", layer_id);397lp.layer_name = layer_name;398lp.layer_type = region_param.type;399lp.layerParams = region_param;400lp.bottom_indexes.push_back(last_layer);401lp.bottom_indexes.push_back(kFirstLayerName);402last_layer = layer_name;403net->layers.push_back(lp);404405layer_id++;406fused_layer_names.push_back(last_layer);407}408409void setShortcut(int from)410{411cv::dnn::LayerParams shortcut_param;412shortcut_param.name = "Shortcut-name";413shortcut_param.type = "Eltwise";414415shortcut_param.set<std::string>("op", "sum");416417darknet::LayerParameter lp;418std::string layer_name = cv::format("shortcut_%d", layer_id);419lp.layer_name = layer_name;420lp.layer_type = shortcut_param.type;421lp.layerParams = shortcut_param;422lp.bottom_indexes.push_back(fused_layer_names.at(from));423lp.bottom_indexes.push_back(last_layer);424last_layer = layer_name;425net->layers.push_back(lp);426427layer_id++;428fused_layer_names.push_back(last_layer);429}430431void setUpsample(int scaleFactor)432{433cv::dnn::LayerParams param;434param.name = "Upsample-name";435param.type = "Resize";436437param.set<int>("zoom_factor", scaleFactor);438param.set<String>("interpolation", "nearest");439440darknet::LayerParameter lp;441std::string layer_name = cv::format("upsample_%d", layer_id);442lp.layer_name = layer_name;443lp.layer_type = param.type;444lp.layerParams = param;445lp.bottom_indexes.push_back(last_layer);446last_layer = layer_name;447net->layers.push_back(lp);448449layer_id++;450fused_layer_names.push_back(last_layer);451}452};453454std::string escapeString(const std::string &src)455{456std::string dst;457for (size_t i = 0; i < src.size(); ++i)458if (src[i] > ' ' && src[i] <= 'z')459dst += src[i];460return dst;461}462463template<typename T>464std::vector<T> getNumbers(const std::string &src)465{466std::vector<T> dst;467std::stringstream ss(src);468469for (std::string str; std::getline(ss, str, ',');) {470std::stringstream line(str);471T val;472line >> val;473dst.push_back(val);474}475return dst;476}477478bool ReadDarknetFromCfgStream(std::istream &ifile, NetParameter *net)479{480bool read_net = false;481int layers_counter = -1;482for (std::string line; std::getline(ifile, line);) {483line = escapeString(line);484if (line.empty()) continue;485switch (line[0]) {486case '\0': break;487case '#': break;488case ';': break;489case '[':490if (line == "[net]") {491read_net = true;492}493else {494// read section495read_net = false;496++layers_counter;497const size_t layer_type_size = line.find("]") - 1;498CV_Assert(layer_type_size < line.size());499std::string layer_type = line.substr(1, layer_type_size);500net->layers_cfg[layers_counter]["type"] = layer_type;501}502break;503default:504// read entry505const size_t separator_index = line.find('=');506CV_Assert(separator_index < line.size());507if (separator_index != std::string::npos) {508std::string name = line.substr(0, separator_index);509std::string value = line.substr(separator_index + 1, line.size() - (separator_index + 1));510name = escapeString(name);511value = escapeString(value);512if (name.empty() || value.empty()) continue;513if (read_net)514net->net_cfg[name] = value;515else516net->layers_cfg[layers_counter][name] = value;517}518}519}520521std::string anchors = net->layers_cfg[net->layers_cfg.size() - 1]["anchors"];522std::vector<float> vec = getNumbers<float>(anchors);523std::map<std::string, std::string> &net_params = net->net_cfg;524net->width = getParam(net_params, "width", 416);525net->height = getParam(net_params, "height", 416);526net->channels = getParam(net_params, "channels", 3);527CV_Assert(net->width > 0 && net->height > 0 && net->channels > 0);528529int current_channels = net->channels;530net->out_channels_vec.resize(net->layers_cfg.size());531532layers_counter = -1;533534setLayersParams setParams(net);535536typedef std::map<int, std::map<std::string, std::string> >::iterator it_type;537for (it_type i = net->layers_cfg.begin(); i != net->layers_cfg.end(); ++i) {538++layers_counter;539std::map<std::string, std::string> &layer_params = i->second;540std::string layer_type = layer_params["type"];541542if (layer_type == "convolutional")543{544int kernel_size = getParam<int>(layer_params, "size", -1);545int pad = getParam<int>(layer_params, "pad", 0);546int stride = getParam<int>(layer_params, "stride", 1);547int filters = getParam<int>(layer_params, "filters", -1);548std::string activation = getParam<std::string>(layer_params, "activation", "linear");549bool batch_normalize = getParam<int>(layer_params, "batch_normalize", 0) == 1;550if(activation != "linear" && activation != "leaky")551CV_Error(cv::Error::StsParseError, "Unsupported activation: " + activation);552int flipped = getParam<int>(layer_params, "flipped", 0);553if (flipped == 1)554CV_Error(cv::Error::StsNotImplemented, "Transpose the convolutional weights is not implemented");555556// correct the strange value of pad=1 for kernel_size=1 in the Darknet cfg-file557if (kernel_size < 3) pad = 0;558559CV_Assert(kernel_size > 0 && filters > 0);560CV_Assert(current_channels > 0);561562setParams.setConvolution(kernel_size, pad, stride, filters, current_channels,563batch_normalize, activation == "leaky");564565current_channels = filters;566}567else if (layer_type == "maxpool")568{569int kernel_size = getParam<int>(layer_params, "size", 2);570int stride = getParam<int>(layer_params, "stride", 2);571int pad = getParam<int>(layer_params, "pad", 0);572setParams.setMaxpool(kernel_size, pad, stride);573}574else if (layer_type == "avgpool")575{576setParams.setAvgpool();577}578else if (layer_type == "softmax")579{580int groups = getParam<int>(layer_params, "groups", 1);581if (groups != 1)582CV_Error(Error::StsNotImplemented, "Softmax from Darknet with groups != 1");583setParams.setSoftmax();584}585else if (layer_type == "route")586{587std::string bottom_layers = getParam<std::string>(layer_params, "layers", "");588CV_Assert(!bottom_layers.empty());589std::vector<int> layers_vec = getNumbers<int>(bottom_layers);590591current_channels = 0;592for (size_t k = 0; k < layers_vec.size(); ++k) {593layers_vec[k] = layers_vec[k] > 0 ? layers_vec[k] : (layers_vec[k] + layers_counter);594current_channels += net->out_channels_vec[layers_vec[k]];595}596597if (layers_vec.size() == 1)598setParams.setIdentity(layers_vec.at(0));599else600setParams.setConcat(layers_vec.size(), layers_vec.data());601}602else if (layer_type == "reorg")603{604int stride = getParam<int>(layer_params, "stride", 2);605current_channels = current_channels * (stride*stride);606607setParams.setReorg(stride);608}609else if (layer_type == "region")610{611float thresh = getParam<float>(layer_params, "thresh", 0.001);612int coords = getParam<int>(layer_params, "coords", 4);613int classes = getParam<int>(layer_params, "classes", -1);614int num_of_anchors = getParam<int>(layer_params, "num", -1);615int classfix = getParam<int>(layer_params, "classfix", 0);616bool softmax = (getParam<int>(layer_params, "softmax", 0) == 1);617bool softmax_tree = (getParam<std::string>(layer_params, "tree", "").size() > 0);618619std::string anchors_values = getParam<std::string>(layer_params, "anchors", std::string());620CV_Assert(!anchors_values.empty());621std::vector<float> anchors_vec = getNumbers<float>(anchors_values);622623CV_Assert(classes > 0 && num_of_anchors > 0 && (num_of_anchors * 2) == anchors_vec.size());624625setParams.setPermute(false);626setParams.setRegion(thresh, coords, classes, num_of_anchors, classfix, softmax, softmax_tree, anchors_vec.data());627}628else if (layer_type == "shortcut")629{630std::string bottom_layer = getParam<std::string>(layer_params, "from", "");631CV_Assert(!bottom_layer.empty());632int from = std::atoi(bottom_layer.c_str());633634from += layers_counter;635current_channels = net->out_channels_vec[from];636637setParams.setShortcut(from);638}639else if (layer_type == "upsample")640{641int scaleFactor = getParam<int>(layer_params, "stride", 1);642setParams.setUpsample(scaleFactor);643}644else if (layer_type == "yolo")645{646int classes = getParam<int>(layer_params, "classes", -1);647int num_of_anchors = getParam<int>(layer_params, "num", -1);648649std::string anchors_values = getParam<std::string>(layer_params, "anchors", std::string());650CV_Assert(!anchors_values.empty());651std::vector<float> anchors_vec = getNumbers<float>(anchors_values);652653std::string mask_values = getParam<std::string>(layer_params, "mask", std::string());654CV_Assert(!mask_values.empty());655std::vector<int> mask_vec = getNumbers<int>(mask_values);656657CV_Assert(classes > 0 && num_of_anchors > 0 && (num_of_anchors * 2) == anchors_vec.size());658659setParams.setPermute(false);660setParams.setYolo(classes, mask_vec, anchors_vec);661}662else {663CV_Error(cv::Error::StsParseError, "Unknown layer type: " + layer_type);664}665net->out_channels_vec[layers_counter] = current_channels;666}667668return true;669}670671bool ReadDarknetFromWeightsStream(std::istream &ifile, NetParameter *net)672{673int32_t major_ver, minor_ver, revision;674ifile.read(reinterpret_cast<char *>(&major_ver), sizeof(int32_t));675ifile.read(reinterpret_cast<char *>(&minor_ver), sizeof(int32_t));676ifile.read(reinterpret_cast<char *>(&revision), sizeof(int32_t));677678uint64_t seen;679if ((major_ver * 10 + minor_ver) >= 2) {680ifile.read(reinterpret_cast<char *>(&seen), sizeof(uint64_t));681}682else {683int32_t iseen = 0;684ifile.read(reinterpret_cast<char *>(&iseen), sizeof(int32_t));685seen = iseen;686}687bool transpose = (major_ver > 1000) || (minor_ver > 1000);688if(transpose)689CV_Error(cv::Error::StsNotImplemented, "Transpose the weights (except for convolutional) is not implemented");690691int current_channels = net->channels;692int cv_layers_counter = -1;693int darknet_layers_counter = -1;694695setLayersParams setParams(net);696697typedef std::map<int, std::map<std::string, std::string> >::iterator it_type;698for (it_type i = net->layers_cfg.begin(); i != net->layers_cfg.end(); ++i) {699++darknet_layers_counter;700++cv_layers_counter;701std::map<std::string, std::string> &layer_params = i->second;702std::string layer_type = layer_params["type"];703704if (layer_type == "convolutional")705{706int kernel_size = getParam<int>(layer_params, "size", -1);707int filters = getParam<int>(layer_params, "filters", -1);708std::string activation = getParam<std::string>(layer_params, "activation", "linear");709bool use_batch_normalize = getParam<int>(layer_params, "batch_normalize", 0) == 1;710711CV_Assert(kernel_size > 0 && filters > 0);712CV_Assert(current_channels > 0);713714size_t const weights_size = filters * current_channels * kernel_size * kernel_size;715int sizes_weights[] = { filters, current_channels, kernel_size, kernel_size };716cv::Mat weightsBlob;717weightsBlob.create(4, sizes_weights, CV_32F);718CV_Assert(weightsBlob.isContinuous());719720cv::Mat meanData_mat(1, filters, CV_32F); // mean721cv::Mat stdData_mat(1, filters, CV_32F); // variance722cv::Mat weightsData_mat(1, filters, CV_32F);// scale723cv::Mat biasData_mat(1, filters, CV_32F); // bias724725ifile.read(reinterpret_cast<char *>(biasData_mat.ptr<float>()), sizeof(float)*filters);726if (use_batch_normalize) {727ifile.read(reinterpret_cast<char *>(weightsData_mat.ptr<float>()), sizeof(float)*filters);728ifile.read(reinterpret_cast<char *>(meanData_mat.ptr<float>()), sizeof(float)*filters);729ifile.read(reinterpret_cast<char *>(stdData_mat.ptr<float>()), sizeof(float)*filters);730}731ifile.read(reinterpret_cast<char *>(weightsBlob.ptr<float>()), sizeof(float)*weights_size);732733// set convolutional weights734std::vector<cv::Mat> conv_blobs;735conv_blobs.push_back(weightsBlob);736if (!use_batch_normalize) {737// use BIAS in any case738conv_blobs.push_back(biasData_mat);739}740setParams.setLayerBlobs(cv_layers_counter, conv_blobs);741742// set batch normalize (mean, variance, scale, bias)743if (use_batch_normalize) {744++cv_layers_counter;745std::vector<cv::Mat> bn_blobs;746bn_blobs.push_back(meanData_mat);747bn_blobs.push_back(stdData_mat);748bn_blobs.push_back(weightsData_mat);749bn_blobs.push_back(biasData_mat);750setParams.setLayerBlobs(cv_layers_counter, bn_blobs);751}752753if(activation == "leaky")754++cv_layers_counter;755}756if (layer_type == "region" || layer_type == "yolo")757{758++cv_layers_counter; // For permute.759}760current_channels = net->out_channels_vec[darknet_layers_counter];761}762return true;763}764765}766767768void ReadNetParamsFromCfgStreamOrDie(std::istream &ifile, darknet::NetParameter *net)769{770if (!darknet::ReadDarknetFromCfgStream(ifile, net)) {771CV_Error(cv::Error::StsParseError, "Failed to parse NetParameter stream");772}773}774775void ReadNetParamsFromBinaryStreamOrDie(std::istream &ifile, darknet::NetParameter *net)776{777if (!darknet::ReadDarknetFromWeightsStream(ifile, net)) {778CV_Error(cv::Error::StsParseError, "Failed to parse NetParameter stream");779}780}781}782}783784785