지난 글에서 COCO Fifty One 을 활용한 Object detection 데이터 셋 시각화 방법을 포스팅 했었는데,
(자세한 내용은 링크 참조 : https://eunga-whereami.tistory.com/2)
사실 FiftyOne은 정말 `엄청난 양`의 데이터 셋을 다룰 때 그 장점을 갖는다.
하지만 간단히 python에서 image와 bounding box를 함께 띄워 보고 싶을 때는,
굳이 FIftyOne을 위해 annotation 파일을 COCO로 맞추고, 패키지를 설치하는 등의 거대한 작업을 거칠 필요가 없다.
Visualization
나의 경우 OpenCV를 활용하여 `bbox와 image를 동시에 visualize하는 함수`를 활용하였다.
import cv2
def visualize_image_with_bbox(img, bboxes, file_name):
for bbox in bboxes:
x_min = int(bbox[0])
y_min = int(bbox[1])
x_max = int(bbox[0] + bbox[2])
y_max = int(bbox[1] + bbox[3])
img = cv2.rectangle(img, (x_min, y_min), (x_max, y_max), (0, 256, 0), 1)
cv2.imwrite(path_dest + file_name, img)
Inputs
- img (numpy.ndarray) : `cv2.imread` 함수로 읽어온 이미지 배열
- bboxes (list) : 이미지 안에 포함된 모든 bounding box들의 리스트.
- file_name (string) : 파일 이름
Bounding boxes
이때 살짝 헷갈릴 수 있는 것이, bboxes 라는 input은 bbox list들을 포함한 하나의 list이다.
(ex. [[0, 293, 3, 189], [156, 10, 52, 376], [348, 402, 35, 40]])
나의 경우, 하나의 이미지에 여러 개의 bbox가 라벨링 되어 있었기 때문에 이러한 input을 사용했다.
만약 이미지당 bbox가 하나라면 위의 코드에서 굳이 for문을 돌지 않아도 된다.
그리고 각 bbox는 역시 길이가 4인 list들이었는데,
나의 경우 COCO dataset을 활용했기 때문에 boundig box의 값들이 [x_min, y_min, width, height] 이었다.
하지만 OpenCV의 rectangle 함수는 2개의 point(직사각형의 시작점, 직사각형의 종료점)를 이용하기 때문에
bounding box의 좌표를 [x_min, y_min, x_max, y_max] 와 같은 좌표계로 바꿔줄 필요가 있다.
위의 함수에서 x_max와 y_max를 다시 정의해 준 이유이다.
bounding box를 나타내는 방법도 다양하니,
궁금한 분들은 아래 Albumentation 사이트를 방문해 보시길!
Albumentation 사이트 : https://albumentations.ai/docs/getting_started/bounding_boxes_augmentation/
'Tech > Computer Vision' 카테고리의 다른 글
[Albumentation] CropAndPad로 이미지에 패딩 처리하기 (0) | 2022.05.09 |
---|---|
[COCO Fifty One] Object detection을 위한 데이터 시각화 (1) : annotation 파일과 image 함께 보기 (0) | 2022.04.26 |