insightface를 이용한 DeepFake 간단 구현
주의 ) 본 글을 이용하며, 본인이 아닌 다른 누군가를 DeepFake 및 합성하는 경우 법적 책임을 질수 있습니다. 본 글의 작성자는 책임지지 않습니다.
BOB 프로젝트를 하면서 Deepfake를 연구하게 되었다. 단순히 소스코드 몇줄로, 사람의 얼굴을 딥페이크 할 수 있다니,, 무서운 세상이다.
먼저 Insightface란 무엇인가?
InsightFace는 최첨단 2D 및 3D 얼굴 분석을 위한 오픈 소스 딥러닝 라이브러리로, 주로 PyTorch와 MXNet을 기반으로 개발되었습니다. 이 라이브러리는 얼굴 인식, 얼굴 검출, 얼굴 정렬 등 다양한 얼굴 분석 작업을 효율적으로 수행할 수 있도록 설계되었습니다. 또한, ArcFace, SubCenter-ArcFace, VPL, Partial-FC와 같은 최신 얼굴 인식 알고리즘을 지원하며, RetinaFace, SCRFD와 같은 얼굴 검출 모델도 포함하고 있습니다.
InsightFace는 MIT 라이선스 하에 공개되어 있어 학술 및 상업적 용도로 자유롭게 사용할 수 있다. 다만, 제공되는 사전 학습된 모델은 비상업적 연구 목적으로만 사용이 제한된다. 공식 링크는 다음과 같다.
https://github.com/deepinsight/insightface
실제 사람 얼굴을 사용하면 초상권이며, 관련 법령에 처벌받는 것이 무서우니,, AI로 무작위 사진을 조합하여 실존하지 않는 사람들의 얼굴 사진을 만들어 주는 사이트를 사용하였다.
https://thispersondoesnotexist.com/
다음은 작성한 코드이다.
먼저 필요로 하는 모듈들을 모두 import 한다.
import cv2
import numpy as np
from insightface.app import FaceAnalysis
import insightface
from PIL import Image
각각 필요한 함수들을 작성한다.
import cv2
import numpy as np
from insightface.app import FaceAnalysis
import insightface
from PIL import Image
def initialize_face_analysis():
app = FaceAnalysis(allowed_modules=['detection', 'recognition'], providers=['CPUExecutionProvider', 'CUDAExecutionProvider'])
app.prepare(ctx_id=0, det_thresh=0.5, det_size=(640, 640))
return app
def load_image(image_path):
return cv2.imread(image_path)
def detect_faces(app, image):
return app.get(image)
def initialize_swapper():
return insightface.model_zoo.get_model('inswapper_128.onnx', providers=['CPUExecutionProvider', 'CUDAExecutionProvider'])
def swap_faces(swapper, img1, faces1, img2, faces2):
if len(faces1) == 0 or len(faces2) == 0:
raise ValueError("No face detected in one or both images.")
return swapper.get(img1, faces1[0], faces2[0], paste_back=True)
def save_image(image, output_path):
temp = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
rimg = Image.fromarray(temp)
rimg.save(output_path)
def main(img1_path, img2_path, output_path='ouput.png'):
app = initialize_face_analysis()
swapper = initialize_swapper()
img1 = load_image(img1_path)
img2 = load_image(img2_path)
faces1 = detect_faces(app, img1)
faces2 = detect_faces(app, img2)
swapped_image = swap_faces(swapper, img1, faces1, img2, faces2)
save_image(swapped_image, output_path)
print(f"Saved swapped image to {output_path}")
if __name__ == "__main__":
main('sample1.jpg', 'sample2.jpg')
단순히 insightface를 통해서 얼굴 분석 및 탐지, Swap 까지 단일 모델 파일로 가능하다.
내가 사용한 얼굴 파일은 다음과 같다.
이런 가짜 이미지를 사용하는 방법도 있고, 실제 내 얼굴을 바탕으로 실행해본 결과, 매우 깔끔하게 잘 나온다.
'그냥 개발 및 잡담' 카테고리의 다른 글
[GIT] 깃헙 다른 원격 저장소로 복제 (0) | 2022.06.04 |
---|---|
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #2 구입 완료 및 제작 후기 (1) | 2022.03.27 |
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #1 부품 선정 (0) | 2022.02.28 |
[MAC] Pyinstaller을 통해 파이썬에서 맥 파일 배포 (pyqt5 + ui파일) (0) | 2022.02.25 |
[MAC] Pyinstaller로 파일 제작시 경로 오류 (0) | 2022.02.25 |
댓글
이 글 공유하기
다른 글
-
[GIT] 깃헙 다른 원격 저장소로 복제
[GIT] 깃헙 다른 원격 저장소로 복제
2022.06.04 -
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #2 구입 완료 및 제작 후기
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #2 구입 완료 및 제작 후기
2022.03.27 -
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #1 부품 선정
[NAS] D-1581 보드 서버 및 NAS(나스) 제작기 - #1 부품 선정
2022.02.28 -
[MAC] Pyinstaller을 통해 파이썬에서 맥 파일 배포 (pyqt5 + ui파일)
[MAC] Pyinstaller을 통해 파이썬에서 맥 파일 배포 (pyqt5 + ui파일)
2022.02.25