Mmdetection: problem about the test script

Created on 11 Jan 2019  路  10Comments  路  Source: open-mmlab/mmdetection

I can not use your test script with my own image.
the problem is:
labels_shape (2, 80) result_shape (2, 80) bboxes.shape[0] 2 labels.shape[0] 160 Traceback (most recent call last): File "tools/test_images.py", line 17, in <module> show_result(img, result,filepath='/mnt/lustre/fangkairen/mmdetection') File "/mnt/lustre/fangkairen/.local/lib/python3.6/site-packages/mmdet-0.5.4+f509f8e-py3.6.egg/mmdet/apis/inference.py", line 69, in show_result out_file=filepath) File "/mnt/lustre/fangkairen/.local/lib/python3.6/site-packages/mmcv/visualization/image.py", line 102, in imshow_det_bboxes assert bboxes.shape[0] == labels.shape[0]
and the scipt I used is:

import mmcv
from mmcv.runner import load_checkpoint
from mmdet.models import build_detector
from mmdet.apis import inference_detector, show_result
import cv2 
import numpy as np
cfg = mmcv.Config.fromfile('configs/mask_rcnn_r50_fpn_1x.py')
cfg.model.pretrained = None

# construct the model and load checkpoint
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
_ = load_checkpoint(model, 'work_dirs/kellen/epoch_12.pth')

# test a single image
img = mmcv.imread('test_images/test.jpg')
result = inference_detector(model, img, cfg)
show_result(img, result,filepath='/mnt/lustre/fangkairen/mmdetection')

and my model is good because i use tool/test.py to test my model in test datasets

Most helpful comment

the script is usful for test mask-rcnn,the code was changed from another issue which I can not find now.Hope it can help other people...

#encoding:utf-8
import mmcv
from mmcv.runner import load_checkpoint

from mmdet.models import build_detector
from mmdet.apis import inference_detector, show_result
import numpy as np, pycocotools.mask as maskUtils, mmcv
from mmdet.core import tensor2imgs, get_classes
from glob import glob
import os
config_path = 'configs/mask_rcnn_r50_fpn_1x.py'
model_path = 'your .pth file '
img_list = glob('test_images/*.jpg')
img_save= 'result_images'
cfg = mmcv.Config.fromfile(config_path)
cfg.model.pretrained = None

img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)

def show_mask_result(img,
                    result,
                    dataset='coco',
                    score_thr=0.7,
                    with_mask=True):
        segm_result=None
        if with_mask:
            bbox_result, segm_result = result
        else:
            bbox_result=result
        if isinstance(dataset, str):#  add own data label to mmdet.core.class_name.py
            class_names = get_classes(dataset)
            # print(class_names)
        elif isinstance(dataset, list):
            class_names = dataset
        else:
            raise TypeError('dataset must be a valid dataset name or a list'
                            ' of class names, not {}'.format(type(dataset)))
        h, w, _ = img.shape
        img_show = img[:h, :w, :]
        labels = [
            np.full(bbox.shape[0], i, dtype=np.int32)
            for i, bbox in enumerate(bbox_result)
        ]
        labels = np.concatenate(labels)
        bboxes = np.vstack(bbox_result)
        if with_mask:
            segms = mmcv.concat_list(segm_result)
            inds = np.where(bboxes[:, -1] > score_thr)[0]
            for i in inds:
                color_mask = np.random.randint(0, 256, (1, 3), dtype=np.uint8)
                mask = maskUtils.decode(segms[i]).astype(np.bool)
                img_show[mask] = img_show[mask] * 0.5 + color_mask * 0.5
        result_img=mmcv.imshow_det_bboxes(
            img_show,
            bboxes,
            labels,
            class_names=class_names,
            score_thr=score_thr)
        return  result_img

# construct the model and load checkpoint
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
_ = load_checkpoint(model, model_path)
for img in img_list:
    img_name=os.path.basename(img)
    new_path=os.path.join(img_save,img_name)
    result=inference_detector(model, img, cfg, device='cuda:0')
    answer=show_mask_result(mmcv.imread(img), result,score_thr=0.6,with_mask=True)
    mmcv.imwrite(answer,new_path)

All 10 comments

You can check whether result is valid, and also see these two lines.

Thanks for your reply,I have check my problem and debug and I know that the test code is useful for faster-rcnn eg to detect the box but not for mask-rcnn.So can you provide a script for test single image with mask?I am working for that ,if I succeed ,I will contribut my code.

the script is usful for test mask-rcnn,the code was changed from another issue which I can not find now.Hope it can help other people...

#encoding:utf-8
import mmcv
from mmcv.runner import load_checkpoint

from mmdet.models import build_detector
from mmdet.apis import inference_detector, show_result
import numpy as np, pycocotools.mask as maskUtils, mmcv
from mmdet.core import tensor2imgs, get_classes
from glob import glob
import os
config_path = 'configs/mask_rcnn_r50_fpn_1x.py'
model_path = 'your .pth file '
img_list = glob('test_images/*.jpg')
img_save= 'result_images'
cfg = mmcv.Config.fromfile(config_path)
cfg.model.pretrained = None

