Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
b7ff9ddc
Commit
b7ff9ddc
authored
Oct 10, 2017
by
Vadim Pisarevsky
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #9705 from AlexeyAB:dnn_darknet_yolo_v2
parents
0739f28e
ecc34dc5
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
810 additions
and
1 deletion
+810
-1
all_layers.hpp
modules/dnn/include/opencv2/dnn/all_layers.hpp
+12
-0
dnn.hpp
modules/dnn/include/opencv2/dnn/dnn.hpp
+8
-0
darknet_importer.cpp
modules/dnn/src/darknet/darknet_importer.cpp
+195
-0
darknet_io.cpp
modules/dnn/src/darknet/darknet_io.cpp
+0
-0
darknet_io.hpp
modules/dnn/src/darknet/darknet_io.hpp
+116
-0
init.cpp
modules/dnn/src/init.cpp
+2
-0
region_layer.cpp
modules/dnn/src/layers/region_layer.cpp
+0
-0
reorg_layer.cpp
modules/dnn/src/layers/reorg_layer.cpp
+140
-0
test_darknet_importer.cpp
modules/dnn/test/test_darknet_importer.cpp
+186
-0
test_layers.cpp
modules/dnn/test/test_layers.cpp
+33
-1
yolo_object_detection.cpp
samples/dnn/yolo_object_detection.cpp
+118
-0
No files found.
modules/dnn/include/opencv2/dnn/all_layers.hpp
View file @
b7ff9ddc
...
...
@@ -527,6 +527,18 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
static
Ptr
<
PriorBoxLayer
>
create
(
const
LayerParams
&
params
);
};
class
CV_EXPORTS
ReorgLayer
:
public
Layer
{
public
:
static
Ptr
<
ReorgLayer
>
create
(
const
LayerParams
&
params
);
};
class
CV_EXPORTS
RegionLayer
:
public
Layer
{
public
:
static
Ptr
<
RegionLayer
>
create
(
const
LayerParams
&
params
);
};
class
CV_EXPORTS
DetectionOutputLayer
:
public
Layer
{
public
:
...
...
modules/dnn/include/opencv2/dnn/dnn.hpp
View file @
b7ff9ddc
...
...
@@ -612,6 +612,14 @@ CV__DNN_EXPERIMENTAL_NS_BEGIN
virtual
~
Importer
();
};
/** @brief Reads a network model stored in <a href="https://pjreddie.com/darknet/">Darknet</a> model files.
* @param cfgFile path to the .cfg file with text description of the network architecture.
* @param darknetModel path to the .weights file with learned network.
* @returns Network object that ready to do forward, throw an exception in failure cases.
* @details This is shortcut consisting from DarknetImporter and Net::populateNet calls.
*/
CV_EXPORTS_W
Net
readNetFromDarknet
(
const
String
&
cfgFile
,
const
String
&
darknetModel
=
String
());
/**
* @deprecated Use @ref readNetFromCaffe instead.
* @brief Creates the importer of <a href="http://caffe.berkeleyvision.org">Caffe</a> framework network.
...
...
modules/dnn/src/darknet/darknet_importer.cpp
0 → 100644
View file @
b7ff9ddc
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
// (3-clause BSD License)
//
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * Neither the names of the copyright holders nor the names of the contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall copyright holders or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "../precomp.hpp"
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include "darknet_io.hpp"
namespace
cv
{
namespace
dnn
{
CV__DNN_EXPERIMENTAL_NS_BEGIN
namespace
{
class
DarknetImporter
:
public
Importer
{
darknet
::
NetParameter
net
;
public
:
DarknetImporter
()
{}
DarknetImporter
(
const
char
*
cfgFile
,
const
char
*
darknetModel
)
{
CV_TRACE_FUNCTION
();
ReadNetParamsFromCfgFileOrDie
(
cfgFile
,
&
net
);
if
(
darknetModel
&&
darknetModel
[
0
])
ReadNetParamsFromBinaryFileOrDie
(
darknetModel
,
&
net
);
}
struct
BlobNote
{
BlobNote
(
const
std
::
string
&
_name
,
int
_layerId
,
int
_outNum
)
:
name
(
_name
),
layerId
(
_layerId
),
outNum
(
_outNum
)
{}
std
::
string
name
;
int
layerId
,
outNum
;
};
std
::
vector
<
BlobNote
>
addedBlobs
;
std
::
map
<
String
,
int
>
layerCounter
;
void
populateNet
(
Net
dstNet
)
{
CV_TRACE_FUNCTION
();
int
layersSize
=
net
.
layer_size
();
layerCounter
.
clear
();
addedBlobs
.
clear
();
addedBlobs
.
reserve
(
layersSize
+
1
);
//setup input layer names
{
std
::
vector
<
String
>
netInputs
(
net
.
input_size
());
for
(
int
inNum
=
0
;
inNum
<
net
.
input_size
();
inNum
++
)
{
addedBlobs
.
push_back
(
BlobNote
(
net
.
input
(
inNum
),
0
,
inNum
));
netInputs
[
inNum
]
=
net
.
input
(
inNum
);
}
dstNet
.
setInputsNames
(
netInputs
);
}
for
(
int
li
=
0
;
li
<
layersSize
;
li
++
)
{
const
darknet
::
LayerParameter
&
layer
=
net
.
layer
(
li
);
String
name
=
layer
.
name
();
String
type
=
layer
.
type
();
LayerParams
layerParams
=
layer
.
getLayerParams
();
int
repetitions
=
layerCounter
[
name
]
++
;
if
(
repetitions
)
name
+=
cv
::
format
(
"_%d"
,
repetitions
);
int
id
=
dstNet
.
addLayer
(
name
,
type
,
layerParams
);
// iterate many bottoms layers (for example for: route -1, -4)
for
(
int
inNum
=
0
;
inNum
<
layer
.
bottom_size
();
inNum
++
)
addInput
(
layer
.
bottom
(
inNum
),
id
,
inNum
,
dstNet
,
layer
.
name
());
for
(
int
outNum
=
0
;
outNum
<
layer
.
top_size
();
outNum
++
)
addOutput
(
layer
,
id
,
outNum
);
}
addedBlobs
.
clear
();
}
void
addOutput
(
const
darknet
::
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
addInput
(
const
std
::
string
&
name
,
int
layerId
,
int
inNum
,
Net
&
dstNet
,
std
::
string
nn
)
{
int
idx
;
for
(
idx
=
(
int
)
addedBlobs
.
size
()
-
1
;
idx
>=
0
;
idx
--
)
{
if
(
addedBlobs
[
idx
].
name
==
name
)
break
;
}
if
(
idx
<
0
)
{
CV_Error
(
Error
::
StsObjectNotFound
,
"Can't find output blob
\"
"
+
name
+
"
\"
"
);
return
;
}
dstNet
.
connect
(
addedBlobs
[
idx
].
layerId
,
addedBlobs
[
idx
].
outNum
,
layerId
,
inNum
);
}
~
DarknetImporter
()
{
}
};
}
Net
readNetFromDarknet
(
const
String
&
cfgFile
,
const
String
&
darknetModel
/*= String()*/
)
{
DarknetImporter
darknetImporter
(
cfgFile
.
c_str
(),
darknetModel
.
c_str
());
Net
net
;
darknetImporter
.
populateNet
(
net
);
return
net
;
}
CV__DNN_EXPERIMENTAL_NS_END
}}
// namespace
modules/dnn/src/darknet/darknet_io.cpp
0 → 100644
View file @
b7ff9ddc
This diff is collapsed.
Click to expand it.
modules/dnn/src/darknet/darknet_io.hpp
0 → 100644
View file @
b7ff9ddc
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
// (3-clause BSD License)
//
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * Neither the names of the copyright holders nor the names of the contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall copyright holders or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
/*M///////////////////////////////////////////////////////////////////////////////////////
//MIT License
//
//Copyright (c) 2017 Joseph Redmon
//
//Permission is hereby granted, free of charge, to any person obtaining a copy
//of this software and associated documentation files (the "Software"), to deal
//in the Software without restriction, including without limitation the rights
//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//copies of the Software, and to permit persons to whom the Software is
//furnished to do so, subject to the following conditions:
//
//The above copyright notice and this permission notice shall be included in all
//copies or substantial portions of the Software.
//
//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//SOFTWARE.
//
//M*/
#ifndef __OPENCV_DNN_DARKNET_IO_HPP__
#define __OPENCV_DNN_DARKNET_IO_HPP__
#include <opencv2/dnn/dnn.hpp>
namespace
cv
{
namespace
dnn
{
namespace
darknet
{
class
LayerParameter
{
std
::
string
layer_name
,
layer_type
;
std
::
vector
<
std
::
string
>
bottom_indexes
;
cv
::
dnn
::
experimental_dnn_v1
::
LayerParams
layerParams
;
public
:
friend
class
setLayersParams
;
cv
::
dnn
::
experimental_dnn_v1
::
LayerParams
getLayerParams
()
const
{
return
layerParams
;
}
std
::
string
name
()
const
{
return
layer_name
;
}
std
::
string
type
()
const
{
return
layer_type
;
}
int
bottom_size
()
const
{
return
bottom_indexes
.
size
();
}
std
::
string
bottom
(
const
int
index
)
const
{
return
bottom_indexes
.
at
(
index
);
}
int
top_size
()
const
{
return
1
;
}
std
::
string
top
(
const
int
index
)
const
{
return
layer_name
;
}
};
class
NetParameter
{
public
:
int
width
,
height
,
channels
;
std
::
vector
<
LayerParameter
>
layers
;
std
::
vector
<
int
>
out_channels_vec
;
std
::
map
<
int
,
std
::
map
<
std
::
string
,
std
::
string
>
>
layers_cfg
;
std
::
map
<
std
::
string
,
std
::
string
>
net_cfg
;
int
layer_size
()
const
{
return
layers
.
size
();
}
int
input_size
()
const
{
return
1
;
}
std
::
string
input
(
const
int
index
)
const
{
return
"data"
;
}
LayerParameter
layer
(
const
int
index
)
const
{
return
layers
.
at
(
index
);
}
};
}
// Read parameters from a file into a NetParameter message.
void
ReadNetParamsFromCfgFileOrDie
(
const
char
*
cfgFile
,
darknet
::
NetParameter
*
net
);
void
ReadNetParamsFromBinaryFileOrDie
(
const
char
*
darknetModel
,
darknet
::
NetParameter
*
net
);
}
}
#endif
modules/dnn/src/init.cpp
View file @
b7ff9ddc
...
...
@@ -114,6 +114,8 @@ void initializeLayerFactory()
CV_DNN_REGISTER_LAYER_CLASS
(
Eltwise
,
EltwiseLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
Permute
,
PermuteLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
PriorBox
,
PriorBoxLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
Reorg
,
ReorgLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
Region
,
RegionLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
DetectionOutput
,
DetectionOutputLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
NormalizeBBox
,
NormalizeBBoxLayer
);
CV_DNN_REGISTER_LAYER_CLASS
(
Normalize
,
NormalizeBBoxLayer
);
...
...
modules/dnn/src/layers/region_layer.cpp
0 → 100644
View file @
b7ff9ddc
This diff is collapsed.
Click to expand it.
modules/dnn/src/layers/reorg_layer.cpp
0 → 100644
View file @
b7ff9ddc
/*M ///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "../precomp.hpp"
#include <opencv2/dnn/shape_utils.hpp>
#include <opencv2/dnn/all_layers.hpp>
#include <iostream>
namespace
cv
{
namespace
dnn
{
class
ReorgLayerImpl
:
public
ReorgLayer
{
int
reorgStride
;
public
:
ReorgLayerImpl
(
const
LayerParams
&
params
)
{
setParamsFrom
(
params
);
reorgStride
=
params
.
get
<
int
>
(
"reorg_stride"
,
2
);
CV_Assert
(
reorgStride
>
0
);
}
bool
getMemoryShapes
(
const
std
::
vector
<
MatShape
>
&
inputs
,
const
int
requiredOutputs
,
std
::
vector
<
MatShape
>
&
outputs
,
std
::
vector
<
MatShape
>
&
internals
)
const
{
CV_Assert
(
inputs
.
size
()
>
0
);
outputs
=
std
::
vector
<
MatShape
>
(
inputs
.
size
(),
shape
(
inputs
[
0
][
0
],
inputs
[
0
][
1
]
*
reorgStride
*
reorgStride
,
inputs
[
0
][
2
]
/
reorgStride
,
inputs
[
0
][
3
]
/
reorgStride
));
CV_Assert
(
outputs
[
0
][
0
]
>
0
&&
outputs
[
0
][
1
]
>
0
&&
outputs
[
0
][
2
]
>
0
&&
outputs
[
0
][
3
]
>
0
);
CV_Assert
(
total
(
outputs
[
0
])
==
total
(
inputs
[
0
]));
return
false
;
}
virtual
bool
supportBackend
(
int
backendId
)
{
return
backendId
==
DNN_BACKEND_DEFAULT
;
}
void
forward
(
std
::
vector
<
Mat
*>
&
inputs
,
std
::
vector
<
Mat
>
&
outputs
,
std
::
vector
<
Mat
>
&
internals
)
{
CV_TRACE_FUNCTION
();
CV_TRACE_ARG_VALUE
(
name
,
"name"
,
name
.
c_str
());
for
(
size_t
i
=
0
;
i
<
inputs
.
size
();
i
++
)
{
Mat
srcBlob
=
*
inputs
[
i
];
MatShape
inputShape
=
shape
(
srcBlob
),
outShape
=
shape
(
outputs
[
i
]);
float
*
dstData
=
outputs
[
0
].
ptr
<
float
>
();
const
float
*
srcData
=
srcBlob
.
ptr
<
float
>
();
int
channels
=
inputShape
[
1
],
height
=
inputShape
[
2
],
width
=
inputShape
[
3
];
int
out_c
=
channels
/
(
reorgStride
*
reorgStride
);
for
(
int
k
=
0
;
k
<
channels
;
++
k
)
{
for
(
int
j
=
0
;
j
<
height
;
++
j
)
{
for
(
int
i
=
0
;
i
<
width
;
++
i
)
{
int
out_index
=
i
+
width
*
(
j
+
height
*
k
);
int
c2
=
k
%
out_c
;
int
offset
=
k
/
out_c
;
int
w2
=
i
*
reorgStride
+
offset
%
reorgStride
;
int
h2
=
j
*
reorgStride
+
offset
/
reorgStride
;
int
in_index
=
w2
+
width
*
reorgStride
*
(
h2
+
height
*
reorgStride
*
c2
);
dstData
[
out_index
]
=
srcData
[
in_index
];
}
}
}
}
}
virtual
int64
getFLOPS
(
const
std
::
vector
<
MatShape
>
&
inputs
,
const
std
::
vector
<
MatShape
>
&
outputs
)
const
{
(
void
)
outputs
;
// suppress unused variable warning
int64
flops
=
0
;
for
(
int
i
=
0
;
i
<
inputs
.
size
();
i
++
)
{
flops
+=
21
*
total
(
inputs
[
i
]);
}
return
flops
;
}
};
Ptr
<
ReorgLayer
>
ReorgLayer
::
create
(
const
LayerParams
&
params
)
{
return
Ptr
<
ReorgLayer
>
(
new
ReorgLayerImpl
(
params
));
}
}
// namespace dnn
}
// namespace cv
modules/dnn/test/test_darknet_importer.cpp
0 → 100644
View file @
b7ff9ddc
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
// (3-clause BSD License)
//
// Copyright (C) 2017, Intel Corporation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistributions in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other materials provided with the distribution.
//
// * Neither the names of the copyright holders nor the names of the contributors
// may be used to endorse or promote products derived from this software
// without specific prior written permission.
//
// This software is provided by the copyright holders and contributors "as is" and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall copyright holders or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "test_precomp.hpp"
#include <opencv2/dnn/shape_utils.hpp>
#include <algorithm>
namespace
cvtest
{
using
namespace
cv
;
using
namespace
cv
::
dnn
;
template
<
typename
TString
>
static
std
::
string
_tf
(
TString
filename
)
{
return
(
getOpenCVExtraDir
()
+
"/dnn/"
)
+
filename
;
}
TEST
(
Test_Darknet
,
read_tiny_yolo_voc
)
{
Net
net
=
readNetFromDarknet
(
_tf
(
"tiny-yolo-voc.cfg"
));
ASSERT_FALSE
(
net
.
empty
());
}
TEST
(
Test_Darknet
,
read_yolo_voc
)
{
Net
net
=
readNetFromDarknet
(
_tf
(
"yolo-voc.cfg"
));
ASSERT_FALSE
(
net
.
empty
());
}
TEST
(
Reproducibility_TinyYoloVoc
,
Accuracy
)
{
Net
net
;
{
const
string
cfg
=
findDataFile
(
"dnn/tiny-yolo-voc.cfg"
,
false
);
const
string
model
=
findDataFile
(
"dnn/tiny-yolo-voc.weights"
,
false
);
net
=
readNetFromDarknet
(
cfg
,
model
);
ASSERT_FALSE
(
net
.
empty
());
}
// dog416.png is dog.jpg that resized to 416x416 in the lossless PNG format
Mat
sample
=
imread
(
_tf
(
"dog416.png"
));
ASSERT_TRUE
(
!
sample
.
empty
());
Size
inputSize
(
416
,
416
);
if
(
sample
.
size
()
!=
inputSize
)
resize
(
sample
,
sample
,
inputSize
);
net
.
setInput
(
blobFromImage
(
sample
,
1
/
255.
F
),
"data"
);
Mat
out
=
net
.
forward
(
"detection_out"
);
Mat
detection
;
const
float
confidenceThreshold
=
0.24
;
for
(
int
i
=
0
;
i
<
out
.
rows
;
i
++
)
{
const
int
probability_index
=
5
;
const
int
probability_size
=
out
.
cols
-
probability_index
;
float
*
prob_array_ptr
=
&
out
.
at
<
float
>
(
i
,
probability_index
);
size_t
objectClass
=
std
::
max_element
(
prob_array_ptr
,
prob_array_ptr
+
probability_size
)
-
prob_array_ptr
;
float
confidence
=
out
.
at
<
float
>
(
i
,
(
int
)
objectClass
+
probability_index
);
if
(
confidence
>
confidenceThreshold
)
detection
.
push_back
(
out
.
row
(
i
));
}
// obtained by: ./darknet detector test ./cfg/voc.data ./cfg/tiny-yolo-voc.cfg ./tiny-yolo-voc.weights -thresh 0.24 ./dog416.png
// There are 2 objects (6-car, 11-dog) with 25 values for each:
// { relative_center_x, relative_center_y, relative_width, relative_height, unused_t0, probability_for_each_class[20] }
float
ref_array
[]
=
{
0.736762
F
,
0.239551
F
,
0.315440
F
,
0.160779
F
,
0.761977
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.761967
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.287486
F
,
0.653731
F
,
0.315579
F
,
0.534527
F
,
0.782737
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.780595
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
};
const
int
number_of_objects
=
2
;
Mat
ref
(
number_of_objects
,
sizeof
(
ref_array
)
/
(
number_of_objects
*
sizeof
(
float
)),
CV_32FC1
,
&
ref_array
);
normAssert
(
ref
,
detection
);
}
TEST
(
Reproducibility_YoloVoc
,
Accuracy
)
{
Net
net
;
{
const
string
cfg
=
findDataFile
(
"dnn/yolo-voc.cfg"
,
false
);
const
string
model
=
findDataFile
(
"dnn/yolo-voc.weights"
,
false
);
net
=
readNetFromDarknet
(
cfg
,
model
);
ASSERT_FALSE
(
net
.
empty
());
}
// dog416.png is dog.jpg that resized to 416x416 in the lossless PNG format
Mat
sample
=
imread
(
_tf
(
"dog416.png"
));
ASSERT_TRUE
(
!
sample
.
empty
());
Size
inputSize
(
416
,
416
);
if
(
sample
.
size
()
!=
inputSize
)
resize
(
sample
,
sample
,
inputSize
);
net
.
setInput
(
blobFromImage
(
sample
,
1
/
255.
F
),
"data"
);
Mat
out
=
net
.
forward
(
"detection_out"
);
Mat
detection
;
const
float
confidenceThreshold
=
0.24
;
for
(
int
i
=
0
;
i
<
out
.
rows
;
i
++
)
{
const
int
probability_index
=
5
;
const
int
probability_size
=
out
.
cols
-
probability_index
;
float
*
prob_array_ptr
=
&
out
.
at
<
float
>
(
i
,
probability_index
);
size_t
objectClass
=
std
::
max_element
(
prob_array_ptr
,
prob_array_ptr
+
probability_size
)
-
prob_array_ptr
;
float
confidence
=
out
.
at
<
float
>
(
i
,
(
int
)
objectClass
+
probability_index
);
if
(
confidence
>
confidenceThreshold
)
detection
.
push_back
(
out
.
row
(
i
));
}
// obtained by: ./darknet detector test ./cfg/voc.data ./cfg/yolo-voc.cfg ./yolo-voc.weights -thresh 0.24 ./dog416.png
// There are 3 objects (6-car, 1-bicycle, 11-dog) with 25 values for each:
// { relative_center_x, relative_center_y, relative_width, relative_height, unused_t0, probability_for_each_class[20] }
float
ref_array
[]
=
{
0.740161
F
,
0.214100
F
,
0.325575
F
,
0.173418
F
,
0.750769
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.750469
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.501618
F
,
0.504757
F
,
0.461713
F
,
0.481310
F
,
0.783550
F
,
0.000000
F
,
0.780879
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.279968
F
,
0.638651
F
,
0.282737
F
,
0.600284
F
,
0.901864
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.901615
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
,
0.000000
F
};
const
int
number_of_objects
=
3
;
Mat
ref
(
number_of_objects
,
sizeof
(
ref_array
)
/
(
number_of_objects
*
sizeof
(
float
)),
CV_32FC1
,
&
ref_array
);
normAssert
(
ref
,
detection
);
}
}
modules/dnn/test/test_layers.cpp
View file @
b7ff9ddc
...
...
@@ -10,7 +10,7 @@
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 201
3, OpenCV Found
ation, all rights reserved.
// Copyright (C) 201
7, Intel Corpor
ation, all rights reserved.
// Third party copyrights are property of their respective owners.
//
// Redistribution and use in source and binary forms, with or without modification,
...
...
@@ -485,4 +485,36 @@ TEST_F(Layer_RNN_Test, get_set_test)
EXPECT_EQ
(
shape
(
outputs
[
1
]),
shape
(
nT
,
nS
,
nH
));
}
void
testLayerUsingDarknetModels
(
String
basename
,
bool
useDarknetModel
=
false
,
bool
useCommonInputBlob
=
true
)
{
String
cfg
=
_tf
(
basename
+
".cfg"
);
String
weights
=
_tf
(
basename
+
".weights"
);
String
inpfile
=
(
useCommonInputBlob
)
?
_tf
(
"blob.npy"
)
:
_tf
(
basename
+
".input.npy"
);
String
outfile
=
_tf
(
basename
+
".npy"
);
cv
::
setNumThreads
(
cv
::
getNumberOfCPUs
());
Net
net
=
readNetFromDarknet
(
cfg
,
(
useDarknetModel
)
?
weights
:
String
());
ASSERT_FALSE
(
net
.
empty
());
Mat
inp
=
blobFromNPY
(
inpfile
);
Mat
ref
=
blobFromNPY
(
outfile
);
net
.
setInput
(
inp
,
"data"
);
Mat
out
=
net
.
forward
();
normAssert
(
ref
,
out
);
}
TEST
(
Layer_Test_Region
,
Accuracy
)
{
testLayerUsingDarknetModels
(
"region"
,
false
,
false
);
}
TEST
(
Layer_Test_Reorg
,
Accuracy
)
{
testLayerUsingDarknetModels
(
"reorg"
,
false
,
false
);
}
}
samples/dnn/yolo_object_detection.cpp
0 → 100644
View file @
b7ff9ddc
#include <opencv2/dnn.hpp>
#include <opencv2/dnn/shape_utils.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using
namespace
cv
;
using
namespace
cv
::
dnn
;
#include <fstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
using
namespace
std
;
const
size_t
network_width
=
416
;
const
size_t
network_height
=
416
;
const
char
*
about
=
"This sample uses You only look once (YOLO)-Detector "
"(https://arxiv.org/abs/1612.08242)"
"to detect objects on image
\n
"
;
// TODO: link
const
char
*
params
=
"{ help | false | print usage }"
"{ cfg | | model configuration }"
"{ model | | model weights }"
"{ image | | image for detection }"
"{ min_confidence | 0.24 | min confidence }"
;
int
main
(
int
argc
,
char
**
argv
)
{
cv
::
CommandLineParser
parser
(
argc
,
argv
,
params
);
if
(
parser
.
get
<
bool
>
(
"help"
))
{
std
::
cout
<<
about
<<
std
::
endl
;
parser
.
printMessage
();
return
0
;
}
String
modelConfiguration
=
parser
.
get
<
string
>
(
"cfg"
);
String
modelBinary
=
parser
.
get
<
string
>
(
"model"
);
//! [Initialize network]
dnn
::
Net
net
=
readNetFromDarknet
(
modelConfiguration
,
modelBinary
);
//! [Initialize network]
if
(
net
.
empty
())
{
cerr
<<
"Can't load network by using the following files: "
<<
endl
;
cerr
<<
"cfg-file: "
<<
modelConfiguration
<<
endl
;
cerr
<<
"weights-file: "
<<
modelBinary
<<
endl
;
cerr
<<
"Models can be downloaded here:"
<<
endl
;
cerr
<<
"https://pjreddie.com/darknet/yolo/"
<<
endl
;
exit
(
-
1
);
}
cv
::
Mat
frame
=
cv
::
imread
(
parser
.
get
<
string
>
(
"image"
));
//! [Resizing without keeping aspect ratio]
cv
::
Mat
resized
;
cv
::
resize
(
frame
,
resized
,
cv
::
Size
(
network_width
,
network_height
));
//! [Resizing without keeping aspect ratio]
//! [Prepare blob]
Mat
inputBlob
=
blobFromImage
(
resized
,
1
/
255.
F
);
//Convert Mat to batch of images
//! [Prepare blob]
//! [Set input blob]
net
.
setInput
(
inputBlob
,
"data"
);
//set the network input
//! [Set input blob]
//! [Make forward pass]
cv
::
Mat
detectionMat
=
net
.
forward
(
"detection_out"
);
//compute output
//! [Make forward pass]
float
confidenceThreshold
=
parser
.
get
<
float
>
(
"min_confidence"
);
for
(
int
i
=
0
;
i
<
detectionMat
.
rows
;
i
++
)
{
const
int
probability_index
=
5
;
const
int
probability_size
=
detectionMat
.
cols
-
probability_index
;
float
*
prob_array_ptr
=
&
detectionMat
.
at
<
float
>
(
i
,
probability_index
);
size_t
objectClass
=
std
::
max_element
(
prob_array_ptr
,
prob_array_ptr
+
probability_size
)
-
prob_array_ptr
;
float
confidence
=
detectionMat
.
at
<
float
>
(
i
,
(
int
)
objectClass
+
probability_index
);
if
(
confidence
>
confidenceThreshold
)
{
float
x
=
detectionMat
.
at
<
float
>
(
i
,
0
);
float
y
=
detectionMat
.
at
<
float
>
(
i
,
1
);
float
width
=
detectionMat
.
at
<
float
>
(
i
,
2
);
float
height
=
detectionMat
.
at
<
float
>
(
i
,
3
);
float
xLeftBottom
=
(
x
-
width
/
2
)
*
frame
.
cols
;
float
yLeftBottom
=
(
y
-
height
/
2
)
*
frame
.
rows
;
float
xRightTop
=
(
x
+
width
/
2
)
*
frame
.
cols
;
float
yRightTop
=
(
y
+
height
/
2
)
*
frame
.
rows
;
std
::
cout
<<
"Class: "
<<
objectClass
<<
std
::
endl
;
std
::
cout
<<
"Confidence: "
<<
confidence
<<
std
::
endl
;
std
::
cout
<<
" "
<<
xLeftBottom
<<
" "
<<
yLeftBottom
<<
" "
<<
xRightTop
<<
" "
<<
yRightTop
<<
std
::
endl
;
Rect
object
((
int
)
xLeftBottom
,
(
int
)
yLeftBottom
,
(
int
)(
xRightTop
-
xLeftBottom
),
(
int
)(
yRightTop
-
yLeftBottom
));
rectangle
(
frame
,
object
,
Scalar
(
0
,
255
,
0
));
}
}
imshow
(
"detections"
,
frame
);
waitKey
();
return
0
;
}
// main
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment