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 |