| | |
| | | #include "parser.h" |
| | | |
| | | |
| | | char *class_names[] = {"bg", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; |
| | | char *class_names[] = {"aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"}; |
| | | char *inet_class_names[] = {"bg", "accordion", "airplane", "ant", "antelope", "apple", "armadillo", "artichoke", "axe", "baby bed", "backpack", "bagel", "balance beam", "banana", "band aid", "banjo", "baseball", "basketball", "bathing cap", "beaker", "bear", "bee", "bell pepper", "bench", "bicycle", "binder", "bird", "bookshelf", "bow tie", "bow", "bowl", "brassiere", "burrito", "bus", "butterfly", "camel", "can opener", "car", "cart", "cattle", "cello", "centipede", "chain saw", "chair", "chime", "cocktail shaker", "coffee maker", "computer keyboard", "computer mouse", "corkscrew", "cream", "croquet ball", "crutch", "cucumber", "cup or mug", "diaper", "digital clock", "dishwasher", "dog", "domestic cat", "dragonfly", "drum", "dumbbell", "electric fan", "elephant", "face powder", "fig", "filing cabinet", "flower pot", "flute", "fox", "french horn", "frog", "frying pan", "giant panda", "goldfish", "golf ball", "golfcart", "guacamole", "guitar", "hair dryer", "hair spray", "hamburger", "hammer", "hamster", "harmonica", "harp", "hat with a wide brim", "head cabbage", "helmet", "hippopotamus", "horizontal bar", "horse", "hotdog", "iPod", "isopod", "jellyfish", "koala bear", "ladle", "ladybug", "lamp", "laptop", "lemon", "lion", "lipstick", "lizard", "lobster", "maillot", "maraca", "microphone", "microwave", "milk can", "miniskirt", "monkey", "motorcycle", "mushroom", "nail", "neck brace", "oboe", "orange", "otter", "pencil box", "pencil sharpener", "perfume", "person", "piano", "pineapple", "ping-pong ball", "pitcher", "pizza", "plastic bag", "plate rack", "pomegranate", "popsicle", "porcupine", "power drill", "pretzel", "printer", "puck", "punching bag", "purse", "rabbit", "racket", "ray", "red panda", "refrigerator", "remote control", "rubber eraser", "rugby ball", "ruler", "salt or pepper shaker", "saxophone", "scorpion", "screwdriver", "seal", "sheep", "ski", "skunk", "snail", "snake", "snowmobile", "snowplow", "soap dispenser", "soccer ball", "sofa", "spatula", "squirrel", "starfish", "stethoscope", "stove", "strainer", "strawberry", "stretcher", "sunglasses", "swimming trunks", "swine", "syringe", "table", "tape player", "tennis ball", "tick", "tie", "tiger", "toaster", "traffic light", "train", "trombone", "trumpet", "turtle", "tv or monitor", "unicycle", "vacuum", "violin", "volleyball", "waffle iron", "washer", "water bottle", "watercraft", "whale", "wine bottle", "zebra"}; |
| | | #define AMNT 3 |
| | | void draw_detection(image im, float *box, int side) |
| | | { |
| | | int classes = 201; |
| | | int classes = 20; |
| | | int elems = 4+classes; |
| | | int j; |
| | | int r, c; |
| | |
| | | //printf("%d\n", j); |
| | | //printf("Prob: %f\n", box[j]); |
| | | int class = max_index(box+j, classes); |
| | | if(box[j+class] > .02 || 1){ |
| | | if(box[j+class] > .2){ |
| | | //int z; |
| | | //for(z = 0; z < classes; ++z) printf("%f %s\n", box[j+z], class_names[z]); |
| | | printf("%f %s\n", box[j+class], inet_class_names[class]); |
| | | printf("%f %s\n", box[j+class], class_names[class]); |
| | | float red = get_color(0,class,classes); |
| | | float green = get_color(1,class,classes); |
| | | float blue = get_color(2,class,classes); |
| | |
| | | void train_detection(char *cfgfile, char *weightfile) |
| | | { |
| | | srand(time(0)); |
| | | data_seed = time(0); |
| | | int imgnet = 0; |
| | | char *base = basecfg(cfgfile); |
| | | printf("%s\n", base); |
| | |
| | | if (imgnet){ |
| | | plist = get_paths("/home/pjreddie/data/imagenet/det.train.list"); |
| | | }else{ |
| | | plist = get_paths("/home/pjreddie/data/voc/trainall.txt"); |
| | | //plist = get_paths("/home/pjreddie/data/voc/trainall.txt"); |
| | | //plist = get_paths("/home/pjreddie/data/coco/trainval.txt"); |
| | | plist = get_paths("/home/pjreddie/data/voc/all2007-2012.txt"); |
| | | } |
| | | paths = (char **)list_to_array(plist); |
| | | pthread_t load_thread = load_data_detection_thread(imgs, paths, plist->size, classes, net.h, net.w, side, side, background, &buffer); |
| | | pthread_t load_thread = load_data_detection_thread(imgs, paths, plist->size, classes, net.w, net.h, side, side, background, &buffer); |
| | | clock_t time; |
| | | while(1){ |
| | | i += 1; |
| | | time=clock(); |
| | | pthread_join(load_thread, 0); |
| | | train = buffer; |
| | | load_thread = load_data_detection_thread(imgs, paths, plist->size, classes, net.h, net.w, side, side, background, &buffer); |
| | | load_thread = load_data_detection_thread(imgs, paths, plist->size, classes, net.w, net.h, side, side, background, &buffer); |
| | | |
| | | /* |
| | | image im = float_to_image(im_dim, im_dim, 3, train.X.vals[114]); |
| | | draw_detection(im, train.y.vals[114], 7); |
| | | */ |
| | | image im = float_to_image(net.w, net.h, 3, train.X.vals[114]); |
| | | image copy = copy_image(im); |
| | | draw_detection(copy, train.y.vals[114], 7); |
| | | free_image(copy); |
| | | */ |
| | | |
| | | printf("Loaded: %lf seconds\n", sec(clock()-time)); |
| | | time=clock(); |
| | |
| | | } |
| | | } |
| | | |
| | | void validate_detection(char *cfgfile, char *weightfile) |
| | | void predict_detections(network net, data d, float threshold, int offset, int classes, int nuisance, int background, int num_boxes, int per_box) |
| | | { |
| | | network net = parse_network_cfg(cfgfile); |
| | | if(weightfile){ |
| | | load_weights(&net, weightfile); |
| | | } |
| | | detection_layer *layer = get_network_detection_layer(net); |
| | | fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); |
| | | srand(time(0)); |
| | | |
| | | list *plist = get_paths("/home/pjreddie/data/voc/val.txt"); |
| | | //list *plist = get_paths("/home/pjreddie/data/voc/train.txt"); |
| | | char **paths = (char **)list_to_array(plist); |
| | | |
| | | int classes = layer->classes; |
| | | int nuisance = layer->nuisance; |
| | | int background = (layer->background && !nuisance); |
| | | int num_boxes = sqrt(get_detection_layer_locations(*layer)); |
| | | |
| | | int per_box = 4+classes+background+nuisance; |
| | | int num_output = num_boxes*num_boxes*per_box; |
| | | |
| | | int m = plist->size; |
| | | int i = 0; |
| | | int splits = 100; |
| | | int num = (i+1)*m/splits - i*m/splits; |
| | | |
| | | fprintf(stderr, "%d\n", m); |
| | | data val, buffer; |
| | | pthread_t load_thread = load_data_thread(paths, num, 0, 0, num_output, net.h, net.w, &buffer); |
| | | clock_t time; |
| | | for(i = 1; i <= splits; ++i){ |
| | | time=clock(); |
| | | pthread_join(load_thread, 0); |
| | | val = buffer; |
| | | |
| | | num = (i+1)*m/splits - i*m/splits; |
| | | char **part = paths+(i*m/splits); |
| | | if(i != splits) load_thread = load_data_thread(part, num, 0, 0, num_output, net.h, net.w, &buffer); |
| | | |
| | | fprintf(stderr, "%d: Loaded: %lf seconds\n", i, sec(clock()-time)); |
| | | matrix pred = network_predict_data(net, val); |
| | | matrix pred = network_predict_data(net, d); |
| | | int j, k, class; |
| | | for(j = 0; j < pred.rows; ++j){ |
| | | for(k = 0; k < pred.cols; k += per_box){ |
| | |
| | | h = h*h; |
| | | float w = pred.vals[j][ci + 3]; //* distance_from_edge(col, num_boxes); |
| | | w = w*w; |
| | | printf("%d %d %f %f %f %f %f\n", (i-1)*m/splits + j, class, scale*pred.vals[j][k+class+background+nuisance], y, x, h, w); |
| | | float prob = scale*pred.vals[j][k+class+background+nuisance]; |
| | | if(prob < threshold) continue; |
| | | printf("%d %d %f %f %f %f %f\n", offset + j, class, prob, y, x, h, w); |
| | | } |
| | | } |
| | | } |
| | | free_matrix(pred); |
| | | } |
| | | |
| | | void validate_detection(char *cfgfile, char *weightfile) |
| | | { |
| | | network net = parse_network_cfg(cfgfile); |
| | | if(weightfile){ |
| | | load_weights(&net, weightfile); |
| | | } |
| | | detection_layer *layer = get_network_detection_layer(net); |
| | | fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net.learning_rate, net.momentum, net.decay); |
| | | srand(time(0)); |
| | | |
| | | list *plist = get_paths("/home/pjreddie/data/voc/val.txt"); |
| | | //list *plist = get_paths("/home/pjreddie/data/voc/test.txt"); |
| | | //list *plist = get_paths("/home/pjreddie/data/voc/val.expanded.txt"); |
| | | //list *plist = get_paths("/home/pjreddie/data/voc/train.txt"); |
| | | char **paths = (char **)list_to_array(plist); |
| | | |
| | | int classes = layer->classes; |
| | | int nuisance = layer->nuisance; |
| | | int background = (layer->background && !nuisance); |
| | | int num_boxes = sqrt(get_detection_layer_locations(*layer)); |
| | | |
| | | int per_box = 4+classes+background+nuisance; |
| | | int num_output = num_boxes*num_boxes*per_box; |
| | | |
| | | int m = plist->size; |
| | | int i = 0; |
| | | int splits = 100; |
| | | |
| | | int nthreads = 4; |
| | | int t; |
| | | data *val = calloc(nthreads, sizeof(data)); |
| | | data *buf = calloc(nthreads, sizeof(data)); |
| | | pthread_t *thr = calloc(nthreads, sizeof(data)); |
| | | for(t = 0; t < nthreads; ++t){ |
| | | int num = (i+1+t)*m/splits - (i+t)*m/splits; |
| | | char **part = paths+((i+t)*m/splits); |
| | | thr[t] = load_data_thread(part, num, 0, 0, num_output, net.w, net.h, &(buf[t])); |
| | | } |
| | | |
| | | clock_t time; |
| | | for(i = nthreads; i <= splits; i += nthreads){ |
| | | time=clock(); |
| | | free_data(val); |
| | | for(t = 0; t < nthreads; ++t){ |
| | | pthread_join(thr[t], 0); |
| | | val[t] = buf[t]; |
| | | } |
| | | for(t = 0; t < nthreads && i < splits; ++t){ |
| | | int num = (i+1+t)*m/splits - (i+t)*m/splits; |
| | | char **part = paths+((i+t)*m/splits); |
| | | thr[t] = load_data_thread(part, num, 0, 0, num_output, net.w, net.h, &(buf[t])); |
| | | } |
| | | |
| | | fprintf(stderr, "%d: Loaded: %lf seconds\n", i, sec(clock()-time)); |
| | | for(t = 0; t < nthreads; ++t){ |
| | | predict_detections(net, val[t], .01, (i-nthreads+t)*m/splits, classes, nuisance, background, num_boxes, per_box); |
| | | free_data(val[t]); |
| | | } |
| | | time=clock(); |
| | | } |
| | | } |
| | | |
| | |
| | | fgets(filename, 256, stdin); |
| | | strtok(filename, "\n"); |
| | | image im = load_image_color(filename, im_size, im_size); |
| | | translate_image(im, -128); |
| | | scale_image(im, 1/128.); |
| | | printf("%d %d %d\n", im.h, im.w, im.c); |
| | | float *X = im.data; |
| | | time=clock(); |