본문 바로가기

Computer Vision Study

Chapter2) Object Detection 과 Segmentation 을 위한 주요 데이터 세트 및 OpenCV 소개

목차

1. Object Detection 주요 데이터 세트 소개 및 Pascal VOC 데이터 세트의 이해

2. Pascal VOC 데이터 세트 탐색하기

3. MS-COCO 데이터 세트의 이해

4. OpenCV 개요

5. OpenCV를 활용한 이미지 처리 실습

6. OpenCV를 활용한 영상 처리 실습

7. Object Detection 네트워크 개요 및 FPS / Resolution / 성능 상관관계

 

1. Object Detection 주요 데이터 세트 소개 및 Pascal VOC 데이터 세트의 이해

 

많은 Detection 과 Segmentation 의 딥러닝 프레임워크에서는 해당 dataset 을 기반으로 Pretrained 되어 있다.

(1) PASCAL VOC : 20 개의 카테고리

(2) MS COCO : 80 개의 카테고리

(3) Google Open Images : 600 개의 카테고리

 

Annotation 이란?

이미지의 detection 정보를 별도의 설명 파일로 제공되는 것을 일반적으로 annotation 이라고 한다.

annotation 은 object 의 bounding box 위치나 object 이름 등 특정 format으로 제공

 

2. Pascal VOC 데이터 세트 탐색하기

 

PASCAL VOC 구조

1) Annotations : Xml format 이며, 개별 xml 파일은 하나의 이미지에 대한 annotation 정보를 가지고 있다.

(확장자 xml을 제외한 파일명은 image 파일명과 동일하게 매핑되어 있다.)

2) ImageSet : train, test, trainval, val 에 사용할 것인지에 대한 매핑 정보를 개별 object 별로 파일 구성.

3) JPEGImages : 사용될 원본 이미지

4) SegmentationClass : Semantic Segmentation 에 사용될 masking 이미지

5) SegmentationObject : Instance Segmentation 에 사용될 masking 이미지

 

3. MS-COCO 데이터 세트의 이해

 

MS-COCO (Tensorflow object detection api 및 많은 오픈 소스 계열의 주요 패키지들은 COCO Dataset 으로 pretrained 되어 있다.)

COCO 2017  데이터셋 기준

train, val, test 파일로 나뉘어 있고 이것은 JSON format 인 한 개의 파일로 구성되어 있다.

JSON 파일 내부를 살펴보자

1) info : COCO dataset 생성 일자 등을 가지는 헤더 정보이다.

2) license : 이미지 파일의 라이센스 정보

3) images : image 의 id, width, height 정보

4) annotations

5) categories

 

COCO Dataset 은 이미지 PASCAL VOC 와는 다소 달리 하나의 이미지에 여러 오브젝트들을 가지고 있는 특징이 있다. 여러 오브젝트가 하나의 이미지에 있다는 것은 비교적 난이도가 높은 데이터를 제공하는 것으로 가늠할 수 있다.

 

4. OpenCV 개요

 

Python 기반 주요 이미지 라이브러리로는 PIL, Scikit Image, OpenCV 가 있다.

PIL : 주로 이미지 처리에 활용되고, 처리 성능이 다른 두 라이브러리보다 상대적으로 느리다.

Scikit Image : 파이썬 기반의 전반적인 컴퓨터 비전 기능을 제공하며, Scipy (Numpy사용) 기반이다.

OpenCV : 컴퓨터 비전 기능 일반화에 큰 기여를 하였고 오픈소스 기반 최고의 인기를 갖는 라이브러리 이다.

 

5. OpenCV를 활용한 이미지 처리 실습

 

(1) OpenCV 이미지 로딩

imread() 를 이용한 이미지 로딩

- imread('파일명')을 이용하여 읽어낼 수 있고, 파일을 읽어 ndarray 형태로 변환되어 반환한다.

