123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- #include "darknet.h"
- #include <sys/time.h>
- #include <assert.h>
- void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
- {
- int i;
- float avg_loss = -1;
- char *base = basecfg(cfgfile);
- printf("%s\n", base);
- printf("%d\n", ngpus);
- network **nets = calloc(ngpus, sizeof(network*));
- srand(time(0));
- int seed = rand();
- for(i = 0; i < ngpus; ++i){
- srand(seed);
- #ifdef GPU
- cuda_set_device(gpus[i]);
- #endif
- nets[i] = load_network(cfgfile, weightfile, clear);
- nets[i]->learning_rate *= ngpus;
- }
- srand(time(0));
- network *net = nets[0];
- int imgs = net->batch * net->subdivisions * ngpus;
- printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
- list *options = read_data_cfg(datacfg);
- char *backup_directory = option_find_str(options, "backup", "/backup/");
- char *train_list = option_find_str(options, "train", "data/train.list");
- int classes = option_find_int(options, "classes", 1);
- list *plist = get_paths(train_list);
- char **paths = (char **)list_to_array(plist);
- printf("%d\n", plist->size);
- int N = plist->size;
- clock_t time;
- load_args args = {0};
- args.w = net->w;
- args.h = net->h;
- args.threads = 32;
- args.classes = classes;
- args.min = net->min_ratio*net->w;
- args.max = net->max_ratio*net->w;
- args.angle = net->angle;
- args.aspect = net->aspect;
- args.exposure = net->exposure;
- args.saturation = net->saturation;
- args.hue = net->hue;
- args.size = net->w;
- args.paths = paths;
- args.n = imgs;
- args.m = N;
- args.type = REGRESSION_DATA;
- data train;
- data buffer;
- pthread_t load_thread;
- args.d = &buffer;
- load_thread = load_data(args);
- int epoch = (*net->seen)/N;
- while(get_current_batch(net) < net->max_batches || net->max_batches == 0){
- time=clock();
- pthread_join(load_thread, 0);
- train = buffer;
- load_thread = load_data(args);
- printf("Loaded: %lf seconds\n", sec(clock()-time));
- time=clock();
- float loss = 0;
- #ifdef GPU
- if(ngpus == 1){
- loss = train_network(net, train);
- } else {
- loss = train_networks(nets, ngpus, train, 4);
- }
- #else
- loss = train_network(net, train);
- #endif
- if(avg_loss == -1) avg_loss = loss;
- avg_loss = avg_loss*.9 + loss*.1;
- printf("%ld, %.3f: %f, %f avg, %f rate, %lf seconds, %ld images\n", get_current_batch(net), (float)(*net->seen)/N, loss, avg_loss, get_current_rate(net), sec(clock()-time), *net->seen);
- free_data(train);
- if(*net->seen/N > epoch){
- epoch = *net->seen/N;
- char buff[256];
- sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
- save_weights(net, buff);
- }
- if(get_current_batch(net)%100 == 0){
- char buff[256];
- sprintf(buff, "%s/%s.backup",backup_directory,base);
- save_weights(net, buff);
- }
- }
- char buff[256];
- sprintf(buff, "%s/%s.weights", backup_directory, base);
- save_weights(net, buff);
- free_network(net);
- free_ptrs((void**)paths, plist->size);
- free_list(plist);
- free(base);
- }
- void predict_regressor(char *cfgfile, char *weightfile, char *filename)
- {
- network *net = load_network(cfgfile, weightfile, 0);
- set_batch_network(net, 1);
- srand(2222222);
- clock_t time;
- char buff[256];
- char *input = buff;
- while(1){
- if(filename){
- strncpy(input, filename, 256);
- }else{
- printf("Enter Image Path: ");
- fflush(stdout);
- input = fgets(input, 256, stdin);
- if(!input) return;
- strtok(input, "\n");
- }
- image im = load_image_color(input, 0, 0);
- image sized = letterbox_image(im, net->w, net->h);
- float *X = sized.data;
- time=clock();
- float *predictions = network_predict(net, X);
- printf("Predicted: %f\n", predictions[0]);
- printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
- free_image(im);
- free_image(sized);
- if (filename) break;
- }
- }
- void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
- {
- #ifdef OPENCV
- printf("Regressor Demo\n");
- network *net = load_network(cfgfile, weightfile, 0);
- set_batch_network(net, 1);
- srand(2222222);
- list *options = read_data_cfg(datacfg);
- int classes = option_find_int(options, "classes", 1);
- char *name_list = option_find_str(options, "names", 0);
- char **names = get_labels(name_list);
- void * cap = open_video_stream(filename, cam_index, 0,0,0);
- if(!cap) error("Couldn't connect to webcam.\n");
- float fps = 0;
- while(1){
- struct timeval tval_before, tval_after, tval_result;
- gettimeofday(&tval_before, NULL);
- image in = get_image_from_stream(cap);
- image crop = center_crop_image(in, net->w, net->h);
- grayscale_image_3c(crop);
- float *predictions = network_predict(net, crop.data);
- printf("\033[2J");
- printf("\033[1;1H");
- printf("\nFPS:%.0f\n",fps);
- int i;
- for(i = 0; i < classes; ++i){
- printf("%s: %f\n", names[i], predictions[i]);
- }
- show_image(crop, "Regressor", 10);
- free_image(in);
- free_image(crop);
- gettimeofday(&tval_after, NULL);
- timersub(&tval_after, &tval_before, &tval_result);
- float curr = 1000000.f/((long int)tval_result.tv_usec);
- fps = .9*fps + .1*curr;
- }
- #endif
- }
- void run_regressor(int argc, char **argv)
- {
- if(argc < 4){
- fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
- return;
- }
- char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
- int *gpus = 0;
- int gpu = 0;
- int ngpus = 0;
- if(gpu_list){
- printf("%s\n", gpu_list);
- int len = strlen(gpu_list);
- ngpus = 1;
- int i;
- for(i = 0; i < len; ++i){
- if (gpu_list[i] == ',') ++ngpus;
- }
- gpus = calloc(ngpus, sizeof(int));
- for(i = 0; i < ngpus; ++i){
- gpus[i] = atoi(gpu_list);
- gpu_list = strchr(gpu_list, ',')+1;
- }
- } else {
- gpu = gpu_index;
- gpus = &gpu;
- ngpus = 1;
- }
- int cam_index = find_int_arg(argc, argv, "-c", 0);
- int clear = find_arg(argc, argv, "-clear");
- char *data = argv[3];
- char *cfg = argv[4];
- char *weights = (argc > 5) ? argv[5] : 0;
- char *filename = (argc > 6) ? argv[6]: 0;
- if(0==strcmp(argv[2], "test")) predict_regressor(data, cfg, weights);
- else if(0==strcmp(argv[2], "train")) train_regressor(data, cfg, weights, gpus, ngpus, clear);
- else if(0==strcmp(argv[2], "demo")) demo_regressor(data, cfg, weights, cam_index, filename);
- }
|