티스토리 뷰
[Deep Learning] Windows 에서 COCO Pretrained DINO Object Detector Inference 방법
developer0hye 2023. 4. 17. 23:15https://github.com/IDEA-Research/DINO
DINO는 2023 년 4월 17일 기준 COCO test-dev Benchmark 에서 12위라는 높은 순위를 기록하고 있는 모델이다.
해당 모델은 DETR 을 베이스로 둔 후속 모델 중 하나로 볼 수 있다. 소개된 논문의 제목 또한 "DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection" 으로, 제목에도 DETR이 포함돼있다.
공개된지는 이미 몇개월이 지난 모델인데 미루고 미루다 한 번 돌려보았다.
미루었던 이유 중 하나는 CUDA operators 를 따로 컴파일까지 해야하는 번거로움이 있어서였다. 뭔가 빌드 과정에서 오류가 잔뜩 날 것 같은 두려움이 앞섰던것이다... 개인적으로 Native PyTorch operators 만으로 구현되는 모델이 좋다... 그래야 배포 과정에서 Onnxruntime, TensorRT 등의 다양한 Inference Engine에서 not supported ... 같은 에러를 볼 가능성이 적어지기 때문이다.
당장 DINO 이슈에 CUDA를 검색해봐도 Compile에서 오류가 발생했다는 유저들이 많다.
그치만...! 성능이 너무 궁금했다. 현재(2023년 4월 17일) COCO test-dev Benchmark에서 1등을 달성한 InternImage 모델의 경우에도 DINO를 Detector로 사용하여 1등을 달성했고, 여러 최상위권 모델들이 DINO를 Detector로 한 경우가 많아서 돌려는 봐야겠다는 생각이 들었다.
설치
https://github.com/IDEA-Research/DINO#installation
위 단계를 따르되, PyTorch는 공식 홈페이지에있는 https://pytorch.org/ 에 있는 명령어를 이용해서 최신 버전을 다운로드 받았고 pycocotools가 제대로 설치가 안되어 requirements.txt를 수정해줬다.
cython
pycocotools
submitit
torch>=1.5.0
torchvision>=0.6.0
git+https://github.com/cocodataset/panopticapi.git#egg=panopticapi
scipy
termcolor
addict
yapf
timm
4. Compiling CUDA operators 단계(gpu driver version: 531.61, cuda version: 11.4, pytorch cuda version: 11.7)에서 딱히 빌드 오류는 없었고 python test.py 실행시 메모리가 부족해서 메모리 사이즈 에러는 발생했다. 어쨌든 작은 인풋 사이즈(D= 30, 32, 64, 71) 에서 돌아갔으니 빌드는 잘 된것이니 무시해줬다.
그런 다음 https://github.com/IDEA-Research/DINO#model-zoo 에 안내된 Google Drive 링크에서 아래의 pth 파일을 다운로드 받았다.
5scale swin이 config 폴더에 없어서 4scale_swin pth 파일을 받았다.
COCO 데이터셋 기준 58.0 AP를 기록한 Weights이다.
이제 https://github.com/IDEA-Research/DINO/blob/main/inference_and_visualization.ipynb 이거 따라서 py 파일로 다시 구현하고 돌려봤는데 안된다!
일단 py파일 내용은 아래와 같다.
import torch, json
from main import build_model_main
from util.slconfig import SLConfig
from util.visualizer import COCOVisualizer
from util import box_ops
model_config_path = "config/DINO/DINO_4scale_swin.py" # change the path of the model config file
model_checkpoint_path = "checkpoint0029_4scale_swin.pth" # change the path of the model checkpoint
# See our Model Zoo section in README.md for more details about our pretrained models.
args = SLConfig.fromfile(model_config_path)
args.device = 'cuda'
model, criterion, postprocessors = build_model_main(args)
checkpoint = torch.load(model_checkpoint_path, map_location='cpu')
model.load_state_dict(checkpoint['model'])
_ = model.eval()
# load coco names
with open('util/coco_id2name.json') as f:
id2name = json.load(f)
id2name = {int(k):v for k,v in id2name.items()}
from PIL import Image
import datasets.transforms as T
image = Image.open("./figs/idea.jpg").convert("RGB") # load image
# transform images
transform = T.Compose([
T.RandomResize([800], max_size=1333),
T.ToTensor(),
T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
image, _ = transform(image, None)
# predict images
output = model.cuda()(image[None].cuda())
output = postprocessors['bbox'](output, torch.Tensor([[1.0, 1.0]]).cuda())[0]
# visualize outputs
thershold = 0.3 # set a thershold
vslzr = COCOVisualizer()
scores = output['scores']
labels = output['labels']
boxes = box_ops.box_xyxy_to_cxcywh(output['boxes'])
select_mask = scores > thershold
box_label = [id2name[int(item)] for item in labels[select_mask]]
pred_dict = {
'boxes': boxes[select_mask],
'size': torch.Tensor([image.shape[1], image.shape[2]]),
'box_label': box_label
}
vslzr.visualize(image, pred_dict, savedir=None, dpi=100)
2개의 에러
https://github.com/IDEA-Research/DINO/pull/184
PR 날려서 고쳐놨다.
1. PermissionError
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\yonghye\\AppData\\Local\\Temp\\tmp4ypiuwgb\\tmpfsiyzo4j.py'
util/slconfig.py 에서 temp_config_file.close()를 추가적으로 호출해주면된다.
https://github.com/IDEA-Research/DINO/issues/43
2. AttributeError: 'ConfigDict' object has no attribute 'backbone_dir'
models/dino/backbone.py에서 pretrained 백본을 load하는 부분을 주석 처리하면 된다.
위 부분을 모두 수정해주고 실행해보면 잘 출력되는 것을 확인할 수 있다.
AP 60 넘는 Weights 은 어디있나요?
https://github.com/IDEA-Research/detrex 이 프로젝트에 있다고한다.
'Deep Learning' 카테고리의 다른 글
[Deep Learning] DETR 전처리 과정(padding, bounding box normalization)에 생긴 의문점 (1) | 2023.05.06 |
---|---|
[Deep Learning] COCO pre-trained YOLOv8 모델의 최적의 confidence threshold 탐색 (0) | 2023.04.29 |
[OnnxRuntime C++] GetInputNameAllocated 와 GetOutputNameAllocated (0) | 2023.02.28 |
[PyTorch,YOLO, hub] YOLOv5 torch hub 로 인터넷 연결 없이 Load하기 (0) | 2022.12.10 |
CLIP Nan 문제 해결 방법 및 Finetuning(=Transfer Learning) 시 팁 (0) | 2022.12.02 |
- Total
- Today
- Yesterday
- 문제집
- 이분탐색
- 백트래킹
- 백준
- 순열
- ㅂ
- MOT
- FairMOT
- C++ Deploy
- cosine
- 파이참
- 백준 11437
- 백준 1766
- 백준 11053
- LCA
- PyCharm
- 조합
- 위상 정렬 알고리즘
- 자료구조
- Lowest Common Ancestor
- 인공지능을 위한 선형대수
- 단축키
- 가장 긴 증가하는 부분 수열
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |