inference demo
원본 : demo/image_demo.py
# Copyright (c) OpenMMLab. All rights reserved. import asyncio from argparse import ArgumentParser from mmdet.apis import (async_inference_detector, inference_detector, init_detector, show_result_pyplot) def parse_args(): parser = ArgumentParser() parser.add_argument('img', help='Image file') parser.add_argument('config', help='Config file') parser.add_argument('checkpoint', help='Checkpoint file') parser.add_argument('--out-file', default=None, help='Path to output file') parser.add_argument( '--device', default='cuda:0', help='Device used for inference') parser.add_argument( '--palette', default='coco', choices=['coco', 'voc', 'citys', 'random'], help='Color palette used for visualization') parser.add_argument( '--score-thr', type=float, default=0.3, help='bbox score threshold') parser.add_argument( '--async-test', action='store_true', help='whether to set async options for async inference.') args = parser.parse_args() return args def main(args): # build the model from a config file and a checkpoint file model = init_detector(args.config, args.checkpoint, device=args.device) # test a single image result = inference_detector(model, args.img) # show the results show_result_pyplot( model, args.img, result, palette=args.palette, score_thr=args.score_thr, out_file=args.out_file) async def async_main(args): # build the model from a config file and a checkpoint file model = init_detector(args.config, args.checkpoint, device=args.device) # test a single image tasks = asyncio.create_task(async_inference_detector(model, args.img)) result = await asyncio.gather(tasks) # show the results show_result_pyplot( model, args.img, result[0], palette=args.palette, score_thr=args.score_thr, out_file=args.out_file) if __name__ == '__main__': args = parse_args() if args.async_test: asyncio.run(async_main(args)) else: main(args)
수정한 demo_img.py 참고
import warnings from pathlib import Path import numpy as np import torch import mmcv from mmcv.ops import RoIPool from mmcv.parallel import collate, scatter from mmcv.runner import load_checkpoint from mmcv.runner import load_checkpoint from mmdet.core import get_classes from mmdet.datasets import replace_ImageToTensor from mmdet.datasets.pipelines import Compose from mmdet.models import build_detector from mmdet.apis import init_detector from mmdet.apis import inference_detector from mmdet.apis import show_result_pyplot import os INPUT_IMG = "./imgs/demo.jpg" OUTPUT_FILE = "./imgs/demo_out.jpg" CONFIG = [os.path.join('./param', filenm) for filenm in os.listdir('./param') if filenm.endswith('.py')][0] CHKPNT = [os.path.join('./param', filenm) for filenm in os.listdir('./param') if filenm.endswith('.pth')][0] # ROOT = "/home/oschung_skcc/my/git/mmdetection/" # CONFIG = os.path.join(ROOT, "sixxconfigs/faster_rcnn_r50_fpn_1x_coco_001.py") # CHECKPOINT = os.path.join(ROOT, "checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth") SCORE_THRESHOLD = 0.9 DEVICE = "cuda:6" PALETTE = "coco" # choices=['coco', 'voc', 'citys', 'random'] # def parse_args(): # parser = ArgumentParser() # parser.add_argument('img', help='Image file') # parser.add_argument('config', help='Config file') # parser.add_argument('checkpoint', help='Checkpoint file') # parser.add_argument('--out-file', default=None, help='Path to output file') # parser.add_argument('--device', default='cuda:0', help='Device used for inference') # parser.add_argument('--palette', default='coco', choices=['coco', 'voc', 'citys', 'random'], help='Color palette used for visualization') # parser.add_argument('--score-thr', type=float, default=0.3, help='bbox score threshold') # parser.add_argument('--async-test', action='store_true', help='whether to set async options for async inference.') # args = parser.parse_args() # return args if __name__ == '__main__': # build the MODEL from a config file & a checkpoint file model = init_detector(CONFIG, CHKPNT, device=DEVICE) # test a single image result = inference_detector(model, INPUT_IMG) # show the results show_result_pyplot(model, INPUT_IMG, result, palette = PALETTE, score_thr = SCORE_THRESHOLD, ) # model.show_result(INPUT_IMG, result, # score_thr=SCORE_THRESHOLD, # show=True, # #wait_time=wait_time, # #win_name=title, # bbox_color=PALETTE, # text_color=(200, 200, 100), # mask_color=PALETTE, # out_file=OUTPUT_FILE) import json # !w g e t http://images.cocodataset.org/annotations/annotations_trainval2017.zip # !unzip annotations_trainval2017.zip with open('./annotations/instances_train2017.json', 'r') as f: data = json.load(f) categories = data['categories'] category_list = [] for category in categories: category_list.append({'name': category['name'], 'id': category['id']}) # print(category_list) classes = category_list # classes = [ # { "id": 1, "name": "person" }, # { "id": 2, "name": "bicycle" }, # { "id": 3, "name": "car" }, # ... # { "id":88, "name": "teddy_bear" }, # { "id":89, "name": "hair_drier" }, # { "id":90, "name": "toothbrush" } # ] encoded_results = [] idx = 0 for dets in result: if len(dets) == 0: idx = idx + 1 continue for det in dets: if det[4] < SCORE_THRESHOLD: continue x_bbox = float(det[0]) y_bbox = float(det[1]) width = float(det[2]) height = float(det[3]) score = float(det[4]) encoded_results.append({ 'confidence': score, 'label': classes[idx]['name'], 'points': [x_bbox, y_bbox, width, height], 'type': 'rectangle' }) idx = idx + 1 # if idx == 1: # break #----------------------------------------------------------------- img = mmcv.imread(INPUT_IMG) if isinstance(result, tuple): bbox_result, segm_result = result if isinstance(segm_result, tuple): segm_result = segm_result[0] # discard the `dim` else: bbox_result, segm_result = result, None img = img.copy() bboxes = np.vstack(bbox_result) labels = [ np.full(bbox.shape[0], i, dtype=np.int32) for i, bbox in enumerate(bbox_result) ] labels = np.concatenate(labels) scores = bboxes[:, -1] inds = scores > SCORE_THRESHOLD bboxes = bboxes[inds, :] # points labels = labels[inds] # label scores = scores[inds] # confidence encoded_results = [] if bboxes.shape[0] > 0: for i in range(bboxes.shape[0]): encoded_results.append({ 'confidence': scores[i], 'label': classes[labels[i]]['name'], 'points': bboxes[i].tolist(), 'type': 'rectangle' }) print(encoded_results) # if show_mask and segm_result is not None: # segms = mmcv.concat_list(segm_result) # segms = [segms[i] for i in np.where(inds)[0]] # #colors = [next(palette) for _ in range(len(segms))]
model.show_result in show_result_pyplot
source code for model.show_result()
in MMDetection
def show_result(img, result, palette=None, score_thr=0.3, show=True, out_file=None, thickness=1, font_scale=0.5, win_name='', show_mask=True): """Visualize the detection results on the image. Args: img (str or ndarray): The image to be displayed. result (tuple[list] or list): The detection result, can be either a tuple containing bbox and segm results or a list of bbox result. palette (list[list[int]]]: The color palette of masks. score_thr (float): The threshold to visualize the bboxes and masks. show (bool): Whether to show the image, default True. out_file (str or None): The filename to write the image. thickness (int): Thickness of lines. font_scale (float): Font scales of texts. win_name (str): The window name. show_mask (bool): Whether to display masks. Returns: ndarray: The image with bboxes and masks drawn on it. """ img = mmcv.imread(img) if isinstance(result, tuple): bbox_result, segm_result = result if isinstance(segm_result, tuple): segm_result = segm_result[0] # discard the `dim` else: bbox_result, segm_result = result, None img = img.copy() bboxes = np.vstack(bbox_result) labels = [ np.full(bbox.shape[0], i, dtype=np.int32) for i, bbox in enumerate(bbox_result) ] labels = np.concatenate(labels) scores = bboxes[:, -1] inds = scores > score_thr bboxes = bboxes[inds, :] labels = labels[inds] scores = scores[inds] if show_mask and segm_result is not None: segms = mmcv.concat_list(segm_result) segms = [segms[i] for i in np.where(inds)[0]] if palette is None: palette = color_val_iter() colors = [next(palette) for _ in range(len(segms))] if bboxes.shape[0] > 0: if hasattr(palette, '__iter__'): color = next(palette) else: color = palette img = imshow_det_bboxes( img, bboxes, labels, scores, color=color, thickness=thickness, font_scale=font_scale, show=False) if show_mask and segm_result is not None: img = imshow_det_masks( img, segms, colors, alpha=0.5, show=False) if show: imshow(img, win_name, out_file=out_file) return img
main.py ver1.0
# Copyright Bong-Kyo Seo. All rights reserved. from mmdet.apis import (inference_detector, init_detector) import json import base64 from PIL import Image import io import numpy as np config = './fifa.py' checkpoint = './fifa.pth' classes = [ { "id": 0, "name": "player" } ] def init_context(context): context.logger.info("Init context... 0%") model = init_detector(config, checkpoint, device='cpu') context.user_data.model = model context.logger.info("Init context... 100%") def handler(context, event): context.logger.info("Run yolox model") data = event.body buf = io.BytesIO(base64.b64decode(data["image"])) threshold = float(data.get("threshold", 0.9)) context.user_data.model.conf = threshold image = Image.open(buf) imgArray = np.array(image) result = inference_detector(context.user_data.model, imgArray) encoded_results = [] idx = 0 for dets in result: if len(dets) == 0: idx = idx + 1 continue for det in dets: if det[4] < 0.05: continue encoded_results.append({ 'confidence': float(det[4]), 'label': classes[idx]['name'], 'points': [float(det[0]), float(det[1]), float(det[2]), float(det[3])], 'type': 'rectangle' }) idx = idx + 1 if idx == 1: break return context.Response( body=json.dumps(encoded_results), headers={}, content_type='application/json', status_code=200 )
main.py ver.2.0
# Copyright onesixx. All rights reserved. import os CONFIG = [os.path.join('./param', filenm) for filenm in os.listdir('./param') if filenm.endswith('.py')][0] CHKPNT = [os.path.join('./param', filenm) for filenm in os.listdir('./param') if filenm.endswith('.pth')][0] SCORE_THRESHOLD = 0.9 DEVICE = "cpu" #"cuda:6" PALETTE = "coco" import json with open('./annotations/instances_train2017.json', 'r') as f: data = json.load(f) categories = data['categories'] category_list = [] for category in categories: category_list.append({'id':category['id'], 'name':category['name']}) classes = category_list # classes = [ # { "id": 1, "name": "person" }, # { "id": 2, "name": "bicycle" }, # ... # { "id":90, "name": "toothbrush" } # ] import mmcv from mmdet.apis import init_detector from mmdet.apis import inference_detector import io import base64 from PIL import Image import numpy as np def init_context(context): context.logger.info("Init context... 0%") # -------------------------------- model = init_detector(CONFIG, CHECKPOINT, device=DEVICE) context.user_data.model = model context.logger.info("Init context... 100%") # ------------------------------ def handler(context, event): context.logger.info("Run sixx model") data = event.body buf = io.BytesIO(base64.b64decode(data["image"])) # threshold = float(data.get("threshold", SCORE_THRESHOLD)) # context.user_data.model.conf = threshold image = Image.open(buf) imgArray = np.array(image) result = inference_detector(context.user_data.model, imgArray) if isinstance(result, tuple): bbox_result, segm_result = result if isinstance(segm_result, tuple): segm_result = segm_result[0] # discard the `dim` else: bbox_result, segm_result = result, None img = image.copy() bboxes = np.vstack(bbox_result) labels = [ np.full(bbox.shape[0], i, dtype=np.int32) for i, bbox in enumerate(bbox_result) ] labels = np.concatenate(labels) scores = bboxes[:, -1] inds = scores > SCORE_THRESHOLD scores = scores[inds] # confidence labels = labels[inds] # label bboxes = bboxes[inds, :] # points if show_mask and segm_result is not None: segms = mmcv.concat_list(segm_result) segms = [segms[i] for i in np.where(inds)[0]] if palette is None: palette = color_val_iter() colors = [next(palette) for _ in range(len(segms))] encoded_results = [] if bboxes.shape[0] > 0: for i in range(bboxes.shape[0]): encoded_results.append({ 'confidence': scores[i], 'label': classes[labels[i]]['name'], 'points': bboxes[i].tolist(), 'type': 'rectangle' }) return context.Response( body=json.dumps(encoded_results), headers={}, content_type='application/json', status_code=200 )