본문 바로가기
Study/Machine learning,NLP

이미지 데이터 다루기

by 왕방개 2024. 2. 20.

1.Computer Vision

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

=>영상 처리

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

 

=>컴퓨터 비전(Computer Vision)

-인간의 시각을 흉내내는 컴퓨터 프로그램

-입력 영상에서 의미있는 정보를 추출하는 분야

-제품의 결함을 검사하는 분야나 얼굴 인식이나 지문 인식이나 물체 검출 등이 컴퓨터 비저의 대표분야

 

2)이미지 처리

=>머신 러닝 분야에서는 원본 이미지를 학습 알고리즘이 사용할 수 있도록 변환을 수행하는 것

 

3)컴퓨터 비전 분야

=>Objective Classification:객체 분류, 이미지 분류

=>Objective detection&Localization:객체 식별

=>Objectvie Segmentation:객체 분할

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

=>Objective Tracking

=>Action Classification

 

4)컴퓨터 비전의 어려움

=>사람은 이미지를 보지만 컴퓨터는 숫자를 바라봄

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

=>AI 서비스 환경에서는 사용자 데이터가 실시간으로 쌓고 이를 반영하기 위한 반복적인 학습이 필수인데 

MLOps 나 DevOps 를 처음부터 고려해서 설계된 체계적이고 견고한 시스템이 많지 않음

커뮤니티 기반 추천서비스.

 

5)비전 체험 서비스

=>구글 렌즈

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

 

6)이미지 데이터셋

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

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

=>ImageNet:1400만개 정도의 공개 이미지 데이터셋

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

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

=>CItyscapes:자율 주행 관련 이미지

=>Open image:구글이 제공하는 이미지로 라벨링과 주석이 같이 있는 이미지 셋.최근에는 음성까지 추가

 

2.Open CV

1)개요

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

=>C/C++ 로 구현했지만 여러 플랫폼에서 C,C++,Python,Java,C#,Javascript언어로 사용가능

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

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

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

=>CUDA와 Open CL 인터페이스가 개발되어 사용하고 있음

=>공식 사이트

-https://opencv.org

-https://docs.opencv.org/4.x/index.html

 

2)설치

=>opencv-python 패키지 설치

=>확인

import cv2

cv2.__version__

 

3.윈도우제어

1)윈도우 생성

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

플래그는 윈도우 크기 관련 옵션:cv2.WINDOW_NORMAL 이나 cv2.WINDOW_AUTOSIZE 

-일반적으로 파이썬은 옵션의 값을 문자열로 설정하는데 OpenCV에서는 상수를 이용해서 설정

 

2)윈도우 출력

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

 

3)윈도우 파괴

=>cv2.destroyALLWindows()

import cv2
import numpy as np

#윈도우생성
cv2.namedWindow("window")
#윈도우 출력할 이미지
image=np.ones((200,300),np.float64)
cv2.imshow("window",image)

while True:
    key = cv2.waitKeyEx(100)
    if key == 27: #ESC
        break

cv2.destroyAllWindows()

 

 

4.영상 입출력

1)영상 가져오기

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

이미지 옵션

cv2.IMREAD_UNCHANGED:알파 채널 포함

cv2.IMREAD_GRAYSCALE:흑백

cv2.IMREAD_COLOR:컬러 영상의 기본

cv2.IMREAD_ANYDEPTH:8비트 영상으로 생성

cv2.IMREAD_ANYCOLOR

 

2)matplotlib.pyplot.imshow

=>matplotlib을 이용해서 이미지를 출력

=>numpy의 ndarray나 PIL 이미지를 출력

=>컬러 이미지를 출력할 떄 BGR순으로 출력하기 떄문에 빨강색과 파랑색이 반전되서 출력되므로 출력할 떄 

cv2.cvtColor(이미지 데이터,cv2.COLOR_BGR2RGB)를 이용해서 색상 값의 순서를 변경해주어야합니다

 

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

import cv2
from matplotlib import pyplot as plt

#이미지를 흑백으로 가져오기
image=cv2.imread("plane.jpg",cv2.IMREAD_GRAYSCALE)

plt.imshow(image,cmap='grey')
plt.show()

#흑백이미지의 shape(차원):2차원 좌표에 값이 있는 구조
#이미지와 관련된 딥러닝은 4차원 데이터만 다룸
print(image.shape)

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

 

#이미지를 컬러로 가져오기
#이미지를 가져올 떄는 RGB 형태로 가져옵니다
image= cv2.imread("plane.jpg",cv2.IMREAD_COLOR)

