2018년 5월 14일 월요일

OpenFaceSwap (2) - 사용방법

  OpenFaceSwap은 FakeApp에 비해 사용이 매우 간편하도록 디자인 되어 있습니다.


  진행과정은

  • VIDEO: 비디오 파일 추가
  • IMAGES: 비디오 파일 캡처 (다른 이미지 파일 추가 가능)
  • FACES: 얼굴 부분 잘라내어 Align 데이터 획득
  • B도 A와 같이 위의 과정 반복
  • Model: 트레이닝 진행
  • SWAPS: A의 몸에 B의 얼굴 합성(반대도 가능)
  • Movie: 생성된 합성이미지 영상으로 변환 (소리 포함 가능)

상단의 디스크 이미지는 세팅을 저장하는 버튼입니다.
상단의 폴더 이미지는 저장한 세팅을 불러오는 버튼입니다.
상단의 물음표는 프로그램 우측에 표시되는 도움말을 띄우는 버튼입니다.

각각의 VIDEO A, IMAGES A버튼등은 각 단계를 진행하도록 하는 버튼이며 아래에서 설명드리겠습니다. 
그 옆의 공란은 추출되거나 추출할 대상의 경로 입니다.
그 옆의 폴더표시는 경로를 선택하는 버튼입니다.
돋보기 표시는 입력되어있는 경로의 폴더를 여는 버튼입니다.
톱니바퀴는 해당 단계를 설정하는 버튼입니다.

과정을 설명드리겠습니다.

  VIDEO A 버튼을 클릭하여 몸이 될 사람이 있는 영상을 추가해줍니다. 혹은 공란에 비디오 파일의 경로를 입력해 줍니다.

  IMAGES 버튼을 클릭하면 추가된 영상파일이 캡처파일로 생성됩니다. 우측 공란에 폴더 경로를 미리 입력해두면 해당 경로에 캡처파일이 생성됩니다. (해당 경로에 다른 이미지 추가가능) 설정에서 이미지 확장자 jpg, png를 선택할 수 있으며,
Frames/sec를 입력하여 캡처를 초당 몇번할 지 선택 할 수 있습니다. 이 때 몸이 될 영상의 경우 원본 영상과 동일 하도록 입력해주시기 바랍니다. 얼굴이 될 영상의 경우 2정도를 넣으면 됩니다.
(데이터로 트레이닝을 진행할 때에는 한사람당 한번에 ~1000장정도 씩 끊어서 진행하면 됨. 이 이상이 된느 경우 경우에 따라 모델이 잘 수렴하지 못하고 트레이닝 된 결과물이 선명하지 못할 수 있음. 따라서 이를 고려하여 선택하면 됨. 쓸모없이 너무 비슷한 얼굴을 많이 하여 트레이닝에 시간을 너무 많이 소요할 필요는 없음.)

  FACES A 버튼을 클릭하면 캡처파일에서 얼굴부분만을 골라냅니다.(256x256 크기임) 위와 마찬가지로 우측 공란에 폴더 경로를 미리 입력해두면 해당 경로에 Align된 이미지 파일을 생성합니다.
  설정 버튼을 누르면 Detector를 선택할 수 있습니다. 이는 얼굴을 인식하는 알고리즘을 선택하는 옵션입니다. 윈도우 7의 경우 FACES 기능을 눌렀을 때 창이 뜨자마자 사라지는 경우는 Command를 Cmd창에서 직접입력해주어야 합니다.
  cmd창을 띄워 cd c:\openfaceswap을 입력하여 명령창의 경로를 openfaceswap폴더로 지정한 후에 Command창에 쓰여져 있는 내용을 붙여넣어 실행하면 됩니다. (이는 굳이 OpenfaceSwap을 실행한 후 할 필요는 없으므로 명령어를 안다면 bat파일을 생성하여 이것만 실행해도 됨.)

  B도 A와 같이 이를 반복해줍니다.

  MODEL 버튼을 클릭하면 트레이닝이 진행됩니다. 이를 위해서는 FACES A, FACES B의 경로가 모두 지정되어 있어야 합니다. 중지를 원하시면 training창에서 '엔터'를 입력하시면 됩니다.
  설정 버튼을 누르면 Trainer를 선택할 수 있으며 Original과 LowMem정도를 활용하면 됩니다.(Layer의 갯수가 다른듯) OOM에러가 나타나면 Batch Size를 줄여야 합니다. Epochs와 Save interval은 다음 링크를 참조하시면 좋을 듯 합니다.
  저는 GTX1060 3GB를 사용하고 있습니다. 그래픽카드의 메모리에 따라 설정이 크게 영향을 받는다는 것을 참고하시면 될 것 같습니다. 저의 경우는 LowMem, batch size 32로 설정하면 진행이 됩니다.
  위의 FACES와 마찬가지로 윈도우 7의 경우 FACES 기능을 눌렀을 때 창이 뜨자마자 사라지는 경우는 Command를 Cmd창에서 직접입력해주어야 합니다.

