딥러닝 학습 Week2

손성수·2023년 5월 16일

인공지능

  • 인공 지능 이란?
    기계가 인간과 같이 생각하고 행동하는 것
  • 머신 러닝 이란?
    인간이 생각하는 것이나 행동 하는 것의 규칙을 컴퓨터가 찾아내는 일
  • 머신러닝의 한 분야로 규칙을 찾아내기 위한 알고리즘

준비된 모델로 데이터 뽑아내기

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.

  • 동영상에 적용해보기
  • 응용 : 웹캠에서도 적용하기

숙제 풀이

  • 숙제 1
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)

  • 숙제 2 - 1
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)

  • 숙제 2 - 2
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)

  • 숙제 3
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 버튼을 누르면 종료해라
profile
더 노력하겠습니다

0개의 댓글