본문 바로가기
python/딥러닝

[컴퓨터 비전] 주요 Dataset 과 openCV, 컴퓨터 비전 패키지

by _avocado_ 2021. 4. 22.
인프런 - 권철민 님의 '딥러닝 컴퓨터 비전 완벽 가이드'를 정리한 내용입니다.

Object Detection과 Segmentation을 위한 주요 Dataset

3개의 주요 데이터 셋

1. PASCAL VOC (주로 2012 버전)

 

- Detection을 위한 20개의 카테고리를 갖는 데이터를 제공한다.

 

- Detection, Segmentation, Action Classification, Person Layout을 위한 데이터를 제공한다.

 

- Annotation을 xml 형태로 제공

Annotation이란?

이미지의 Detection 정보를 설명 파일로 저장한 것을 말한다.

이미지 class, Boundering box의 위치 등을 특정 포맷으로 전달한다.

 

2. MS-COCO (주로 2017 버전)

 

- Detection을 위한 80개의 카테고리를 갖는 데이터 제공

 

- 하나의 이미지의 평균 5개의 Object로 구성 (난이도가 있는 이미지가 많다.)

 

- 주요 Detection 패키지들의 모델들이 COCO 데이터로 학습된 경우가 많다.

 

- Annotation을 json 포맷으로 전달

 

 

3. Google Open Images (2018)

 

- Detection을 위한 600개의 카테고리를 제공

 

- Annotation을 csv형태로 제공

 

- 학습하는데 시간이 너무 오래 걸려 많이 사용하지는 않는다.


OpenCV 개요

 

다양한 이미지 처리 라이브러리

여러 이미지 라이브러리들이 존재한다.

openCV를 사용하는 이유

 

- 가장 인기가 많은 라이브러리다.

 

- 어려운 기능도 짧은 코드로 구현이 가능하다. (컴퓨터 비전에 많은 기여를 하였다.)

 

- 다양한 언어 지원 (C++/python/Java/C#) 및 다양한 플랫폼에서 사용 가능 (window/Linux/MacOS/안드로이드/IOS)

 

- 최적화가 되어있어 가장 빠르다.


openCV의 활용

이미지 로딩: cv2.imread('파일 경로')

 

이미지 보기: cv2.imshow('tittle', 로드한 이미지)

 

이미지 저장: cv2.imwrite('파일 경로', 저장할 이미지)

import cv2

img_path = 'sample.jpg'


# 이미지 로드
img = cv2.imread(img_path)

# 이미지 보기
cv2.imshow('sample',img)

# 이미지 저장하기
cv2.inwrite('sample2.jpg',img)

 

● 주의할 점

 

openCV는 이미지를 로드할 때 BGR순서로 가져온다. cv2를 이용하여 시각화할 때는 정상적인 이미지를 볼 수 있지만

 

RGB순서로 인식하는 matplotlib을 이용해야 하는 jupyter/colab 등의 환경에서는 아래처럼 색이 변한다.

정상이미지/cv2로 읽고 matplotlib으로 시각화한 이미지

따라서 변환을 해주어야 한다.

 

BGR을 RGB순서로 변환하기 : cv2.cvtColor(로드한 이미지, cv2.COLOR_BGR2RGB) 또는 img[:,:,::-1] (배열의 순서만 바꾼다.)

import cv2

BGR_img = cv2.inread('sample.jpg')

RGB_img = cv2.cvtColor(BGR_img, cv2.COLOR_BGR2RGB)

RGB_img = BGR_img[:,:,::-1]

 

단, 저장할 때에는 BGR 형태로 저장을 하여야 정상적인 이미지로 활용이 가능하다.


OpenCV 영상 처리 개요

openCV의 VideoCapture 클래스를 이용한다. 영상의 Frame을 하나씩 읽어 낼 수 있다. (이미지처럼)

 

VideoWrite를 이용하여 개별 Frame을 다시 동영상 파일로 저장할 수 있다.

import cv2

# 영상을 읽어오기
cap = cv2.VideoCapture(video_input_path)

# 저장하기위한 writer 지정
vid_writer = cv2.VideoWriter(video_output_path, codec, fps등)

# 개별 프레임을 읽어 각각 처리하는 방법
while True:
	
    hasFrame, img_frame = cap.read() # 프레임을 하나씩 받는다. 받을 프레임이 없다면 hasFrame = False 반환
    
    if not hasFrame:
	
    	print('더 이상 처리할 frame이 없습니다.') 
        
        break
        
    # 각 프레임을 writer에 저장
	vid_writer.write(img_frame)

영상 정보 관련 함수

 

영상 cap : cap = cv2.VideoCapture('영상 경로')

 

영상 넓이: cap.get(cv2.CAP_PROP_FRAME_WIDTH)

 

영상 넓이: cap.get(cv2.CAP_PROP_FRAME_HEIGHT)

 

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


Object Detection 및 Segmentation을 위한 다양항 패키지

1. keras, Tensorflow 기반 다양한 패키지

 

- 쉬운 활용 및 Custermization이 가능하다.

 

- 알고리즘 별 다른 패키지를 사용해야 한다.

YOLO, Retinanet, Mask R-CNN 등

 

2. OpenCV 내의 DNN 모듈

 

- openCV 설치 시 함께 설치된다. (바로 사용 가능)

 

- 학습이 불가능하고 (정해진 모델만 사용) CUP만 사용 가능하다.

 

3. Tensorflow Object Detection API

 

- 가장 많은 알고리즘 적용 가능하다.

 

- 다루기가 어렵다. 버전 1에서만 현재 사용 가능하며 버전 2와는 충돌한다.


Object Detection 네트워크 개요

이미지가 2개의 모델을 통과하면서 Object Detection을 수행한다.

 

모델 1에서는 feature extraction과정이 일어나고 주로 ResNet, Inception 등이 활용된다. (imagenet으로 학습된)

 

모델 2에서는 Detection을 수행하며 Pascal VOC/MS-COCO로 학습된 모델을 활용한다.

 

성능에 영향을 미치는 요인

1. Image Resolution : 선명한 이미지일수록 좋은 성능을 내지만 속도(FPS)는 감소한다.

 

2. FPS : 속도가 중요한 경우 성능 감소는 감수해야 한다. (트레이드오프)

댓글