detector.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850
  1. #include "darknet.h"
  2. static int coco_ids[] = {1,2,3,4,5,6,7,8,9,10,11,13,14,15,16,17,18,19,20,21,22,23,24,25,27,28,31,32,33,34,35,36,37,38,39,40,41,42,43,44,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,67,70,72,73,74,75,76,77,78,79,80,81,82,84,85,86,87,88,89,90};
  3. void train_detector(char *datacfg, char *cfgfile, char *weightfile, int *gpus, int ngpus, int clear)
  4. {
  5. list *options = read_data_cfg(datacfg);
  6. char *train_images = option_find_str(options, "train", "data/train.list");
  7. char *backup_directory = option_find_str(options, "backup", "/backup/");
  8. srand(time(0));
  9. char *base = basecfg(cfgfile);
  10. printf("%s\n", base);
  11. float avg_loss = -1;
  12. network **nets = calloc(ngpus, sizeof(network));
  13. srand(time(0));
  14. int seed = rand();
  15. int i;
  16. for(i = 0; i < ngpus; ++i){
  17. srand(seed);
  18. #ifdef GPU
  19. cuda_set_device(gpus[i]);
  20. #endif
  21. nets[i] = load_network(cfgfile, weightfile, clear);
  22. nets[i]->learning_rate *= ngpus;
  23. }
  24. srand(time(0));
  25. network *net = nets[0];
  26. int imgs = net->batch * net->subdivisions * ngpus;
  27. printf("Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  28. data train, buffer;
  29. layer l = net->layers[net->n - 1];
  30. int classes = l.classes;
  31. float jitter = l.jitter;
  32. list *plist = get_paths(train_images);
  33. //int N = plist->size;
  34. char **paths = (char **)list_to_array(plist);
  35. load_args args = get_base_args(net);
  36. args.coords = l.coords;
  37. args.paths = paths;
  38. args.n = imgs;
  39. args.m = plist->size;
  40. args.classes = classes;
  41. args.jitter = jitter;
  42. args.num_boxes = l.max_boxes;
  43. args.d = &buffer;
  44. args.type = DETECTION_DATA;
  45. //args.type = INSTANCE_DATA;
  46. args.threads = 64;
  47. pthread_t load_thread = load_data(args);
  48. double time;
  49. int count = 0;
  50. //while(i*imgs < N*120){
  51. while(get_current_batch(net) < net->max_batches){
  52. if(l.random && count++%10 == 0){
  53. printf("Resizing\n");
  54. int dim = (rand() % 10 + 10) * 32;
  55. if (get_current_batch(net)+200 > net->max_batches) dim = 608;
  56. //int dim = (rand() % 4 + 16) * 32;
  57. printf("%d\n", dim);
  58. args.w = dim;
  59. args.h = dim;
  60. pthread_join(load_thread, 0);
  61. train = buffer;
  62. free_data(train);
  63. load_thread = load_data(args);
  64. #pragma omp parallel for
  65. for(i = 0; i < ngpus; ++i){
  66. resize_network(nets[i], dim, dim);
  67. }
  68. net = nets[0];
  69. }
  70. time=what_time_is_it_now();
  71. pthread_join(load_thread, 0);
  72. train = buffer;
  73. load_thread = load_data(args);
  74. /*
  75. int k;
  76. for(k = 0; k < l.max_boxes; ++k){
  77. box b = float_to_box(train.y.vals[10] + 1 + k*5);
  78. if(!b.x) break;
  79. printf("loaded: %f %f %f %f\n", b.x, b.y, b.w, b.h);
  80. }
  81. */
  82. /*
  83. int zz;
  84. for(zz = 0; zz < train.X.cols; ++zz){
  85. image im = float_to_image(net->w, net->h, 3, train.X.vals[zz]);
  86. int k;
  87. for(k = 0; k < l.max_boxes; ++k){
  88. box b = float_to_box(train.y.vals[zz] + k*5, 1);
  89. printf("%f %f %f %f\n", b.x, b.y, b.w, b.h);
  90. draw_bbox(im, b, 1, 1,0,0);
  91. }
  92. show_image(im, "truth11");
  93. cvWaitKey(0);
  94. save_image(im, "truth11");
  95. }
  96. */
  97. printf("Loaded: %lf seconds\n", what_time_is_it_now()-time);
  98. time=what_time_is_it_now();
  99. float loss = 0;
  100. #ifdef GPU
  101. if(ngpus == 1){
  102. loss = train_network(net, train);
  103. } else {
  104. loss = train_networks(nets, ngpus, train, 4);
  105. }
  106. #else
  107. loss = train_network(net, train);
  108. #endif
  109. if (avg_loss < 0) avg_loss = loss;
  110. avg_loss = avg_loss*.9 + loss*.1;
  111. i = get_current_batch(net);
  112. printf("%ld: %f, %f avg, %f rate, %lf seconds, %d images\n", get_current_batch(net), loss, avg_loss, get_current_rate(net), what_time_is_it_now()-time, i*imgs);
  113. if(i%100==0){
  114. #ifdef GPU
  115. if(ngpus != 1) sync_nets(nets, ngpus, 0);
  116. #endif
  117. char buff[256];
  118. sprintf(buff, "%s/%s.backup", backup_directory, base);
  119. save_weights(net, buff);
  120. }
  121. if(i%10000==0 || (i < 1000 && i%100 == 0)){
  122. #ifdef GPU
  123. if(ngpus != 1) sync_nets(nets, ngpus, 0);
  124. #endif
  125. char buff[256];
  126. sprintf(buff, "%s/%s_%d.weights", backup_directory, base, i);
  127. save_weights(net, buff);
  128. }
  129. free_data(train);
  130. }
  131. #ifdef GPU
  132. if(ngpus != 1) sync_nets(nets, ngpus, 0);
  133. #endif
  134. char buff[256];
  135. sprintf(buff, "%s/%s_final.weights", backup_directory, base);
  136. save_weights(net, buff);
  137. }
  138. static int get_coco_image_id(char *filename)
  139. {
  140. char *p = strrchr(filename, '/');
  141. char *c = strrchr(filename, '_');
  142. if(c) p = c;
  143. return atoi(p+1);
  144. }
  145. static void print_cocos(FILE *fp, char *image_path, detection *dets, int num_boxes, int classes, int w, int h)
  146. {
  147. int i, j;
  148. int image_id = get_coco_image_id(image_path);
  149. for(i = 0; i < num_boxes; ++i){
  150. float xmin = dets[i].bbox.x - dets[i].bbox.w/2.;
  151. float xmax = dets[i].bbox.x + dets[i].bbox.w/2.;
  152. float ymin = dets[i].bbox.y - dets[i].bbox.h/2.;
  153. float ymax = dets[i].bbox.y + dets[i].bbox.h/2.;
  154. if (xmin < 0) xmin = 0;
  155. if (ymin < 0) ymin = 0;
  156. if (xmax > w) xmax = w;
  157. if (ymax > h) ymax = h;
  158. float bx = xmin;
  159. float by = ymin;
  160. float bw = xmax - xmin;
  161. float bh = ymax - ymin;
  162. for(j = 0; j < classes; ++j){
  163. if (dets[i].prob[j]) fprintf(fp, "{\"image_id\":%d, \"category_id\":%d, \"bbox\":[%f, %f, %f, %f], \"score\":%f},\n", image_id, coco_ids[j], bx, by, bw, bh, dets[i].prob[j]);
  164. }
  165. }
  166. }
  167. void print_detector_detections(FILE **fps, char *id, detection *dets, int total, int classes, int w, int h)
  168. {
  169. int i, j;
  170. for(i = 0; i < total; ++i){
  171. float xmin = dets[i].bbox.x - dets[i].bbox.w/2. + 1;
  172. float xmax = dets[i].bbox.x + dets[i].bbox.w/2. + 1;
  173. float ymin = dets[i].bbox.y - dets[i].bbox.h/2. + 1;
  174. float ymax = dets[i].bbox.y + dets[i].bbox.h/2. + 1;
  175. if (xmin < 1) xmin = 1;
  176. if (ymin < 1) ymin = 1;
  177. if (xmax > w) xmax = w;
  178. if (ymax > h) ymax = h;
  179. for(j = 0; j < classes; ++j){
  180. if (dets[i].prob[j]) fprintf(fps[j], "%s %f %f %f %f %f\n", id, dets[i].prob[j],
  181. xmin, ymin, xmax, ymax);
  182. }
  183. }
  184. }
  185. void print_imagenet_detections(FILE *fp, int id, detection *dets, int total, int classes, int w, int h)
  186. {
  187. int i, j;
  188. for(i = 0; i < total; ++i){
  189. float xmin = dets[i].bbox.x - dets[i].bbox.w/2.;
  190. float xmax = dets[i].bbox.x + dets[i].bbox.w/2.;
  191. float ymin = dets[i].bbox.y - dets[i].bbox.h/2.;
  192. float ymax = dets[i].bbox.y + dets[i].bbox.h/2.;
  193. if (xmin < 0) xmin = 0;
  194. if (ymin < 0) ymin = 0;
  195. if (xmax > w) xmax = w;
  196. if (ymax > h) ymax = h;
  197. for(j = 0; j < classes; ++j){
  198. int class = j;
  199. if (dets[i].prob[class]) fprintf(fp, "%d %d %f %f %f %f %f\n", id, j+1, dets[i].prob[class],
  200. xmin, ymin, xmax, ymax);
  201. }
  202. }
  203. }
  204. void validate_detector_flip(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
  205. {
  206. int j;
  207. list *options = read_data_cfg(datacfg);
  208. char *valid_images = option_find_str(options, "valid", "data/train.list");
  209. char *name_list = option_find_str(options, "names", "data/names.list");
  210. char *prefix = option_find_str(options, "results", "results");
  211. char **names = get_labels(name_list);
  212. char *mapf = option_find_str(options, "map", 0);
  213. int *map = 0;
  214. if (mapf) map = read_map(mapf);
  215. network *net = load_network(cfgfile, weightfile, 0);
  216. set_batch_network(net, 2);
  217. fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  218. srand(time(0));
  219. list *plist = get_paths(valid_images);
  220. char **paths = (char **)list_to_array(plist);
  221. layer l = net->layers[net->n-1];
  222. int classes = l.classes;
  223. char buff[1024];
  224. char *type = option_find_str(options, "eval", "voc");
  225. FILE *fp = 0;
  226. FILE **fps = 0;
  227. int coco = 0;
  228. int imagenet = 0;
  229. if(0==strcmp(type, "coco")){
  230. if(!outfile) outfile = "coco_results";
  231. snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
  232. fp = fopen(buff, "w");
  233. fprintf(fp, "[\n");
  234. coco = 1;
  235. } else if(0==strcmp(type, "imagenet")){
  236. if(!outfile) outfile = "imagenet-detection";
  237. snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
  238. fp = fopen(buff, "w");
  239. imagenet = 1;
  240. classes = 200;
  241. } else {
  242. if(!outfile) outfile = "comp4_det_test_";
  243. fps = calloc(classes, sizeof(FILE *));
  244. for(j = 0; j < classes; ++j){
  245. snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
  246. fps[j] = fopen(buff, "w");
  247. }
  248. }
  249. int m = plist->size;
  250. int i=0;
  251. int t;
  252. float thresh = .005;
  253. float nms = .45;
  254. int nthreads = 4;
  255. image *val = calloc(nthreads, sizeof(image));
  256. image *val_resized = calloc(nthreads, sizeof(image));
  257. image *buf = calloc(nthreads, sizeof(image));
  258. image *buf_resized = calloc(nthreads, sizeof(image));
  259. pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
  260. image input = make_image(net->w, net->h, net->c*2);
  261. load_args args = {0};
  262. args.w = net->w;
  263. args.h = net->h;
  264. //args.type = IMAGE_DATA;
  265. args.type = LETTERBOX_DATA;
  266. for(t = 0; t < nthreads; ++t){
  267. args.path = paths[i+t];
  268. args.im = &buf[t];
  269. args.resized = &buf_resized[t];
  270. thr[t] = load_data_in_thread(args);
  271. }
  272. double start = what_time_is_it_now();
  273. for(i = nthreads; i < m+nthreads; i += nthreads){
  274. fprintf(stderr, "%d\n", i);
  275. for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
  276. pthread_join(thr[t], 0);
  277. val[t] = buf[t];
  278. val_resized[t] = buf_resized[t];
  279. }
  280. for(t = 0; t < nthreads && i+t < m; ++t){
  281. args.path = paths[i+t];
  282. args.im = &buf[t];
  283. args.resized = &buf_resized[t];
  284. thr[t] = load_data_in_thread(args);
  285. }
  286. for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
  287. char *path = paths[i+t-nthreads];
  288. char *id = basecfg(path);
  289. copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data, 1);
  290. flip_image(val_resized[t]);
  291. copy_cpu(net->w*net->h*net->c, val_resized[t].data, 1, input.data + net->w*net->h*net->c, 1);
  292. network_predict(net, input.data);
  293. int w = val[t].w;
  294. int h = val[t].h;
  295. int num = 0;
  296. detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &num);
  297. if (nms) do_nms_sort(dets, num, classes, nms);
  298. if (coco){
  299. print_cocos(fp, path, dets, num, classes, w, h);
  300. } else if (imagenet){
  301. print_imagenet_detections(fp, i+t-nthreads+1, dets, num, classes, w, h);
  302. } else {
  303. print_detector_detections(fps, id, dets, num, classes, w, h);
  304. }
  305. free_detections(dets, num);
  306. free(id);
  307. free_image(val[t]);
  308. free_image(val_resized[t]);
  309. }
  310. }
  311. for(j = 0; j < classes; ++j){
  312. if(fps) fclose(fps[j]);
  313. }
  314. if(coco){
  315. fseek(fp, -2, SEEK_CUR);
  316. fprintf(fp, "\n]\n");
  317. fclose(fp);
  318. }
  319. fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start);
  320. }
  321. void validate_detector(char *datacfg, char *cfgfile, char *weightfile, char *outfile)
  322. {
  323. int j;
  324. list *options = read_data_cfg(datacfg);
  325. char *valid_images = option_find_str(options, "valid", "data/train.list");
  326. char *name_list = option_find_str(options, "names", "data/names.list");
  327. char *prefix = option_find_str(options, "results", "results");
  328. char **names = get_labels(name_list);
  329. char *mapf = option_find_str(options, "map", 0);
  330. int *map = 0;
  331. if (mapf) map = read_map(mapf);
  332. network *net = load_network(cfgfile, weightfile, 0);
  333. set_batch_network(net, 1);
  334. fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  335. srand(time(0));
  336. list *plist = get_paths(valid_images);
  337. char **paths = (char **)list_to_array(plist);
  338. layer l = net->layers[net->n-1];
  339. int classes = l.classes;
  340. char buff[1024];
  341. char *type = option_find_str(options, "eval", "voc");
  342. FILE *fp = 0;
  343. FILE **fps = 0;
  344. int coco = 0;
  345. int imagenet = 0;
  346. if(0==strcmp(type, "coco")){
  347. if(!outfile) outfile = "coco_results";
  348. snprintf(buff, 1024, "%s/%s.json", prefix, outfile);
  349. fp = fopen(buff, "w");
  350. fprintf(fp, "[\n");
  351. coco = 1;
  352. } else if(0==strcmp(type, "imagenet")){
  353. if(!outfile) outfile = "imagenet-detection";
  354. snprintf(buff, 1024, "%s/%s.txt", prefix, outfile);
  355. fp = fopen(buff, "w");
  356. imagenet = 1;
  357. classes = 200;
  358. } else {
  359. if(!outfile) outfile = "comp4_det_test_";
  360. fps = calloc(classes, sizeof(FILE *));
  361. for(j = 0; j < classes; ++j){
  362. snprintf(buff, 1024, "%s/%s%s.txt", prefix, outfile, names[j]);
  363. fps[j] = fopen(buff, "w");
  364. }
  365. }
  366. int m = plist->size;
  367. int i=0;
  368. int t;
  369. float thresh = .005;
  370. float nms = .45;
  371. int nthreads = 4;
  372. image *val = calloc(nthreads, sizeof(image));
  373. image *val_resized = calloc(nthreads, sizeof(image));
  374. image *buf = calloc(nthreads, sizeof(image));
  375. image *buf_resized = calloc(nthreads, sizeof(image));
  376. pthread_t *thr = calloc(nthreads, sizeof(pthread_t));
  377. load_args args = {0};
  378. args.w = net->w;
  379. args.h = net->h;
  380. //args.type = IMAGE_DATA;
  381. args.type = LETTERBOX_DATA;
  382. for(t = 0; t < nthreads; ++t){
  383. args.path = paths[i+t];
  384. args.im = &buf[t];
  385. args.resized = &buf_resized[t];
  386. thr[t] = load_data_in_thread(args);
  387. }
  388. double start = what_time_is_it_now();
  389. for(i = nthreads; i < m+nthreads; i += nthreads){
  390. fprintf(stderr, "%d\n", i);
  391. for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
  392. pthread_join(thr[t], 0);
  393. val[t] = buf[t];
  394. val_resized[t] = buf_resized[t];
  395. }
  396. for(t = 0; t < nthreads && i+t < m; ++t){
  397. args.path = paths[i+t];
  398. args.im = &buf[t];
  399. args.resized = &buf_resized[t];
  400. thr[t] = load_data_in_thread(args);
  401. }
  402. for(t = 0; t < nthreads && i+t-nthreads < m; ++t){
  403. char *path = paths[i+t-nthreads];
  404. char *id = basecfg(path);
  405. float *X = val_resized[t].data;
  406. network_predict(net, X);
  407. int w = val[t].w;
  408. int h = val[t].h;
  409. int nboxes = 0;
  410. detection *dets = get_network_boxes(net, w, h, thresh, .5, map, 0, &nboxes);
  411. if (nms) do_nms_sort(dets, nboxes, classes, nms);
  412. if (coco){
  413. print_cocos(fp, path, dets, nboxes, classes, w, h);
  414. } else if (imagenet){
  415. print_imagenet_detections(fp, i+t-nthreads+1, dets, nboxes, classes, w, h);
  416. } else {
  417. print_detector_detections(fps, id, dets, nboxes, classes, w, h);
  418. }
  419. free_detections(dets, nboxes);
  420. free(id);
  421. free_image(val[t]);
  422. free_image(val_resized[t]);
  423. }
  424. }
  425. for(j = 0; j < classes; ++j){
  426. if(fps) fclose(fps[j]);
  427. }
  428. if(coco){
  429. fseek(fp, -2, SEEK_CUR);
  430. fprintf(fp, "\n]\n");
  431. fclose(fp);
  432. }
  433. fprintf(stderr, "Total Detection Time: %f Seconds\n", what_time_is_it_now() - start);
  434. }
  435. void validate_detector_recall(char *cfgfile, char *weightfile)
  436. {
  437. network *net = load_network(cfgfile, weightfile, 0);
  438. set_batch_network(net, 1);
  439. fprintf(stderr, "Learning Rate: %g, Momentum: %g, Decay: %g\n", net->learning_rate, net->momentum, net->decay);
  440. srand(time(0));
  441. list *plist = get_paths("data/coco_val_5k.list");
  442. char **paths = (char **)list_to_array(plist);
  443. layer l = net->layers[net->n-1];
  444. int j, k;
  445. int m = plist->size;
  446. int i=0;
  447. float thresh = .001;
  448. float iou_thresh = .5;
  449. float nms = .4;
  450. int total = 0;
  451. int correct = 0;
  452. int proposals = 0;
  453. float avg_iou = 0;
  454. for(i = 0; i < m; ++i){
  455. char *path = paths[i];
  456. image orig = load_image_color(path, 0, 0);
  457. image sized = resize_image(orig, net->w, net->h);
  458. char *id = basecfg(path);
  459. network_predict(net, sized.data);
  460. int nboxes = 0;
  461. detection *dets = get_network_boxes(net, sized.w, sized.h, thresh, .5, 0, 1, &nboxes);
  462. if (nms) do_nms_obj(dets, nboxes, 1, nms);
  463. char labelpath[4096];
  464. find_replace(path, "images", "labels", labelpath);
  465. find_replace(labelpath, "JPEGImages", "labels", labelpath);
  466. find_replace(labelpath, ".jpg", ".txt", labelpath);
  467. find_replace(labelpath, ".JPEG", ".txt", labelpath);
  468. int num_labels = 0;
  469. box_label *truth = read_boxes(labelpath, &num_labels);
  470. for(k = 0; k < nboxes; ++k){
  471. if(dets[k].objectness > thresh){
  472. ++proposals;
  473. }
  474. }
  475. for (j = 0; j < num_labels; ++j) {
  476. ++total;
  477. box t = {truth[j].x, truth[j].y, truth[j].w, truth[j].h};
  478. float best_iou = 0;
  479. for(k = 0; k < l.w*l.h*l.n; ++k){
  480. float iou = box_iou(dets[k].bbox, t);
  481. if(dets[k].objectness > thresh && iou > best_iou){
  482. best_iou = iou;
  483. }
  484. }
  485. avg_iou += best_iou;
  486. if(best_iou > iou_thresh){
  487. ++correct;
  488. }
  489. }
  490. fprintf(stderr, "%5d %5d %5d\tRPs/Img: %.2f\tIOU: %.2f%%\tRecall:%.2f%%\n", i, correct, total, (float)proposals/(i+1), avg_iou*100/total, 100.*correct/total);
  491. free(id);
  492. free_image(orig);
  493. free_image(sized);
  494. }
  495. }
  496. void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
  497. {
  498. list *options = read_data_cfg(datacfg);
  499. char *name_list = option_find_str(options, "names", "data/names.list");
  500. char **names = get_labels(name_list);
  501. image **alphabet = load_alphabet();
  502. network *net = load_network(cfgfile, weightfile, 0);
  503. set_batch_network(net, 1);
  504. srand(2222222);
  505. double time;
  506. char buff[256];
  507. char *input = buff;
  508. float nms=.45;
  509. while(1){
  510. if(filename){
  511. strncpy(input, filename, 256);
  512. } else {
  513. printf("Enter Image Path: ");
  514. fflush(stdout);
  515. input = fgets(input, 256, stdin);
  516. if(!input) return;
  517. strtok(input, "\n");
  518. }
  519. image im = load_image_color(input,0,0);
  520. image sized = letterbox_image(im, net->w, net->h);
  521. //image sized = resize_image(im, net->w, net->h);
  522. //image sized2 = resize_max(im, net->w);
  523. //image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h);
  524. //resize_network(net, sized.w, sized.h);
  525. layer l = net->layers[net->n-1];
  526. float *X = sized.data;
  527. time=what_time_is_it_now();
  528. network_predict(net, X);
  529. printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time);
  530. int nboxes = 0;
  531. detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
  532. //printf("%d\n", nboxes);
  533. //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
  534. if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
  535. draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
  536. free_detections(dets, nboxes);
  537. if(outfile){
  538. save_image(im, outfile);
  539. }
  540. else{
  541. save_image(im, "predictions");
  542. #ifdef OPENCV
  543. make_window("predictions", 512, 512, 0);
  544. show_image(im, "predictions", 0);
  545. #endif
  546. }
  547. free_image(im);
  548. free_image(sized);
  549. if (filename) break;
  550. }
  551. }
  552. /*
  553. void censor_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip)
  554. {
  555. #ifdef OPENCV
  556. char *base = basecfg(cfgfile);
  557. network *net = load_network(cfgfile, weightfile, 0);
  558. set_batch_network(net, 1);
  559. srand(2222222);
  560. CvCapture * cap;
  561. int w = 1280;
  562. int h = 720;
  563. if(filename){
  564. cap = cvCaptureFromFile(filename);
  565. }else{
  566. cap = cvCaptureFromCAM(cam_index);
  567. }
  568. if(w){
  569. cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w);
  570. }
  571. if(h){
  572. cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h);
  573. }
  574. if(!cap) error("Couldn't connect to webcam.\n");
  575. cvNamedWindow(base, CV_WINDOW_NORMAL);
  576. cvResizeWindow(base, 512, 512);
  577. float fps = 0;
  578. int i;
  579. float nms = .45;
  580. while(1){
  581. image in = get_image_from_stream(cap);
  582. //image in_s = resize_image(in, net->w, net->h);
  583. image in_s = letterbox_image(in, net->w, net->h);
  584. layer l = net->layers[net->n-1];
  585. float *X = in_s.data;
  586. network_predict(net, X);
  587. int nboxes = 0;
  588. detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 0, &nboxes);
  589. //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
  590. if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
  591. for(i = 0; i < nboxes; ++i){
  592. if(dets[i].prob[class] > thresh){
  593. box b = dets[i].bbox;
  594. int left = b.x-b.w/2.;
  595. int top = b.y-b.h/2.;
  596. censor_image(in, left, top, b.w, b.h);
  597. }
  598. }
  599. show_image(in, base);
  600. cvWaitKey(10);
  601. free_detections(dets, nboxes);
  602. free_image(in_s);
  603. free_image(in);
  604. float curr = 0;
  605. fps = .9*fps + .1*curr;
  606. for(i = 0; i < skip; ++i){
  607. image in = get_image_from_stream(cap);
  608. free_image(in);
  609. }
  610. }
  611. #endif
  612. }
  613. void extract_detector(char *datacfg, char *cfgfile, char *weightfile, int cam_index, const char *filename, int class, float thresh, int skip)
  614. {
  615. #ifdef OPENCV
  616. char *base = basecfg(cfgfile);
  617. network *net = load_network(cfgfile, weightfile, 0);
  618. set_batch_network(net, 1);
  619. srand(2222222);
  620. CvCapture * cap;
  621. int w = 1280;
  622. int h = 720;
  623. if(filename){
  624. cap = cvCaptureFromFile(filename);
  625. }else{
  626. cap = cvCaptureFromCAM(cam_index);
  627. }
  628. if(w){
  629. cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, w);
  630. }
  631. if(h){
  632. cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, h);
  633. }
  634. if(!cap) error("Couldn't connect to webcam.\n");
  635. cvNamedWindow(base, CV_WINDOW_NORMAL);
  636. cvResizeWindow(base, 512, 512);
  637. float fps = 0;
  638. int i;
  639. int count = 0;
  640. float nms = .45;
  641. while(1){
  642. image in = get_image_from_stream(cap);
  643. //image in_s = resize_image(in, net->w, net->h);
  644. image in_s = letterbox_image(in, net->w, net->h);
  645. layer l = net->layers[net->n-1];
  646. show_image(in, base);
  647. int nboxes = 0;
  648. float *X = in_s.data;
  649. network_predict(net, X);
  650. detection *dets = get_network_boxes(net, in.w, in.h, thresh, 0, 0, 1, &nboxes);
  651. //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
  652. if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
  653. for(i = 0; i < nboxes; ++i){
  654. if(dets[i].prob[class] > thresh){
  655. box b = dets[i].bbox;
  656. int size = b.w*in.w > b.h*in.h ? b.w*in.w : b.h*in.h;
  657. int dx = b.x*in.w-size/2.;
  658. int dy = b.y*in.h-size/2.;
  659. image bim = crop_image(in, dx, dy, size, size);
  660. char buff[2048];
  661. sprintf(buff, "results/extract/%07d", count);
  662. ++count;
  663. save_image(bim, buff);
  664. free_image(bim);
  665. }
  666. }
  667. free_detections(dets, nboxes);
  668. free_image(in_s);
  669. free_image(in);
  670. float curr = 0;
  671. fps = .9*fps + .1*curr;
  672. for(i = 0; i < skip; ++i){
  673. image in = get_image_from_stream(cap);
  674. free_image(in);
  675. }
  676. }
  677. #endif
  678. }
  679. */
  680. /*
  681. void network_detect(network *net, image im, float thresh, float hier_thresh, float nms, detection *dets)
  682. {
  683. network_predict_image(net, im);
  684. layer l = net->layers[net->n-1];
  685. int nboxes = num_boxes(net);
  686. fill_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 0, dets);
  687. if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
  688. }
  689. */
  690. void run_detector(int argc, char **argv)
  691. {
  692. char *prefix = find_char_arg(argc, argv, "-prefix", 0);
  693. float thresh = find_float_arg(argc, argv, "-thresh", .5);
  694. float hier_thresh = find_float_arg(argc, argv, "-hier", .5);
  695. int cam_index = find_int_arg(argc, argv, "-c", 0);
  696. int frame_skip = find_int_arg(argc, argv, "-s", 0);
  697. int avg = find_int_arg(argc, argv, "-avg", 3);
  698. if(argc < 4){
  699. fprintf(stderr, "usage: %s %s [train/test/valid] [cfg] [weights (optional)]\n", argv[0], argv[1]);
  700. return;
  701. }
  702. char *gpu_list = find_char_arg(argc, argv, "-gpus", 0);
  703. char *outfile = find_char_arg(argc, argv, "-out", 0);
  704. int *gpus = 0;
  705. int gpu = 0;
  706. int ngpus = 0;
  707. if(gpu_list){
  708. printf("%s\n", gpu_list);
  709. int len = strlen(gpu_list);
  710. ngpus = 1;
  711. int i;
  712. for(i = 0; i < len; ++i){
  713. if (gpu_list[i] == ',') ++ngpus;
  714. }
  715. gpus = calloc(ngpus, sizeof(int));
  716. for(i = 0; i < ngpus; ++i){
  717. gpus[i] = atoi(gpu_list);
  718. gpu_list = strchr(gpu_list, ',')+1;
  719. }
  720. } else {
  721. gpu = gpu_index;
  722. gpus = &gpu;
  723. ngpus = 1;
  724. }
  725. int clear = find_arg(argc, argv, "-clear");
  726. int fullscreen = find_arg(argc, argv, "-fullscreen");
  727. int width = find_int_arg(argc, argv, "-w", 0);
  728. int height = find_int_arg(argc, argv, "-h", 0);
  729. int fps = find_int_arg(argc, argv, "-fps", 0);
  730. //int class = find_int_arg(argc, argv, "-class", 0);
  731. char *datacfg = argv[3];
  732. char *cfg = argv[4];
  733. char *weights = (argc > 5) ? argv[5] : 0;
  734. char *filename = (argc > 6) ? argv[6]: 0;
  735. if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);
  736. else if(0==strcmp(argv[2], "train")) train_detector(datacfg, cfg, weights, gpus, ngpus, clear);
  737. else if(0==strcmp(argv[2], "valid")) validate_detector(datacfg, cfg, weights, outfile);
  738. else if(0==strcmp(argv[2], "valid2")) validate_detector_flip(datacfg, cfg, weights, outfile);
  739. else if(0==strcmp(argv[2], "recall")) validate_detector_recall(cfg, weights);
  740. else if(0==strcmp(argv[2], "demo")) {
  741. list *options = read_data_cfg(datacfg);
  742. int classes = option_find_int(options, "classes", 20);
  743. char *name_list = option_find_str(options, "names", "data/names.list");
  744. char **names = get_labels(name_list);
  745. demo(cfg, weights, thresh, cam_index, filename, names, classes, frame_skip, prefix, avg, hier_thresh, width, height, fps, fullscreen);
  746. }
  747. //else if(0==strcmp(argv[2], "extract")) extract_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip);
  748. //else if(0==strcmp(argv[2], "censor")) censor_detector(datacfg, cfg, weights, cam_index, filename, class, thresh, frame_skip);
  749. }