- imread() 를 이용하여 이미지 로딩 시 가장 주의할 것은 OpenCV 가 이미지를 RGB 형태가 아닌 BGR 형태로 로딩하기 때문에 색감이 원본과 다르게 나타난다.

 

(2) OpenCV 이미지 로딩 시 BGR 을 RGB 로 변환

cvtColor() 를 이용하여 BGR 을 RGB 로 변환이 가능하다.

예)

bgr_img_array = cv2.imread('파일명')

rgb_img_array = cv2.cvtColor(bgr_img_array, cv2.COLOR_BGR2RGB)

 

(3) OpenCV 이미지 배열을 파일에 쓰기

imwrite() 를 이용하여 파일에 쓰기

예)

img_array = cv2.imread('파일명')

cv2.imwrite('출력파일명', img_array)

 

*유의사항 : imread 와는 달리 imwrite 는 원본 RGB 형태의 이미지를 BGR 형태로 imread() 이용으로 읽어내고 imwrite() 로 다시 저장할 시 원래의 RGB 형태가 유지되는 경향이 있다.

 

6. OpenCV를 활용한 영상 처리 실습

 

OpenCV 의 VideoCapture 클래스는 동영상을 개별 Frame 으로 하나씩 읽어들이는 기능 제공

VideoWriter 는 VideoCapture 로 읽어낸 개별 Frame 을 동영상 파일로 Write 수행.

 

예)

capture = cv2.VideoCapture(video_input_path)

vid_writer = cv2.VideoWriter(video_output_path, ---)

 

VideoCapture 의 개요

capture = cv2.VideoCapture(video_input_path)

 

입력 video 의 다양한 속성을 얻어올 수 있다.

영상 Frame 너비 : capture.get(cv2.CAP_PROP_FRAME_WIDTH)

영상 Frame 높이 : capture.get(cv2.CAP_PROP_FRAME_HEIGHT)

영상 FPS : capture.get(cv2.CAP_PROP_FPS)

 

while 문을 무한루프로 이용하게되면 read()에서 마지막 frame까지 차례로 읽게할 수 있다.

while True:

    hasFrame, img_frame = capture.read()

    if not hasFrame:

        print('Do not exist more img_frame')

        break

위와 같이 while 을 사용하면 img_frame 으로 한 프레임씩 넘어오게 되기 때문에 차례로 작업을 수행 가능케 한다.

 

VideoWriter 의 개요

입력인자 : write 할 파일 위치, Encoding 코덱 유형, write fps 수치, frame 크기를 생성자로 입력 받아 이 값에 따른 동영상 Write 수행

VideoWriter는 write 시 특정 format으로 동영상을 Encoding 할 수 있음(DIVX, XVID, MJPG, ---)

 

예)

capture = cv2.VideoCapture(video_input_path)

codec = cv2.VideoWriter_fourcc(*'XVID')

vid_size = (round(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),round(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

vid_fps = capture.get(cv2.CAP_PROP_FPS)

vid_writer = cv2.VideoWriter(video_output_path, codec, vid_fps, vid_size)

 

7. Object Detection 네트워크 개요 및 FPS / Resolution / 성능 상관관계

 

Object Detection 네트워크의 개요를 간단하게 살펴보면

Input_image -> Feature Extractor Network -> Object Detection Network -> Output 의 전개이다.

                       (VGG, RESNET, 등 backbone net) (RCNN, faster-RCNN 과 같은 방법)

 

위 과정과 함께 Input_image 가 region proposal 을 통하여 바로 object detection 으로 수행될 수 있다.

 

Image Resolution, FPS, Detection 의 성능 상관관계

 

높은 해상도를 갖게 되면 물론 Detection 의 성능이 향상된다. 당연하겠지만, 선명한 이미지를 전해 받았다면 탐지하기가 쉽다라는 개념이다. 하지만 FPS (Frame per Second) 한 초에 처리하는 frame 에 대한 약어이다. 말 그래도 선명해진다면 초당 처리할 수 있는 frame 수가 적어지기에 FPS 는 떨어진다.