SWAPS 버튼을 누르면 얼굴합성이 진행됩니다. 이를 위해  IMAGES A, MODEL 파일의 경로가 입력되어 있어야 합니다. 설정 버튼에서 Trainer는 이전에 MODEL에서 사용한 설정과 동일하게 선택하면 됩니다. Direction은 A,B중 누가 얼굴을 사용하는지의 방향입니다. seamless, smooth mask 등은 영상합성시에 이미지 후처리 해주는 설정입니다. 필요에 경험해보시고 사용하시면 됩니다.

MOVIE 버튼을 누르면 합성된 이미지를 영상으로 바꾸어 줍니다. 설정에서 sync audio를 누르면 음원을 같이 합칠 수 있습니다. 이 때에는 VIDEO A에 해당 영상의 경로가 입력되어 있어야 합니다.

설명은 길었지만 사실 버튼만 누르면 진행되는
과정들입니다. 저도 아직 초기 모델 학습을 진행중이여서 
결과물을 보지는 못했지만 사용이 직관적임을 느꼈습니다.

설치과정도 단순하니까 처음 시작하시는 분이라면 FakeApp보다는 
OpenFaceSwap을 추천드리고 싶네요.

댓글 29개:

  1. 감사합니다 작성자님!

    근데 face 추출하는게 안되네요... 윈도우 7이라 cmd에 직접 명령 넣어서 했는데 output에 발견된 이미지만 생기고 발견된 얼굴은 0이네요... 방법이 있을까요?

    답글삭제
    답글
    1. 발견된 이미지만 생기고 얼굴은 0이라는 게 이미지 내에서 얼굴을 못찾는다는 뜻인가요? 여러 사진을 사용해보세요. 나름 인식률이 괜찮은 편이라서 왠만하면 다 인식합니다.

      삭제
  2. 작성자가 댓글을 삭제했습니다.

    답글삭제
  3. 작성자가 댓글을 삭제했습니다.

    답글삭제
  4. 작성자가 댓글을 삭제했습니다.

    답글삭제
  5. 작성자가 댓글을 삭제했습니다.

    답글삭제
  6. 작성자가 댓글을 삭제했습니다.

    답글삭제
  7. D:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
    from ._conv import register_converters as _register_converters
    Using TensorFlow backend.
    Input Directory: D:\OpenFaceSwap\imgA
    Output Directory: D:\OpenFaceSwap\alignA
    Filter: filter.jpg
    Using json serializer
    Starting, this may take a while...
    Loading Extract from Extract_Align plugin...
    0%| | 0/214 [00:00<?, ?it/s]cudaStreamDestroy() failed. Reason: unspecified launch failure
    cudaFree() failed. Reason: unspecified launch failure
    cudaFreeHost() failed. Reason: unspecified launch failure

    ------------------------------------------
    이번에는 아예 경로를 바꿔서 작업했는데도 이렇게 뜨네요 ㅠ

    환경 변수라던지 뭔가 추가할게 있을까요?
    1주동안을 꼬박씨름해서..import error(지정된 모듈)어쩌고는 안뜨게 됐는데요 ㅠㅠㅠ
    현재 환경변수는 이렇게 추가 되어있습니다.
    혹시더 추가작업하거나 그게 아니라면,
    충돌이 일어나서 삭제해야하는 폴더나 환경변수(예를들어 쿠다8.0이라던지)가 있을까요?

    CUDA PATH C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0
    CUDA PATH_V8_0 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0
    CUDA_PATH_V9_0 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

    Path

    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\libnvvp
    C:\ffmpeg\bin
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
    C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\libnvvp
    C:\Windows
    C:\Windows\system32
    C:\Program Files(x86)\NVIDIA Corporation\PhysX\Common
    D:\OpenFaceSwap

    ※추가 질문.
    그리고 D드라이브에는 D:\OpenFaceSwap이 있고 현재 그걸로 진행중입니다만.
    C드라이브에도 C:\faceswap가 있습니다.

    C드라이브에 있는건 다른분 홈페이지 링크를 따라가서 받았고,
    (https://github.com/deepfakes/faceswap)
    D드라이브는 선생님이 올려주신 링크에서 받았습니다.
    (https://www.deepfakes.club/openfaceswap-deepfakes-software/)
    서로 구동방식이 조금씩 차이가 나는것 같아서 냅두고 있긴한데, 서로 간의 충돌때문은 아니겠죠?

    답글삭제
  8. 혹시 작성자님 이런 오류를 좀 봐줄 수 있나요?

    Traceback (most recent call last):
    File "faceswap\faceswap.py", line 8, in
    from lib.cli import FullHelpArgumentParser
    File "C:\OpenFaceSwap\faceswap\lib\cli.py", line 7, in
    from lib.FaceFilter import FaceFilter
    File "C:\OpenFaceSwap\faceswap\lib\FaceFilter.py", line 3, in
    import face_recognition
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\__init__.py", line 7, in
    from .api import load_image_file, face_locations, batch_face_locations, face_landmarks, face_encodings, compare_faces, face_distance
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\api.py", line 4, in
    import dlib
    ImportError: DLL load failed: 지정된 모듈을 찾을 수 없습니다.

    이런 오류는 어떻게 고칠 수 있을까요?

    답글삭제
  9. Traceback (most recent call last):
    File "faceswap\faceswap.py", line 8, in
    from lib.cli import FullHelpArgumentParser
    File "C:\OpenFaceSwap\faceswap\lib\cli.py", line 7, in
    from lib.FaceFilter import FaceFilter
    File "C:\OpenFaceSwap\faceswap\lib\FaceFilter.py", line 3, in
    import face_recognition
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\__init__.py", line 7, in
    from .api import load_image_file, face_locations, batch_face_locations, face_landmarks, face_encodings, compare_faces, face_distance
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\api.py", line 4, in
    import dlib
    ImportError: DLL load failed: DLL 초기화 루틴을 실행할 수 없습니다.
    계속하려면 아무 키나 누르십시오 . . .
    이런 오류가 뜨네요 왜이런걸까요>

    답글삭제
  10. 작성자가 댓글을 삭제했습니다.

    답글삭제
  11. 으으 ... 얼굴을 못인식하는건가 개속 0개 찾았다고 하내요 ㅠ

    답글삭제
  12. 페이스A에서 막히네요....페이스A 누르면 도스창 아무거나 누르세요... 뜨고 누르면

    Status messages
    aligning faces from image A set with command

    python\scripts\python.bat facewap\faceswap.py extract-.\imgA-o\alignA-D cnn
    note: A default directory location has been used
    라고 뜨면서.... 구동을 하지 않네요... 도와주세요~~~

    답글삭제
  13. 지나가다 막히시는분들 제가컴맹이긴한데 말씀드리면

    환경변수에서 cuda_path / C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0

    추가해주시는것과, 페이스에서 막히시는분들은 사진이름이 한글로 되어있어서 안되는겁니다 참고하세여

    답글삭제
  14. ResourceOutputError (see above for traceback): OOM when allocating tensor with shape [16,2048,4,4] and type float on / job: localhost / replica: 0 / task: 0 / device: GPU: 0 by allocator GPU_0_bfc
    [[Node: model_1 / conv2d_4 / convolution = Conv2D [T = DT_FLOAT, data_format = & quot; NCHW & quot ;, dilations = [1, 1, 1, 1], padding = 0] (model_1 / conv2d_4 / convolution-0-TransposeNHWCToNCHW-LayoutOptimizer, conv2d_4 / kernel / read)]]
    Indian: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

    / Job: localhost / replica: 0 / task: 0 / device: CPU: 0, send_device = “/ job: localhost / replica: 0 / task: 0 / device: GPU: 0 “, send_device_incarnation = 1, tensor_name =” edge_1543_loss_1 / mul “, tensor_type = DT_FLOAT, _device = ] ()]]
    Indian: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

    GTX1060 3G
    RAM 12G

    LowMem
    Batch size 8

    모델에서 막히네요 ㅠㅠ
    도와주세요 ㅠㅠ

    답글삭제
  15. 작성자가 댓글을 삭제했습니다.

    답글삭제
  16. video:13524kB audio:0kB subtitle:0kB other streams:0kb global headers:0kB muxing overhead: unknown
    Press any key to continue.

    ImageA 버턴을 누르니까 영상에서 연속사진들은 나오는데 Command Prompt에서 이렇게 나오더라고요. 그 다음 단계인 Faces A에서 에러가 뜨면서 align A에 아무것도 뜨지 않습니다.

    어디서 달못되었는지 모르겠네요. 한가지 다르게 한게 위에 CUDA 다운 받을때 Version 7이 안되서 10으로한거 밖에 없거든요.

    제 컴퓨터는 window 10 에 RAM: 8 GB, System type: 64bit, X64, CPU: 2.50GHz 입니다.

    답글삭제
  17. Model에서 FACE A FACE B 를 지정해야한다고만 말씀하셨는데, 설명이 매우많이 부족하네요. 제가 그래서 Model 파일 경로로 지정하고 어짜피 FACE A와 FACE B는 분홍색이 두 곳에 칠해지니까 그냥 딸려오는구나 하고 Model 버턴을 눌렀는데, 트레이닝이 되지 않고 batch를 봐꿔라는 애기만 나옵니다. LOW MEMORY와 original, 번갈아가면서 숫자도 여러번 바꿔서 입력했는데, 똑같은 상황입니다. 계속 image가 부족하면 트래이닝이 잘안된다는 메세지만 나올뿐 저는 face A에 2천장 사진, face B에 3천장 사진을 가지고 있는데 image가 부족하다는것은 말이되지 않는것 같고요.

    더 정확한 설명이 필요합니다.

    답글삭제
  18. 내가 하면서 발생했던 문제점과 해결법 정리.
    1. 이미지 부족하다고 트레이닝이 잘 안될거라는 메세지: 경로설정할때 뒤에 이상한 문자가 추가되어 있었음. 수정 후 작동.
    2. 메모리 부족하다는 메세지: lowmem, 32로 수정 후 작동.

    답글삭제
  19. 다른사람의 정크데이터는 일일히 삭제해줘야하나요?

    답글삭제
  20. Traceback (most recent call last):
    File "faceswap\faceswap.py", line 8, in
    from lib.cli import FullHelpArgumentParser
    File "C:\OpenFaceSwap\faceswap\lib\cli.py", line 7, in
    from lib.FaceFilter import FaceFilter
    File "C:\OpenFaceSwap\faceswap\lib\FaceFilter.py", line 3, in
    import face_recognition
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\__init__.py", line 7, in
    from .api import load_image_file, face_locations, batch_face_locations, face_landmarks, face_encodings, compare_faces, face_distance
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\face_recognition\api.py", line 24, in
    cnn_face_detector = dlib.cnn_face_detection_model_v1(cnn_face_detection_model)
    RuntimeError: Error while calling cudaGetDevice(&the_device_id) in file D:\pythonfs\scripts\dlib\dlib\dnn\gpu_data.cpp:178. code: 35, reason: CUDA driver version is insufficient for CUDA runtime version
    계속하려면 아무 키나 누르십시오 . . .

    이렇게 나오면서 faces A 에서 안되네요. 왜 그럴까요
    cuda 9버젼 설치 되어있습니다만..;

    답글삭제
  21. 작성자가 댓글을 삭제했습니다.

    답글삭제
  22. RuntimeError: Error while calling cudaGetDevice(&the_device_id) in file D:\pythonfs\scripts\dlib\dlib\dnn\gpu_data.cpp:178. code: 35, reason: CUDA driver version is insufficient for CUDA runtime version
    계속하려면 아무 키나 누르십시오 . . .
    이건 그래픽 드라이버 업데이트 하니까 에러 안나게 넘어갔는데 그다음 얼굴추출이 안되고 이런 메세지와 함께 끝나네요..

    C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
    from ._conv import register_converters as _register_converters
    Using TensorFlow backend.
    Input Directory: J:\fakes\test\data_a
    Output Directory: J:\fakes\test\data_a\align
    Filter: filter.jpg
    Using json serializer
    Starting, this may take a while...
    Loading Extract from Extract_Align plugin...
    0%| | 0/3016 [00:00 physical GPU (device: 0, name: GeForce GTX 970, pci bus id: 0000:01:00.0, compute capability: 5.2)
    WARNING:tensorflow:From C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\site-packages\keras\backend\tensorflow_backend.py:1349: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.
    Instructions for updating:
    keep_dims is deprecated, use keepdims instead
    2018-10-15 15:08:21.810561: E T:\src\github\tensorflow\tensorflow\stream_executor\cuda\cuda_dnn.cc:396] Loaded runtime CuDNN library: 7301 (compatibility version 7300) but source was compiled with 7003 (compatibility version 7000). If using a binary install, upgrade your CuDNN library to match. If building from sources, make sure the library loaded at runtime matches a compatible version specified during compile configuration.
    2018-10-15 15:08:21.815196: F T:\src\github\tensorflow\tensorflow\core\kernels\conv_ops.cc:712] Check failed: stream->parent()->GetConvolveAlgorithms( conv_parameters.ShouldIncludeWinogradNonfusedAlgo(), &algorithms)
    계속하려면 아무 키나 누르십시오 . . .

    어떻게 해야할까요.

    답글삭제
    답글
    1. 같은 문제 해결했습니다. 일단 CuDNN 버전을 작성자가 말한 버전으로 받으셔서 폴더 3개를 다시 엎으세요. 저는 그렇게 해결되었습니다.

      삭제
  23. 모델 트레이닝을 0.02 수준까지 진행하고 SWAP 시켰는데, 자연스러운 얼굴이 아니라 이미지 B의 사각형 테두리가 그대로 남아있습니다. 무엇이 잘못된 걸까요?

    답글삭제
  24. Starting. Press "Enter" to stop training and save model
    Exception in thread Thread-2:
    Traceback (most recent call last):
    File "C:\OpenFaceSwap\python\python-3.6.3.amd64\lib\threading.py", line 916, in _bootstrap_inner
    self.run()
    File "C:\OpenFaceSwap\faceswap\lib\utils.py", line 64, in run
    for item in self.generator:
    File "C:\OpenFaceSwap\faceswap\lib\training_data.py", line 23, in minibatch
    assert length >= batchsize, "Number of images is lower than batch-size (Note that too few images may lead to bad training). # images: {}, batch-size: {}".format(length, batchsize)
    AssertionError: Number of images is lower than batch-size (Note that too few images may lead to bad training). # images: 0, batch-size: 32

    이미지의수가 배치사이즈보다 낮다는데 어떤걸 고쳐야할까요

    답글삭제
    답글
    1. 비디오 이미지 페이스 a랑b다하고 모델하는데 저렇게뜨네요

      삭제
  25. swap 과정에서 계속 이렇게 뜨는데 진행 퍼센트는 계속 늘어나네요 제대로 진행되고 있는게 맞나요?

    Failed to convert image: C:\OpenFaceSwap\DataA\classanal\clip01863.png. Reason: Error while calling cudaMalloc(&data, new_size*sizeof(float)) in file D:\pythonfs\scripts\dlib\dlib\dnn\gpu_data.cpp:195. code: 2, reason: out of memory
    7%|████▉ | 1864/28313 [04:41<1:06:27, 6.63it/s]F

    답글삭제
  26. raise type(e)(node_def, op, message)
    tensorflow.python.framework.errors_impl.InternalError: GPU sync failed

    학습 단계에서 잘하다가
    갑자기 위에 문구처럼 GPU 동기화 실패가 뜹니다 왜그럴까요

    답글삭제