1. Computer Vision

1-1) 영상 처리와 컴퓨터 비전

- 영상 처리

  • 컴퓨터를 사용해서 입력 영상 데이터를 처리하는 분야

- 컴퓨터 비전

  • 인간의 시각을 흉내내는 컴퓨터 프로그램
  • 입력 영상에서 의미있는 정보를 추출하는 분야
  • 제품의 결함을 검사하는 분야나 얼굴 인식이나 지문 인식이나 물체 검출 등이 컴퓨터 비전의 대표적인 분야

 

1-2) 이미지 처리

- 머신 러닝에서는 원본 이미지를 학습 알고리즘이 사용할 수 있도록 변환 수행

 

1-3) 컴퓨터 비전 분야

- Object Classification: 객체 분류, 이미지 분류

- Object Detection & Localization: 객체 식별

- Object Segmentation: 객체 분할

- Image Captioning: 이미지의 상황을 텍스트로 설명하는 기술

- Object Tracking

- Action Classification

 

1-4) 컴퓨터 비전의 어려움

- 사람은 이미지를 보지만 컴퓨터는 숫자를 봄

- 사람은 적은 데이터로 이미지 유추가 가능하지만 컴퓨터는 많은 양의 데이터를 필요로 함

- AI 서비스 환경에서는 사용자 데이터가 실시간으로 쌓이고 이를 반영하기 위한 반복적인 학습이 필수인데, MLOps 나 DevOps를 처음부터 고려해서 설계된 체계적이고 견고한 시스템이 많지 않음

 

1-5) 비전 체험 서비스

- 구글 렌즈

- Which face is real: https://www.whichfaceisreal.com - 생성형 AI를 이용해서 가짜 얼굴 영상을 만들고 골라내는 서비스

 

1-6) 이미지 데이터 셋

- CIFAR-10: 10개의 클래스에 대한 6만개의 이미지 데이터셋

- fashion MNIST: 10개의 클래스에 대한 7만개의 흑백 이미지 데이터셋

- Image Net: 1400 만 개 정도의 공개 이미지 데이터 셋

  • 일상 생활에 사용하는 모든 이미지를 포함하고 있는 데이터 셋

- MS COCO: 이미지를 설명하는 캡션도 같이 제공

- Cityscapes: 자율 주행 관련 이미지

 -Open image: 구글이 제공하는 이미지로 라벨링 과 주석이 같이 있는 이미지 셋

  • 최근에는 음성까지 추가

 

 

2. Open CV

- intel에서 만든 영상 처리와 컴퓨터 비전 관련 오픈 소스 라이브러리

- C/C++ 로 구현했는데 여러 플랫폼에서 C, C++, Python, Java, C#, Javascript 언어로 사용 가능

- MMX나 SSE 명령어를 통해서 고속의 알고리즘을 구현해서 실시간 비전 응용에 강점을 가지고 있음

- 영상 및 비디오 입출력, 영상 처리, 컴퓨터 비전 관련 기본 알고리즘, 기계 학습 모듈이 내장되어 있음

- 최근의 버전에서는 딥러닝 모델도 추가

- CUDA(Compute Unified Device Architecture) 와 Open CL 인터페이스가 개발되어 사용하고 있음

- 공식 사이트

 

설치

- opencv-python 패키지 설치

pip install opencv-python
import cv2
cv2.__version__

 

 

 

3. 윈도우 제어

3-1) 윈도우 생성

- cv2.namedWindow(이름[, 플래그])

  • 플래그: 윈도우 크기 관련 옵션: cv2.WINDOW_NORMAL 이나 cv2.WINDOW_AUTOSIZE
  • 일반적으로 파이썬은 옵션의 값을 문자열로 설정하는데 Open CV에서는 상수를 이용해서 설정

 

3-2) 윈도우 출력

- cv2.imshow(윈도우이름, 윈도우에 표시되는 영상 배열 - numpy.ndarray)

 

3-3) 윈도우 파괴

- cv2.destroyAllWIndows()

 

3-4) 윈도우 생성 및 출력

#윈도우 생성
cv2.namedWindow("window")

#윈도우에 출력할 이미지
image = np.ones((200, 300), np.float64)

#윈도우에 이미지를 출력
cv2.imshow("window", image)

#무한 반복
while True:
    #키보드 입력을 받아서 27(esc)이면 무한 반복 종료
    key = cv2.waitKeyEx(100)
    if key == 27:
        break
        
cv2.destroyAllWindows()

 

 

 

4. 영상 입출력

