[python] Selective Search

김보현·2024년 5월 29일
0

ComputerVision

목록 보기
3/11

Selective Search module 구현

import selectivesearch 
_, regions = selectivesearch.selective_search(img_rgb, scale=100, min_size=2000)
print(type(regions), len(regions))

[출력] <class 'list'> 41

selectivesearch 모듈을 임포트한다.

파라미터

img_rgb: 대상이되는 이미지들을 넣는다.
scale: scale이 클수록 큰 object위주로 알고리즘이 실행된다. 반대로 작을수록 작은 object위주로 알고리즘이 실행된다.
min_size: object 추천 최소사이즈. 위 코드에서는 2000으로 설정되어 있으니, 적어도 사이즈 2000이상만 추천해준다.

반환

튜플 형식이다.
_ : 첫번째 튜플 값은 중요하지 않아서 언더바로 표시했다.
regions: dect할 object가 있을만한 공간이다.

출력

type은 list이고 list안에 원소가 41개가 있는 것이다.
selective search로 찾아낸 object가 있을만한 공간이 41개라는 것이다.

Region Proposal

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

[{'labels': [0.0], 'rect': (0, 0, 107, 167), 'size': 11166},

regions의 첫 원소만 보면, 딕셔너리 형태이다.
'rect': (0, 0, 107, 167)
-> bounding box 정보이다.
'size': 11166
-> object의 size 이다.

{'labels': [7.0, 11.0], 'rect': (0, 91, 183, 175), 'size': 12312},

알고리즘을 돌리면서 유사한 label끼리 합쳐진다.

Bounding box 시각화

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

rect 정보만 출력해서 볼 수 있다.
(시작w,시작h,끝w,끝h) 형태로 출력된다.

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()

img_rgb_copy

opencv에 rectangle이라는 사각형을 그려주는 함수가 있다.
color=green_rgb는 그 사각형의 색을 green으로 그려준다.
thickness=2 사각형 선의 두께이다.

cand_rects

위에서 구한 41개의 튜플이다.

img_rgb_copy

노트북으로 작업해서 셀이 나뉘어져 있기 때문에 원본을 copy해둔것이다.

좌표

left = rect[0] 좌상단좌표, top = rect[1] 우상단좌표,
right = left + rect[2] 우하단좌표(좌상단좌표에서 더해줘야한다)

cv2.rectangle((left, top), (right, bottom)

좌상단,우하단 좌표와 우상단,좌하단 자표가 들어가야한다.

profile
Fall in love with Computer Vision

0개의 댓글