PointRend 인 스 턴 스 를 사용 하여 자신의 coco 데이터 세트 를 분할 훈련 합 니 다.
32997 단어 detectron2pytorchPointRend
1. Detectron 2 설치
Detectron 2 를 설치 하면 현재 인터넷 에서 도 큰 인 기 를 끌 고 있 습 니 다. 저도 제 가 이해 하 는 설치 와 테스트 블 로 그 를 썼 습 니 다. 관심 이 있 는 것 은 참고 하 셔 도 됩 니 다.설치 에 성 공 했 습 니 다. 바로 자신의 데이터 세트 를 준비 해 야 합 니 다.
2. 자신의 coco 데이터 세트 준비
① 저 는 labelme 로 자신의 그림 을 표시 하고 json 파일 로 변환 합 니 다. 이것 은 제 가 말 하 는 중점 이 아니 기 때문에 놓 습 니 다.
② json 파일 을 train 과 val 두 개의 폴 더 로 나 눈 다음 에 각각 train. json 과 val. json 으로 바 꾸 고 코드 를 바 꾸 면 아래 를 참고 하거나 github 에 가서 다운로드 할 수 있 습 니 다.
# -*- coding: utf-8 -*-
"""
Created on Fri May 15 14:27:14 2020
@author: Administrator
"""
import argparse
import json
import matplotlib.pyplot as plt
import skimage.io as io
import cv2
from labelme import utils
import numpy as np
import glob
import PIL.Image
class MyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, np.integer):
return int(obj)
elif isinstance(obj, np.floating):
return float(obj)
elif isinstance(obj, np.ndarray):
return obj.tolist()
else:
return super(MyEncoder, self).default(obj)
class labelme2coco(object):
def __init__(self, labelme_json=[], save_json_path='./tran.json'):
'''
:param labelme_json: labelme json
:param save_json_path: json
'''
self.labelme_json = labelme_json
self.save_json_path = save_json_path
self.images = []
self.categories = []
self.annotations = []
# self.data_coco = {}
self.label = []
self.annID = 1
self.height = 0
self.width = 0
self.save_json()
def data_transfer(self):
for num, json_file in enumerate(self.labelme_json):
with open(json_file, 'r') as fp:
data = json.load(fp) # json
self.images.append(self.image(data, num))
for shapes in data['shapes']:
label = shapes['label']
if label not in self.label:
self.categories.append(self.categorie(label))
self.label.append(label)
points = shapes['points']# point rectangle , ,
#points.append([points[0][0],points[1][1]])
#points.append([points[1][0],points[0][1]])
self.annotations.append(self.annotation(points, label, num))
self.annID += 1
def image(self, data, num):
image = {}
img = utils.img_b64_to_arr(data['imageData']) #
# img=io.imread(data['imagePath']) #
# img = cv2.imread(data['imagePath'], 0)
height, width = img.shape[:2]
img = None
image['height'] = height
image['width'] = width
image['id'] = num + 1
#image['file_name'] = data['imagePath'].split('/')[-1]
image['file_name'] = data['imagePath'] #github ,
self.height = height
self.width = width
return image
def categorie(self, label):
categorie = {}
categorie['supercategory'] = 'Cancer'
categorie['id'] = len(self.label) + 1 # 0
categorie['name'] = label
return categorie
def annotation(self, points, label, num):
annotation = {}
annotation['segmentation'] = [list(np.asarray(points).flatten())]
annotation['iscrowd'] = 0
annotation['image_id'] = num + 1
# annotation['bbox'] = str(self.getbbox(points)) # list json ( )
# list(map(int,a[1:-1].split(','))) a=annotation['bbox'] list
annotation['bbox'] = list(map(float, self.getbbox(points)))
annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3]
# annotation['category_id'] = self.getcatid(label)
annotation['category_id'] = self.getcatid(label)# , 1
annotation['id'] = self.annID
return annotation
def getcatid(self, label):
for categorie in self.categories:
if label == categorie['name']:
return categorie['id']
return 1
def getbbox(self, points):
# img = np.zeros([self.height,self.width],np.uint8)
# cv2.polylines(img, [np.asarray(points)], True, 1, lineType=cv2.LINE_AA) #
# cv2.fillPoly(img, [np.asarray(points)], 1) # 1
polygons = points
mask = self.polygons_to_mask([self.height, self.width], polygons)
return self.mask2box(mask)
def mask2box(self, mask):
''' mask
mask:[h,w] 0、1
1 , 1 ( , , )
'''
# np.where(mask==1)
index = np.argwhere(mask == 1)
rows = index[:, 0]
clos = index[:, 1]
#
left_top_r = np.min(rows) # y
left_top_c = np.min(clos) # x
#
right_bottom_r = np.max(rows)
right_bottom_c = np.max(clos)
# return [(left_top_r,left_top_c),(right_bottom_r,right_bottom_c)]
# return [(left_top_c, left_top_r), (right_bottom_c, right_bottom_r)]
# return [left_top_c, left_top_r, right_bottom_c, right_bottom_r] # [x1,y1,x2,y2]
return [left_top_c, left_top_r, right_bottom_c - left_top_c,
right_bottom_r - left_top_r] # [x1,y1,w,h] COCO bbox
def polygons_to_mask(self, img_shape, polygons):
mask = np.zeros(img_shape, dtype=np.uint8)
mask = PIL.Image.fromarray(mask)
xy = list(map(tuple, polygons))
PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)
mask = np.array(mask, dtype=bool)
return mask
def data2coco(self):
data_coco = {}
data_coco['images'] = self.images
data_coco['categories'] = self.categories
data_coco['annotations'] = self.annotations
return data_coco
def save_json(self):
self.data_transfer()
self.data_coco = self.data2coco()
# json
json.dump(self.data_coco, open(self.save_json_path, 'w'), indent=4, cls=MyEncoder) # indent=4
labelme_json = glob.glob(r'I:/timage/val/json/*.json')
# labelme_json=['./Annotations/*.json']
labelme2coco(labelme_json, 'I:/image//val/footdeep_val.json')
저 는 스스로 실 행 했 고 통 과 했 습 니 다. 전환 결 과 는 문제 가 없습니다. 여기 서 하 나 를 주의해 야 합 니 다. 제 가 다른 프로젝트 를 할 때 그림 의 이름 을 바 꾸 어서 제 이 슨 파일 의 imagepath 와 이미지 이름 이 일치 하지 않 습 니 다. 그리고 훈련 이 계속 잘못 되 었 습 니 다. 아, 이것 도 꼭 주의 하 세 요. 그리고 자신 에 게 깨 어 나 야 합 니 다.나중에 표 시 된 데 이 터 는 반드시 가장 원시 적 인 데이터 세트 를 저장 해 야 합 니 다. 그리고 주의해 야 합 니 다. labelme 로 그림 을 표시 하고 배경 은 표시 되 지 않 았 기 때문에 상기 코드 에서 반드시 annotation ['category id'] = self. getcatid (label) 가 수정 되 었 습 니 다. annotation ['category id'] = self. getcatid (label) - 1, 이렇게 뛰 어 나 온 제 이 슨 파일 에 category_id 는 0 부터 배경 이 테스트 할 때 잘못 표시 되 지 않도록 합 니 다. 이것 은 구덩이 입 니 다.
마지막 데이터 구 조 는 다음 과 같다.
footdata
--foot
train.json
val.json
train
png
val
png
내 데이터 세트 는 하나의 분류 이기 때문에 어쨌든 간단 하 다
3. API 사용 훈련
기본적으로 Detectron 2 와 훈련 차이 가 많 지 않 습 니 다. 여기에 코드 를 붙 입 니 다. 저 는 train 로 정의 합 니 다.foot.py:
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 2 16:26:02 2020
@author: CTZN
"""
import os
import torch
import detectron2.utils.comm as comm
from detectron2.checkpoint import DetectionCheckpointer
from detectron2.config import get_cfg
from detectron2.data import MetadataCatalog
from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, launch
from detectron2.evaluation import (
CityscapesEvaluator,
COCOEvaluator,
DatasetEvaluators,
LVISEvaluator,
verify_results,
)
from point_rend import add_pointrend_config
from detectron2.data import DatasetCatalog, MetadataCatalog
from detectron2.data.datasets.coco import load_coco_json
import pycocotools
# ,
CLASS_NAMES =["__background__","foot"]
DATASET_ROOT = '/root/detectron2/projects/PointRend/footdata'
ANN_ROOT = os.path.join(DATASET_ROOT, 'foot')
TRAIN_PATH = os.path.join(DATASET_ROOT, 'train')
VAL_PATH = os.path.join(DATASET_ROOT, 'val')
TRAIN_JSON = os.path.join(ANN_ROOT, 'footdeep_train.json')
#VAL_JSON = os.path.join(ANN_ROOT, 'val.json')
VAL_JSON = os.path.join(ANN_ROOT, 'footdeep_val.json')
#
PREDEFINED_SPLITS_DATASET = {
"coco_my_train": (TRAIN_PATH, TRAIN_JSON),
"coco_my_val": (VAL_PATH, VAL_JSON),
}
# ( Detectron2)
def register_dataset():
"""
purpose: register all splits of dataset with PREDEFINED_SPLITS_DATASET
"""
for key, (image_root, json_file) in PREDEFINED_SPLITS_DATASET.items():
register_dataset_instances(name=key,
json_file=json_file,
image_root=image_root)
def register_dataset_instances(name, json_file, image_root):
"""
purpose: register dataset to DatasetCatalog,
register metadata to MetadataCatalog and set attribute
"""
DatasetCatalog.register(name, lambda: load_coco_json(json_file, image_root, name))
MetadataCatalog.get(name).set(json_file=json_file,
image_root=image_root,
evaluator_type="coco")
#
def plain_register_dataset():
#
DatasetCatalog.register("coco_my_train", lambda: load_coco_json(TRAIN_JSON, TRAIN_PATH))
MetadataCatalog.get("coco_my_train").set(thing_classes=CLASS_NAMES, # , , ,
evaluator_type='coco', #
json_file=TRAIN_JSON,
image_root=TRAIN_PATH)
# /
DatasetCatalog.register("coco_my_val", lambda: load_coco_json(VAL_JSON, VAL_PATH))
MetadataCatalog.get("coco_my_val").set(thing_classes=CLASS_NAMES, # , , ,
evaluator_type='coco', #
json_file=VAL_JSON,
image_root=VAL_PATH)
class Trainer(DefaultTrainer):
"""
We use the "DefaultTrainer" which contains a number pre-defined logic for
standard training workflow. They may not work for you, especially if you
are working on a new research project. In that case you can use the cleaner
"SimpleTrainer", or write your own training loop.
"""
@classmethod
def build_evaluator(cls, cfg, dataset_name, output_folder=None):
"""
Create evaluator(s) for a given dataset.
This uses the special metadata "evaluator_type" associated with each builtin dataset.
For your own dataset, you can simply create an evaluator manually in your
script and do not have to worry about the hacky if-else logic here.
"""
if output_folder is None:
output_folder = os.path.join(cfg.OUTPUT_DIR, "inference")
evaluator_list = []
evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type
if evaluator_type == "lvis":
return LVISEvaluator(dataset_name, cfg, True, output_folder)
if evaluator_type == "coco":
return COCOEvaluator(dataset_name, cfg, True, output_folder)
if evaluator_type == "cityscapes":
assert (
torch.cuda.device_count() >= comm.get_rank()
), "CityscapesEvaluator currently do not work with multiple machines."
return CityscapesEvaluator(dataset_name)
if len(evaluator_list) == 0:
raise NotImplementedError(
"no Evaluator for the dataset {} with the type {}".format(
dataset_name, evaluator_type
)
)
if len(evaluator_list) == 1:
return evaluator_list[0]
return DatasetEvaluators(evaluator_list)
def setup(args):
"""
Create configs and perform basic setups.
"""
cfg = get_cfg()
add_pointrend_config(cfg)
args.config_file = "/root/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml"
cfg.merge_from_file(args.config_file) # config file
cfg.merge_from_list(args.opts) # CLI
#
cfg.DATASETS.TRAIN = ("coco_my_train",) #
cfg.DATASETS.TEST = ("coco_my_val",)
cfg.DATALOADER.NUM_WORKERS = 4 #
# cfg.INPUT.CROP.ENABLED = True
cfg.INPUT.MAX_SIZE_TRAIN = 640 #
cfg.INPUT.MAX_SIZE_TEST = 640 #
cfg.INPUT.MIN_SIZE_TRAIN = (512, 768) # ,
cfg.INPUT.MIN_SIZE_TEST = 640
#cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING, , choice range :
# range 512-768
#choice : , , 512 768
cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING = 'range'
cfg.MODEL.RETINANET.NUM_CLASSES = 2 # +1( background)
#cfg.MODEL.WEIGHTS="/home/yourstorePath/.pth"
cfg.MODEL.WEIGHTS = "/root/detectron2/projects/PointRend/models/model_final_3c3198.pkl" #
cfg.SOLVER.IMS_PER_BATCH = 4 # batch_size=2; iters_in_one_epoch = dataset_imgs/batch_size
# batch_size, epoch
#9000 ,
ITERS_IN_ONE_EPOCH = int(9000 / cfg.SOLVER.IMS_PER_BATCH)
#
cfg.SOLVER.MAX_ITER = (ITERS_IN_ONE_EPOCH * 12) - 1 # 12 epochs,
#
cfg.SOLVER.BASE_LR = 0.002
#
cfg.SOLVER.MOMENTUM = 0.9
#
cfg.SOLVER.WEIGHT_DECAY = 0.0001
cfg.SOLVER.WEIGHT_DECAY_NORM = 0.0
#
cfg.SOLVER.GAMMA = 0.1
# ,
cfg.SOLVER.STEPS = (7000,)
# , ,
cfg.SOLVER.WARMUP_FACTOR = 1.0 / 1000
#
cfg.SOLVER.WARMUP_ITERS = 1000
cfg.SOLVER.WARMUP_METHOD = "linear"
# 1
cfg.SOLVER.CHECKPOINT_PERIOD = ITERS_IN_ONE_EPOCH - 1
# ,
cfg.TEST.EVAL_PERIOD = ITERS_IN_ONE_EPOCH
#cfg.TEST.EVAL_PERIOD = 100
#cfg.merge_from_file(args.config_file)
#cfg.merge_from_list(args.opts)
cfg.freeze()
default_setup(cfg, args)
return cfg
def main(args):
plain_register_dataset()
cfg = setup(args)
if args.eval_only:
model = Trainer.build_model(cfg)
DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load(
cfg.MODEL.WEIGHTS, resume=args.resume
)
res = Trainer.test(cfg, model)
if comm.is_main_process():
verify_results(cfg, res)
return res
trainer = Trainer(cfg)
trainer.resume_or_load(resume=args.resume)
return trainer.train()
if __name__ == "__main__":
args = default_argument_parser().parse_args()
print("Command Line Args:", args)
launch(
main,
args.num_gpus,
num_machines=args.num_machines,
machine_rank=args.machine_rank,
dist_url=args.dist_url,
args=(args,),
)
여기 서 저 는 블 로 거들 이 Detectron 2 의 API 수정 을 실 현 했 습 니 다. 블 로 거들 에 게 감 사 드 립 니 다. 많은 문 제 를 해결 해 주 셔 서 감사합니다. 문제 가 있 으 면 참고 하 세 요. labelme 에 표 시 된 데이터 세트 를 사용 하면 CLASSNAMES = [" background", "foot"] CLASS 로 변경NAMES = ["foot"], 이렇게 하면 테스트 할 때 틀 리 지 않 습 니 다.
, 3 ,
def register_dataset(),
def register_dataset_instances(),
def plain_register_dataset().
, , detectron2 , , , 。
그리고 python train 을 직접 실행 합 니 다foot.py。
실행 과정:
[07/03 17:20:32 d2.data.build]: Using training sampler TrainingSampler
[07/03 17:20:32 fvcore.common.checkpoint]: Loading checkpoint from /root/detectron2/projects/PointRend/models/model_final_3c3198.pkl
[07/03 17:20:32 fvcore.common.checkpoint]: Reading a file from 'Detectron2 Model Zoo'
[07/03 17:20:33 d2.engine.train_loop]: Starting training from iteration 0
====>
[07/03 17:21:04 d2.utils.events]: eta: 11:56:26 iter: 19 total_loss: 0.538 loss_cls: 0.529 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.007 loss_rpn_loc: 0.003 time: 1.5912 data_time: 0.0224 lr: 0.000040 max_mem: 2850M
[07/03 17:21:37 d2.utils.events]: eta: 12:05:00 iter: 39 total_loss: 0.156 loss_cls: 0.148 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.006 loss_rpn_loc: 0.003 time: 1.6116 data_time: 0.0156 lr: 0.000080 max_mem: 2866M
[07/03 17:22:09 d2.utils.events]: eta: 12:05:53 iter: 59 total_loss: 0.054 loss_cls: 0.044 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.007 loss_rpn_loc: 0.002 time: 1.6162 data_time: 0.0148 lr: 0.000120 max_mem: 2866M
[07/03 17:22:42 d2.utils.events]: eta: 12:07:30 iter: 79 total_loss: 0.025 loss_cls: 0.016 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.006 loss_rpn_loc: 0.003 time: 1.6198 data_time: 0.0152 lr: 0.000160 max_mem: 2866M
[07/03 17:23:15 d2.utils.events]: eta: 12:08:44 iter: 99 total_loss: 0.016 loss_cls: 0.009 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.005 loss_rpn_loc: 0.003 time: 1.6235 data_time: 0.0148 lr: 0.000200 max_mem: 2866M
[07/03 17:23:47 d2.utils.events]: eta: 12:07:41 iter: 119 total_loss: 0.016 loss_cls: 0.007 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.005 loss_rpn_loc: 0.003 time: 1.6227 data_time: 0.0152 lr: 0.000240 max_mem: 2866M
[07/03 17:24:19 d2.utils.events]: eta: 12:07:03 iter: 139 total_loss: 0.011 loss_cls: 0.004 loss_box_reg: 0.000 loss_mask: 0.000 loss_mask_point: 0.000 loss_rpn_cls: 0.004 loss_rpn_loc: 0.002 time: 1.6233 data_time: 0.0149 lr: 0.000280 max_mem: 2866M
[07/03 17:24:52 d2.utils.events]: eta: 12:06:25 iter: 159 total_loss: 0.011 loss_cls: 0.003 loss_box_reg: 0.000 loss_mask: 0.000
4. 주의사항
1:CUDA error: device-side assert triggered
실제 분류 수 와 네트워크 출력의 분류 수가 일치 하지 않 는 것 같 으 니 수정 에 주의 하 십시오.
2:KeyError: 'Non-existent config key: MODEL.ROI_MASK_HEAD.FC_DIM'
이 건 detectron 2 / config / config. py 에 ROI 가 없어 요.MASK_HEAD.FC_DIM, 등록 하 세 요. 등록 하면 같은 오 류 를 보고 합 니 다. 바로 pointrend 의 add 입 니 다.pointrend_config 가 져 오지 않 았 습 니 다. 가 져 온 다음 set 에 불 러 옵 니 다. 저 는 addpointrend_config 내용 을 붙 여 주세요. 친구 가 알 아 듣 지 못 했 는 지 보 세 요.
from detectron2.config import CfgNode as CN
def add_pointrend_config(cfg):
"""
Add config for PointRend.
"""
# We retry random cropping until no single category in semantic segmentation GT occupies more
# than `SINGLE_CATEGORY_MAX_AREA` part of the crop.
cfg.INPUT.CROP.SINGLE_CATEGORY_MAX_AREA = 1.0
# Color augmentatition from SSD paper for semantic segmentation model during training.
cfg.INPUT.COLOR_AUG_SSD = False
# Names of the input feature maps to be used by a coarse mask head.
cfg.MODEL.ROI_MASK_HEAD.IN_FEATURES = ("p2",)
cfg.MODEL.ROI_MASK_HEAD.FC_DIM = 1024 # , , , OK
cfg.MODEL.ROI_MASK_HEAD.NUM_FC = 2
# The side size of a coarse mask head prediction.
cfg.MODEL.ROI_MASK_HEAD.OUTPUT_SIDE_RESOLUTION = 7
# True if point head is used.
cfg.MODEL.ROI_MASK_HEAD.POINT_HEAD_ON = False
cfg.MODEL.POINT_HEAD = CN()
cfg.MODEL.POINT_HEAD.NAME = "StandardPointHead"
cfg.MODEL.POINT_HEAD.NUM_CLASSES = 3
# Names of the input feature maps to be used by a mask point head.
cfg.MODEL.POINT_HEAD.IN_FEATURES = ("p2",)
# Number of points sampled during training for a mask point head.
cfg.MODEL.POINT_HEAD.TRAIN_NUM_POINTS = 14 * 14
# Oversampling parameter for PointRend point sampling during training. Parameter `k` in the
# original paper.
cfg.MODEL.POINT_HEAD.OVERSAMPLE_RATIO = 3
# Importance sampling parameter for PointRend point sampling during training. Parametr `beta` in
# the original paper.
cfg.MODEL.POINT_HEAD.IMPORTANCE_SAMPLE_RATIO = 0.75
# Number of subdivision steps during inference.
cfg.MODEL.POINT_HEAD.SUBDIVISION_STEPS = 5
# Maximum number of points selected at each subdivision step (N).
cfg.MODEL.POINT_HEAD.SUBDIVISION_NUM_POINTS = 28 * 28
cfg.MODEL.POINT_HEAD.FC_DIM = 256
cfg.MODEL.POINT_HEAD.NUM_FC = 3
cfg.MODEL.POINT_HEAD.CLS_AGNOSTIC_MASK = False
# If True, then coarse prediction features are used as inout for each layer in PointRend's MLP.
cfg.MODEL.POINT_HEAD.COARSE_PRED_EACH_LAYER = True
cfg.MODEL.POINT_HEAD.COARSE_SEM_SEG_HEAD_NAME = "SemSegFPNHead"
오류 보고 3: NotImplemented Error: Caught NotImplemented Error in DataLoader worker process 0.
Traceback (most recent call last):
File "train_net.py", line 182, in
args=(args,),
File "/root/detectron2/detectron2/engine/launch.py", line 54, in launch
daemon=False,
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 171, in spawn
while not spawn_context.join():
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 118, in join
raise Exception(msg)
Exception:
-- Process 0 terminated with the following error:
Traceback (most recent call last):
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/multiprocessing/spawn.py", line 19, in _wrap
fn(i, *args)
File "/root/detectron2/detectron2/engine/launch.py", line 89, in _distributed_worker
main_func(*args)
File "/root/detectron2/projects/PointRend/train_net.py", line 170, in main
return trainer.train()
File "/root/detectron2/detectron2/engine/defaults.py", line 401, in train
super().train(self.start_iter, self.max_iter)
File "/root/detectron2/detectron2/engine/train_loop.py", line 132, in train
self.run_step()
File "/root/detectron2/detectron2/engine/train_loop.py", line 209, in run_step
data = next(self._data_loader_iter)
File "/root/detectron2/detectron2/data/common.py", line 141, in __iter__
for d in self.dataset:
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 345, in __next__
data = self._next_data()
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 856, in _next_data
return self._process_data(data)
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 881, in _process_data
data.reraise()
File "/root/anaconda3/envs/PointRend/lib/python3.6/site-packages/torch/_utils.py", line 394, in reraise
raise self.exc_type(msg)
NotImplementedError: Caught NotImplementedError in DataLoader worker process 0.
setup () 의 cfg. INPUT. ROP. ENABLED = True 를 로그아웃 하거나 false 로 변경 하 는 것 은 데이터 세트 를 분할 처리 하지 않 아 도 그림 을 강화 할 수 있 기 때 문 입 니 다. detectron 2 / config / defaults. py 의 내용 을 참고 할 수 있 습 니 다.
업데이트
댓 글 을 보고 어떤 친구 가 저 에 게 pointrend 의 테스트 demo 를 물 었 습 니 다. 저 는 detection 2 의 demo. py 에서 뛰 어 나 왔 습 니 다. 이렇게 하 겠 습 니 다. 저 는 두 가지 코드 를 붙 여서 여러분 의 교 류 를 편리 하 게 하고 참고 하 시기 바 랍 니 다.
첫 번 째 종류:
하 나 는 데모 에서 직접 수정 되 었 습 니 다. PointRend 에 demo. py 를 새로 만 들 고 아래 코드 를 복사 합 니 다.
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
import argparse
import glob
import multiprocessing as mp
import os
import time
import cv2
import tqdm
from detectron2.config import get_cfg
from detectron2.data.detection_utils import read_image
from detectron2.utils.logger import setup_logger
from predictor import VisualizationDemo
from point_rend import add_pointrend_config
# constants
WINDOW_NAME = "COCO detections"
def setup_cfg(args):
# load config from file and command-line arguments
cfg = get_cfg()
add_pointrend_config(cfg)
cfg.merge_from_file(args.config_file)
cfg.merge_from_list(args.opts)
# Set score_threshold for builtin models
cfg.MODEL.RETINANET.SCORE_THRESH_TEST = args.confidence_threshold
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = args.confidence_threshold
cfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = args.confidence_threshold
cfg.freeze()
return cfg
def get_parser():
parser = argparse.ArgumentParser(description="Detectron2 demo for builtin models")
parser.add_argument(
"--config-file",
default="configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml",
metavar="FILE",
help="path to config file",
)
parser.add_argument("--webcam", action="store_true", help="Take inputs from webcam.")
parser.add_argument("--video-input", help="Path to video file.")
parser.add_argument(
"--input",
nargs="+",
help="A list of space separated input images; "
"or a single glob pattern such as 'directory/*.jpg'",
)
parser.add_argument(
"--output",
help="A file or directory to save output visualizations. "
"If not given, will show output in an OpenCV window.",
)
parser.add_argument(
"--confidence-threshold",
type=float,
default=0.5,
help="Minimum score for instance predictions to be shown",
)
parser.add_argument(
"--opts",
help="Modify config options using the command-line 'KEY VALUE' pairs",
default=[],
nargs=argparse.REMAINDER,
)
return parser
if __name__ == "__main__":
mp.set_start_method("spawn", force=True)
args = get_parser().parse_args()
setup_logger(name="fvcore")
logger = setup_logger()
logger.info("Arguments: " + str(args))
cfg = setup_cfg(args)
demo = VisualizationDemo(cfg)
if args.input:
if len(args.input) == 1:
args.input = glob.glob(os.path.expanduser(args.input[0]))
assert args.input, "The input path(s) was not found"
for path in tqdm.tqdm(args.input, disable=not args.output):
# use PIL, to be consistent with evaluation
img = read_image(path, format="BGR")
start_time = time.time()
predictions, visualized_output = demo.run_on_image(img)
logger.info(
"{}: {} in {:.2f}s".format(
path,
"detected {} instances".format(len(predictions["instances"]))
if "instances" in predictions
else "finished",
time.time() - start_time,
)
)
if args.output:
if os.path.isdir(args.output):
assert os.path.isdir(args.output), args.output
out_filename = os.path.join(args.output, os.path.basename(path))
else:
assert len(args.input) == 1, "Please specify a directory with args.output"
out_filename = args.output
visualized_output.save(out_filename)
else:
cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL)
cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1])
if cv2.waitKey(0) == 27:
break # esc to quit
elif args.webcam:
assert args.input is None, "Cannot have both --input and --webcam!"
cam = cv2.VideoCapture(0)
for vis in tqdm.tqdm(demo.run_on_video(cam)):
cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL)
cv2.imshow(WINDOW_NAME, vis)
if cv2.waitKey(1) == 27:
break # esc to quit
cv2.destroyAllWindows()
elif args.video_input:
video = cv2.VideoCapture(args.video_input)
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
frames_per_second = video.get(cv2.CAP_PROP_FPS)
num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT))
basename = os.path.basename(args.video_input)
if args.output:
if os.path.isdir(args.output):
output_fname = os.path.join(args.output, basename)
output_fname = os.path.splitext(output_fname)[0] + ".mkv"
else:
output_fname = args.output
assert not os.path.isfile(output_fname), output_fname
output_file = cv2.VideoWriter(
filename=output_fname,
# some installation of opencv may not support x264 (due to its license),
# you can try other format (e.g. MPEG)
fourcc=cv2.VideoWriter_fourcc(*"x264"),
fps=float(frames_per_second),
frameSize=(width, height),
isColor=True,
)
assert os.path.isfile(args.video_input)
for vis_frame in tqdm.tqdm(demo.run_on_video(video), total=num_frames):
if args.output:
output_file.write(vis_frame)
else:
cv2.namedWindow(basename, cv2.WINDOW_NORMAL)
cv2.imshow(basename, vis_frame)
if cv2.waitKey(1) == 27:
break # esc to quit
video.release()
if args.output:
output_file.release()
else:
cv2.destroyAllWindows()
테스트 할 때 명령 행 을 통 해 테스트 하고 다음 코드 를 실행 해 야 합 니 다:
python demo.py --config-file models/model_final_3c3198.pkl --input test/1.jpg --output test/out/
두 번 째:
위 에 있 는 것 은 간단 한 테스트 입 니 다. 자신의 데이터 세트 를 테스트 하고 명령 행 으로 테스트 하고 싶 지 않 으 면 데모. py 를 먼저 만 듭 니 다. 그러면 아래 코드 를 사용 하 십시오.
import os
import cv2
from detectron2.config import get_cfg
from detectron2.data.detection_utils import read_image
from predictor import VisualizationDemo
from point_rend import add_pointrend_config
# constants
WINDOW_NAME = "COCO detections"
def setup_cfg():
# load config from file and command-line arguments
cfg = get_cfg()
add_pointrend_config(cfg)
cfg.merge_from_file("/root/detectron2/projects/PointRend/configs/InstanceSegmentation/pointrend_rcnn_R_50_FPN_3x_coco.yaml")
# Set score_threshold for builtin models
cfg.MODEL.RETINANET.SCORE_THRESH_TEST = 0.5
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = os.path.join(cfg.OUTPUT_DIR, "model_final.pth")#
cfg.freeze()
return cfg
if __name__=='__main__':
cfg = setup_cfg()
detectron_out=VisualizationDemo(cfg)
path=r'/root/detectron2/testimage/1.jpg'#
outpath=r'/root/detectron2/testimage/out/'#
img = read_image(path, format="BGR")
predictions, visualized_output = detectron_out.run_on_image(img)
out_img=visualized_output.get_image()[:, :, ::-1]
out_path=os.path.join(outpath,os.path.basename(path))
visualized_output.save(out_path)
그리고 python demo. py 를 직접 실행 하면 됩 니 다.사실은 위의 코드 에서 수 정 된 것 입 니 다. 아래 의 코드 에 문제 가 있 습 니 다. 만약 에 자신 이 훈련 한 모델 을 테스트 하면 여기 결과 에 라벨 이름 이 표시 되 지 않 았 습 니 다. 이것 은 수정 해 야 합 니 다. 저 는 여기 서 말 하지 않 겠 습 니 다. 여러분 이 직접 연구 해 보 세 요. 아주 간단 합 니 다. 사실은 자신의 데이터 라벨 을 등록 하 는 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PointRend 인 스 턴 스 를 사용 하여 자신의 coco 데이터 세트 를 분할 훈련 합 니 다.저도 제 가 이해 하 는 설치 와 테스트 블 로 그 를 썼 습 니 다. 관심 이 있 는 것 은 참고 하 셔 도 됩 니 다.설치 에 성 공 했 습 니 다. 그리고 자신 에 게 깨 어 나 야 합 니 다.나중에 표 시 된...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.