실제로는 윈도우에서도 실행이 가능하고 한다.
stackoverflow, medium, tistory, velog 등 에서 확인 가능
물론 실패
windows용 detectron2를 설치하기 위해서는 windows용 소스파일을 사용해야 함.
https://github.com/conansherry/detectron2 하지만 공식 문서가 아니기 때문에
cuda 10.1버전에 pytorch는 1.3버전을 요구한다.
다음에 우분투로 최신버전을 설치해 보자
Windows 10 Education (빌드 19045)
CPU: i7-13700F
RAM: 32G
GPU: RTX 4060Ti
CUDA: 11.8
호환되는 pytorch 버전을 보면 torch 1.8을 사용하기 위해선 CUDA11.1이 필요하다.
GPU와 CUDA 버전 호환을 보면 내 GPU에 적합하지 않지만 11.1 설치하기로 함
- cuda 11.1.1, cuDNN 8.9.6을 받았다.
이것을 대채하기 위해 visual studio build tools을 사용하는 것 같다.
여기에서 2019 버전을 설치하자
2022버전으로 하다가 에러가 발생했다(2017~2019 버전을 사용하라고 한다)
2022버전 2019버전 동시에 설치해도 상관없다.
잘모르니 빌드도구 몽땅 설치함
pip install fvcore
pip install ninja
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cudatoolkit=11.1 -c pytorch -c conda-forge
pip install cython
# 이 아래부터는 꼭 설치해야 하는지는 모르겠음 하지만 예제 실행할 때 필요
pip install cloudpickle
pip install omegaconf
pip install pycocotools
pip install opencv-python
pytorch 과거 버전 설치
3번째 줄 conda install pytorch는 생각보다 오래걸린다(나만그런가?), 원래 오래걸리니 참고하자.
pip install “git+https://github.com/philferriere/cocoapi.git#egg=pycocotools&subdirectory=PythonAPI"
git clone https://github.com/facebookresearch/detectron2.git
python setup.py build_ext --inplace
아마도 여기서 https://github.com/facebookresearch/detectron2.git 가 아닌 https://github.com/conansherry/detectron2 에서 설치해야 하는 것 같다
설치할 위치에서 아나콘다 프롬프트내에서 실행해야 한다
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\include\crt/host_config.h(160): fatal error C1189: #error: -- unsupported Microsoft Visual Studio version! Only the versions between 2017 and 2019 (inclusive) are supported! The nvcc flag '-allow-unsupported-compiler' can be used to override this version check; however, using an unsupported host compiler may cause compilation failure or incorrect run time execution. Use at your own risk.
nms_rotated_cuda.cu
ninja: build stopped: subcommand failed.
에러 발생 visual studio 버전을 2017~2019로 맞춰야 하나 보다.
참고 사이트에는 cpu용, cuda용 파일이 따로 생성되는데 나는 cpu만 나온다;
그런데 해당 사이트의 예제를 실행해보니
cuda가 사용중이라고 나오긴한다.
from detectron2.utils.logger import setup_logger
setup_logger()
from detectron2 import model_zoo
from detectron2.engine import DefaultPredictor
from detectron2.config import get_cfg
from detectron2.utils.visualizer import Visualizer
from detectron2.data import MetadataCatalog
import cv2
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file("COCO-Detection/faster_rcnn_R_50_FPN_1x.yaml"))
cfg.MODEL.WEIGHTS = "weights/model_final_b275ba.pkl"
predictor = DefaultPredictor(cfg)
img = cv2.imread('input.jpg')
outputs = predictor(img)
# score가 0.4 이상인 인스턴스만 필터링
high_score_mask = outputs["instances"].scores > 0.4
filtered_instances = outputs["instances"][high_score_mask]
v = Visualizer(img[:, :, ::-1], MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.2)
out = v.draw_instance_predictions(filtered_instances.to("cpu"))
cv2.imwrite('saved_image_40.jpg', out.get_image()[:, :, ::-1])
일단 실행은 됬으니 다른 방법도 찾아보자
pip install requests
만 추가로 설치하자
from detectron2.engine import DefaultPredictor
from detectron2.data import MetadataCatalog
from detectron2.config import get_cfg
from detectron2.utils.visualizer import ColorMode, Visualizer
from detectron2 import model_zoo
import cv2
import numpy as np
import requests
# Load an image
res = requests.get("https://thumbor.forbes.com/thumbor/fit-in/1200x0/filters%3Aformat%28jpg%29/https%3A%2F%2Fspecials-images.forbesimg.com%2Fimageserve%2F5f15af31465263000625ce08%2F0x0.jpg")
image = np.asarray(bytearray(res.content), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
config_file = 'COCO-Detection/faster_rcnn_R_101_FPN_3x.yaml'
cfg = get_cfg()
cfg.merge_from_file(model_zoo.get_config_file(config_file))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.75 # Threshold
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(config_file)
cfg.MODEL.DEVICE = "cuda" # cpu or cuda
# Create predictor
predictor = DefaultPredictor(cfg)
# Make prediction
output = predictor(image)
print(output)
v = Visualizer(image[:, :, ::-1],
scale=0.8,
metadata=MetadataCatalog.get(cfg.DATASETS.TRAIN[0]),
instance_mode=ColorMode.IMAGE
)
v = v.draw_instance_predictions(output["instances"].to("cpu"))
cv2.imshow('images', v.get_image()[:, :, ::-1])
cv2.waitKey(0)