Scaled-YOLOv4のpredictions.jpgに出力されるconfidenceを消す

Scaled-YOLOv4を使っていた時、検出される物体が多いとラベルに埋もれて画像が見えなくなってしまったため、画像に描画されるconfidenceの値を消したくなった。

GitHub - AlexeyAB/darknet: YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet )
YOLOv4 / Scaled-YOLOv4 / YOLO - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/...

C言語のソースコードを追いかけていき、当該箇所を特定してコメントアウト、再ビルドすれば良いだろうと予想。

出力されるログから取っ掛かりを見つける。

Done! Loaded 305 layers from weights-file
 Detection layer: 292 - type = 28
 Detection layer: 296 - type = 28
 Detection layer: 300 - type = 28
 Detection layer: 304 - type = 28
image.jpg: Predicted in 11622.129000 milli-seconds.
dog: 70%
cat: 86%

milli-secondsという単語を手がかりにソースコード全体から文字検索を行う。

detector.cがヒット。

https://github.com/AlexeyAB/darknet/blob/master/src/detector.c#L1704

前後を眺めてみる。

        //time= what_time_is_it_now();
        double time = get_time_point();
        network_predict(net, X);
        //network_predict_image(&net, im); letterbox = 1;
        printf("%s: Predicted in %lf milli-seconds.\n", input, ((double)get_time_point() - time) / 1000);
        //printf("%s: Predicted in %f seconds.\n", input, (what_time_is_it_now()-time));

        int nboxes = 0;
        detection *dets = get_network_boxes(&net, im.w, im.h, thresh, hier_thresh, 0, 1, &nboxes, letter_box);
        if (nms) {
            if (l.nms_kind == DEFAULT_NMS) do_nms_sort(dets, nboxes, l.classes, nms);
            else diounms_sort(dets, nboxes, l.classes, nms, l.nms_kind, l.beta_nms);
        }
        draw_detections_v3(im, dets, nboxes, thresh, names, alphabet, l.classes, ext_output);
        save_image(im, "predictions");
        if (!dont_show) {
            show_image(im, "predictions");
        }

save_image(im, “predictions”)でjpgが出力されると予想。

その手前にdraw_detections_v3というそのまんまな関数を発見。

検索するとimage.cに定義があった。

https://github.com/AlexeyAB/darknet/blob/master/src/image.c#L329

confidenceは小数点2桁で出力されているので、関数のどこかに%.2fがあるだろうと予想して検索。

https://github.com/AlexeyAB/darknet/blob/master/src/image.c#L438

前後を眺めてみる。

            if (alphabet) {
                char labelstr[4096] = { 0 };
                strcat(labelstr, names[selected_detections[i].best_class]);
                char prob_str[10];
                sprintf(prob_str, ": %.2f", selected_detections[i].det.prob[selected_detections[i].best_class]);
                strcat(labelstr, prob_str);
                int j;
                for (j = 0; j < classes; ++j) {
                    if (selected_detections[i].det.prob[j] > thresh && j != selected_detections[i].best_class) {
                        strcat(labelstr, ", ");
                        strcat(labelstr, names[j]);
                    }
                }
                image label = get_label_v3(alphabet, labelstr, (im.h*.02));
                //draw_label(im, top + width, left, label, rgb);
                draw_weighted_label(im, top + width, left, label, rgb, 0.7);
                free_image(label);
            }

%.2fがsprintfされている行の変数、prob_strが怪しい。多分probability stringの略?

直後のstrcatをコメントアウトし、prob_strがlabelstrに結合されないようにする。

// strcat(labelstr, prob_str);

これでOK。

ルートディレクトリまで戻って再ビルド。

make clean
make

これでpredictions.jpgにconfidenceが出力されなくなり、四角形とラベルだけが写る見やすい画像を得ることができた。

コメント

タイトルとURLをコピーしました