#컬러이미지를 화면에 출력할 때는 R과 B의 값을 스위치 해야합니다
image_rgb=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
#이미지출력
#BGR형태로 출력: 빨강색과 파랑색의 값이 스위치 되어서 출력
plt.imshow(image_rgb)
plt.show()
print(image_rgb.shape) #칼러는 3차원

 

5.배열 처리

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

=>차원을 변경하거나 타입을 변경하고자 하면 reshape나 flattern 그리고 astype 같은 함수를 이용

 

1)이미지 크기 변경

=>머신러닝 에서는 배열(동일한 자료형이어야 하고 동일한 차원의 데이터) 데이터만 다룰수 있음

=>머신러닝에 사용할 모든 데이터는 차원이 같아야 합니다.

=>머신러닝에서 많이 사용하는 이미지크기는 32x 32, 64x64, 96x96,256x256 등입니다

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

=>이미지 차원 변경

#이미지를 흑백으로 가져오기
image=cv2.imread("plane.jpg",cv2.IMREAD_GRAYSCALE)

print("원본이미지구조:",image.shape)

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

img=img.flatten()
print(img.shape)

#다차원으로 변경
result=img.reshape(2270,3600)
print(result.shape)

#다차원으로 변경할때 하나의 차원은 -1로 설정하는 것이 가능
#-1로 설정하는 곳은 나머지를 배정하고 남은 개수가 자동으로 설정됩니다
r=img.reshape(2270,-1)
print(r.shape)

 

=>이미지 크기 변경

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

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

 

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

=>ROI(Region of Interest - 관심영역) 선택:이미지를 가지고 예측을 할 때 이미지의 모든 데이터가 필요한 것이 아니기 떄문에 예측을 하기 위해서 필요한 영역을 선택하는 것은 중요한 작업

회귀나 분류에서는 이게 Feature Selection(피처의 중요도를 파악해 특정피처를 선택)과 유사한 역할을 함

img=cv2.imread("C:\\Users\\User\\Desktop\\python_opencv-main\\python_opencv-main\\data\\lena.jpg",cv2.IMREAD_GRAYSCALE)

#특정영역을 선택해서 마스킹
img[100:400, 200:300]=255
plt.imshow(img,cmap="gray")
plt.show()

 

3)회전

=>이미지를 회전시키는 경우가 있는데 이미지 머신러닝의 결과가 정확하지 않은 경우 또는 이미지 데이터가 부족한 경우 이미지 증강을 위해서 수행합니다.

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

 

  cv2.flip(rc,flopCode[,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은 반복횟수

import cv2

#사용할 이미지 불러오기
image=cv2.imread("C:\\Users\\User\\Desktop\\python_opencv-main\\python_opencv-main\\data\\flip_test.jpg",cv2.IMREAD_COLOR)

#print(image) 잘불러왔는지 확인

#회전
x_axis=cv2.flip(image,0)
y_axis=cv2.flip(image,1)
xy_axis=cv2.flip(image,-1)


#복사
rep_image=cv2.repeat(image,1,2)

#전치
trans_image=cv2.transpose(image)

#문자열에 해당하는 인스턴스를 생성 -eval

titles=["image","x_axis","y_axis","xy_axis","rep_image","trans_image"]

for title in titles:
    cv2.imshow(title,eval(title))

cv2.waitKey(0)

 

 

4) 이미지의 연산

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

덧셈을 하는 경우에 255를 초과하면 의미가 없기 때문

뺼셈을 하는 경우에 음수가 나오면 무의미

 

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

비트 연산을 이용해서 이미지 합성을 수행

bitwise_or(둘 다 0인경우만 0이고 나머지는 1),bitwise_and(둘다 1인 경우만 1이고 나머지는 0)

,bitwise_xor(같으면 0 다르면 1,bitwise_not(0->1, 1->0) 으로 연산

import cv2
import numpy as np

# 2개의 배열 생성
image1 = np.zeros((300, 300), np.uint8)
image2 = image1.copy()  # Use copy() to create a separate copy of the image

# 중앙점의 좌표 찾기
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)  # Fix the rectangle coordinates

# OR 연산
image3 = cv2.bitwise_or(image1, image2)

# AND 연산
image4 = cv2.bitwise_and(image1, image2)

# 이미지 표시
cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
cv2.imshow("image3", image3)
cv2.imshow("image4", image4)

cv2.waitKey(0)
cv2.destroyAllWindows()

 

'Study > Machine learning,NLP' 카테고리의 다른 글

머신러닝(5) - Regression(2)  (0) 2024.03.05
머신러닝(4)-Regression(1)  (0) 2024.03.04
머신러닝(3)-Classification(2)  (0) 2024.02.29
머신러닝(2)-Classification(1)  (0) 2024.02.28
머신러닝(1)  (1) 2024.02.27