4-1) 영상 가져오기

- cv2.imread("이미지 파일 경로", 이미지 옵션) -> numpy.ndarray

- 이미지 옵션

  • cv2.IMREAD_UNCHANGED: 알파채널 포함
  • cv2.IMREAD_GRAYSCALE: 흑백
  • cv2.IMREAD_COLOR: 컬러 영상의 기본
  • cv2.IMREAD_ANYDEPTH: 8비트 영상으로 생성
  • cv2.IMREAD_ANYCOLOR

 

4-2) matplotlib.pyplot.imshow

- matplotlib을 이용해서 이미지를 출력

- numpy 의 ndarray 나 PIL 이미지를 출력

- 컬러 이미지를 출력할 때 BGR 순으로 출력하기 때문에 빨강 색과 파랑 색이 반전되서 출력되므로 출력할 때 cv2.cvtColor(이미지 데이터, cv2.COLOR_BGR2RGB)를 이용해서 색상 값의 순서를 변경해 주어야 합니다.

 

 

4-3) 이미지를 흑백으로 출력하고 이미지 데이터의 차원을 확인

import cv2
from matplotlib import pyplot as plt

#이미지를 흑백으로 가져오기
image = cv2.imread("./data/redpanda.png", cv2.IMREAD_GRAYSCALE)

#이미지 출력
plt.imshow(image, cmap='gray')
plt.show()

*이미지 출처: https://mshk43.tistory.com/14
#흑백 이미지의 shape(차원): 2차원 좌표에 값이 있는 구조
#이미지와 관련된 딥러닝은 4차원 데이터만 다룬다.
print(image.shape)

#하나의 픽셀 값을 알고자 하는 경우
print(image[100, 100])

 

(732, 730)
66

 

 

4-4) 이미지를 컬러로 출력

#이미지를 컬러로 가져오기
#이미지를 가져올 때는 BGR 형태로 가져옵니다.
image = cv2.imread("./data/redpanda.png", cv2.IMREAD_COLOR)

# 컬러 이미지를 화면에 출력할 때는 R 과 B의 값을 스위치해야 합니다.
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

#이미지 출력
#BGR의 형태로 출력: 빨강색과 파랑색의 값이 스위치 되어서 출력
#plt.imshow(image)
plt.imshow(image_rgb)
plt.show()
print(image_rgb.shape)#컬럼 이미지는 3차원
(732, 730, 3)

 

 

 

 

5. 배열 처리

- 이미지를 전처리하는 것은 numpy의 ndarray를 조작하는 것

- 차원을 변경하거나 타입을 변경하고자 하면 reshape, flattern, astype 같은 함수 이용

 

5-1) 이미지 크기 변경

- 머신러닝(+딥러닝)에서는 배열 데이터만 다룰 수 있음

*배열 데이터는 동일한 자료형이어야 하고 동일한 차원의 데이터여야 한다.

- 많은 양의 이미지 데이터를 가지고 학습을 하면 메모리 사용량이 많기 때문에 머신이 제대로 학습을 못할 수 있기 때문에 줄여서 학습을 수행하기도 함

- 머신 러닝에서 많이 사용하는 이미지 크기는 32 X 32, 64 X 64, 96 X 96, 256 X 256 등 

- resize(이미지데이터, (가로 크기, 세로 크기)): 이미지 데이터를 가로 크기 와 세로 크기에 맞게 사이즈 조정을 수행

 

# 이미지 차원 변경

#이미지를 흑백으로 가져오기
image = cv2.imread("./data/redpanda.png", cv2.IMREAD_GRAYSCALE)
print("원본 이미지 구조:", image.shape)

#1차원으로 구조를 수정
img = image.reshape(image.shape[0] * image.shape[1])
print(img.shape)

img = image.flatten()
print(img.shape)
원본 이미지 구조: (732, 730)
(534360,)
(534360,)

 

image = cv2.imread("./data/redpanda_64.png", cv2.IMREAD_GRAYSCALE)

#64*64로 이미지 크기를 변경
result = cv2.resize(image, dsize=(64, 64))

plt.imshow(result, cmap='gray')
plt.show()

 

 

5-2) 배열에서 특정 영역 선택

- ROI(Region of Interest - 관심 영역) 선택

  • 이미지를 가지고 예측을 할 때 이미지의 모든 데이터가 필요한 것이 아니기 때문에 예측을 하기 위해서 필요한 영역을 선택하는 것은 중요한 작업
  • 회귀나 분류에서 feature selection(피처의 중요도를 파악해서 특정 피처를 선택하는 것) 과 유사한 작업

