- 인공 지능 이란?
기계가 인간과 같이 생각하고 행동하는 것- 머신 러닝 이란?
인간이 생각하는 것이나 행동 하는 것의 규칙을 컴퓨터가 찾아내는 일- 머신러닝의 한 분야로 규칙을 찾아내기 위한 알고리즘
import cv2
# 오픈 패키지 cv2 import
import numpy as np
# 행렬 연산을 도와주는 패키지
net = cv2.dnn.readNetFromTorch('models/eccv16/starry_night.t7')
# OpenCV의 dnn 모델을 사용하는데 Troch로부터 모델을 읽어온다.
img = cv2.imread('imgs/01_(1).jpg')
cv2.imshow('img', img)
cv2.waitKey(0)
- 이미지 전처리
모델의 성능을 높이기위한 방법
- 💡 딥러닝 모델의 성능 이란?
딥러닝 모델이 얼마나 정답을 잘 맞추는지를 가리키는 정확도
h, w, c = img.shape
# shape : img의 정보를 불러온다.
# h,w,c의 변수에 높이,넓이,체널의 정보를 담는다.
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
# 이미지의 비율을 유지하며 크기 재조정
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
# blobFromImage : 전처리 함수
# 차원 변형
# mean=MEAN_VALUE : 모델에서 추천하는 정보
# 각 픽셀에 MEAN_VALUE만큼 빼준다.
- 비례 법칙을 이용한 비율 유지
- 결과 추론하기(Inference)
전처리 과정이 끝난 입력값을, 함수에 넣는 과정net.setInput(blob) # 전처리한 결과를, 입력값으로 지정하여 모델에 전달 output = net.forward() # 추론 : 결과값을 저장한다.
- 후처리
전처리 결과값은 인간이 이해하기 어려운 내용이기에
보기 쉽도록 재 가공하는 과정이 필요하다.output = output.squeeze().transpose((1, 2, 0)) output += MEAN_VALUE output = np.clip(output, 0, 255) output = output.astype('uint8')squeeze : 늘렸던 차원을 줄여준다
transpose : 차원 변형
clip : 값이 255이 넘어가지 않게끔 제한
astype : 정수형태로 바꿔준다.
import cv2
# 오픈 패키지 cv2 import
import numpy as np
# 행렬 연산을 도와주는 패키지
net = cv2.dnn.readNetFromTorch('models/eccv16/starry_night.t7')
# OpenCV의 dnn 모델을 사용하는데 Troch로부터 모델을 읽어온다.
img = cv2.imread('imgs/01_(1).jpg')
h, w, c = img.shape
# shape : img의 정보를 불러온다.
# h,w,c의 변수에 높이,넓이,체널의 정보를 담는다.
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
# 이미지의 비율을 유지하며 크기 재조정
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
# blobFromImage : 전처리 함수
# 차원 변형
# mean=MEAN_VALUE : 모델에서 추천하는 정보
# 각 픽셀에 MEAN_VALUE만큼 빼준다.
net.setInput(blob)
# 전처리한 결과를, 입력값으로 지정하여 모델에 입력
output = net.forward()
# 추론 : 결과값을저장한다
output = output.squeeze().transpose((1, 2, 0))
# squeeze : 늘렸던 차원을 줄여준다
# transpose : 차원 변형
output += MEAN_VALUE
output = np.clip(output, 0, 255)
# clip 값이 255이 넘어가지 않게끔 제한
output = output.astype('uint8')
# astype : 정수형태로 바꿔준다.
cv2.imshow('output', output)
cv2.imshow('img', img)
cv2.waitKey(0)
net = cv2.dnn.readNetFromTorch('models/eccv16/starry_night.t7')
net = cv2.dnn.readNetFromTorch('models/eccv16/la_muse.t7')
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
# 다양한 모델 적용 가능
- 각각의 모델의 데이터값을 받아온다.
- x방향 기준으로 절반을 잘라내어
- 각각의 모델에서 나온 출력값을 결합한다.
###########################################
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 += MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
######################################
output = output[:,0:250]
output2 = output2[:,250:500]
output3 = np.concatenate([output,output2],axis=1)
# axis = 1(x방향)
import cv2
import numpy as np
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
net2 = cv2.dnn.readNetFromTorch('models/instance_norm/the_scream.t7')
img = cv2.imread('imgs/03.jpg')
h, w, c = img.shape
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
net.setInput(blob)
output = net.forward()
output = output.squeeze().transpose((1, 2, 0))
output += MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
###########################################
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 += MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
######################################
output = output[:,0:250]
output2 = output2[:,250:500]
output3 = np.concatenate([output,output2],axis=1)
# axis = 1(x방향)
cv2.imshow('img', img)
cv2.imshow('output', output)
cv2.imshow('output2', output2)
cv2.imshow('output3', output3)
cv2.waitKey(0)
숙제 1.
- 원본 이미의 액자 부분만 crop 하여 추론하기
- 다양한 모델 적용해보기
- 바뀐 이미지를 다시 액자 안에 집어넣기
숙제 2.
- 이미지를 가로로 잘라 반반 적용하기
- 응용 : 가운데가 아닌 곳으로 나눠보기
- 응용 : 2개가 아닌 3개,4개로 나눠보기
숙제 3.
- 동영상에 적용해보기
- 응용 : 웹캠에서도 적용하기
import cv2
import numpy as np
net = cv2.dnn.readNetFromTorch('models/instance_norm/the_scream.t7')
img = cv2.imread('imgs/hw.jpg')
cropped_img = img[140:370, 480:810]
# 액자 위치 이미지 자르기
h, w, c = cropped_img.shape
# 원본 이미지의 정보, 높이, 넓이, 체널 정보 저장
cropped_img = cv2.resize(cropped_img, dsize=(500, int(h / w * 500)))
# 잘라낸 이미지를 원본 비율을 유지
print(img.shape)
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(cropped_img, mean=MEAN_VALUE)
# blobFromImage : 전처리 함수
# mean=MEAN_VALUE : 모델에서 추천하는 정보
# 각 픽셀에 MEAN_VALUE만큼 빼준다.
print(blob.shape)
net.setInput(blob)
# 전처리한 결과를 입력값으로 지정하여 모델에 입력
output = net.forward()
# 추론값을 저장한다.
output = output.squeeze().transpose((1, 2, 0))
# squeeze : 늘렸던 차원을 줄여준다
# transpose : 차원 변형
output = output + MEAN_VALUE
output = np.clip(output, 0, 255)
# clip 값이 255가 넘어가지 않도록 제한
output = output.astype('uint8')
# 정수 형태로 변환
output = cv2.resize(output, (w, h))
# out put 사이즈 재 정의
img[140:370, 480:810] = output
# 원본 이미지의 y축 x축에 새로운 이미지 삽입
cv2.imshow('img', img)
cv2.waitKey(0)
import cv2
import numpy as np
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
net2 = cv2.dnn.readNetFromTorch('models/instance_norm/the_scream.t7')
img = cv2.imread('imgs/hw.jpg')
h, w, c = img.shape
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
net.setInput(blob)
output = net.forward()
output = output.squeeze().transpose((1, 2, 0))
output += MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
###########################################
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 += MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
# ######################################
output = output[0:int(h / w * 500)//2,:]
output2 = output2[int(h / w * 500)//2:int(h / w * 500),:]
output3 = np.concatenate([output,output2],axis=0)
# axis = 1(x방향)
# cv2.imshow('img', img)
# cv2.imshow('output', output)
# cv2.imshow('output2', output2)
cv2.imshow('output3', output3)
cv2.waitKey(0)
import cv2
import numpy as np
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
net2 = cv2.dnn.readNetFromTorch('models/instance_norm/the_scream.t7')
net3 = cv2.dnn.readNetFromTorch('models/eccv16/la_muse.t7')
net4 = cv2.dnn.readNetFromTorch('models/eccv16/the_wave.t7')
img = cv2.imread('imgs/hw.jpg')
h, w, c = img.shape
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
net.setInput(blob)
output = net.forward()
output = output.squeeze().transpose((1, 2, 0))
output += MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
###########################################
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 += MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
#######################################
net3.setInput(blob)
output3 = net3.forward()
output3 = output3.squeeze().transpose((1, 2, 0))
output3 += MEAN_VALUE
output3 = np.clip(output3, 0, 255)
output3 = output3.astype('uint8')
# ######################################
net4.setInput(blob)
output4 = net4.forward()
output4 = output4.squeeze().transpose((1, 2, 0))
output4 += MEAN_VALUE
output4 = np.clip(output4, 0, 255)
output4 = output4.astype('uint8')
# ######################################
size = int(h / w * 500)
y1 = size//4
y2 = (size//4)*2
y3 = (size//4)*3
# size = 281
output = output[0:y1,0:250]
output2 = output2[y1:y2,0:250]
output3 = output3[y2:y3,0:250]
output4 = output4[y3:size,0:250]
img = img[:,250:500]
result = np.concatenate([output,output2,output3,output4,],axis=0)
result = np.concatenate([result,img],axis=1)
# cv2.imshow('img', img)
# cv2.imshow('output', output)
# cv2.imshow('output2', output2)
# cv2.imshow('output3', output3)
# cv2.imshow('output4', output4)
cv2.imshow('result', result)
cv2.waitKey(0)
import cv2
import numpy as np
cap = cv2.VideoCapture('imgs/03.mp4')
# VideoCapture : 동영상 로드
# 동영상 : 이미지의 연속
while True:
ret, img = cap.read()
# img : 동영상의 현재 프레임에 맞는 이미지 로드
# ret : 동영상이 끝나면 False
if ret == False:
break
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
net2 = cv2.dnn.readNetFromTorch('models/instance_norm/the_scream.t7')
h, w, c = img.shape
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
MEAN_VALUE = [103.939, 116.779, 123.680]
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
net.setInput(blob)
output = net.forward()
output = output.squeeze().transpose((1, 2, 0))
output += MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
###########################################
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 += MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
size = int(h / w * 500)
# size = 281
output = output[0:size//2,0:250]
output2 = output2[size//2:size,0:250]
img = img[:,250:500]
result = np.concatenate([output,output2],axis=0)
result = np.concatenate([result,img],axis=1)
cv2.imshow('result', result)
if cv2.waitKey(5) == ord('q'):
break
# waitKey(n) : n millisecond 만큼 기다린다.
# ord('q') : 만약 키보드의 q 버튼을 누르면 종료해라