_won_
wonprogrammer
_won_
전체 방문자
오늘
어제
  • 분류 전체보기
    • woncoding
      • TIL
      • WIL
    • source Code
      • Python
      • Programmers
      • BAEKJOON

블로그 메뉴

  • 방명록

티스토리

Github · Wonprogrammer
hELLO · Designed By 정상우.
_won_

wonprogrammer

woncoding/TIL

TIL | 11.21.월 [Deep Learning]

2022. 11. 21. 23:22

- 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
    'woncoding/TIL' 카테고리의 다른 글
    • TIL | 11.23.수 [DRF ↔️ JS CRUD]
    • TIL | 11.22.화 [DRF ↔️ JS CRUD ]
    • TIL | 11.18.금 [Docker]
    • TIL | 11.17.목 [Algorithm]
    _won_
    _won_
    Coding Practice blog

    티스토리툴바