<jupyter_start><jupyter_text>AI-빅데이터 MBA 딥러닝의 이해 CNN 모델 - Facebook Detectron2 예제 Detectron2 소스 : https://github.com/facebookresearch/detectron2 https://towardsdatascience.com/a-beginners-guide-to-object-detection-and-computer-vision-with-facebook-s-detectron2-700b6273390e 예제를 강좌에 맞춰 수정  MS COCO dataset 을 이용하기 위한 코드 설치MS COCO는 마이크로소프트에서 만든 객체 인식, 탐지, 세그멘테이션 데이터셋  Common Objects in Context (https://cocodataset.org)  객체 클래스는 80개 Colab에 기본으로 포함되지 않은 패키지는 shell command로 설치해야 함  pip (Preferred Installer Program)  파이썬 패키지에 포함된 기본 설치 프로그램<jupyter_code>!pip install -U 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'<jupyter_output><empty_output><jupyter_text>Detectron2 설치<jupyter_code>!python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'<jupyter_output><empty_output><jupyter_text>필요한 패키지 import<jupyter_code>import numpy as np
import cv2
import random
from google.colab.patches import cv2_imshow # On your local machine you don’t need it.
import json
# import some common detectron2 utilities
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
from google.colab.patches import cv2_imshow<jupyter_output><empty_output><jupyter_text>**from google.colab.patches import cv2_imshow**  OpenCV의 이미지 디스플레이 함수인 cv2.imshow() 함수가 colab과 호환되지 않음.  Google에서 cv2_imshow라는 함수를 정의해서 동일한 기능을 제공하고 있음  (주의) '.' 대신 '_'로 연결되어 있음  샘플이미지 다운로드 인터넷 URL을 로컬 컴퓨터에 다운로드할 때는 wget 명령 사용  -O 옵션으로 저장할 파일이름 지정<jupyter_code>!wget https://miro.medium.com/max/2000/1*sxjvURCdHBC0MkuZkPnIkQ.png -O street.png
im = cv2.imread('street.png')
cv2_imshow(im)<jupyter_output><empty_output><jupyter_text>Configuration 확인<jupyter_code>cfg = get_cfg()
cfg
cfg.VERSION
cfg.merge_from_file(model_zoo.get_config_file('COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml'))
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model
cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url('COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml')
cfg.MODEL.DEVICE
cfg.MODEL.META_ARCHITECTURE<jupyter_output><empty_output><jupyter_text>GPU 사용 여부에 따라 configuration이 달라짐 Colab에서 GPU 할당받았는지 확인하고 configuration을 맞춰줌 디폴트는 DEVICE가 'gpu'로 설정되어 있음<jupyter_code>import os

def check_cpu_mode():
    if (int(os.environ["COLAB_GPU"]) > 0):
        return False
    elif ("COLAB_TPU_ADDR" in os.environ and os.environ["COLAB_TPU_ADDR"]):
        return False
    else:
        return True
if check_cpu_mode():
    cfg.MODEL.DEVICE = 'cpu'
