- Deep Learning
[#1. 내가 가져온 이미지 편집]
import cv2
img = cv2.imread('01.jpg')
print(img)
print(img.shape)
# 사각형
cv2.rectangle(img, pt1=(259, 89), pt2=(380, 348), color=(255, 0, 0), thickness=2)
# 원
cv2.circle(img, center=(320, 220), radius=100, color=(255, 255, 0), thickness=2)
# cropped_img 이미지로 저장 후 띄워주기 / cropped_img좌표 순서는 Y->X순
cropped_img = img[89:348, 259:380]
# img_resized : 이미지 크기 조정
img_resized = cv2.resize(img, (512, 256))
# img_rgb : 이미지 색상 변경
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow('result', img)
cv2.imshow('cropped', cropped_img)
cv2.imshow('resized', img_resized)
cv2.imshow('result', img_rgb)
cv2.waitKey(0)
[#2. 내가 가져온 이미지 합성]
import cv2
img = cv2.imread('01.jpg')
# png 이미지를 로드할 때는 꼭 cv2.IMREAD_UNCHANGED를 붙여줘야 배경 투명도를 유지한 상태로 로드가 됨
overlay_img = cv2.imread('dices.png', cv2.IMREAD_UNCHANGED)
overlay_img = cv2.resize(overlay_img, dsize=(150, 150))
# overlay 이미지
overlay_alpha = overlay_img[:, :, 3:] / 255.0
background_alpha = 1.0 - overlay_alpha
# 이미지 합성하기
x1 = 100
y1 = 100
x2 = x1 + 150
y2 = y1 + 150
img[y1:y2, x1:x2] = overlay_alpha * overlay_img[:, :, :3] + background_alpha * img[y1:y2, x1:x2]
cv2.imshow('result', img)
cv2.waitKey(0)
[#3. 동영상 처리 및 사이즈 편집]
import cv2
# imread가 아닌 동영상 처리를 위해 : VideoCapture
cap = cv2.VideoCapture('04.mp4')
'''
웹캠으로 동영상 처리하기
cap = cv2.VideoCapture(0)
'''
# 동영상은 이미지의 연속이기 때문에 while문으로 불러와
while True:
ret, img = cap.read()
if ret == False:
break
# 동영상 처리 심화
cv2.rectangle(img, pt1=(721, 183), pt2=(878, 465), color=(255, 0, 0), thickness=2)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = cv2.resize(img, dsize=(640, 360))
#img = img[100:200, 150:250]
cv2.imshow('result', img)
if cv2.waitKey(10) == ord('q'):
break
[#4. 학습된 모델로 이미지 화풍 바꾸기]
import cv2
import numpy as np
# Torch로 로딩된 딥러닝 된 모델을 로드 하는데 경로는 (여기)
net = cv2.dnn.readNetFromTorch('models/eccv16/starry_night.t7')
# 이미지 출력
img = cv2.imread('imgs/01.jpg')
print(img.shape) # (325, 500, 3)
# 이미지 전처리 하기
h, w, c = img.shape
img = cv2.resize(img, dsize=(500, int(h / w * 500)))
MEAN_VALUE = [103.939, 116.779, 123.680]
# blobFromImage : 이미지를 전처리하는 코드
blob = cv2.dnn.blobFromImage(img, mean=MEAN_VALUE)
print(blob.shape) # (1, 3, 325, 500)
# 전처리 결과를 input으로 지정 : 모델에 넣어라
net.setInput(blob)
# output : 컴퓨터만 알수있는 결과 -> 따라서 사람이 볼 수 있도록 후처리 필요
output = net.forward()
# 후처리 (차원 줄이고 -> 다시 원래대로 차원변형)
output = output.squeeze().transpose((1, 2, 0))
output += MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
cv2.imshow('img', img)
cv2.imshow('result', output)
cv2.waitKey(0)
[#5. 두가지의 모델을 모두 불러와 내가 가져온 이미지에 반반 적용시키기]
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)
# net1 모델 추론
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 모델 추론
net2.setInput(blob)
output2 = net2.forward()
output2 = output2.squeeze().transpose((1, 2, 0))
output2 = output2 + MEAN_VALUE
output2 = np.clip(output2, 0, 255)
output2 = output2.astype('uint8')
# net1, net2 잘라서 output3로 정의 (반반 섞기)
output3 = np.concatenate([output[:, :250], output2[:, 250:]], axis=1)
cv2.imshow('img', img)
#cv2.imshow('result', output)
cv2.imshow('output3', output3)
cv2.waitKey(0)
👉 모델 추론 방법은 똑같이 진행해 준다.
[#6. 내가 불러온 이미지 중 원하는 부분만 화풍바꾸기]
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)
print(blob.shape)
net.setInput(blob)
output = net.forward()
output = output.squeeze().transpose((1, 2, 0))
output = output + MEAN_VALUE
output = np.clip(output, 0, 255)
output = output.astype('uint8')
output = cv2.resize(output, (w, h))
img[140:370, 480:810] = output
cv2.imshow('output', output)
cv2.imshow('img', img)
cv2.waitKey(0)
[#7. 동영상 화풍바꾸기]
import cv2
import numpy as np
net = cv2.dnn.readNetFromTorch('models/instance_norm/mosaic.t7')
cap = cv2.VideoCapture('imgs/03.mp4')
while True:
ret, img = cap.read()
if ret == False:
break
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')
cv2.imshow('img', img)
cv2.imshow('result', output)
if cv2.waitKey(100) == ord('q'):
break
[#8. 여러모델을 불러와 동영상 화풍에 여러 화풍 적용시키기]
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/instance_norm/candy.t7')
cap = cv2.VideoCapture('imgs/03.mp4')
while True:
ret, img = cap.read()
if ret == False:
break
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')
output = output[0:100, :]
output2 = output2[100:200, :]
output3 = output3[200:, :]
output4 = np.concatenate([output, output2, output3], axis=0)
cv2.imshow('result', output4)
if cv2.waitKey(10) == ord('q'):
break
👉 모델 추론 방법은 똑같이 진행해 준다.
'woncoding > TIL' 카테고리의 다른 글
| TIL | 11.23.수 [DRF ↔️ JS CRUD] (1) | 2022.11.25 |
|---|---|
| TIL | 11.22.화 [DRF ↔️ JS CRUD ] (0) | 2022.11.25 |
| TIL | 11.18.금 [Docker] (0) | 2022.11.21 |
| TIL | 11.17.목 [Algorithm] (0) | 2022.11.18 |
| TIL | 11.16.수 [Docker] (0) | 2022.11.18 |