Yolo v3 Multiple-inputに対応させる(複数枚画像)

#1. 概要
Yolo v3で複数枚の画像を識別しようとすると、毎回モデルの読み込みが入って面倒ですよね。

どうやら以下の人のリファクタリングされたソースコードを用いれば、Multiple inputも出来るみたいですが、
なるべく本家のソースコードをいじってやりたいなーと。

https://github.com/AlexeyAB/darknet


#2. 理想

こんな感じに入力したらtest.txt内の画像が全て識別されればうれしいなと。

```
./darknet detector test ./cfg/datasets.data ./cfg/testing.cfg ./cfg/backup/classifier_100.weights  < ./cfg/test.txt
```

なおtest.txtの中身は以下のような感じ

```
/home/user/pic/a.png
/home/user/pic/b.png
/home/user/pic/c.png
...
```

#3. ソースコードの変更
OpenCVのフラグを立ててMakeをしておく必要がある。`darknet`フォルダ直下にて作業を行う。

`$ vi examples/detector.c`

```
563 void test_detector(char *datacfg, char *cfgfile, char *weightfile, char *filename, float thresh, float hier_thresh, char *outfile, int fullscreen)
564 {
565     list *options = read_data_cfg(datacfg);
566     char *name_list = option_find_str(options, "names", "data/names.list");
567     char **names = get_labels(name_list);
568
569     image **alphabet = load_alphabet();
570     network *net = load_network(cfgfile, weightfile, 0);
571     set_batch_network(net, 1);
572     srand(2222222);
573     double time;
574     char buff[256];
575     char *input = buff;
576     float nms=.45;
577     while(1){
578         if(filename){
579             strncpy(input, filename, 256);
580         } else {
581             printf("Enter Image Path: ");
582             fflush(stdout);
583             input = fgets(input, 256, stdin);
584             if(!input) return;
585             strtok(input, "\n");
586         }
587         image im = load_image_color(input,0,0);
588         image sized = letterbox_image(im, net->w, net->h);
589         //image sized = resize_image(im, net->w, net->h);
590         //image sized2 = resize_max(im, net->w);
591         //image sized = crop_image(sized2, -((net->w - sized2.w)/2), -((net->h - sized2.h)/2), net->w, net->h);
592         //resize_network(net, sized.w, sized.h);
593         layer l = net->layers[net->n-1];
594
595
596         float *X = sized.data;
597         time=what_time_is_it_now();
598         network_predict(net, X);
599         printf("%s: Predicted in %f seconds.\n", input, what_time_is_it_now()-time);
600         int nboxes = 0;
601         detection *dets = get_network_boxes(net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes);
602         //printf("%d\n", nboxes);
603         //if (nms) do_nms_obj(boxes, probs, l.w*l.h*l.n, l.classes, nms);
604         if (nms) do_nms_sort(dets, nboxes, l.classes, nms);
605         draw_detections(im, dets, nboxes, thresh, names, alphabet, l.classes);
606         free_detections(dets, nboxes);
607         if(outfile){
608             save_image(im, outfile);
609         }
610         else{
611             save_image(im, "predictions");
612 #ifdef OPENCV
613             /*cvNamedWindow("predictions", CV_WINDOW_NORMAL);
614             if(fullscreen){
615                 cvSetWindowProperty("predictions", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
616             }
617             show_image(im, "predictions");
618             cvWaitKey(0);
619             cvDestroyAllWindows();*/
620 #endif
621         }
622
623         free_image(im);
624         free_image(sized);
625         if (filename) break;
626     }
627 }
```

取り合えず、opencvのところを全てコメントアウトしておけばおｋ。
コメントアウトしなければ毎回、識別結果の画像が開いてしまう。

後は`save_image(im, "predictions");`こいつをwhile毎にRenameしてやれば、識別した画像のデータが全て保存される。