cfg.MODEL.DEVICE
predictor = DefaultPredictor(cfg)<jupyter_output><empty_output><jupyter_text>predictor model의 구성 살펴보기<jupyter_code>predictor.model
predictor.model.backbone
predictor.model.proposal_generator
predictor.model.roi_heads<jupyter_output><empty_output><jupyter_text>이미지의 색상 포맷 디폴트가 BGR임<jupyter_code>cfg.INPUT.FORMAT<jupyter_output><empty_output><jupyter_text>이미지에서 객체 탐지<jupyter_code>outputs = predictor(im)
outputs.keys()<jupyter_output><empty_output><jupyter_text>탐지된 객체 리스트<jupyter_code>instances = outputs['instances']
len(instances)
instances[0]
instances[0].pred_masks.shape
instances[0].pred_masks.nonzero()<jupyter_output><empty_output><jupyter_text>첫번 인스턴스의 영역중 일부인 [513:583, 637:654] 의 이미지 확인<jupyter_code>cv2_imshow(im[510:590, 630:660])<jupyter_output><empty_output><jupyter_text>pred_masks는 탐지된 객체의 픽셀<jupyter_code>instances.pred_classes, instances.pred_classes.size()<jupyter_output><empty_output><jupyter_text>31개의 객체 탐지. pred_classes는 각 인스턴스의 클래스. 즉 첫번째 인스턴스는 2번 클래스, 두번째 인스턴스는 0번 클래스, ...<jupyter_code>instances.scores, instances.scores.size()<jupyter_output><empty_output><jupyter_text>객체 클래스 확인<jupyter_code>metadata = MetadataCatalog.get(cfg.DATASETS.TRAIN[0])
metadata
class_catalog = metadata.thing_classes
class_catalog[2]
class_catalog[0]
class_catalog[7]
class_catalog[3]
len(class_catalog)
instances.pred_boxes, len(instances.pred_boxes)<jupyter_output><empty_output><jupyter_text>첫번째 박스 영역 보기<jupyter_code>instances.pred_boxes[0]<jupyter_output><empty_output><jupyter_text>위 결과는 graphics 좌표계임에 주의 (왼쪽 위가 0,0이고 x축이 수평, y축이 수직).  numpy image array는 row가 수직, column이 수평 좌표.  따라서 첫번 좌표 (604, 511)는 image에서는 im[511, 604]임  첫번 box의 numpy array상의 데이터는 [511:584, 604:702]에 해당.<jupyter_code>cv2_imshow(im[511:584, 604:703])<jupyter_output><empty_output><jupyter_text>전체 결과 표시는 Visualizer를 사용하여 확인<jupyter_code>v = Visualizer(im, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]))
v = v.draw_instance_predictions(outputs['instances'].to('cpu'))
cv2_imshow(v.get_image())<jupyter_output><empty_output><jupyter_text>다른 이미지로 테스트 https://nypost.com/wp-content/uploads/sites/2/2017/12/nyc-streets.jpg<jupyter_code>!wget https://nypost.com/wp-content/uploads/sites/2/2017/12/nyc-streets.jpg -O street2.jpg
!ls -l
im2 = cv2.imread('street2.jpg')
cv2_imshow(im2)
outputs2 = predictor(im2)
instances2 = outputs2['instances']

v2 = Visualizer(im2, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]))
v2 = v2.draw_instance_predictions(outputs2['instances'].to('cpu'))
cv2_imshow(v2.get_image())<jupyter_output><empty_output><jupyter_text>https://media.timeout.com/images/102973595/750/422/image.jpg<jupyter_code>!wget https://media.timeout.com/images/102973595/750/422/image.jpg -O living_room1.jpg
!ls -l
im2 = cv2.imread('living_room1.jpg')
cv2_imshow(im2)
outputs2 = predictor(im2)
instances2 = outputs2['instances']

v2 = Visualizer(im2, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]))
v2 = v2.draw_instance_predictions(outputs2['instances'].to('cpu'))
cv2_imshow(v2.get_image())
v2 = Visualizer(im2, MetadataCatalog.get(cfg.DATASETS.TRAIN[0]), scale=1.5)
v2 = v2.draw_instance_predictions(outputs2['instances'].to('cpu'))
cv2_imshow(v2.get_image())<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.11745372772876665, 'fraction_numerical': 0.03736377789309808, 'mean_word_length': 7.465592972181552, 'pattern_counts': {'":': 0, '<': 77, '<?xml version=': 0, '>': 78, 'https://': 10, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '19', 'dir': 'jupyter-structured-clean-dedup', 'id': '221515', 'license': 'MIT', 'n_tokens_mistral': 2783, 'n_tokens_neox': 3004, 'n_words': 384, 'path': 'cnn_models_detectron2_assist.ipynb', 'repo_name': 'skimaza/assist_ai', 'size': '5781'}