@ -229,27 +229,70 @@ image **load_alphabet()
return alphabets ;
}
void draw_detections_v3 ( image im , detection * dets , int num , float thresh , char * * names , image * * alphabet , int classes )
{
int i , j ;
for ( i = 0 ; i < num ; + + i ) {
char labelstr [ 4096 ] = { 0 } ;
int class_id = - 1 ;
for ( j = 0 ; j < classes ; + + j ) {
// 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 )
{
int selected_num = 0 ;
detection * * result_arr = calloc ( dets_num , sizeof ( detection * ) ) ;
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 ( class_id < 0 ) {
strcat ( labelstr , names [ j ] ) ;
class_id = j ;
if ( dets [ i ] . best_class < 0 | | dets [ i ] . prob [ dets [ i ] . best_class ] < dets [ i ] . prob [ j ] ) {
dets [ i ] . best_class = j ;
}
else {
strcat ( labelstr , " , " ) ;
strcat ( labelstr , names [ j ] ) ;
}
printf ( " %s: %.0f%% \n " , names [ j ] , dets [ i ] . prob [ j ] * 100 ) ;
}
}
if ( class_id > = 0 ) {
if ( dets [ i ] . best_class > = 0 ) {
result_arr [ selected_num ] = & ( dets [ i ] ) ;
+ + selected_num ;
}
}
if ( selected_detections_num )
* selected_detections_num = selected_num ;
return result_arr ;
}
// 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 ) ;
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 ] ;
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 )
{
int selected_detections_num ;
detection * * selected_detections = get_actual_detections ( dets , num , classes , 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 ) ;
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 ) ;
}
}
}
// image output
qsort ( selected_detections , selected_detections_num , sizeof ( * selected_detections ) , compare_by_probs ) ;
for ( int i = 0 ; i < selected_detections_num ; + + i ) {
int width = im . h * .006 ;
if ( width < 1 )
width = 1 ;
@ -261,8 +304,8 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
}
*/
//printf("%d %s: %.0f%%\n", i, names[class_id ], prob*100);
int offset = class_id * 123457 % classes ;
//printf("%d %s: %.0f%%\n", i, names[dets[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 ) ;
@ -273,7 +316,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 = dets [ i ] . bbox ;
box b = selected_ detection s[ i ] - > bbox ;
//printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
int left = ( b . x - b . w / 2. ) * im . w ;
@ -294,12 +337,20 @@ 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 ] ) ;
for ( int j = 0 ; j < classes ; + + j ) {
if ( selected_detections [ i ] - > prob [ j ] > thresh & & j ! = selected_detections [ i ] - > best_class ) {
strcat ( labelstr , " , " ) ;
strcat ( labelstr , names [ j ] ) ;
}
}
image label = get_label_v3 ( alphabet , labelstr , ( im . h * .03 ) ) ;
draw_label ( im , top + width , left , label , rgb ) ;
free_image ( label ) ;
}
if ( dets [ i ] . mask ) {
image mask = float_to_image ( 14 , 14 , 1 , dets [ i ] . mask ) ;
if ( selected_ detection s[ i ] - > mask ) {
image mask = float_to_image ( 14 , 14 , 1 , selected_ detection s[ i ] - > 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 ) ;
@ -307,8 +358,8 @@ void draw_detections_v3(image im, detection *dets, int num, float thresh, char *
free_image ( resized_mask ) ;
free_image ( tmask ) ;
}
}
}
free ( selected_detections ) ;
}
void draw_detections ( image im , int num , float thresh , box * boxes , float * * probs , char * * names , image * * alphabet , int classes )