img_norm_cfg = dict(
    mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)

def show_mask_result(img,
                    result,
                    dataset='coco',
                    score_thr=0.7,
                    with_mask=True):
        segm_result=None
        if with_mask:
            bbox_result, segm_result = result
        else:
            bbox_result=result
        if isinstance(dataset, str):#  add own data label to mmdet.core.class_name.py
            class_names = get_classes(dataset)
            # print(class_names)
        elif isinstance(dataset, list):
            class_names = dataset
        else:
            raise TypeError('dataset must be a valid dataset name or a list'
                            ' of class names, not {}'.format(type(dataset)))
        h, w, _ = img.shape
        img_show = img[:h, :w, :]
        labels = [
            np.full(bbox.shape[0], i, dtype=np.int32)
            for i, bbox in enumerate(bbox_result)
        ]
        labels = np.concatenate(labels)
        bboxes = np.vstack(bbox_result)
        if with_mask:
            segms = mmcv.concat_list(segm_result)
            inds = np.where(bboxes[:, -1] > score_thr)[0]
            for i in inds:
                color_mask = np.random.randint(0, 256, (1, 3), dtype=np.uint8)
                mask = maskUtils.decode(segms[i]).astype(np.bool)
                img_show[mask] = img_show[mask] * 0.5 + color_mask * 0.5
        result_img=mmcv.imshow_det_bboxes(
            img_show,
            bboxes,
            labels,
            class_names=class_names,
            score_thr=score_thr)
        return  result_img

# construct the model and load checkpoint
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
_ = load_checkpoint(model, model_path)
for img in img_list:
    img_name=os.path.basename(img)
    new_path=os.path.join(img_save,img_name)
    result=inference_detector(model, img, cfg, device='cuda:0')
    answer=show_mask_result(mmcv.imread(img), result,score_thr=0.6,with_mask=True)
    mmcv.imwrite(answer,new_path)

Just to remind that the above script needs some modifications when using the latest version of mmdetection and pytorch.

# -*- coding: utf-8 -*-
import os
import numpy as np
import mmcv
import torch
from mmcv.runner import load_checkpoint
from mmdet.models import build_detector
from mmdet.apis import inference_detector
from mmdet.core import get_classes
import pycocotools.mask as maskutils


def show_mask_result(img, result, save_img, dataset='coco', score_thr=0.7, with_mask=True):
    segm_result = None
    if with_mask:
        bbox_result, segm_result = result
    else:
        bbox_result = result
    if isinstance(dataset, str):  # add own data label to mmdet.core.class_name.py
        class_names = get_classes(dataset)
        # print(class_names)
    elif isinstance(dataset, list):
        class_names = dataset
    else:
        raise TypeError('dataset must be a valid dataset name or a list'
                        ' of class names, not {}'.format(type(dataset)))
    h, w, _ = img.shape
    img_show = img[:h, :w, :]
    labels = [
        np.full(bbox.shape[0], i, dtype=np.int32)
        for i, bbox in enumerate(bbox_result)
    ]
    labels = np.concatenate(labels)
    bboxes = np.vstack(bbox_result)
    if with_mask:
        segms = mmcv.concat_list(segm_result)
        inds = np.where(bboxes[:, -1] > score_thr)[0]
        for i in inds:
            color_mask = np.random.randint(0, 256, (1, 3), dtype=np.uint8)
            mask = maskutils.decode(segms[i]).astype(np.bool)
            img_show[mask] = img_show[mask] * 0.5 + color_mask * 0.5
    result_img = mmcv.imshow_det_bboxes(img_show, bboxes, labels, class_names=class_names,
                                        score_thr=score_thr, show=False, out_file=save_img)
    return result_img


config_path = config file path
model_path = model file path

cfg = mmcv.Config.fromfile(config_path)
cfg.model.pretrained = None
cfg.data.test.test_mode = True

# construct the model and load checkpoint
model = build_detector(cfg.model, test_cfg=cfg.test_cfg)
model.cfg = cfg
device = torch.device("cuda:0")
model = model.to(device)
model.eval()
_ = load_checkpoint(model, model_path)
mask_score_thresh = 0.6

img = []
img_folder = your image folder
for single_img in os.listdir(img_folder):
    img.append(os.path.join(img_folder, single_img))

img_result = inference_detector(model, img)
for single_img in img:
    img = mmcv.imread(single_img)
    result = next(img_result)
    answer = show_mask_result(img, result, os.path.basename(single_img),
                              score_thr=mask_score_thresh, with_mask=True)

The official demo has supported visualizing bbox/mask results for a long time...

@hellock Thanks for your reply. I did not notice the official demo..

Never mind. This repo is developed rapidly.

Yeah, hope to see more networks and papers in this repo.

@hellock how to provide filter class names to get a particular class instance in the output image similar to a mask rcnn?

I also have this question and I used rpn_r50_fpn_1x.py

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Youngkl0726 picture Youngkl0726  路  3Comments

yangcong955 picture yangcong955  路  3Comments

dereyly picture dereyly  路  3Comments

BeBeauty picture BeBeauty  路  3Comments

happog picture happog  路  3Comments