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 |