@ -232,21 +232,22 @@ image **load_alphabet()
// Creates array of detections with prob > thresh and fills best_class for them
detection * * get_actual_detections ( detection * dets , int dets_num , int classes , float thresh , int * selected_detections_num )
detection_with_class * get_actual_detections ( detection * dets , int dets_num , float thresh , int * selected_detections_num )
{
int selected_num = 0 ;
detection * * result_arr = calloc ( dets_num , sizeof ( detection * ) ) ;
detection_with_class * result_arr = calloc ( dets_num , sizeof ( detection_with_class ) ) ;
for ( int i = 0 ; i < dets_num ; + + i ) {
dets [ i ] . best_class = - 1 ;
for ( int j = 0 ; j < classes ; + + j ) {
if ( dets [ i ] . prob [ j ] > thresh ) {
if ( dets [ i ] . best_class < 0 | | dets [ i ] . prob [ dets [ i ] . best_class ] < dets [ i ] . prob [ j ] ) {
dets [ i ] . best_class = j ;
}
int best_class = - 1 ;
float best_class_prob = thresh ;
for ( int j = 0 ; j < dets [ i ] . classes ; + + j ) {
if ( dets [ i ] . prob [ j ] > best_class_prob ) {
best_class = j ;
best_class_prob = dets [ i ] . prob [ j ] ;
}
}
if ( dets [ i ] . best_class > = 0 ) {
result_arr [ selected_num ] = & ( dets [ i ] ) ;
if ( best_class > = 0 ) {
result_arr [ selected_num ] . det = dets [ i ] ;
result_arr [ selected_num ] . best_class = best_class ;
+ + selected_num ;
}
}
@ -256,36 +257,41 @@ detection** get_actual_detections(detection *dets, int dets_num, int classes, fl
}
// compare to sort detection** by bbox.x
int compare_by_lefts ( const void * a , const void * b ) {
const float delta = ( ( * ( detection * * ) a ) - > bbox . x - ( * ( detection * * ) a ) - > bbox . w / 2 ) - ( ( * ( detection * * ) b ) - > bbox . x - ( * ( detection * * ) b ) - > bbox . w / 2 ) ;
int compare_by_lefts ( const void * a_ptr , const void * b_ptr ) {
const detection_with_class * a = ( detection_with_class * ) a_ptr ;
const detection_with_class * b = ( detection_with_class * ) b_ptr ;
const float delta = ( a - > det . bbox . x - a - > det . bbox . w / 2 ) - ( b - > det . bbox . x - b - > det . bbox . w / 2 ) ;
return delta < 0 ? - 1 : delta > 0 ? 1 : 0 ;
}
// compare to sort detection** by best_class probability
int compare_by_probs ( const void * a_ptr , const void * b_ptr ) {
const detection * a = * ( detection * * ) a_ptr ;
const detection * b = * ( detection * * ) b_ptr ;
float delta = a - > prob [ a - > best_class ] - b - > prob [ b - > best_class ] ;
const detection_with_class * a = ( detection_with_class * ) a_ptr ;
const detection_with_class * b = ( detection_with_class * ) b_ptr ;
float delta = a - > det . prob [ a - > best_class ] - b - > det . prob [ b - > best_class ] ;
return delta < 0 ? - 1 : delta > 0 ? 1 : 0 ;
}
void draw_detections_v3 ( image im , detection * dets , int num , float thresh , char * * names , image * * alphabet , int classes )
void draw_detections_v3 ( image im , detection * dets , int num , float thresh , char * * names , image * * alphabet , int classes , int ext_output )
{
int selected_detections_num ;
detection * * selected_detections = get_actual_detections ( dets , num , classes , thresh , & selected_detections_num ) ;
detection_with_class * selected_detections = get_actual_detections ( dets , num , thresh , & selected_detections_num ) ;
// text output
qsort ( selected_detections , selected_detections_num , sizeof ( * selected_detections ) , compare_by_lefts ) ;
for ( int i = 0 ; i < selected_detections_num ; + + i ) {
const int best_class = selected_detections [ i ] - > best_class ;
printf ( " %s: %.0f%% \t (left: %.0f \t top: %.0f \t w: %0.f \t h: %0.f) \n " , names [ best_class ] ,
selected_detections [ i ] - > prob [ best_class ] * 100 ,
( selected_detections [ i ] - > bbox . x - selected_detections [ i ] - > bbox . w / 2 ) * im . w ,
( selected_detections [ i ] - > bbox . y - selected_detections [ i ] - > bbox . h / 2 ) * im . h ,
selected_detections [ i ] - > bbox . w * im . w , selected_detections [ i ] - > bbox . h * im . h ) ;
const int best_class = selected_detections [ i ] . best_class ;
printf ( " %s: %.0f%% " , names [ best_class ] , selected_detections [ i ] . det . prob [ best_class ] * 100 ) ;
if ( ext_output )
printf ( " \t (left: %.0f \t top: %.0f \t w: %0.f \t h: %0.f) \n " ,
( selected_detections [ i ] . det . bbox . x - selected_detections [ i ] . det . bbox . w / 2 ) * im . w ,
( selected_detections [ i ] . det . bbox . y - selected_detections [ i ] . det . bbox . h / 2 ) * im . h ,
selected_detections [ i ] . det . bbox . w * im . w , selected_detections [ i ] . det . bbox . h * im . h ) ;
else
printf ( " \n " ) ;
for ( int j = 0 ; j < classes ; + + j ) {
if ( selected_detections [ i ] - > prob [ j ] > thresh & & j ! = best_class ) {
printf ( " %s: %.0f%% \n " , names [ j ] , selected_detections [ i ] - > prob [ j ] * 100 ) ;
if ( selected_detections [ i ] . det . prob [ j ] > thresh & & j ! = best_class ) {
printf ( " %s: %.0f%% \n " , names [ j ] , selected_detections [ i ] . det . prob [ j ] * 100 ) ;
}
}
}
@ -304,8 +310,8 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
}
*/
//printf("%d %s: %.0f%%\n", i, names[dets[i].best_class], prob*100);
int offset = selected_detections [ i ] - > best_class * 123457 % classes ;
//printf("%d %s: %.0f%%\n", i, names[selected_ detection s[i].best_class], prob*100);
int offset = selected_detections [ i ] . best_class * 123457 % classes ;
float red = get_color ( 2 , offset , classes ) ;
float green = get_color ( 1 , offset , classes ) ;
float blue = get_color ( 0 , offset , classes ) ;
@ -316,7 +322,7 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
rgb [ 0 ] = red ;
rgb [ 1 ] = green ;
rgb [ 2 ] = blue ;
box b = selected_detections [ i ] - > bbox ;
box b = selected_detections [ i ] . det . bbox ;
//printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
int left = ( b . x - b . w / 2. ) * im . w ;
@ -338,9 +344,9 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
draw_box_width ( im , left , top , right , bot , width , red , green , blue ) ;
if ( alphabet ) {
char labelstr [ 4096 ] = { 0 } ;
strcat ( labelstr , names [ selected_detections [ i ] - > best_class ] ) ;
strcat ( labelstr , names [ selected_detections [ i ] . best_class ] ) ;
for ( int j = 0 ; j < classes ; + + j ) {
if ( selected_detections [ i ] - > prob [ j ] > thresh & & j ! = selected_detections [ i ] - > best_class ) {
if ( selected_detections [ i ] . det . prob [ j ] > thresh & & j ! = selected_detections [ i ] . best_class ) {
strcat ( labelstr , " , " ) ;
strcat ( labelstr , names [ j ] ) ;
}
@ -349,8 +355,8 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
draw_label ( im , top + width , left , label , rgb ) ;
free_image ( label ) ;
}
if ( selected_detections [ i ] - > mask ) {
image mask = float_to_image ( 14 , 14 , 1 , selected_detections [ i ] - > mask ) ;
if ( selected_detections [ i ] . det . mask ) {
image mask = float_to_image ( 14 , 14 , 1 , selected_detections [ i ] . det . mask ) ;
image resized_mask = resize_image ( mask , b . w * im . w , b . h * im . h ) ;
image tmask = threshold_image ( resized_mask , .5 ) ;
embed_image ( tmask , im , left , top ) ;