mirror of
https://github.com/pjreddie/darknet.git
synced 2023-08-10 21:13:14 +03:00
redid the demo for TED, little faster
This commit is contained in:
parent
9726f1e89c
commit
72a2fe93f9
@ -5,8 +5,8 @@ subdivisions=1
|
|||||||
# Training
|
# Training
|
||||||
# batch=64
|
# batch=64
|
||||||
# subdivisions=8
|
# subdivisions=8
|
||||||
width=608
|
width=416
|
||||||
height=608
|
height=416
|
||||||
channels=3
|
channels=3
|
||||||
momentum=0.9
|
momentum=0.9
|
||||||
decay=0.0005
|
decay=0.0005
|
||||||
|
@ -698,7 +698,7 @@ void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *fi
|
|||||||
float *X = r.data;
|
float *X = r.data;
|
||||||
time=clock();
|
time=clock();
|
||||||
float *predictions = network_predict(net, X);
|
float *predictions = network_predict(net, X);
|
||||||
if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 0, 1);
|
if(net.hierarchy) hierarchy_predictions(predictions, net.outputs, net.hierarchy, 1, 1);
|
||||||
top_k(predictions, net.outputs, top, indexes);
|
top_k(predictions, net.outputs, top, indexes);
|
||||||
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
|
||||||
for(i = 0; i < top; ++i){
|
for(i = 0; i < top; ++i){
|
||||||
|
@ -376,9 +376,10 @@ void run_coco(int argc, char **argv)
|
|||||||
char *cfg = argv[3];
|
char *cfg = argv[3];
|
||||||
char *weights = (argc > 4) ? argv[4] : 0;
|
char *weights = (argc > 4) ? argv[4] : 0;
|
||||||
char *filename = (argc > 5) ? argv[5]: 0;
|
char *filename = (argc > 5) ? argv[5]: 0;
|
||||||
|
int avg = find_int_arg(argc, argv, "-avg", 1);
|
||||||
if(0==strcmp(argv[2], "test")) test_coco(cfg, weights, filename, thresh);
|
if(0==strcmp(argv[2], "test")) test_coco(cfg, weights, filename, thresh);
|
||||||
else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights);
|
else if(0==strcmp(argv[2], "train")) train_coco(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights);
|
else if(0==strcmp(argv[2], "valid")) validate_coco(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights);
|
else if(0==strcmp(argv[2], "recall")) validate_coco_recall(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, .5, 0,0,0,0);
|
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, coco_classes, 80, frame_skip, prefix, avg, .5, 0,0,0,0);
|
||||||
}
|
}
|
||||||
|
281
src/demo.c
281
src/demo.c
@ -9,7 +9,6 @@
|
|||||||
#include "demo.h"
|
#include "demo.h"
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
#define FRAMES 3
|
|
||||||
#define DEMO 1
|
#define DEMO 1
|
||||||
|
|
||||||
#ifdef OPENCV
|
#ifdef OPENCV
|
||||||
@ -21,65 +20,26 @@ static int demo_classes;
|
|||||||
static float **probs;
|
static float **probs;
|
||||||
static box *boxes;
|
static box *boxes;
|
||||||
static network net;
|
static network net;
|
||||||
static image in ;
|
static image buff [3];
|
||||||
static image in_s ;
|
static image buff_letter[3];
|
||||||
static image det ;
|
static int buff_index = 0;
|
||||||
static image det_s;
|
|
||||||
static image disp = {0};
|
|
||||||
static CvCapture * cap;
|
static CvCapture * cap;
|
||||||
|
static IplImage * ipl;
|
||||||
static float fps = 0;
|
static float fps = 0;
|
||||||
static float demo_thresh = 0;
|
static float demo_thresh = 0;
|
||||||
static float demo_hier = .5;
|
static float demo_hier = .5;
|
||||||
|
static int running = 0;
|
||||||
|
|
||||||
static float *predictions[FRAMES];
|
static int demo_delay = 0;
|
||||||
|
static int demo_frame = 5;
|
||||||
|
static int demo_detections = 0;
|
||||||
|
static float **predictions;
|
||||||
static int demo_index = 0;
|
static int demo_index = 0;
|
||||||
static image images[FRAMES];
|
static int demo_done = 0;
|
||||||
|
static float *last_avg2;
|
||||||
|
static float *last_avg;
|
||||||
static float *avg;
|
static float *avg;
|
||||||
|
double demo_time;
|
||||||
void *fetch_in_thread(void *ptr)
|
|
||||||
{
|
|
||||||
in = get_image_from_stream(cap);
|
|
||||||
if(!in.data){
|
|
||||||
error("Stream closed.");
|
|
||||||
}
|
|
||||||
in_s = letterbox_image(in, net.w, net.h);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *detect_in_thread(void *ptr)
|
|
||||||
{
|
|
||||||
float nms = .4;
|
|
||||||
|
|
||||||
layer l = net.layers[net.n-1];
|
|
||||||
float *X = det_s.data;
|
|
||||||
float *prediction = network_predict(net, X);
|
|
||||||
|
|
||||||
memcpy(predictions[demo_index], prediction, l.outputs*sizeof(float));
|
|
||||||
mean_arrays(predictions, FRAMES, l.outputs, avg);
|
|
||||||
l.output = avg;
|
|
||||||
|
|
||||||
free_image(det_s);
|
|
||||||
if(l.type == DETECTION){
|
|
||||||
get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0);
|
|
||||||
} else if (l.type == REGION){
|
|
||||||
get_region_boxes(l, in.w, in.h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1);
|
|
||||||
} else {
|
|
||||||
error("Last layer must produce detections\n");
|
|
||||||
}
|
|
||||||
if (nms > 0) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
|
|
||||||
printf("\033[2J");
|
|
||||||
printf("\033[1;1H");
|
|
||||||
printf("\nFPS:%.1f\n",fps);
|
|
||||||
printf("Objects:\n\n");
|
|
||||||
|
|
||||||
images[demo_index] = det;
|
|
||||||
det = images[(demo_index + FRAMES/2 + 1)%FRAMES];
|
|
||||||
demo_index = (demo_index + 1)%FRAMES;
|
|
||||||
|
|
||||||
draw_detections(det, l.w*l.h*l.n, demo_thresh, boxes, probs, demo_names, demo_alphabet, demo_classes);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
double get_wall_time()
|
double get_wall_time()
|
||||||
{
|
{
|
||||||
@ -90,11 +50,95 @@ double get_wall_time()
|
|||||||
return (double)time.tv_sec + (double)time.tv_usec * .000001;
|
return (double)time.tv_sec + (double)time.tv_usec * .000001;
|
||||||
}
|
}
|
||||||
|
|
||||||
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier, int w, int h, int frames, int fullscreen)
|
void *detect_in_thread(void *ptr)
|
||||||
{
|
{
|
||||||
//skip = frame_skip;
|
running = 1;
|
||||||
|
float nms = .4;
|
||||||
|
|
||||||
|
layer l = net.layers[net.n-1];
|
||||||
|
float *X = buff_letter[(buff_index+2)%3].data;
|
||||||
|
float *prediction = network_predict(net, X);
|
||||||
|
|
||||||
|
memcpy(predictions[demo_index], prediction, l.outputs*sizeof(float));
|
||||||
|
mean_arrays(predictions, demo_frame, l.outputs, avg);
|
||||||
|
l.output = last_avg2;
|
||||||
|
if(demo_delay == 0) l.output = avg;
|
||||||
|
if(l.type == DETECTION){
|
||||||
|
get_detection_boxes(l, 1, 1, demo_thresh, probs, boxes, 0);
|
||||||
|
} else if (l.type == REGION){
|
||||||
|
get_region_boxes(l, buff[0].w, buff[0].h, net.w, net.h, demo_thresh, probs, boxes, 0, 0, demo_hier, 1);
|
||||||
|
} else {
|
||||||
|
error("Last layer must produce detections\n");
|
||||||
|
}
|
||||||
|
if (nms > 0) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
|
||||||
|
|
||||||
|
printf("\033[2J");
|
||||||
|
printf("\033[1;1H");
|
||||||
|
printf("\nFPS:%.1f\n",fps);
|
||||||
|
printf("Objects:\n\n");
|
||||||
|
image display = buff[(buff_index+2) % 3];
|
||||||
|
draw_detections(display, demo_detections, demo_thresh, boxes, probs, demo_names, demo_alphabet, demo_classes);
|
||||||
|
|
||||||
|
demo_index = (demo_index + 1)%demo_frame;
|
||||||
|
running = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *fetch_in_thread(void *ptr)
|
||||||
|
{
|
||||||
|
int status = fill_image_from_stream(cap, buff[buff_index]);
|
||||||
|
letterbox_image_into(buff[buff_index], net.w, net.h, buff_letter[buff_index]);
|
||||||
|
if(status == 0) demo_done = 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *display_in_thread(void *ptr)
|
||||||
|
{
|
||||||
|
show_image_cv(buff[(buff_index + 1)%3], "Demo", ipl);
|
||||||
|
int c = cvWaitKey(1);
|
||||||
|
if (c != -1) c = c%256;
|
||||||
|
if (c == 10){
|
||||||
|
if(demo_delay == 0) demo_delay = 60;
|
||||||
|
else if(demo_delay == 5) demo_delay = 0;
|
||||||
|
else if(demo_delay == 60) demo_delay = 5;
|
||||||
|
else demo_delay = 0;
|
||||||
|
} else if (c == 27) {
|
||||||
|
demo_done = 1;
|
||||||
|
return 0;
|
||||||
|
} else if (c == 82) {
|
||||||
|
demo_thresh += .02;
|
||||||
|
} else if (c == 84) {
|
||||||
|
demo_thresh -= .02;
|
||||||
|
if(demo_thresh <= .02) demo_thresh = .02;
|
||||||
|
} else if (c == 83) {
|
||||||
|
demo_hier += .02;
|
||||||
|
} else if (c == 81) {
|
||||||
|
demo_hier -= .02;
|
||||||
|
if(demo_hier <= .0) demo_hier = .0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *display_loop(void *ptr)
|
||||||
|
{
|
||||||
|
while(1){
|
||||||
|
display_in_thread(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *detect_loop(void *ptr)
|
||||||
|
{
|
||||||
|
while(1){
|
||||||
|
detect_in_thread(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg_frames, float hier, int w, int h, int frames, int fullscreen)
|
||||||
|
{
|
||||||
|
demo_delay = delay;
|
||||||
|
demo_frame = avg_frames;
|
||||||
|
predictions = calloc(demo_frame, sizeof(float*));
|
||||||
image **alphabet = load_alphabet();
|
image **alphabet = load_alphabet();
|
||||||
int delay = frame_skip;
|
|
||||||
demo_names = names;
|
demo_names = names;
|
||||||
demo_alphabet = alphabet;
|
demo_alphabet = alphabet;
|
||||||
demo_classes = classes;
|
demo_classes = classes;
|
||||||
@ -106,6 +150,8 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch
|
|||||||
load_weights(&net, weightfile);
|
load_weights(&net, weightfile);
|
||||||
}
|
}
|
||||||
set_batch_network(&net, 1);
|
set_batch_network(&net, 1);
|
||||||
|
pthread_t detect_thread;
|
||||||
|
pthread_t fetch_thread;
|
||||||
|
|
||||||
srand(2222222);
|
srand(2222222);
|
||||||
|
|
||||||
@ -129,36 +175,25 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch
|
|||||||
if(!cap) error("Couldn't connect to webcam.\n");
|
if(!cap) error("Couldn't connect to webcam.\n");
|
||||||
|
|
||||||
layer l = net.layers[net.n-1];
|
layer l = net.layers[net.n-1];
|
||||||
|
demo_detections = l.n*l.w*l.h;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
avg = (float *) calloc(l.outputs, sizeof(float));
|
avg = (float *) calloc(l.outputs, sizeof(float));
|
||||||
for(j = 0; j < FRAMES; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float));
|
last_avg = (float *) calloc(l.outputs, sizeof(float));
|
||||||
for(j = 0; j < FRAMES; ++j) images[j] = make_image(1,1,3);
|
last_avg2 = (float *) calloc(l.outputs, sizeof(float));
|
||||||
|
for(j = 0; j < demo_frame; ++j) predictions[j] = (float *) calloc(l.outputs, sizeof(float));
|
||||||
|
|
||||||
boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box));
|
boxes = (box *)calloc(l.w*l.h*l.n, sizeof(box));
|
||||||
probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *));
|
probs = (float **)calloc(l.w*l.h*l.n, sizeof(float *));
|
||||||
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes, sizeof(float));
|
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = (float *)calloc(l.classes+1, sizeof(float));
|
||||||
|
|
||||||
pthread_t fetch_thread;
|
buff[0] = get_image_from_stream(cap);
|
||||||
pthread_t detect_thread;
|
buff[1] = copy_image(buff[0]);
|
||||||
|
buff[2] = copy_image(buff[0]);
|
||||||
fetch_in_thread(0);
|
buff_letter[0] = letterbox_image(buff[0], net.w, net.h);
|
||||||
det = in;
|
buff_letter[1] = letterbox_image(buff[0], net.w, net.h);
|
||||||
det_s = in_s;
|
buff_letter[2] = letterbox_image(buff[0], net.w, net.h);
|
||||||
|
ipl = cvCreateImage(cvSize(buff[0].w,buff[0].h), IPL_DEPTH_8U, buff[0].c);
|
||||||
fetch_in_thread(0);
|
|
||||||
detect_in_thread(0);
|
|
||||||
disp = det;
|
|
||||||
det = in;
|
|
||||||
det_s = in_s;
|
|
||||||
|
|
||||||
for(j = 0; j < FRAMES/2; ++j){
|
|
||||||
fetch_in_thread(0);
|
|
||||||
detect_in_thread(0);
|
|
||||||
disp = det;
|
|
||||||
det = in;
|
|
||||||
det_s = in_s;
|
|
||||||
}
|
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if(!prefix){
|
if(!prefix){
|
||||||
@ -171,76 +206,34 @@ void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const ch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double before = get_wall_time();
|
demo_time = get_wall_time();
|
||||||
|
|
||||||
while(1){
|
while(!demo_done){
|
||||||
|
buff_index = (buff_index + 1) %3;
|
||||||
|
if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed");
|
||||||
|
if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed");
|
||||||
|
if(!prefix){
|
||||||
|
if(count % (demo_delay+1) == 0){
|
||||||
|
fps = 1./(get_wall_time() - demo_time);
|
||||||
|
demo_time = get_wall_time();
|
||||||
|
float *swap = last_avg;
|
||||||
|
last_avg = last_avg2;
|
||||||
|
last_avg2 = swap;
|
||||||
|
memcpy(last_avg, avg, l.outputs*sizeof(float));
|
||||||
|
}
|
||||||
|
display_in_thread(0);
|
||||||
|
}else{
|
||||||
|
char name[256];
|
||||||
|
sprintf(name, "%s_%08d", prefix, count);
|
||||||
|
save_image(buff[(buff_index + 1)%3], name);
|
||||||
|
}
|
||||||
|
pthread_join(fetch_thread, 0);
|
||||||
|
pthread_join(detect_thread, 0);
|
||||||
++count;
|
++count;
|
||||||
if(1){
|
|
||||||
if(pthread_create(&fetch_thread, 0, fetch_in_thread, 0)) error("Thread creation failed");
|
|
||||||
if(pthread_create(&detect_thread, 0, detect_in_thread, 0)) error("Thread creation failed");
|
|
||||||
|
|
||||||
if(!prefix){
|
|
||||||
show_image(disp, "Demo");
|
|
||||||
int c = cvWaitKey(1);
|
|
||||||
if (c != -1) c = c%256;
|
|
||||||
if (c == 10){
|
|
||||||
if(frame_skip == 0) frame_skip = 60;
|
|
||||||
else if(frame_skip == 4) frame_skip = 0;
|
|
||||||
else if(frame_skip == 60) frame_skip = 4;
|
|
||||||
else frame_skip = 0;
|
|
||||||
} else if (c == 27) {
|
|
||||||
return;
|
|
||||||
} else if (c == 82) {
|
|
||||||
demo_thresh += .02;
|
|
||||||
} else if (c == 84) {
|
|
||||||
demo_thresh -= .02;
|
|
||||||
if(demo_thresh <= .02) demo_thresh = .02;
|
|
||||||
} else if (c == 83) {
|
|
||||||
demo_hier += .02;
|
|
||||||
} else if (c == 81) {
|
|
||||||
demo_hier -= .02;
|
|
||||||
if(demo_hier <= .0) demo_hier = .0;
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
char buff[256];
|
|
||||||
sprintf(buff, "%s_%08d", prefix, count);
|
|
||||||
save_image(disp, buff);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_join(fetch_thread, 0);
|
|
||||||
pthread_join(detect_thread, 0);
|
|
||||||
|
|
||||||
if(delay == 0){
|
|
||||||
free_image(disp);
|
|
||||||
disp = det;
|
|
||||||
}
|
|
||||||
det = in;
|
|
||||||
det_s = in_s;
|
|
||||||
}else {
|
|
||||||
fetch_in_thread(0);
|
|
||||||
det = in;
|
|
||||||
det_s = in_s;
|
|
||||||
detect_in_thread(0);
|
|
||||||
if(delay == 0) {
|
|
||||||
free_image(disp);
|
|
||||||
disp = det;
|
|
||||||
}
|
|
||||||
show_image(disp, "Demo");
|
|
||||||
cvWaitKey(1);
|
|
||||||
}
|
|
||||||
--delay;
|
|
||||||
if(delay < 0){
|
|
||||||
delay = frame_skip;
|
|
||||||
|
|
||||||
double after = get_wall_time();
|
|
||||||
float curr = 1./(after - before);
|
|
||||||
fps = curr;
|
|
||||||
before = after;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen)
|
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int delay, char *prefix, int avg, float hier, int w, int h, int frames, int fullscreen)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Demo needs OpenCV for webcam images.\n");
|
fprintf(stderr, "Demo needs OpenCV for webcam images.\n");
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
#define DEMO_H
|
#define DEMO_H
|
||||||
|
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, float hier_thresh, int w, int h, int fps, int fullscreen);
|
void demo(char *cfgfile, char *weightfile, float thresh, int cam_index, const char *filename, char **names, int classes, int frame_skip, char *prefix, int avg, float hier_thresh, int w, int h, int fps, int fullscreen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -259,8 +259,8 @@ void forward_detection_layer_gpu(const detection_layer l, network net)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
float *in_cpu = calloc(l.batch*l.inputs, sizeof(float));
|
//float *in_cpu = calloc(l.batch*l.inputs, sizeof(float));
|
||||||
float *truth_cpu = 0;
|
//float *truth_cpu = 0;
|
||||||
|
|
||||||
forward_detection_layer(l, net);
|
forward_detection_layer(l, net);
|
||||||
cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs);
|
cuda_push_array(l.output_gpu, l.output, l.batch*l.outputs);
|
||||||
|
@ -292,7 +292,7 @@ void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char
|
|||||||
|
|
||||||
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
||||||
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
||||||
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *));
|
||||||
|
|
||||||
int m = plist->size;
|
int m = plist->size;
|
||||||
int i=0;
|
int i=0;
|
||||||
@ -428,7 +428,7 @@ void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *out
|
|||||||
|
|
||||||
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
||||||
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
||||||
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *));
|
||||||
|
|
||||||
int m = plist->size;
|
int m = plist->size;
|
||||||
int i=0;
|
int i=0;
|
||||||
@ -521,7 +521,7 @@ void validate_detector_recall(char *cfgfile, char *weightfile)
|
|||||||
int j, k;
|
int j, k;
|
||||||
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
box *boxes = calloc(l.w*l.h*l.n, sizeof(box));
|
||||||
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
float **probs = calloc(l.w*l.h*l.n, sizeof(float *));
|
||||||
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes, sizeof(float *));
|
for(j = 0; j < l.w*l.h*l.n; ++j) probs[j] = calloc(classes+1, sizeof(float *));
|
||||||
|
|
||||||
int m = plist->size;
|
int m = plist->size;
|
||||||
int i=0;
|
int i=0;
|
||||||
@ -659,6 +659,7 @@ void run_detector(int argc, char **argv)
|
|||||||
float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
|
float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
|
||||||
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
int cam_index = find_int_arg(argc, argv, "-c", 0);
|
||||||
int frame_skip = find_int_arg(argc, argv, "-s", 0);
|
int frame_skip = find_int_arg(argc, argv, "-s", 0);
|
||||||
|
int avg = find_int_arg(argc, argv, "-avg", 3);
|
||||||
if(argc < 4){
|
if(argc < 4){
|
||||||
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
|
||||||
return;
|
return;
|
||||||
@ -707,6 +708,6 @@ void run_detector(int argc, char **argv)
|
|||||||
int classes = option_find_int(options, "classes", 20);
|
int classes = option_find_int(options, "classes", 20);
|
||||||
char *name_list = option_find_str(options, "names", "data/names.list");
|
char *name_list = option_find_str(options, "names", "data/names.list");
|
||||||
char **names = get_labels(name_list);
|
char **names = get_labels(name_list);
|
||||||
demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, hier_thresh, width, height, fps, fullscreen);
|
demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
77
src/image.c
77
src/image.c
@ -216,6 +216,7 @@ void draw_detections(image im, int num, float thresh, box *boxes, float **probs,
|
|||||||
if (alphabet) {
|
if (alphabet) {
|
||||||
image label = get_label(alphabet, names[class], (im.h*.03)/10);
|
image label = get_label(alphabet, names[class], (im.h*.03)/10);
|
||||||
draw_label(im, top + width, left, label, rgb);
|
draw_label(im, top + width, left, label, rgb);
|
||||||
|
free_image(label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -394,6 +395,11 @@ void normalize_image2(image p)
|
|||||||
free(max);
|
free(max);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void copy_image_into(image src, image dest)
|
||||||
|
{
|
||||||
|
memcpy(dest.data, src.data, src.h*src.w*src.c*sizeof(float));
|
||||||
|
}
|
||||||
|
|
||||||
image copy_image(image p)
|
image copy_image(image p)
|
||||||
{
|
{
|
||||||
image copy = p;
|
image copy = p;
|
||||||
@ -413,19 +419,16 @@ void rgbgr_image(image im)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OPENCV
|
#ifdef OPENCV
|
||||||
void show_image_cv(image p, const char *name)
|
void show_image_cv(image p, const char *name, IplImage *disp)
|
||||||
{
|
{
|
||||||
int x,y,k;
|
int x,y,k;
|
||||||
image copy = copy_image(p);
|
if(p.c == 3) rgbgr_image(p);
|
||||||
constrain_image(copy);
|
|
||||||
if(p.c == 3) rgbgr_image(copy);
|
|
||||||
//normalize_image(copy);
|
//normalize_image(copy);
|
||||||
|
|
||||||
char buff[256];
|
char buff[256];
|
||||||
//sprintf(buff, "%s (%d)", name, windows);
|
//sprintf(buff, "%s (%d)", name, windows);
|
||||||
sprintf(buff, "%s", name);
|
sprintf(buff, "%s", name);
|
||||||
|
|
||||||
IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c);
|
|
||||||
int step = disp->widthStep;
|
int step = disp->widthStep;
|
||||||
cvNamedWindow(buff, CV_WINDOW_NORMAL);
|
cvNamedWindow(buff, CV_WINDOW_NORMAL);
|
||||||
//cvMoveWindow(buff, 100*(windows%10) + 200*(windows/10), 100*(windows%10));
|
//cvMoveWindow(buff, 100*(windows%10) + 200*(windows/10), 100*(windows%10));
|
||||||
@ -433,11 +436,10 @@ void show_image_cv(image p, const char *name)
|
|||||||
for(y = 0; y < p.h; ++y){
|
for(y = 0; y < p.h; ++y){
|
||||||
for(x = 0; x < p.w; ++x){
|
for(x = 0; x < p.w; ++x){
|
||||||
for(k= 0; k < p.c; ++k){
|
for(k= 0; k < p.c; ++k){
|
||||||
disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(copy,x,y,k)*255);
|
disp->imageData[y*step + x*p.c + k] = (unsigned char)(get_pixel(p,x,y,k)*255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free_image(copy);
|
|
||||||
if(0){
|
if(0){
|
||||||
int w = 448;
|
int w = 448;
|
||||||
int h = w*p.h/p.w;
|
int h = w*p.h/p.w;
|
||||||
@ -451,14 +453,18 @@ void show_image_cv(image p, const char *name)
|
|||||||
cvReleaseImage(&buffer);
|
cvReleaseImage(&buffer);
|
||||||
}
|
}
|
||||||
cvShowImage(buff, disp);
|
cvShowImage(buff, disp);
|
||||||
cvReleaseImage(&disp);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void show_image(image p, const char *name)
|
void show_image(image p, const char *name)
|
||||||
{
|
{
|
||||||
#ifdef OPENCV
|
#ifdef OPENCV
|
||||||
show_image_cv(p, name);
|
IplImage *disp = cvCreateImage(cvSize(p.w,p.h), IPL_DEPTH_8U, p.c);
|
||||||
|
image copy = copy_image(p);
|
||||||
|
constrain_image(copy);
|
||||||
|
show_image_cv(copy, name, disp);
|
||||||
|
free_image(copy);
|
||||||
|
cvReleaseImage(&disp);
|
||||||
#else
|
#else
|
||||||
fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name);
|
fprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name);
|
||||||
save_image(p, name);
|
save_image(p, name);
|
||||||
@ -467,23 +473,31 @@ void show_image(image p, const char *name)
|
|||||||
|
|
||||||
#ifdef OPENCV
|
#ifdef OPENCV
|
||||||
|
|
||||||
image ipl_to_image(IplImage* src)
|
void ipl_into_image(IplImage* src, image im)
|
||||||
{
|
{
|
||||||
unsigned char *data = (unsigned char *)src->imageData;
|
unsigned char *data = (unsigned char *)src->imageData;
|
||||||
int h = src->height;
|
int h = src->height;
|
||||||
int w = src->width;
|
int w = src->width;
|
||||||
int c = src->nChannels;
|
int c = src->nChannels;
|
||||||
int step = src->widthStep;
|
int step = src->widthStep;
|
||||||
image out = make_image(w, h, c);
|
int i, j, k;
|
||||||
int i, j, k, count=0;;
|
|
||||||
|
|
||||||
for(k= 0; k < c; ++k){
|
for(i = 0; i < h; ++i){
|
||||||
for(i = 0; i < h; ++i){
|
for(k= 0; k < c; ++k){
|
||||||
for(j = 0; j < w; ++j){
|
for(j = 0; j < w; ++j){
|
||||||
out.data[count++] = data[i*step + j*c + k]/255.;
|
im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
image ipl_to_image(IplImage* src)
|
||||||
|
{
|
||||||
|
int h = src->height;
|
||||||
|
int w = src->width;
|
||||||
|
int c = src->nChannels;
|
||||||
|
image out = make_image(w, h, c);
|
||||||
|
ipl_into_image(src, out);
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,6 +527,14 @@ image load_image_cv(char *filename, int channels)
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush_stream_buffer(CvCapture *cap, int n)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for(i = 0; i < n; ++i) {
|
||||||
|
cvQueryFrame(cap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
image get_image_from_stream(CvCapture *cap)
|
image get_image_from_stream(CvCapture *cap)
|
||||||
{
|
{
|
||||||
IplImage* src = cvQueryFrame(cap);
|
IplImage* src = cvQueryFrame(cap);
|
||||||
@ -522,6 +544,15 @@ image get_image_from_stream(CvCapture *cap)
|
|||||||
return im;
|
return im;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int fill_image_from_stream(CvCapture *cap, image im)
|
||||||
|
{
|
||||||
|
IplImage* src = cvQueryFrame(cap);
|
||||||
|
if (!src) return 0;
|
||||||
|
ipl_into_image(src, im);
|
||||||
|
rgbgr_image(im);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
void save_image_jpg(image p, const char *name)
|
void save_image_jpg(image p, const char *name)
|
||||||
{
|
{
|
||||||
image copy = copy_image(p);
|
image copy = copy_image(p);
|
||||||
@ -794,6 +825,22 @@ void composite_3d(char *f1, char *f2, char *out, int delta)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void letterbox_image_into(image im, int w, int h, image boxed)
|
||||||
|
{
|
||||||
|
int new_w = im.w;
|
||||||
|
int new_h = im.h;
|
||||||
|
if (((float)w/im.w) < ((float)h/im.h)) {
|
||||||
|
new_w = w;
|
||||||
|
new_h = (im.h * w)/im.w;
|
||||||
|
} else {
|
||||||
|
new_h = h;
|
||||||
|
new_w = (im.w * h)/im.h;
|
||||||
|
}
|
||||||
|
image resized = resize_image(im, new_w, new_h);
|
||||||
|
embed_image(resized, boxed, (w-new_w)/2, (h-new_h)/2);
|
||||||
|
free_image(resized);
|
||||||
|
}
|
||||||
|
|
||||||
image letterbox_image(image im, int w, int h)
|
image letterbox_image(image im, int w, int h)
|
||||||
{
|
{
|
||||||
int new_w = im.w;
|
int new_w = im.w;
|
||||||
|
@ -29,7 +29,11 @@ typedef struct {
|
|||||||
#ifndef __cplusplus
|
#ifndef __cplusplus
|
||||||
#ifdef OPENCV
|
#ifdef OPENCV
|
||||||
image get_image_from_stream(CvCapture *cap);
|
image get_image_from_stream(CvCapture *cap);
|
||||||
|
int fill_image_from_stream(CvCapture *cap, image im);
|
||||||
image ipl_to_image(IplImage* src);
|
image ipl_to_image(IplImage* src);
|
||||||
|
void ipl_into_image(IplImage* src, image im);
|
||||||
|
void flush_stream_buffer(CvCapture *cap, int n);
|
||||||
|
void show_image_cv(image p, const char *name, IplImage *disp);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -49,6 +53,7 @@ image random_crop_image(image im, int w, int h);
|
|||||||
image random_augment_image(image im, float angle, float aspect, int low, int high, int size);
|
image random_augment_image(image im, float angle, float aspect, int low, int high, int size);
|
||||||
void random_distort_image(image im, float hue, float saturation, float exposure);
|
void random_distort_image(image im, float hue, float saturation, float exposure);
|
||||||
image letterbox_image(image im, int w, int h);
|
image letterbox_image(image im, int w, int h);
|
||||||
|
void letterbox_image_into(image im, int w, int h, image boxed);
|
||||||
image resize_image(image im, int w, int h);
|
image resize_image(image im, int w, int h);
|
||||||
image resize_min(image im, int min);
|
image resize_min(image im, int min);
|
||||||
image resize_max(image im, int max);
|
image resize_max(image im, int max);
|
||||||
@ -96,6 +101,7 @@ image make_random_image(int w, int h, int c);
|
|||||||
image make_empty_image(int w, int h, int c);
|
image make_empty_image(int w, int h, int c);
|
||||||
image float_to_image(int w, int h, int c, float *data);
|
image float_to_image(int w, int h, int c, float *data);
|
||||||
image copy_image(image p);
|
image copy_image(image p);
|
||||||
|
void copy_image_into(image src, image dest);
|
||||||
image load_image(char *filename, int w, int h, int c);
|
image load_image(char *filename, int w, int h, int c);
|
||||||
image load_image_color(char *filename, int w, int h);
|
image load_image_color(char *filename, int w, int h);
|
||||||
image **load_alphabet();
|
image **load_alphabet();
|
||||||
|
@ -406,7 +406,7 @@ void get_region_boxes(layer l, int w, int h, int netw, int neth, float thresh, f
|
|||||||
probs[index][j] = (prob > thresh) ? prob : 0;
|
probs[index][j] = (prob > thresh) ? prob : 0;
|
||||||
if(prob > max) max = prob;
|
if(prob > max) max = prob;
|
||||||
// TODO REMOVE
|
// TODO REMOVE
|
||||||
// if (j != 15 && j != 16) probs[index][j] = 0;
|
// if (j == 56 ) probs[index][j] = 0;
|
||||||
/*
|
/*
|
||||||
if (j != 0) probs[index][j] = 0;
|
if (j != 0) probs[index][j] = 0;
|
||||||
int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500};
|
int blacklist[] = {121, 497, 482, 504, 122, 518,481, 418, 542, 491, 914, 478, 120, 510,500};
|
||||||
|
@ -340,6 +340,7 @@ void run_yolo(int argc, char **argv)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int avg = find_int_arg(argc, argv, "-avg", 1);
|
||||||
char *cfg = argv[3];
|
char *cfg = argv[3];
|
||||||
char *weights = (argc > 4) ? argv[4] : 0;
|
char *weights = (argc > 4) ? argv[4] : 0;
|
||||||
char *filename = (argc > 5) ? argv[5]: 0;
|
char *filename = (argc > 5) ? argv[5]: 0;
|
||||||
@ -347,5 +348,5 @@ void run_yolo(int argc, char **argv)
|
|||||||
else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights);
|
else if(0==strcmp(argv[2], "train")) train_yolo(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights);
|
else if(0==strcmp(argv[2], "valid")) validate_yolo(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights);
|
else if(0==strcmp(argv[2], "recall")) validate_yolo_recall(cfg, weights);
|
||||||
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, .5, 0,0,0,0);
|
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 20, frame_skip, prefix, avg, .5, 0,0,0,0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user