1
0

darknet.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. #include "darknet.h"
  2. #include <time.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. extern void predict_classifier(char *datacfg, char *cfgfile, char *weightfile, char *filename, int top);
  6. extern void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen);
  7. extern void run_yolo(int argc, char **argv);
  8. extern void run_detector(int argc, char **argv);
  9. extern void run_coco(int argc, char **argv);
  10. extern void run_nightmare(int argc, char **argv);
  11. extern void run_classifier(int argc, char **argv);
  12. extern void run_regressor(int argc, char **argv);
  13. extern void run_segmenter(int argc, char **argv);
  14. extern void run_isegmenter(int argc, char **argv);
  15. extern void run_char_rnn(int argc, char **argv);
  16. extern void run_tag(int argc, char **argv);
  17. extern void run_cifar(int argc, char **argv);
  18. extern void run_go(int argc, char **argv);
  19. extern void run_art(int argc, char **argv);
  20. extern void run_super(int argc, char **argv);
  21. extern void run_lsd(int argc, char **argv);
  22. void average(int argc, char *argv[])
  23. {
  24. char *cfgfile = argv[2];
  25. char *outfile = argv[3];
  26. gpu_index = -1;
  27. network *net = parse_network_cfg(cfgfile);
  28. network *sum = parse_network_cfg(cfgfile);
  29. char *weightfile = argv[4];
  30. load_weights(sum, weightfile);
  31. int i, j;
  32. int n = argc - 5;
  33. for(i = 0; i < n; ++i){
  34. weightfile = argv[i+5];
  35. load_weights(net, weightfile);
  36. for(j = 0; j < net->n; ++j){
  37. layer l = net->layers[j];
  38. layer out = sum->layers[j];
  39. if(l.type == CONVOLUTIONAL){
  40. int num = l.n*l.c*l.size*l.size;
  41. axpy_cpu(l.n, 1, l.biases, 1, out.biases, 1);
  42. axpy_cpu(num, 1, l.weights, 1, out.weights, 1);
  43. if(l.batch_normalize){
  44. axpy_cpu(l.n, 1, l.scales, 1, out.scales, 1);
  45. axpy_cpu(l.n, 1, l.rolling_mean, 1, out.rolling_mean, 1);
  46. axpy_cpu(l.n, 1, l.rolling_variance, 1, out.rolling_variance, 1);
  47. }
  48. }
  49. if(l.type == CONNECTED){
  50. axpy_cpu(l.outputs, 1, l.biases, 1, out.biases, 1);
  51. axpy_cpu(l.outputs*l.inputs, 1, l.weights, 1, out.weights, 1);
  52. }
  53. }
  54. }
  55. n = n+1;
  56. for(j = 0; j < net->n; ++j){
  57. layer l = sum->layers[j];
  58. if(l.type == CONVOLUTIONAL){
  59. int num = l.n*l.c*l.size*l.size;
  60. scal_cpu(l.n, 1./n, l.biases, 1);
  61. scal_cpu(num, 1./n, l.weights, 1);
  62. if(l.batch_normalize){
  63. scal_cpu(l.n, 1./n, l.scales, 1);
  64. scal_cpu(l.n, 1./n, l.rolling_mean, 1);
  65. scal_cpu(l.n, 1./n, l.rolling_variance, 1);
  66. }
  67. }
  68. if(l.type == CONNECTED){
  69. scal_cpu(l.outputs, 1./n, l.biases, 1);
  70. scal_cpu(l.outputs*l.inputs, 1./n, l.weights, 1);
  71. }
  72. }
  73. save_weights(sum, outfile);
  74. }
  75. long numops(network *net)
  76. {
  77. int i;
  78. long ops = 0;
  79. for(i = 0; i < net->n; ++i){
  80. layer l = net->layers[i];
  81. if(l.type == CONVOLUTIONAL){
  82. ops += 2l * l.n * l.size*l.size*l.c/l.groups * l.out_h*l.out_w;
  83. } else if(l.type == CONNECTED){
  84. ops += 2l * l.inputs * l.outputs;
  85. } else if (l.type == RNN){
  86. ops += 2l * l.input_layer->inputs * l.input_layer->outputs;
  87. ops += 2l * l.self_layer->inputs * l.self_layer->outputs;
  88. ops += 2l * l.output_layer->inputs * l.output_layer->outputs;
  89. } else if (l.type == GRU){
  90. ops += 2l * l.uz->inputs * l.uz->outputs;
  91. ops += 2l * l.uh->inputs * l.uh->outputs;
  92. ops += 2l * l.ur->inputs * l.ur->outputs;
  93. ops += 2l * l.wz->inputs * l.wz->outputs;
  94. ops += 2l * l.wh->inputs * l.wh->outputs;
  95. ops += 2l * l.wr->inputs * l.wr->outputs;
  96. } else if (l.type == LSTM){
  97. ops += 2l * l.uf->inputs * l.uf->outputs;
  98. ops += 2l * l.ui->inputs * l.ui->outputs;
  99. ops += 2l * l.ug->inputs * l.ug->outputs;
  100. ops += 2l * l.uo->inputs * l.uo->outputs;
  101. ops += 2l * l.wf->inputs * l.wf->outputs;
  102. ops += 2l * l.wi->inputs * l.wi->outputs;
  103. ops += 2l * l.wg->inputs * l.wg->outputs;
  104. ops += 2l * l.wo->inputs * l.wo->outputs;
  105. }
  106. }
  107. return ops;
  108. }
  109. void speed(char *cfgfile, int tics)
  110. {
  111. if (tics == 0) tics = 1000;
  112. network *net = parse_network_cfg(cfgfile);
  113. set_batch_network(net, 1);
  114. int i;
  115. double time=what_time_is_it_now();
  116. image im = make_image(net->w, net->h, net->c*net->batch);
  117. for(i = 0; i < tics; ++i){
  118. network_predict(net, im.data);
  119. }
  120. double t = what_time_is_it_now() - time;
  121. long ops = numops(net);
  122. printf("\n%d evals, %f Seconds\n", tics, t);
  123. printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.);
  124. printf("FLOPS: %.2f Bn\n", (float)ops/1000000000.*tics/t);
  125. printf("Speed: %f sec/eval\n", t/tics);
  126. printf("Speed: %f Hz\n", tics/t);
  127. }
  128. void operations(char *cfgfile)
  129. {
  130. gpu_index = -1;
  131. network *net = parse_network_cfg(cfgfile);
  132. long ops = numops(net);
  133. printf("Floating Point Operations: %ld\n", ops);
  134. printf("Floating Point Operations: %.2f Bn\n", (float)ops/1000000000.);
  135. }
  136. void oneoff(char *cfgfile, char *weightfile, char *outfile)
  137. {
  138. gpu_index = -1;
  139. network *net = parse_network_cfg(cfgfile);
  140. int oldn = net->layers[net->n - 2].n;
  141. int c = net->layers[net->n - 2].c;
  142. scal_cpu(oldn*c, .1, net->layers[net->n - 2].weights, 1);
  143. scal_cpu(oldn, 0, net->layers[net->n - 2].biases, 1);
  144. net->layers[net->n - 2].n = 11921;
  145. net->layers[net->n - 2].biases += 5;
  146. net->layers[net->n - 2].weights += 5*c;
  147. if(weightfile){
  148. load_weights(net, weightfile);
  149. }
  150. net->layers[net->n - 2].biases -= 5;
  151. net->layers[net->n - 2].weights -= 5*c;
  152. net->layers[net->n - 2].n = oldn;
  153. printf("%d\n", oldn);
  154. layer l = net->layers[net->n - 2];
  155. copy_cpu(l.n/3, l.biases, 1, l.biases + l.n/3, 1);
  156. copy_cpu(l.n/3, l.biases, 1, l.biases + 2*l.n/3, 1);
  157. copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + l.n/3*l.c, 1);
  158. copy_cpu(l.n/3*l.c, l.weights, 1, l.weights + 2*l.n/3*l.c, 1);
  159. *net->seen = 0;
  160. save_weights(net, outfile);
  161. }
  162. void oneoff2(char *cfgfile, char *weightfile, char *outfile, int l)
  163. {
  164. gpu_index = -1;
  165. network *net = parse_network_cfg(cfgfile);
  166. if(weightfile){
  167. load_weights_upto(net, weightfile, 0, net->n);
  168. load_weights_upto(net, weightfile, l, net->n);
  169. }
  170. *net->seen = 0;
  171. save_weights_upto(net, outfile, net->n);
  172. }
  173. void partial(char *cfgfile, char *weightfile, char *outfile, int max)
  174. {
  175. gpu_index = -1;
  176. network *net = load_network(cfgfile, weightfile, 1);
  177. save_weights_upto(net, outfile, max);
  178. }
  179. void print_weights(char *cfgfile, char *weightfile, int n)
  180. {
  181. gpu_index = -1;
  182. network *net = load_network(cfgfile, weightfile, 1);
  183. layer l = net->layers[n];
  184. int i, j;
  185. //printf("[");
  186. for(i = 0; i < l.n; ++i){
  187. //printf("[");
  188. for(j = 0; j < l.size*l.size*l.c; ++j){
  189. //if(j > 0) printf(",");
  190. printf("%g ", l.weights[i*l.size*l.size*l.c + j]);
  191. }
  192. printf("\n");
  193. //printf("]%s\n", (i == l.n-1)?"":",");
  194. }
  195. //printf("]");
  196. }
  197. void rescale_net(char *cfgfile, char *weightfile, char *outfile)
  198. {
  199. gpu_index = -1;
  200. network *net = load_network(cfgfile, weightfile, 0);
  201. int i;
  202. for(i = 0; i < net->n; ++i){
  203. layer l = net->layers[i];
  204. if(l.type == CONVOLUTIONAL){
  205. rescale_weights(l, 2, -.5);
  206. break;
  207. }
  208. }
  209. save_weights(net, outfile);
  210. }
  211. void rgbgr_net(char *cfgfile, char *weightfile, char *outfile)
  212. {
  213. gpu_index = -1;
  214. network *net = load_network(cfgfile, weightfile, 0);
  215. int i;
  216. for(i = 0; i < net->n; ++i){
  217. layer l = net->layers[i];
  218. if(l.type == CONVOLUTIONAL){
  219. rgbgr_weights(l);
  220. break;
  221. }
  222. }
  223. save_weights(net, outfile);
  224. }
  225. void reset_normalize_net(char *cfgfile, char *weightfile, char *outfile)
  226. {
  227. gpu_index = -1;
  228. network *net = load_network(cfgfile, weightfile, 0);
  229. int i;
  230. for (i = 0; i < net->n; ++i) {
  231. layer l = net->layers[i];
  232. if (l.type == CONVOLUTIONAL && l.batch_normalize) {
  233. denormalize_convolutional_layer(l);
  234. }
  235. if (l.type == CONNECTED && l.batch_normalize) {
  236. denormalize_connected_layer(l);
  237. }
  238. if (l.type == GRU && l.batch_normalize) {
  239. denormalize_connected_layer(*l.input_z_layer);
  240. denormalize_connected_layer(*l.input_r_layer);
  241. denormalize_connected_layer(*l.input_h_layer);
  242. denormalize_connected_layer(*l.state_z_layer);
  243. denormalize_connected_layer(*l.state_r_layer);
  244. denormalize_connected_layer(*l.state_h_layer);
  245. }
  246. }
  247. save_weights(net, outfile);
  248. }
  249. layer normalize_layer(layer l, int n)
  250. {
  251. int j;
  252. l.batch_normalize=1;
  253. l.scales = calloc(n, sizeof(float));
  254. for(j = 0; j < n; ++j){
  255. l.scales[j] = 1;
  256. }
  257. l.rolling_mean = calloc(n, sizeof(float));
  258. l.rolling_variance = calloc(n, sizeof(float));
  259. return l;
  260. }
  261. void normalize_net(char *cfgfile, char *weightfile, char *outfile)
  262. {
  263. gpu_index = -1;
  264. network *net = load_network(cfgfile, weightfile, 0);
  265. int i;
  266. for(i = 0; i < net->n; ++i){
  267. layer l = net->layers[i];
  268. if(l.type == CONVOLUTIONAL && !l.batch_normalize){
  269. net->layers[i] = normalize_layer(l, l.n);
  270. }
  271. if (l.type == CONNECTED && !l.batch_normalize) {
  272. net->layers[i] = normalize_layer(l, l.outputs);
  273. }
  274. if (l.type == GRU && l.batch_normalize) {
  275. *l.input_z_layer = normalize_layer(*l.input_z_layer, l.input_z_layer->outputs);
  276. *l.input_r_layer = normalize_layer(*l.input_r_layer, l.input_r_layer->outputs);
  277. *l.input_h_layer = normalize_layer(*l.input_h_layer, l.input_h_layer->outputs);
  278. *l.state_z_layer = normalize_layer(*l.state_z_layer, l.state_z_layer->outputs);
  279. *l.state_r_layer = normalize_layer(*l.state_r_layer, l.state_r_layer->outputs);
  280. *l.state_h_layer = normalize_layer(*l.state_h_layer, l.state_h_layer->outputs);
  281. net->layers[i].batch_normalize=1;
  282. }
  283. }
  284. save_weights(net, outfile);
  285. }
  286. void statistics_net(char *cfgfile, char *weightfile)
  287. {
  288. gpu_index = -1;
  289. network *net = load_network(cfgfile, weightfile, 0);
  290. int i;
  291. for (i = 0; i < net->n; ++i) {
  292. layer l = net->layers[i];
  293. if (l.type == CONNECTED && l.batch_normalize) {
  294. printf("Connected Layer %d\n", i);
  295. statistics_connected_layer(l);
  296. }
  297. if (l.type == GRU && l.batch_normalize) {
  298. printf("GRU Layer %d\n", i);
  299. printf("Input Z\n");
  300. statistics_connected_layer(*l.input_z_layer);
  301. printf("Input R\n");
  302. statistics_connected_layer(*l.input_r_layer);
  303. printf("Input H\n");
  304. statistics_connected_layer(*l.input_h_layer);
  305. printf("State Z\n");
  306. statistics_connected_layer(*l.state_z_layer);
  307. printf("State R\n");
  308. statistics_connected_layer(*l.state_r_layer);
  309. printf("State H\n");
  310. statistics_connected_layer(*l.state_h_layer);
  311. }
  312. printf("\n");
  313. }
  314. }
  315. void denormalize_net(char *cfgfile, char *weightfile, char *outfile)
  316. {
  317. gpu_index = -1;
  318. network *net = load_network(cfgfile, weightfile, 0);
  319. int i;
  320. for (i = 0; i < net->n; ++i) {
  321. layer l = net->layers[i];
  322. if ((l.type == DECONVOLUTIONAL || l.type == CONVOLUTIONAL) && l.batch_normalize) {
  323. denormalize_convolutional_layer(l);
  324. net->layers[i].batch_normalize=0;
  325. }
  326. if (l.type == CONNECTED && l.batch_normalize) {
  327. denormalize_connected_layer(l);
  328. net->layers[i].batch_normalize=0;
  329. }
  330. if (l.type == GRU && l.batch_normalize) {
  331. denormalize_connected_layer(*l.input_z_layer);
  332. denormalize_connected_layer(*l.input_r_layer);
  333. denormalize_connected_layer(*l.input_h_layer);
  334. denormalize_connected_layer(*l.state_z_layer);
  335. denormalize_connected_layer(*l.state_r_layer);
  336. denormalize_connected_layer(*l.state_h_layer);
  337. l.input_z_layer->batch_normalize = 0;
  338. l.input_r_layer->batch_normalize = 0;
  339. l.input_h_layer->batch_normalize = 0;
  340. l.state_z_layer->batch_normalize = 0;
  341. l.state_r_layer->batch_normalize = 0;
  342. l.state_h_layer->batch_normalize = 0;
  343. net->layers[i].batch_normalize=0;
  344. }
  345. }
  346. save_weights(net, outfile);
  347. }
  348. void mkimg(char *cfgfile, char *weightfile, int h, int w, int num, char *prefix)
  349. {
  350. network *net = load_network(cfgfile, weightfile, 0);
  351. image *ims = get_weights(net->layers[0]);
  352. int n = net->layers[0].n;
  353. int z;
  354. for(z = 0; z < num; ++z){
  355. image im = make_image(h, w, 3);
  356. fill_image(im, .5);
  357. int i;
  358. for(i = 0; i < 100; ++i){
  359. image r = copy_image(ims[rand()%n]);
  360. rotate_image_cw(r, rand()%4);
  361. random_distort_image(r, 1, 1.5, 1.5);
  362. int dx = rand()%(w-r.w);
  363. int dy = rand()%(h-r.h);
  364. ghost_image(r, im, dx, dy);
  365. free_image(r);
  366. }
  367. char buff[256];
  368. sprintf(buff, "%s/gen_%d", prefix, z);
  369. save_image(im, buff);
  370. free_image(im);
  371. }
  372. }
  373. void visualize(char *cfgfile, char *weightfile)
  374. {
  375. network *net = load_network(cfgfile, weightfile, 0);
  376. visualize_network(net);
  377. }
  378. int main(int argc, char **argv)
  379. {
  380. //test_resize("data/bad.jpg");
  381. //test_box();
  382. //test_convolutional_layer();
  383. if(argc < 2){
  384. fprintf(stderr, "usage: %s <function>\n", argv[0]);
  385. return 0;
  386. }
  387. gpu_index = find_int_arg(argc, argv, "-i", 0);
  388. if(find_arg(argc, argv, "-nogpu")) {
  389. gpu_index = -1;
  390. }
  391. #ifndef GPU
  392. gpu_index = -1;
  393. #else
  394. if(gpu_index >= 0){
  395. cuda_set_device(gpu_index);
  396. }
  397. #endif
  398. if (0 == strcmp(argv[1], "average")){
  399. average(argc, argv);
  400. } else if (0 == strcmp(argv[1], "yolo")){
  401. run_yolo(argc, argv);
  402. } else if (0 == strcmp(argv[1], "super")){
  403. run_super(argc, argv);
  404. } else if (0 == strcmp(argv[1], "lsd")){
  405. run_lsd(argc, argv);
  406. } else if (0 == strcmp(argv[1], "detector")){
  407. run_detector(argc, argv);
  408. } else if (0 == strcmp(argv[1], "detect")){
  409. float thresh = find_float_arg(argc, argv, "-thresh", .5);
  410. char *filename = (argc > 4) ? argv[4]: 0;
  411. char *outfile = find_char_arg(argc, argv, "-out", 0);
  412. int fullscreen = find_arg(argc, argv, "-fullscreen");
  413. test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);
  414. } else if (0 == strcmp(argv[1], "cifar")){
  415. run_cifar(argc, argv);
  416. } else if (0 == strcmp(argv[1], "go")){
  417. run_go(argc, argv);
  418. } else if (0 == strcmp(argv[1], "rnn")){
  419. run_char_rnn(argc, argv);
  420. } else if (0 == strcmp(argv[1], "coco")){
  421. run_coco(argc, argv);
  422. } else if (0 == strcmp(argv[1], "classify")){
  423. predict_classifier("cfg/imagenet1k.data", argv[2], argv[3], argv[4], 5);
  424. } else if (0 == strcmp(argv[1], "classifier")){
  425. run_classifier(argc, argv);
  426. } else if (0 == strcmp(argv[1], "regressor")){
  427. run_regressor(argc, argv);
  428. } else if (0 == strcmp(argv[1], "isegmenter")){
  429. run_isegmenter(argc, argv);
  430. } else if (0 == strcmp(argv[1], "segmenter")){
  431. run_segmenter(argc, argv);
  432. } else if (0 == strcmp(argv[1], "art")){
  433. run_art(argc, argv);
  434. } else if (0 == strcmp(argv[1], "tag")){
  435. run_tag(argc, argv);
  436. } else if (0 == strcmp(argv[1], "3d")){
  437. composite_3d(argv[2], argv[3], argv[4], (argc > 5) ? atof(argv[5]) : 0);
  438. } else if (0 == strcmp(argv[1], "test")){
  439. test_resize(argv[2]);
  440. } else if (0 == strcmp(argv[1], "nightmare")){
  441. run_nightmare(argc, argv);
  442. } else if (0 == strcmp(argv[1], "rgbgr")){
  443. rgbgr_net(argv[2], argv[3], argv[4]);
  444. } else if (0 == strcmp(argv[1], "reset")){
  445. reset_normalize_net(argv[2], argv[3], argv[4]);
  446. } else if (0 == strcmp(argv[1], "denormalize")){
  447. denormalize_net(argv[2], argv[3], argv[4]);
  448. } else if (0 == strcmp(argv[1], "statistics")){
  449. statistics_net(argv[2], argv[3]);
  450. } else if (0 == strcmp(argv[1], "normalize")){
  451. normalize_net(argv[2], argv[3], argv[4]);
  452. } else if (0 == strcmp(argv[1], "rescale")){
  453. rescale_net(argv[2], argv[3], argv[4]);
  454. } else if (0 == strcmp(argv[1], "ops")){
  455. operations(argv[2]);
  456. } else if (0 == strcmp(argv[1], "speed")){
  457. speed(argv[2], (argc > 3 && argv[3]) ? atoi(argv[3]) : 0);
  458. } else if (0 == strcmp(argv[1], "oneoff")){
  459. oneoff(argv[2], argv[3], argv[4]);
  460. } else if (0 == strcmp(argv[1], "oneoff2")){
  461. oneoff2(argv[2], argv[3], argv[4], atoi(argv[5]));
  462. } else if (0 == strcmp(argv[1], "print")){
  463. print_weights(argv[2], argv[3], atoi(argv[4]));
  464. } else if (0 == strcmp(argv[1], "partial")){
  465. partial(argv[2], argv[3], argv[4], atoi(argv[5]));
  466. } else if (0 == strcmp(argv[1], "average")){
  467. average(argc, argv);
  468. } else if (0 == strcmp(argv[1], "visualize")){
  469. visualize(argv[2], (argc > 3) ? argv[3] : 0);
  470. } else if (0 == strcmp(argv[1], "mkimg")){
  471. mkimg(argv[2], argv[3], atoi(argv[4]), atoi(argv[5]), atoi(argv[6]), argv[7]);
  472. } else if (0 == strcmp(argv[1], "imtest")){
  473. test_resize(argv[2]);
  474. } else {
  475. fprintf(stderr, "Not an option: %s\n", argv[1]);
  476. }
  477. return 0;
  478. }