안 쓰던 블로그

Object Detection_2. 실습 본문

머신러닝/머신러닝

Object Detection_2. 실습

proqk 2021. 1. 11. 11:35
반응형

Selective Search 실습 및 시각화

AlpacaDB/selectivesearch

github.com/AlpacaDB/selectivesearch

 

AlpacaDB/selectivesearch

Selective Search Implementation for Python. Contribute to AlpacaDB/selectivesearch development by creating an account on GitHub.

github.com

!pip install selectivesearch

이것을 설치한다

 

import selectivesearch
import cv2
import matplotlib.pyplot as plt
import os
%matplotlib inline
 
default_dir = '/content/DLCV'
img = cv2.imread(os.path.join(default_dir, 'data/image/audrey01.jpg'))
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
print('img shape:', img.shape)

plt.figure(figsize=(8, 8))
plt.imshow(img_rgb)
plt.show()

이 이미지에 selective search를 해보도록 한다

 

Region Proposal(후보 영역)에 대한 정보 보기

#selectivesearch.selective_search()함수: 이미지의 Region Proposal정보 반환 
_, regions = selectivesearch.selective_search(img_rgb, scale=100, min_size=2000)

print(type(regions), len(regions))

img_rgb: 이미지의 rgb값

scale: 알고리즘이 선택하는 오브젝트 크기를 조정하는 값->알고리즘 조정

min_size: 추천되는 값 중에 최소 이 값 이상은 선택하겠다(가로x세로값)->선택값 조정

 

반환된 regions 변수는 리스트 타입으로 세부 원소로 딕셔너리를 가지고 있다

 

개별 딕셔너리내 KEY값별 의미

rect는 x값, y값, width값, height값을 가지며 이 값이 Detected Object 후보를 나타내는 Bounding box

size는 Bounding box의 크기

labels는 해당 rect로 지정된 Bounding Box내에 있는 오브젝트들의 고유 ID

아래로 내려갈 수록 너비와 높이 값이 큰 Bounding box이며 하나의 Bounding box에 여러개의 오브젝트가 있을 확률이 커진다

 

cand_rects = [cand['rect'] for cand in regions]
print(cand_rects)

이렇게 하면 rect정보만 뽑아서 출력할 수 있다

 

Bounding Box를 시각화하기

green_rgb = (125, 255, 51) #초록색 박스
img_rgb_copy = img_rgb.copy()
for rect in cand_rects:    
    left = rect[0]
    top = rect[1]
    right = left + rect[2] #오른쪽=왼쪽+너비
    bottom = top + rect[3] #바닥=탑+높이
    
    img_rgb_copy = cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), color=green_rgb, thickness=2)
    
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()

opencv의 rectangle()을 이용하여 시각화
rectangle()은 이미지와 왼쪽 위 좌표, 오른쪽 아래 좌표, box컬러색, 두께 등을 인자로 입력하면 원본 이미지에 box를 그린다

앞서 했던 min_size값을 작게 잡으면 더 자세하게 그려지게 된다

 

bounding box의 크기가 큰 후보만 추출

cand_rects = [cand['rect'] for cand in regions if cand['size'] > 10000]

green_rgb = (125, 255, 51)
img_rgb_copy = img_rgb.copy()
for rect in cand_rects:
    
    left = rect[0]
    top = rect[1]
    right = left + rect[2]
    bottom = top + rect[3]
    
    img_rgb_copy = cv2.rectangle(img_rgb_copy, (left, top), (right, bottom), color=green_rgb, thickness=2)
    
plt.figure(figsize=(8, 8))
plt.imshow(img_rgb_copy)
plt.show()

if문을 써서 size가 10000이상인 값만 출력할 수 있다

 

반응형
Comments