-
TIL 2023.05.19내일배움캠프 2023. 5. 19. 20:31
유명 화가의 화풍을 따라하는 인공지능 만들기
OpenCV가 설치되어 있어야 한다.
pip install opencv-python
패키지 불러오기
import cv2 import numpy as np
모델 불러오기
net = cv2.dnn.readNetFromTorch('models/eccv16/starry_night.t7')
모델은 스파르타코딩클럽에서 제공해주었는데 맘대로 배포해도 되는 지는 모르겠어서 파일을 공유하진 않는다.
관련 논문들:
https://cs.stanford.edu/people/jcjohns/papers/eccv16/JohnsonECCV16.pdf
https://arxiv.org/pdf/1607.08022.pdf
이미지 불러오기
img = cv2.imread('이미지파일 경로')
전처리
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)
h, w, c 는 각각 이미지의 높이 너비 채널
가로 500에 맞춰서 리사이즈
cv2.dnn.blobFromImage는
- MEAN_VALUE 빼기 연산 (MEAN_VALUE = 연구원들이 사용했던 전처리 방법)
- 딥러닝 모델에 넣기 위한 이미지 데이터 차원 변형
의 작업을 해준다.
전처리 전, 후의 shape를 보면
print(img.shape) # (325, 500, 3) MEAN_VALUE = [103.939, 116.779, 123.680] blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE) print(blob.shape) # (1, 3, 325, 500)
이렇게 바뀐 걸 알 수 있다.
(높이, 너비, 채널) 의 순서를 (배치사이즈, 채널, 높이, 너비) 로 변형
추론 결과 보기
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()> (높이, 너비, 채널)
빼줬던 MEAN_VALUE를 더해주고
0~255를 벗어난 픽셀을 없애주고
이미지의 자료형을 정수형(uint8)로 바꿔준다.
출력하기
cv2.imshow('img', img) cv2.imshow('result', output) cv2.waitKey(0)
좌: 원본 이미지, 우: 변환된 이미지 '내일배움캠프' 카테고리의 다른 글
TIL 2023.05.22 (0) 2023.05.22 WIL 내일배움캠프 10주차 (0) 2023.05.19 TIL 2023.05.18 (0) 2023.05.18 TIL 2023.05.17 (0) 2023.05.17 TIL 2023.05.16 (0) 2023.05.16