regressor.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "darknet.h"
  2. #include <sys/time.h>
  3. #include <assert.h>
  4. void train_regressor(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
  5. {
  6. int i;
  7. float avg_loss = -1;
  8. char *base = basecfg(cfgfile);
  9. printf("%s\n", base);
  10. printf("%d\n", ngpus);
  11. network **nets = calloc(ngpus, sizeof(network*));
  12. srand(time(0));
  13. int seed = rand();
  14. for(i = 0; i < ngpus; ++i){
  15. srand(seed);
  16. #ifdef GPU
  17. cuda_set_device(gpus[i]);
  18. #endif
  19. nets[i] = load_network(cfgfile, weightfile, clear);
  20. nets[i]->learning_rate *= ngpus;
  21. }
  22. srand(time(0));
  23. network *net = nets[0];
  24. int imgs = net->batch * net->subdivisions * ngpus;
  25. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  26. list *options = read_data_cfg(datacfg);
  27. char *backup_directory = option_find_str(options, "backup", "/backup/");
  28. char *train_list = option_find_str(options, "train", "data/train.list");
  29. int classes = option_find_int(options, "classes", 1);
  30. list *plist = get_paths(train_list);
  31. char **paths = (char **)list_to_array(plist);
  32. printf("%d\n", plist->size);
  33. int N = plist->size;
  34. clock_t time;
  35. load_args args = {0};
  36. args.w = net->w;
  37. args.h = net->h;
  38. args.threads = 32;
  39. args.classes = classes;
  40. args.min = net->min_ratio*net->w;
  41. args.max = net->max_ratio*net->w;
  42. args.angle = net->angle;
  43. args.aspect = net->aspect;
  44. args.exposure = net->exposure;
  45. args.saturation = net->saturation;
  46. args.hue = net->hue;
  47. args.size = net->w;
  48. args.paths = paths;
  49. args.n = imgs;
  50. args.m = N;
  51. args.type = REGRESSION_DATA;
  52. data train;
  53. data buffer;
  54. pthread_t load_thread;
  55. args.d = &buffer;
  56. load_thread = load_data(args);
  57. int epoch = (*net->seen)/N;
  58. while(get_current_batch(net) < net->max_batches || net->max_batches == 0){
  59. time=clock();
  60. pthread_join(load_thread, 0);
  61. train = buffer;
  62. load_thread = load_data(args);
  63. printf("Loaded: %lf seconds\n", sec(clock()-time));
  64. time=clock();
  65. float loss = 0;
  66. #ifdef GPU
  67. if(ngpus == 1){
  68. loss = train_network(net, train);
  69. } else {
  70. loss = train_networks(nets, ngpus, train, 4);
  71. }
  72. #else
  73. loss = train_network(net, train);
  74. #endif
  75. if(avg_loss == -1) avg_loss = loss;
  76. avg_loss = avg_loss*.9 + loss*.1;
  77. 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);
  78. free_data(train);
  79. if(*net->seen/N > epoch){
  80. epoch = *net->seen/N;
  81. char buff[256];
  82. sprintf(buff, "%s/%s_%d.weights",backup_directory,base, epoch);
  83. save_weights(net, buff);
  84. }
  85. if(get_current_batch(net)%100 == 0){
  86. char buff[256];
  87. sprintf(buff, "%s/%s.backup",backup_directory,base);
  88. save_weights(net, buff);
  89. }
  90. }
  91. char buff[256];
  92. sprintf(buff, "%s/%s.weights", backup_directory, base);
  93. save_weights(net, buff);
  94. free_network(net);
  95. free_ptrs((void**)paths, plist->size);
  96. free_list(plist);
  97. free(base);
  98. }
  99. void predict_regressor(char *cfgfile, char *weightfile, char *filename)
  100. {
  101. network *net = load_network(cfgfile, weightfile, 0);
  102. set_batch_network(net, 1);
  103. srand(2222222);
  104. clock_t time;
  105. char buff[256];
  106. char *input = buff;
  107. while(1){
  108. if(filename){
  109. strncpy(input, filename, 256);
  110. }else{
  111. printf("Enter Image Path: ");
  112. fflush(stdout);
  113. input = fgets(input, 256, stdin);
  114. if(!input) return;
  115. strtok(input, "\n");
  116. }
  117. image im = load_image_color(input, 0, 0);
  118. image sized = letterbox_image(im, net->w, net->h);
  119. float *X = sized.data;
  120. time=clock();
  121. float *predictions = network_predict(net, X);
  122. printf("Predicted: %f\n", predictions[0]);
  123. printf("%s: Predicted in %f seconds.\n", input, sec(clock()-time));
  124. free_image(im);
  125. free_image(sized);
  126. if (filename) break;
  127. }
  128. }
  129. void demo_regressor(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename)
  130. {
  131. #ifdef OPENCV
  132. printf("Regressor Demo\n");
  133. network *net = load_network(cfgfile, weightfile, 0);
  134. set_batch_network(net, 1);
  135. srand(2222222);
  136. list *options = read_data_cfg(datacfg);
  137. int classes = option_find_int(options, "classes", 1);
  138. char *name_list = option_find_str(options, "names", 0);
  139. char **names = get_labels(name_list);
  140. void * cap = open_video_stream(filename, cam_index, 0,0,0);
  141. if(!cap) error("Couldn't connect to webcam.\n");
  142. float fps = 0;
  143. while(1){
  144. struct timeval tval_before, tval_after, tval_result;
  145. gettimeofday(&tval_before, NULL);
  146. image in = get_image_from_stream(cap);
  147. image crop = center_crop_image(in, net->w, net->h);
  148. grayscale_image_3c(crop);
  149. float *predictions = network_predict(net, crop.data);
  150. printf("\033[2J");
  151. printf("\033[1;1H");
  152. printf("\nFPS:%.0f\n",fps);
  153. int i;
  154. for(i = 0; i < classes; ++i){
  155. printf("%s: %f\n", names[i], predictions[i]);
  156. }
  157. show_image(crop, "Regressor", 10);
  158. free_image(in);
  159. free_image(crop);
  160. gettimeofday(&tval_after, NULL);
  161. timersub(&tval_after, &tval_before, &tval_result);
  162. float curr = 1000000.f/((long int)tval_result.tv_usec);
  163. fps = .9*fps + .1*curr;
  164. }
  165. #endif
  166. }
  167. void run_regressor(int argc, char **argv)
  168. {
  169. if(argc < 4){
  170. fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
  171. return;
  172. }
  173. char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
  174. int *gpus = 0;
  175. int gpu = 0;
  176. int ngpus = 0;
  177. if(gpu_list){
  178. printf("%s\n", gpu_list);
  179. int len = strlen(gpu_list);
  180. ngpus = 1;
  181. int i;
  182. for(i = 0; i < len; ++i){
  183. if (gpu_list[i] == ',') ++ngpus;
  184. }
  185. gpus = calloc(ngpus, sizeof(int));
  186. for(i = 0; i < ngpus; ++i){
  187. gpus[i] = atoi(gpu_list);
  188. gpu_list = strchr(gpu_list, ',')+1;
  189. }
  190. } else {
  191. gpu = gpu_index;
  192. gpus = &gpu;
  193. ngpus = 1;
  194. }
  195. int cam_index = find_int_arg(argc, argv, "-c", 0);
  196. int clear = find_arg(argc, argv, "-clear");
  197. char *data = argv[3];
  198. char *cfg = argv[4];
  199. char *weights = (argc > 5) ? argv[5] : 0;
  200. char *filename = (argc > 6) ? argv[6]: 0;
  201. if(0==strcmp(argv[2], "test")) predict_regressor(data, cfg, weights);
  202. else if(0==strcmp(argv[2], "train")) train_regressor(data, cfg, weights, gpus, ngpus, clear);
  203. else if(0==strcmp(argv[2], "demo")) demo_regressor(data, cfg, weights, cam_index, filename);
  204. }