@ -44,6 +44,8 @@
# include "test_precomp.hpp"
# include <opencv2/dnn/shape_utils.hpp>
# include <algorithm>
# include <opencv2/core/ocl.hpp>
# include <opencv2/ts/ocl_test.hpp>
namespace cvtest
{
@ -69,6 +71,64 @@ TEST(Test_Darknet, read_yolo_voc)
ASSERT_FALSE ( net . empty ( ) ) ;
}
OCL_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 ( ) ) ;
}
net . setPreferableBackend ( DNN_BACKEND_DEFAULT ) ;
net . setPreferableTarget ( DNN_TARGET_OPENCL ) ;
// 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.736762F , 0.239551F , 0.315440F , 0.160779F , 0.761977F , 0.000000F , 0.000000F , 0.000000F , 0.000000F ,
0.000000F , 0.000000F , 0.761967F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F ,
0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F ,
0.287486F , 0.653731F , 0.315579F , 0.534527F , 0.782737F , 0.000000F , 0.000000F , 0.000000F , 0.000000F ,
0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.780595F ,
0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F , 0.000000F
} ;
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_TinyYoloVoc , Accuracy )
{
Net net ;