質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.13%

YOLOv3 コンフィデンスレベル取得方法

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 586

Pinkun

score 13

YOLOv3ホームページに公開されているdetect.pyというファイルにおいて検出された物体のコンフィデンスの値を取得したいと考えています。
ソースコード中のpredictionにそれらの情報が格納されていると考え抽出しようと考えているのですが、中身の値の認識に困っています。検出された物体のコンフィデンスを正確に出力するためにはどのようにしたら良いか教えていただけると幸いです。
ソースコードはdetect.pyの一部抜粋となります。

def arg_parse():

    parser = argparse.ArgumentParser(description='YOLO v3 Detection Module')

    parser.add_argument("--images", dest = 'images', help =
                        "Image / Directory containing images to perform detection upon",
                        default = "imgs", type = str)
    parser.add_argument("--det", dest = 'det', help =
                        "Image / Directory to store detections to",
                        default = "det", type = str)
    parser.add_argument("--bs", dest = "bs", help = "Batch size", default = 1)
    parser.add_argument("--confidence", dest = "confidence", help = "Object Confidence to filter predictions", default = 0.5)
    parser.add_argument("--nms_thresh", dest = "nms_thresh", help = "NMS Threshhold", default = 0.4)
    parser.add_argument("--cfg", dest = 'cfgfile', help =
                        "Config file",
                        default = "cfg/yolov3.cfg", type = str)
    parser.add_argument("--weights", dest = 'weightsfile', help =
                        "weightsfile",
                        default = "yolov3.weights", type = str)
    parser.add_argument("--reso", dest = 'reso', help =
                        "Input resolution of the network. Increase to increase accuracy. Decrease to increase speed",
                        default = "416", type = str)
    parser.add_argument("--scales", dest = "scales", help = "Scales to use for detection",
                        default = "1,2,3", type = str)

    return parser.parse_args()

if __name__ ==  '__main__':
    args = arg_parse()
    scales = args.scales
    images = args.images
    batch_size = int(args.bs)
    confidence = float(args.confidence)
    nms_thesh = float(args.nms_thresh)
    start = 0

    CUDA = torch.cuda.is_available()

    num_classes = 80
    classes = load_classes('data/coco.names')

    model = Darknet(args.cfgfile)
    model.load_weights(args.weightsfile)

    model.net_info["height"] = args.reso
    inp_dim = int(model.net_info["height"])
    assert inp_dim % 32 == 0
    assert inp_dim > 32

    #If there's a GPU availible, put the model on GPU
    if CUDA:
        model.cuda()

    model.eval()

    read_dir = time.time()
    #Detection phase
    try:
        imlist = [osp.join(osp.realpath('.'), images, img) for img in os.listdir(images) if os.path.splitext(img)[1] == '.png' or os.path.splitext(img)[1] =='.jpeg' or os.path.splitext(img)[1] =='.jpg']
    except NotADirectoryError:
        imlist = []
        imlist.append(osp.join(osp.realpath('.'), images))
    except FileNotFoundError:
        print ("No file or directory with the name {}".format(images))
        exit()

    if not os.path.exists(args.det):
        os.makedirs(args.det)

    load_batch = time.time()

    batches = list(map(prep_image, imlist, [inp_dim for x in range(len(imlist))]))
    im_batches = [x[0] for x in batches]
    orig_ims = [x[1] for x in batches]
    im_dim_list = [x[2] for x in batches]
    im_dim_list = torch.FloatTensor(im_dim_list).repeat(1,2)

    if CUDA:
        im_dim_list = im_dim_list.cuda()

    leftover = 0

    if (len(im_dim_list) % batch_size):
        leftover = 1

    if batch_size != 1:
        num_batches = len(imlist) // batch_size + leftover
        im_batches = [torch.cat((im_batches[i*batch_size : min((i +  1)*batch_size,
                            len(im_batches))]))  for i in range(num_batches)]

    i = 0

    write = False
    model(get_test_input(inp_dim, CUDA), CUDA)

    start_det_loop = time.time()

    objs = {}

    for batch in im_batches:
        #load the image
        start = time.time()
        if CUDA:
            batch = batch.cuda()

        with torch.no_grad():
            prediction = model(Variable(batch), CUDA)
# prediction here
            print ("prediction", prediction)

        prediction = write_results(prediction, confidence, num_classes, nms = True, nms_conf = nms_thesh)
# prediction here
        print ("prediction2", prediction)

        if type(prediction) == int:
            i += 1
            continue

        end = time.time()

        prediction[:,0] += i*batch_size

        if not write:
            output = prediction
            write = 1
        else:
            output = torch.cat((output,prediction))

これらのpredictionの出力は以下のようになっています。

prediction tensor([[[1.5383e+01, 1.2399e+01, 9.3864e+01,  ..., 7.5703e-04,
9.0208e-04, 5.9246e-04],
[1.8194e+01, 1.4778e+01, 1.0411e+02,  ..., 2.1265e-04,
1.1475e-03, 1.6560e-03],
[2.1265e+01, 1.2748e+01, 3.8478e+02,  ..., 3.6203e-03,
7.6282e-03, 6.8394e-03],
...,
[4.1259e+02, 4.1129e+02, 3.3664e+00,  ..., 2.8758e-05,
3.9763e-05, 2.3203e-05],
[4.1155e+02, 4.0989e+02, 7.5316e+00,  ..., 1.7735e-04,
2.2018e-04, 2.0052e-04],
[4.1110e+02, 4.1259e+02, 5.2966e+01,  ..., 9.5141e-05,
1.5668e-04, 2.1929e-04]]])

prediction2 tensor([[  0.0000,  89.3013, 110.7477, 303.7198, 294.3178,   0.9951,   0.9997,
1.0000],
[  0.0000, 256.5005,  98.3645, 373.2559, 144.1284,   0.9953,   0.9431,
7.0000],
[  0.0000,  69.5096, 173.2218, 170.4211, 343.0221,   0.9997,   0.9882,
16.0000]])

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

Pythonコードに見えますので本家ではなく別の方のコードを使ってますでしょうか
本家はcで書かれてます

書かれたprediction tensorで言うと最後の次元の5番目がコンフィデンスだと思います
なので下記を打てばひとまず全Bboxのコンフィデンスは出ます。
print(pred[:,:,4].shape,pred[:,:,4])
そのうちのMaxが知りたい場合は下記を打てば出ます
print(pred[:,:,4].max())

検出した物体のコンフィデンスかどうかはこの関数前後のコードを追った方がよろしいかもしれません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.13%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る