@ -476,68 +476,61 @@ namespace cv {
return dst ;
return dst ;
}
}
bool ReadDarknetFromCfgFile ( const char * cfgF ile , NetParameter * net )
bool ReadDarknetFromCfgStream ( std : : istream & if ile , NetParameter * net )
{
{
std : : ifstream ifile ;
bool read_net = false ;
ifile . open ( cfgFile ) ;
int layers_counter = - 1 ;
if ( ifile . is_open ( ) )
for ( std : : string line ; std : : getline ( ifile , line ) ; ) {
{
line = escapeString ( line ) ;
bool read_net = false ;
if ( line . empty ( ) ) continue ;
int layers_counter = - 1 ;
switch ( line [ 0 ] ) {
for ( std : : string line ; std : : getline ( ifile , line ) ; ) {
case ' \0 ' : break ;
line = escapeString ( line ) ;
case ' # ' : break ;
if ( line . empty ( ) ) continue ;
case ' ; ' : break ;
switch ( line [ 0 ] ) {
case ' [ ' :
case ' \0 ' : break ;
if ( line = = " [net] " ) {
case ' # ' : break ;
read_net = true ;
case ' ; ' : break ;
}
case ' [ ' :
else {
if ( line = = " [net] " ) {
// read section
read_net = true ;
read_net = false ;
}
+ + layers_counter ;
else {
const size_t layer_type_size = line . find ( " ] " ) - 1 ;
// read section
CV_Assert ( layer_type_size < line . size ( ) ) ;
read_net = false ;
std : : string layer_type = line . substr ( 1 , layer_type_size ) ;
+ + layers_counter ;
net - > layers_cfg [ layers_counter ] [ " type " ] = layer_type ;
const size_t layer_type_size = line . find ( " ] " ) - 1 ;
}
CV_Assert ( layer_type_size < line . size ( ) ) ;
break ;
std : : string layer_type = line . substr ( 1 , layer_type_size ) ;
default :
net - > layers_cfg [ layers_counter ] [ " type " ] = layer_type ;
// read entry
}
const size_t separator_index = line . find ( ' = ' ) ;
break ;
CV_Assert ( separator_index < line . size ( ) ) ;
default :
if ( separator_index ! = std : : string : : npos ) {
// read entry
std : : string name = line . substr ( 0 , separator_index ) ;
const size_t separator_index = line . find ( ' = ' ) ;
std : : string value = line . substr ( separator_index + 1 , line . size ( ) - ( separator_index + 1 ) ) ;
CV_Assert ( separator_index < line . size ( ) ) ;
name = escapeString ( name ) ;
if ( separator_index ! = std : : string : : npos ) {
value = escapeString ( value ) ;
std : : string name = line . substr ( 0 , separator_index ) ;
if ( name . empty ( ) | | value . empty ( ) ) continue ;
std : : string value = line . substr ( separator_index + 1 , line . size ( ) - ( separator_index + 1 ) ) ;
if ( read_net )
name = escapeString ( name ) ;
net - > net_cfg [ name ] = value ;
value = escapeString ( value ) ;
else
if ( name . empty ( ) | | value . empty ( ) ) continue ;
net - > layers_cfg [ layers_counter ] [ name ] = value ;
if ( read_net )
net - > net_cfg [ name ] = value ;
else
net - > layers_cfg [ layers_counter ] [ name ] = value ;
}
}
}
}
}
std : : string anchors = net - > layers_cfg [ net - > layers_cfg . size ( ) - 1 ] [ " anchors " ] ;
std : : vector < float > vec = getNumbers < float > ( anchors ) ;
std : : map < std : : string , std : : string > & net_params = net - > net_cfg ;
net - > width = getParam ( net_params , " width " , 416 ) ;
net - > height = getParam ( net_params , " height " , 416 ) ;
net - > channels = getParam ( net_params , " channels " , 3 ) ;
CV_Assert ( net - > width > 0 & & net - > height > 0 & & net - > channels > 0 ) ;
}
}
else
return false ;
std : : string anchors = net - > layers_cfg [ net - > layers_cfg . size ( ) - 1 ] [ " anchors " ] ;
std : : vector < float > vec = getNumbers < float > ( anchors ) ;
std : : map < std : : string , std : : string > & net_params = net - > net_cfg ;
net - > width = getParam ( net_params , " width " , 416 ) ;
net - > height = getParam ( net_params , " height " , 416 ) ;
net - > channels = getParam ( net_params , " channels " , 3 ) ;
CV_Assert ( net - > width > 0 & & net - > height > 0 & & net - > channels > 0 ) ;
int current_channels = net - > channels ;
int current_channels = net - > channels ;
net - > out_channels_vec . resize ( net - > layers_cfg . size ( ) ) ;
net - > out_channels_vec . resize ( net - > layers_cfg . size ( ) ) ;
int layers_counter = - 1 ;
layers_counter = - 1 ;
setLayersParams setParams ( net ) ;
setLayersParams setParams ( net ) ;
@ -676,13 +669,8 @@ namespace cv {
return true ;
return true ;
}
}
bool ReadDarknetFromWeightsStream ( std : : istream & ifile , NetParameter * net )
bool ReadDarknetFromWeightsFile ( const char * darknetModel , NetParameter * net )
{
{
std : : ifstream ifile ;
ifile . open ( darknetModel , std : : ios : : binary ) ;
CV_Assert ( ifile . is_open ( ) ) ;
int32_t major_ver , minor_ver , revision ;
int32_t major_ver , minor_ver , revision ;
ifile . read ( reinterpret_cast < char * > ( & major_ver ) , sizeof ( int32_t ) ) ;
ifile . read ( reinterpret_cast < char * > ( & major_ver ) , sizeof ( int32_t ) ) ;
ifile . read ( reinterpret_cast < char * > ( & minor_ver ) , sizeof ( int32_t ) ) ;
ifile . read ( reinterpret_cast < char * > ( & minor_ver ) , sizeof ( int32_t ) ) ;
@ -778,19 +766,18 @@ namespace cv {
}
}
void ReadNetParamsFromCfgFileOrDie ( const char * cfgF ile , darknet : : NetParameter * net )
void ReadNetParamsFromCfgStreamOrDie ( std : : istream & if ile , darknet : : NetParameter * net )
{
{
if ( ! darknet : : ReadDarknetFromCfgFile ( cfgF ile , net ) ) {
if ( ! darknet : : ReadDarknetFromCfgStream ( if ile , net ) ) {
CV_Error ( cv : : Error : : StsParseError , " Failed to parse NetParameter file: " + std : : string ( cfgFile ) ) ;
CV_Error ( cv : : Error : : StsParseError , " Failed to parse NetParameter stream " ) ;
}
}
}
}
void ReadNetParamsFromBinaryFileOrDie ( const char * darknetModel , darknet : : NetParameter * net )
void ReadNetParamsFromBinaryStreamOrDie ( std : : istream & ifile , darknet : : NetParameter * net )
{
{
if ( ! darknet : : ReadDarknetFromWeightsFile ( darknetModel , net ) ) {
if ( ! darknet : : ReadDarknetFromWeightsStream ( ifile , net ) ) {
CV_Error ( cv : : Error : : StsParseError , " Failed to parse NetParameter file: " + std : : string ( darknetModel ) ) ;
CV_Error ( cv : : Error : : StsParseError , " Failed to parse NetParameter stream " ) ;
}
}
}
}
}
}
}
}