mirror of
https://github.com/pjreddie/darknet.git
synced 2023-08-10 21:13:14 +03:00
Added Yolo v3
This commit is contained in:
178
src/image.c
178
src/image.c
@ -93,6 +93,23 @@ image get_label(image **characters, char *string, int size)
|
||||
return b;
|
||||
}
|
||||
|
||||
image get_label_v3(image **characters, char *string, int size)
|
||||
{
|
||||
size = size / 10;
|
||||
if (size > 7) size = 7;
|
||||
image label = make_empty_image(0, 0, 0);
|
||||
while (*string) {
|
||||
image l = characters[size][(int)*string];
|
||||
image n = tile_images(label, l, -size - 1 + (size + 1) / 2);
|
||||
free_image(label);
|
||||
label = n;
|
||||
++string;
|
||||
}
|
||||
image b = border_image(label, label.h*.25);
|
||||
free_image(label);
|
||||
return b;
|
||||
}
|
||||
|
||||
void draw_label(image a, int r, int c, image label, const float *rgb)
|
||||
{
|
||||
int w = label.w;
|
||||
@ -183,6 +200,80 @@ 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) {
|
||||
if (dets[i].prob[j] > thresh) {
|
||||
if (class_id < 0) {
|
||||
strcat(labelstr, names[j]);
|
||||
class_id = j;
|
||||
}
|
||||
else {
|
||||
strcat(labelstr, ", ");
|
||||
strcat(labelstr, names[j]);
|
||||
}
|
||||
printf("%s: %.0f%%\n", names[j], dets[i].prob[j] * 100);
|
||||
}
|
||||
}
|
||||
if (class_id >= 0) {
|
||||
int width = im.h * .006;
|
||||
|
||||
/*
|
||||
if(0){
|
||||
width = pow(prob, 1./2.)*10+1;
|
||||
alphabet = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
//printf("%d %s: %.0f%%\n", i, names[class_id], prob*100);
|
||||
int offset = class_id * 123457 % classes;
|
||||
float red = get_color(2, offset, classes);
|
||||
float green = get_color(1, offset, classes);
|
||||
float blue = get_color(0, offset, classes);
|
||||
float rgb[3];
|
||||
|
||||
//width = prob*20+2;
|
||||
|
||||
rgb[0] = red;
|
||||
rgb[1] = green;
|
||||
rgb[2] = blue;
|
||||
box b = dets[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;
|
||||
int right = (b.x + b.w / 2.)*im.w;
|
||||
int top = (b.y - b.h / 2.)*im.h;
|
||||
int bot = (b.y + b.h / 2.)*im.h;
|
||||
|
||||
if (left < 0) left = 0;
|
||||
if (right > im.w - 1) right = im.w - 1;
|
||||
if (top < 0) top = 0;
|
||||
if (bot > im.h - 1) bot = im.h - 1;
|
||||
|
||||
draw_box_width(im, left, top, right, bot, width, red, green, blue);
|
||||
if (alphabet) {
|
||||
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);
|
||||
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);
|
||||
free_image(mask);
|
||||
free_image(resized_mask);
|
||||
free_image(tmask);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_detections(image im, int num, float thresh, box *boxes, float **probs, char **names, image **alphabet, int classes)
|
||||
{
|
||||
int i;
|
||||
@ -245,6 +336,93 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs,
|
||||
}
|
||||
|
||||
#ifdef OPENCV
|
||||
|
||||
void draw_detections_cv_v3(IplImage* show_img, detection *dets, int num, float thresh, char **names, image **alphabet, int classes)
|
||||
{
|
||||
int i, j;
|
||||
if (!show_img) return;
|
||||
|
||||
for (i = 0; i < num; ++i) {
|
||||
char labelstr[4096] = { 0 };
|
||||
int class_id = -1;
|
||||
for (j = 0; j < classes; ++j) {
|
||||
if (dets[i].prob[j] > thresh) {
|
||||
if (class_id < 0) {
|
||||
strcat(labelstr, names[j]);
|
||||
class_id = j;
|
||||
}
|
||||
else {
|
||||
strcat(labelstr, ", ");
|
||||
strcat(labelstr, names[j]);
|
||||
}
|
||||
printf("%s: %.0f%%\n", names[j], dets[i].prob[j] * 100);
|
||||
}
|
||||
}
|
||||
if (class_id >= 0) {
|
||||
int width = show_img->height * .006;
|
||||
|
||||
/*
|
||||
if(0){
|
||||
width = pow(prob, 1./2.)*10+1;
|
||||
alphabet = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
//printf("%d %s: %.0f%%\n", i, names[class_id], prob*100);
|
||||
int offset = class_id * 123457 % classes;
|
||||
float red = get_color(2, offset, classes);
|
||||
float green = get_color(1, offset, classes);
|
||||
float blue = get_color(0, offset, classes);
|
||||
float rgb[3];
|
||||
|
||||
//width = prob*20+2;
|
||||
|
||||
rgb[0] = red;
|
||||
rgb[1] = green;
|
||||
rgb[2] = blue;
|
||||
box b = dets[i].bbox;
|
||||
//printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
|
||||
|
||||
int left = (b.x - b.w / 2.)*show_img->width;
|
||||
int right = (b.x + b.w / 2.)*show_img->width;
|
||||
int top = (b.y - b.h / 2.)*show_img->height;
|
||||
int bot = (b.y + b.h / 2.)*show_img->height;
|
||||
|
||||
if (left < 0) left = 0;
|
||||
if (right > show_img->width - 1) right = show_img->width - 1;
|
||||
if (top < 0) top = 0;
|
||||
if (bot > show_img->height - 1) bot = show_img->height - 1;
|
||||
|
||||
float const font_size = show_img->height / 1000.F;
|
||||
CvPoint pt1, pt2, pt_text, pt_text_bg1, pt_text_bg2;
|
||||
pt1.x = left;
|
||||
pt1.y = top;
|
||||
pt2.x = right;
|
||||
pt2.y = bot;
|
||||
pt_text.x = left;
|
||||
pt_text.y = top - 12;
|
||||
pt_text_bg1.x = left;
|
||||
pt_text_bg1.y = top - (10 + 25 * font_size);
|
||||
pt_text_bg2.x = right;
|
||||
pt_text_bg2.y = top;
|
||||
CvScalar color;
|
||||
color.val[0] = red * 256;
|
||||
color.val[1] = green * 256;
|
||||
color.val[2] = blue * 256;
|
||||
|
||||
cvRectangle(show_img, pt1, pt2, color, width, 8, 0);
|
||||
//printf("left=%d, right=%d, top=%d, bottom=%d, obj_id=%d, obj=%s \n", left, right, top, bot, class_id, names[class_id]);
|
||||
cvRectangle(show_img, pt_text_bg1, pt_text_bg2, color, width, 8, 0);
|
||||
cvRectangle(show_img, pt_text_bg1, pt_text_bg2, color, CV_FILLED, 8, 0); // filled
|
||||
CvScalar black_color;
|
||||
black_color.val[0] = 0;
|
||||
CvFont font;
|
||||
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX, font_size, font_size, 0, font_size * 3, 8);
|
||||
cvPutText(show_img, names[class_id], pt_text, &font, black_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_detections_cv(IplImage* show_img, int num, float thresh, box *boxes, float **probs, char **names, image **alphabet, int classes)
|
||||
{
|
||||
int i;
|
||||
|
Reference in New Issue
Block a user