2017年6月9日金曜日

Darknetのサンプルのソースを覗いてみた。(I looked into the sample source of Darknet.)

YOLO v2の結果 特に意味はない

はじめに

特定の引数を与えて、examples 内の darknet を起動させることで、YOLOを実行させることができる。説明では、

 ./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg

を実行するよう記載されている。一方、中段では、detect の引数は、下記と同じ結果になると説明されている。

 ./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg

そこでサンプルプログラム内でどのような処理が行われているか、簡単に追ってみた。


第1引数がdetectの場合

内部では、下記の用な処理により、引数を追加し、関数test_detectorを呼び出している。
しきい値、結果の保存ファイル、フルスクリーンの指定がオプションである。

        float thresh = find_float_arg(argc, argv, "-thresh", .24);
        char *filename = (argc > 4) ? argv[4]: 0;
        char *outfile = find_char_arg(argc, argv, "-out", 0);
        int fullscreen = find_arg(argc, argv, "-fullscreen");
        test_detector("cfg/coco.data", argv[2], argv[3], filename, thresh, .5, outfile, fullscreen);

  cfg/coco.data は、固定の値

第1引数、第2引数がdetector testの場合

引数そのままで、関数
 run_detector(argc, argv);
 を呼び出している

それぞれの関数の実態は、
darknet-master/examples/detector.c
に定義されている。

関数の実態

test_detector()

関数内で再度パラメータを準備、ネットワークや重みを読み込み、最後に
network_predict(net, X);
で検出を行っている。

run_detector()

与えられたパラメータを解析し、最後に第2引数を調べ、test_detectorを呼び出している。

    if(0==strcmp(argv[2], "test")) test_detector(datacfg, cfg, weights, filename, thresh, hier_thresh, outfile, fullscreen);

YOLOの検出と分類機能に特化すれば、これらのソースから不要なコードを削除でき、すっきりさせることができそうである。

以上

0 件のコメント:

コメントを投稿