본문 바로가기
DNN with Keras/Transfer Learning

Transfer Learning for Facial Points and GANs

by goatlab 2024. 2. 14.
728x90
반응형
SMALL

Transfer Learning for Facial Points and GANs

 

신경망을 사용하여 얼굴 특징, 특히 개인의 눈 위치를 감지하는 방법이 있다. 눈의 위치를 파악하면 인물 사진을 일관성 있게 자를 수 있다. GAN은 무작위 벡터를 사실적인 인물 사진으로 변환할 수 있다. 그 반대로 실제 사진을 숫자 벡터로 변환할 수도 있다. 두 이미지를 이러한 벡터로 변환하면 두 이미지 사이를 변환하는 비디오를 제작할 수 있다.

 

NVIDIA는 눈이 항상 같은 위치에 있도록 일관되게 잘린 인물 사진을 대상으로 StyleGAN을 훈련했다. 이미지를 벡터로 성공적으로 변환하려면 NVIDIA가 크롭을 사용한 방식과 유사하게 이미지를 크롭해야 한다.

 

여기에 제시된 코드를 사용하면 시작 이미지와 끝 이미지를 선택하고 StyleGAN2를 사용하여 두 사진 사이에 " morph" 동영상을 만들 수 있다. 전처리 코드는 각 이미지의 정확한 위치를 고정하므로 자르기가 완벽할 필요는 없다. 자르기의 핵심은 얼굴로 혼동될 수 있는 다른 부분을 제거하는 것다. 여러 개의 얼굴이 감지되면 오류가 발생한다.

 

 

또한,  CoLab에서 GPU 런타임을 선택한다. "런타임"을 선택한 다음 "런타임 유형 변경"을 선택하고 "하드웨어 가속기"에서 GPU를 선택한다.

 

이러한 설정을 통해 상위 수준 구성을 변경할 수 있다. 단계 수에 따라 결과 동영상의 길이가 결정된다. 동영상은 초당 30프레임으로 재생되므로 150은 5초이다. 정지 단계를 지정하여 동영상의 시작과 끝을 변경하지 않고 그대로 둘 수도 있다. 네트워크를 변경할 필요는 없다.

 

NETWORK = "https://nvlabs-fi-cdn.nvidia.com/stylegan2-ada-pytorch/pretrained/ffhq.pkl"
STEPS = 150
FPS = 30
FREEZE_STEPS = 30

 

시작 이미지와 끝 이미지를 업로드하는 것으로 시작한다. Colab 서비스는 이러한 이미지를 업로드한다. Colab 외부에서 이 코드를 실행하는 경우 이러한 이미지는 컴퓨터의 어딘가에 있을 것이며, SOURCE 및 TARGET 변수를 사용하여 이러한 파일의 경로를 제공한다. 시작 이미지를 선택한다.

 

import os
from google.colab import files

uploaded = files.upload()

if len(uploaded) != 1:
    print("이미지 1개 업로드")
else:
    for k, v in uploaded.items():
        _, ext = os.path.splitext(k)
        os.remove(k)
        SOURCE_NAME = f"source{ext}"
        open(SOURCE_NAME, 'wb').write(v)

uploaded = files.upload()

if len(uploaded) != 1:
    print("Upload exactly 1 file for target.")
else:
    for k, v in uploaded.items():
        _, ext = os.path.splitext(k)
        os.remove(k)
        TARGET_NAME = f"target{ext}"
        open(TARGET_NAME, 'wb').write(v)

 

그리고 다음 소프트웨어를 설치한다.

 

!wget http://dlib.net/files/shape_predictor_5_face_landmarks.dat.bz2
!bzip2 -d shape_predictor_5_face_landmarks.dat.bz2
!git clone https://github.com/NVlabs/stylegan2-ada-pytorch.git
!pip install ninja
import sys

sys.path.insert(0, "/content/stylegan2-ada-pytorch")

 

얼굴 특징 감지

 

먼저, 이미지의 일관된 자르기 및 중심을 잡는 데 사용할 얼굴 특징을 감지하는 방법이 있다. 이를 위해 사전 학습된 여러 모델에 액세스할 수 있는 신경망 라이브러리인 dlib 패키지를 사용한다. DLIB 얼굴 인식 ResNET 모델 V1은 눈의 모서리와 코의 바닥을 식별하는 5점 랜드마킹 모델이다. 이 네트워크의 제작자는 7198개의 얼굴로 구성된 dlib 5점 얼굴 랜드마크 데이터셋을 학습시켰다. dlib를 초기화하고 얼굴 특징 신경망을 로드한다.

 

import cv2
import numpy as np
from PIL import Image
import dlib
from matplotlib import pyplot as plt

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_5_face_landmarks.dat')

 

그 다음, 소스 이미지의 얼굴 특징부터 살펴 본다. 다음 코드는 다섯 가지 얼굴 특징을 감지하고 좌표를 표시한다.

 

img = cv2.imread(SOURCE_NAME)
if img is None:
    raise ValueError("Source image not found")

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rects = detector(gray, 0)

if len(rects) == 0:
    raise ValueError("No faces detected")
elif len(rects) > 1:
    raise ValueError("Multiple faces detected")
shape = predictor(gray, rects[0])
w = img.shape[0] // 50

for i in range(0, 5):
    pt1 = (shape.part(i).x, shape.part(i).y)
    pt2 = (shape.part(i).x + w, shape.part(i).y + w)
    cv2.rectangle(img, pt1, pt2, (0, 255, 255), 4)
    print(pt1, pt2)
(294, 141) (308, 155)
(277, 141) (291, 155)
(231, 135) (245, 149)
(249, 138) (263, 152)
(261, 175) (275, 189)

 

이러한 특징을 소스 이미지에 쉽게 그릴 수 있다. 눈의 모서리와 코의 밑부분을 볼 수 있다.

 

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.title('source')
plt.show()

728x90
반응형
LIST