# 【Darknet】複数枚のpredictionsをまとめて取得する

# 経緯

複数枚のテストをしたいとき、predictions.jpgが上書きされるため、一度にすべての検出画像を取得できません。

shell、bat などで自動化して、一枚ずつ〔実行・リネーム〕の工程を繰り返しても、毎回ネットワークを構築する時間がかかって遅くなってしまいます。

predictions.jpgに上書きされるのが問題なので、内部を書き換えてファイル名で保存するようにしました。


# 変更箇所

detector.c内のtest_detector()の中身を変更します。

1346行目(2020 / 02 / 02現在)のsave_image(im, "predictions")の下に以下のコードを追加します。

/* please change according to your environment. */
// export root path. (specified directory need to create before execute.)
char* rootPath = (char*)"prediction-results";
/* -------------------------------------------- */
// replace all backslash to slash. ('\\' -> '/')
char* target = input;
int i;
for (i = 0; target[i] != '/'; i++) {
    if (target[i] == '\\')
        target[i] = '/';
}
// get filename.
char* fname = strrchr(target, '/');
// calc length, allocate memory.
int len = strlen(fname);
char* buf = (char*)calloc(len, sizeof(char));
// delete extension of filename. (xx.jpg -> xx)
for (i = 1; i < len; i++) {
    if (fname[i] == '.')
        break;
    buf[i - 1] = fname[i];
}
// calc length of exportPath.
len = strlen(buf) + strlen(rootPath) + 1;
char* exportPath = (char*)calloc(len, sizeof(char));
sprintf(exportPath, "%s/%s", rootPath, buf);    // format
// whether predictions image can save.
save_image(im, exportPath);
printf("\nSave to %s.jpg\n\n", exportPath);

画像の保存先のディレクトリを変更したい場合は、ディレクトリ名を変更します。

char* rootPath = (char*)"prediction-results";

NOTE

指定したディレクトリは、あらかじめ作成しておく必要があります。

ディレクトリがない場合は、保存されません。


# リビルド

変更を適用するために、もう一度ビルドします。


# 実行

list.txtには、テスト画像のパスを列挙します。

darknet detector test <data> <cfg> <weights> < list.txt -dont_show
# OR
darknet detector test <data> <cfg> <weight> [img_path]

# まとめ

最近Pythonばっかり書いているのもあって、C言語でファイル名の区切りだとかを書くのは正直めんどくさかったです。

やっぱりDarknet書いてる人頭おかしい。


ソースコードはGistにも置いています。

https://gist.github.com/kazuya0202/1576a0cbfdc3b2a67798f8d2e3157f24 (opens new window)