#1. 概要
Yolo v3で複数枚の画像を識別しようとすると、毎回モデルの読み込みが入って面倒ですよね。
どうやら以下の人のリファクタリングされたソースコードを用いれば、Multiple inputも出来るみたいですが、
なるべく本家のソースコードをいじってやりたいなーと。
#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のところを全てコメントアウトしておけばおk。
コメントアウトしなければ毎回、識別結果の画像が開いてしまう。
後はsave_image(im, "predictions");
こいつをwhile毎にRenameしてやれば、識別した画像のデータが全て保存される。