- 특정 영역을 선택한 후 이 데이터만 추출해서 작업을 하기도 하고 마스킹을 하기도 함

img = cv2.imread('./data/redpanda.png', cv2.IMREAD_GRAYSCALE)

#특정 영역을 선택해서 마스킹: 0이 검정색 255가 흰색
img[300:400, 200:450] = 255

plt.imshow(img, cmap="gray")
plt.show()

 

 

5-3) 회전

- 이미지 머신 러닝(딥 러닝)의 결과가 정확하지 않은 경우 혹은 이미지 데이터가 부족한 경우 이미지 증강을 위해서 수행

- 고정된 카메라가 영상을 만든다면 모든 영상의 각도가 일정하겠지만, 실제 카메라를 들고 촬영한 영상은 동일한 이미지더라도 각도가 다른 경우가 있기 때문에 학습을 할 때 이 부분을 고려하는 것이 좋다.

 

- 2차원 배열을 수직, 수평 양축으로 뒤집기

  • cv2.flip(src, flipCode[,dst])
    • src: 뒤집을 이미지
    • dst: 결과를 저장할 배열 (리턴하기 때문에 생략 가능)
    • flipCode: 배열을 뒤집는 축. 0이면 X축 기준으로 뒤집고, 1이면 Y축 기준으로 뒤집고, -1이면 양방향 모두 뒤집음

- 전치 (행열치환)

  • cv2.transpose(src[, dst]) -> dst
    • 매개변수dst: 저장할 배열.  리턴 타입에 있는 dst를 리턴하는 결과인데 값 자체는 동일

- 복사

  • cv2.repeat(src, nx, ny[,dst]) ->dst
    • nx 와 ny는 반복 횟수

 

# 이미지 복사 및 회전

x_axis
y_axis
xy_axis
trans_image
rep_image

 

 

5-4) 이미지의 연산

- 이미지는 산술 연산은 거의 수행하지 않음

  • 덧셈을 하는 경우에 255를 초과하면 의미가 없기 때문
  • 뺄셈을 하는 경우에 음수가 나오면 무의미

- 이미지는 비트 연산을 많이 수행

  • 비트 연산을 이용해서 이미지 합성을 수행
  • bitwise_or(둘 다 0인 경우만 0이고 나머지는 1), 
    bitwise_and(둘 다 1인 경우만 1이고 나머지는 0), 
    bitwise_xor(같으면 0 다르면 1)
  • 0 과 0 또는 1 과 1 이면 0 그 이외의 경우는 1), bitwise_not(0->1, 1->0) 으로 연산
#2개의 배열 생성
image1 = np.zeros((300, 300), np.uint8)
image2 = image1.copy()

#중앙점의 좌표 찾기
h, w = image1.shape[:2]
cx, cy = w//2, h//2

#배열에 원과 사각형 그리기
cv2.circle(image1, (cx, cy), 100, 255, -1)
cv2.rectangle(image2, (0, 0, cx, h), 255, -1)
#or를 하게되면 색상이 있는 영역이 합쳐집니다.
image3 = cv2.bitwise_or(image1, image2)
#and를 하게되면 색상이 없는 영역이 합쳐집니다.
image4 = cv2.bitwise_and(image1, image2)
#xor를 하게되면 색상이 색상이 같은 영역은 색상이 제거되고 그렇지 않은 영역만 색상이 
#칠해집니다.
image5 = cv2.bitwise_xor(image1, image2)

cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
cv2.imshow("image3", image3)
cv2.imshow("image4", image4)
cv2.imshow("image5", image5)

cv2.waitKey(0)
image1
image2
image3
image4

image5

 

 

5-5) 통계 함수 사용 가능 - 이미지 선명화

image = cv2.imread("./data/redpanda.png", cv2.IMREAD_GRAYSCALE)

(min_val, max_val, _, _) = cv2.minMaxLoc(image)

ratio = 255/(max_val - min_val)
dst = np.round((image - min_val) * ratio).astype('uint8')

cv2.imshow("image", image)
cv2.imshow("dst", dst)
cv2.waitKey(0)

 

'Python' 카테고리의 다른 글

[Python] 확률 분포 모형  (1) 2024.02.26
[Python] 기술통계  (0) 2024.02.22
[Python] 확률  (0) 2024.02.21
[Python] 데이터 스케일링  (1) 2024.02.16
[Python] 데이터 전처리  (0) 2024.02.15