2018년 1월 25일 목요일

Deepfakes (5) - 추출 얼굴 이미지로 합성, 제작된 이미지 영상 변환


트레이닝 화면

손실값
  그 전 게시물을 잘 따라하셨으면 위와 같은 트레이닝이 진행됐을 것입니다(참고로 트레이닝은 한번에 끝까지 안해도 됩니다. q를 눌러서 정상종료하면 저장되기 때문에 다음에 트레이닝 하면 이어서 진행됩니다.). 아래 cmd창에 보이는 loss값은 0.008~0.009로 많이 낮아진 것을 확인할 수 있습니다.

  하지만 아쉽게도 얼굴 데이터 자체가 충분하지 않아 트레이닝이 잘 이루어지지는 않았습니다. 트레이닝 화면을 통해 몇가지 문제점을 확인할 수 있습니다. 한쪽 영상은 옆면 얼굴을 가지고 있지만 반대쪽의 경우는 옆면 얼굴이 없다보니 굉장히 이상하게 이미지가 생성됐네요. 또 영상속에서 모자를 쓰고 있었기때문에 흰색 모자가 같이 잡힌것을 확인할 수 있습니다. 만약 모자쓴 얼굴을 영상에 붙여넣는다면 이목구비 경계에 흰색 모자가 나타나겠죠. 물론 반대로 모자를 쓰지 않은 얼굴을 쓴쪽에 붙여넣는다면 모자가 조금 짤리기는 하지만 좀 더 나을 겁니다.
  

Merge를 수행하는 Convert탭의 화면
  이제 합성을 진행하도록 하겠습니다. 현재 data_B에는 문자, data_A에는 빨간옷입니다. 문자하는 사람의 몸에 빨간옷 여자의 얼굴을 넣기 위해 위와 같이 설정했습니다.
  • Model: model폴더 경로 그대로 두시면 됩니다.
  • data: 몸이 되는 data의 폴더경로를 입력해주시면 됩니다.
  • Seamless: 잘 모르겠습니다. 댓글로좀 알려주십쇼
  • Blur Size: 합성하는 얼굴의 경계를 'x'픽셀만큼 흐리게 처리합니다.
  • Kernel Size: 잘 모르겠습니다. 링크보시고 좀 알려주십쇼.
  • Direction: 방향입니다. 저도 헷갈리는데요. 반대로 원하시면 AtoB, BtoA하시면 됩니다.

Merge 진행모습
  
   Start를 누르시면 처음에 얼굴 추출한것과 유사하게 진행됩니다. data_B폴더에 merged폴더가 생성되고 그 안에 합성된 이미지들이 나타납니다(즉 영상뿐 아니라 단일 그림도 합성가능하다는 것). 합성된 이미지의 이름은 원본 이미지와 같습니다.(ex b0001이면 똑같이 b0001) 이 때 사전에 junk data를 지운경우 몇몇 프레임이 빠진 분들이 계실겁니다. 그럴경우 원본 데이터를 옮겨놓은 상태에서 생성한 파일들을 붙여넣어 빠진 프레임들을 보충 해주시면 됩니다. 다시 간략하게 설명하면

  1. data_B폴더에 source폴더 생성
  2. data_B에 있는 원본 이미지 source폴더로 복사
  3. merged폴더에 있는 이미지 data_B폴더 이미지로 복사하여 덮어쓰기
  4. 이를 통해 중간에 빠진 프레임이 보충되어 얼굴은 원래 얼굴이지만 끊기지 않고 자연스럽게 영상이 이어지게 된다.
합성된 이미지 예시, 품질이 너무 안좋네요ㅜㅜ
  합성을 진행한 후 품질이 마음에 들지 않으면 다시 트레이닝을 이어서 진행한 후 하시면 되겠습니다.

  자 이제 Deepfakes의 역할은 모두 끝났습니다. Deepfakes를 통해 생성한 이미지를 이용하여 영상으로 제작하겠습니다. 이미지 생성은 원하시는 방법으로 하셔도 되고 이전에 다운받은 ffmpeg를 활용하셔도 됩니다.



  cmd를 실행하시 이미지가 저장된 곳으로 디렉토리를 옮깁니다. 
ex: cd c:/fakes/data_B/merged (소스파일과 합쳤으면 그냥 data_B까지 치면 됩니다.)
  영상을 생성하기 위한 명령어를 입력합니다.
양식: ffmpeg -f image2 -framerate [00] -i img%03d.png -vcodec libx264 -crf 24 -pix_fmt yuv420p [output].mp4

예시: ffmpeg -f image2 -framerate 29.7 -i b%04d.png -vcodec libx264 -crf 24 -pix_fmt yuv420p gmdori.mp4

이전에 ffmpeg를 활용해서 캡쳐하셨던것과 비슷합니다. ffmpeg는 여러모로 많이 쓰이고 있으므로 자세한 명령어는 검색을 통해 확인할 수 있습니다.
  • framerate [00]: 00부분에 원래 영상의 fps를 입력해줍니다. ([]는 지워주세요)
  • img%03d.png: 영상을 만들기위해 사용하는 이미지의 이름입니다. img는 이름 03은 3자리숫자
  • [ouput].mp3: 만드는 영상의 이름입니다. output자리에 이름을 쓰시면 됩니다.


  다 완료하셨으면 cd로 이동한 경로에 영상이 생성되어 있습니다. 위와 같은 영상 예시를 확인할 수 있고 더 좋은 품질의 영상을 얻기 위해 다음과 같은 방법을 추천드립니다.
  • 비슷한 환경의 얼굴 데이터를 최대한 많이 확보하여 모든 각도의 얼굴을 커버
  • 피부색, 얼굴형이 비슷한 사람을 선택하여 최종 결과물 품질 향상
  • 트레이닝에 충분한 시간 투자
  • 화질제한내에서 좋은 품질의 이미지 확보
  • 붙여넣는 얼굴의 경우 junk data(얼굴이 가려짐, 오류로 기울어진 이미지)등을 최대한 제거한다.
  딥페이크에 대해 궁금한 게 있으신가요? 공유할 정보(그래픽카드별 트레이닝 설정값, 오류대처, 업데이트 사항)가 있으신가요? 댓글로 많이 남겨주세요~

댓글 42개:

  1. RuntimeError: module compiled against API version 0xc but this version of numpy is 0xb
    0%| | 0/300 [00:00
    File "align_faces.py", line 136, in main
    File "align_faces.py", line 116, in iter_face_alignments
    File "face_alignment\api.py", line 172, in get_landmarks
    File "face_alignment\api.py", line 160, in detect_faces
    RuntimeError: Error while calling cudaOccupancyMaxPotentialBlockSize(&num_blocks,&num_threads,K) in file c:\arthur\dlib-master\dlib\dnn\cuda_utils.h:155. code: 8, reason: invalid device function
    [4844] Failed to execute script align_faces

    extract 실행시 이렇게 뜨네요.
    두가지 런타임 에러네요. 넘피버전 문제와 c:\arthur와 관련있어보이는데 이런 디렉터리가 없거든요.
    일부러 cudo 8.0도 깔고 했는데 왜 안되는 걸까요..해결방법을 알려주세요~

    답글삭제
    답글
    1. 윗줄 runtimeerror는 그냥 warning이니까 무시하셔도 됩니다.
      아래 failed to execute script align_faces쪽이 문제인데요.
      https://developer.nvidia.com/cuda-gpus 들어가셔서 CUDA-Enabled Geforce Products클릭하신 후 사용하시는 GPU의 compute Capability가 2.0 이상인지 확인해 보세요.
      데이터 크기도 줄여서 해보시구요.

      삭제
  2. Traceback (most recent call last):
    File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line 172, in __init__
    File "ctypes\__init__.py", line 351, in __init__
    OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "site-packages\tensorflow\python\platform\self_check.py", line 62, in preload_check
    File "site-packages\PyInstaller\loader\pyiboot01_bootstrap.py", line 174, in __init__
    __main__.PyInstallerImportError: Failed to load dynlib/dll 'nvcuda.dll'. Most probably this dynlib/dll was not found when the application was frozen.

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "merge_faces.py", line 9, in
    File "d:\anaconda\envs\merging\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    File "site-packages\tensorflow\__init__.py", line 24, in
    File "d:\anaconda\envs\merging\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    File "site-packages\tensorflow\python\__init__.py", line 49, in
    File "d:\anaconda\envs\merging\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    File "site-packages\tensorflow\python\pywrap_tensorflow.py", line 30, in
    File "site-packages\tensorflow\python\platform\self_check.py", line 70, in preload_check
    ImportError: Could not find 'nvcuda.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Typically it is installed in 'C:\Windows\System32'. If it is not present, ensure that you have a CUDA-capable GPU with the correct driver installed.
    [7324] Failed to execute script merge_faces



    지금까지는 잘 따라왔는데 무슨 에러일까요? ㅠㅠ

    답글삭제
    답글
    1. 오늘 같은 에러는 아니고 저도 비슷한 에러떴습니다. 그래픽 드라이버관련해서 업데이트 하면서 뭐가 잘못됐었는지,
      다시 CUDA 8.0설치하니 정상작동하더군요. 한번 쿠다를 재설치 해보시는건 어떨까요

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

    답글삭제
  4. 한 가지 궁금한 점이 있습니다.
    사진 합성중에 한번 저장했다가 다시 시작하면
    user\user\appdata\local\temp 안에 t.exe로 시작하는 파일들이 계속 생성 되는데요.
    용량이 상당합니다. 개 당 500mb정도
    Gmdori님은 이전 파일들을 삭제 하시나요?

    답글삭제
    답글
    1. 네. 작업끝나면 삭제하셔도 됩니다. model폴더안에 데이터가 남는것 같더라구요.(model 폴더 지우면 트레이닝 첨부터 진행됨.) 희한한건 model 폴더 안에 있는 파일들은 트레이닝 시켜도 용량이 그대로인데 말이죠.

      삭제
  5. 덕분에 글 잘보고 마지막단계까지 왔네요..ㅎㅎ

    궁금한게 있는데 현재 train loss가 0.11 0.019 이정도인 상태에서 그만두고 사진들
    병합을 하니 dorigm님께서 게시한 위의 샘플영상과 비슷한 저품질의 결과물이 나오는데..
    이런경우에는 학습을 더 시키면 해결이 되는건가요?? 아니면 더 많은 사진을 필요로 하나요??
    현재 바꾸고자하는 얼굴의 사진은 40개정도 폴더에 넣어 놨습니다.

    그리고 매번 학습할때마다 이렇게 긴 시간을 투자해야 하는건가요??

    답글삭제
    답글
    1. 잘된 결과물들을 보면 어마어마하게 많은 사진을 이용합니다. 2만장 사용했다는 사람도 있더라구요. 또한 이용하는 사진의 얼굴 각도, 조명이 다양한 것이 좋다고 하네요.
      한번 학습한 사람의 얼굴을 다시 이용하는 경우는 그 시간이 단축된다고 합니다.(동일 폴더에서 몸이 되는 사진만 바꾸는 경우, 다음 (6)번 글참조하여 얼굴 데이터를 더 늘리는 것은 가능)

      삭제
    2. 시간 단축이 어느정도 가능할지는 모르겠지만, CUDA 연산능력이 좋은 그래픽카드를 사서 줄일 수는 있겠지만, 결국 고품질의 영상을 얻기위해서는 긴 시간을 투자할 수 밖에 없어보입니다.
      그리고 혹시 발생했던 문제가 해결됐을 때 해당 댓글에 알려주시면 다른 분들에게도 도움이 될 것 같습니다. 감사합니다.

      삭제
  6. ffmpeg -f image2 -framerate [00] -i img%03d.png -vcodec libx264 -crf 24 -pix_fmt yuv420p [output].mp4

    이 명령어는 420p영상을 만드는데 720p로 만드려면 어떻게 해야 할까요?

    답글삭제
    답글
    1. 명령어 문제가 아니라 이미지 자체사이즈가 420p일 겁니다. 이미지를 720p 크기로 사용하세요.

      삭제
    2. 명령어에서 420p는 색상형식에 관련된 명령어로 알고있습니다.

      삭제
  7. 한번 학습에 시간이 오래걸려서그런데

    한번에 10시간 할꺼를 2시간씩 5번 나눠서 해도 되나요??

    답글삭제
  8. 순서대로 했는데 영상 합치는 명령어가 안먹네요

    디렉터리 옮기고
    ffmpeg -f image2 -framerate 29.7 -i a%03d.png -vcodec libx264 -crf 24 -pix_fmt yuv420p 321.mp4
    명령어 치면
    [image2 @0000015369f8ad00] could find no file with path 'a%03d.png; and inex in the range 0-4
    a%03d.png: no such file or deriectory

    라는 오류가뜨는데.. 어떻게 해야하나요??

    merged파일명은 a0001로 시작합니다.

    답글삭제
    답글
    1. 숫자가 4자리이므로 a%04d.png 등으로 하셔야 합니다. 이전에 캡처이미지 만드실때에는 %04로 하셨을 겁니다.

      삭제
  9. 트레인 실행시 0.03까지는 3시간만에 내려가던데, 이후 12시간 더 켜놔도 계속 0.03이네요.
    이게 한계란 뜻인가요?
    며칠 더 켜두면 0.01까지 갈수도 있나요?

    답글삭제
    답글
    1. 네 가능합니다. 단 본인의 그래픽카드를 포함한 컴퓨터 연산능력에 따른 영향이 크므로 하루가 될 수도 일주일이 될 수도 일년이 될 수도 있습니다.

      삭제
  10. Convert하려고 제대로 입력하고 누르니까

    json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 12859051 (char 12859050)
    [17168] Failed to execute script merge_faces

    라고 뜨네요.. 혹시 방법을 아시나요?

    답글삭제
  11. CONVERT 실행후 폴더생성은 됐는데 파일이 생성안됩니다. ㅠㅠㅠ 어떻게해야하나요

    답글삭제
  12. 100%|#####################################| 805/805 [00:00<00:00, 15187.87it/s] 이렇게 뜬뒤 폴더만 생성되고 파일은 안나오는데 어떻게해야하나요?

    답글삭제
    답글
    1. 처음에 영상에서 쪼갠 이미지파일을 데이터 폴더에 다시 넣고 실행해보세요 모델은 있는데 이미지가 없어서 합성을 못하는겁니다

      삭제
    2. 데이타 A 폴더 말씀이신가요? 이미지가 그대로있는데

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

    답글삭제
  14. Reading config file from G:/fakes/model\config.p
    Using TensorFlow backend.
    2018-02-20 12:57:26.005472: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feat
    ure_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
    2018-02-20 12:57:26.266487: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gp
    u\gpu_device.cc:1030] Found device 0 with properties:
    name: GeForce GTX 970 major: 5 minor: 2 memoryClockRate(GHz): 1.266
    pciBusID: 0000:05:00.0
    totalMemory: 4.00GiB freeMemory: 3.37GiB
    2018-02-20 12:57:26.266487: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gp
    u\gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 970, pci bus id: 0000:
    05:00.0, compute capability: 5.2)
    Traceback (most recent call last):
    File "merge_faces.py", line 341, in
    File "merge_faces.py", line 234, in main
    File "pathlib.py", line 1151, in open
    File "pathlib.py", line 1005, in _opener
    File "pathlib.py", line 371, in wrapped
    FileNotFoundError: [Errno 2] No such file or directory: 'G:\\fakes\\Data_B\\alignments.json'
    [2588] Failed to execute script merge_faces

    alignments.json은 다 끝나고나면 자동 생성일텐데 왜 만드는 도중에 못 찾겠다고 오류가 나는지 모르겠습니다.
    오류 해결되서 댓글 삭제했더니 새로운 오류가..

    답글삭제
    답글
    1. 아예 싹 지우고 처음부터 다시 해봤더니 해결됐습니다.

      삭제
  15. 이미지를 영상으로 만들때 최대 몇초? 몇분까지 만들수 있나요???제가 만든건 15초가 한계여서요....

    답글삭제
    답글
    1. 한번에 처리할 수 있는 이미지의 양에 한계가 있으므로, 컴퓨터의 성능에 따라 한번에 처리할 수 있는 영상의 길이도 제한이 있긴합니다만/ 따로 처리하면 되므로 길이는 상관없습니다.

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

    답글삭제
  17. 이전에 합성 작업하던걸 다시켜서 실행하는데 loss값이 초기화되버리는현상은 왜그런건지 아시나요...

    답글삭제
  18. Reading config file from C://fakes//encoder.h5\config.p
    Model config file is missing or corrupted. Briefly rerun the Train tool with model to produce a new config file.
    Traceback (most recent call last):
    File "merge_faces.py", line 59, in
    File "d:\anaconda\envs\merging\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 631, in exec_module
    File "model.py", line 1, in
    ImportError: cannot import name 'layers'
    [3356] Failed to execute script merge_faces

    D:\FakeApp\FakeApp>

    왜이런거죠

    답글삭제
  19. 트래인눌러도 loss a loss b 일케뜨고 그다음엔 아무것도 안되네요 ㅠ 왜이런걸까요

    답글삭제
  20. 트레인프로그램으로 q누르고 정상종료 했는데 이어하기가 안되고 처음부터 다시합니다 왜이런거죠?

    답글삭제
  21. 영상 합성에는 성공 했는데 영상 화질이 본 영상에 비해 많이 떨어지네요 ㅠㅠ 이유가 뭘까요

    답글삭제
  22. Reading config file from C://fakes//model\config.p
    Using TensorFlow backend.
    2019-01-16 14:07:34.706823: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
    2019-01-16 14:07:35.313456: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1030] Found device 0 with properties:
    name: GeForce GTX 960M major: 5 minor: 0 memoryClockRate(GHz): 1.176
    pciBusID: 0000:01:00.0
    totalMemory: 4.00GiB freeMemory: 3.35GiB
    2019-01-16 14:07:35.325087: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1120] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce GTX 960M, pci bus id: 0000:01:00.0, compute capability: 5.0)
    100%|##############################################################################| 492/492 [00:00<00:00, 4288.73it/s]
    Exception ignored in: >
    Traceback (most recent call last):
    File "site-packages\tensorflow\python\client\session.py", line 696, in __del__
    File "site-packages\tensorflow\python\framework\c_api_util.py", line 30, in __init__
    TypeError: 'NoneType' object is not call


    별 반응없이 위처럼뜨고 폴더만 생성되고 사진파일은 없는데 이유가뭘까요?
    다른 합성은 생성이 되었었는데...

    답글삭제
  23. FakeApp을 종료하면 기록이 남지 않는건가요? 0.02까지 내려갔다가 컴퓨터를 껏다키니 0.1부터 다시하고있네요 q로 정상종료 했는데

    답글삭제
  24. 다 완성햇는데 원래 만든영상은 원래 소리가 안들리나여 ㅠ

    답글삭제
  25. AttributeError: module 'plaidml' has no attribute 'exceptions'


    저는 다른 사이트에서 보고따라했는데 이런게 뜨더라고요
    영상을 이미지로 추출하는데 까지는 성공했는데
    얼굴추출은 위의 메세지가 뜨면서 안되더군요 ㅠㅠ
    도와주십셔..

    답글삭제
  26. FileNotFoundError: [Errno 2] No such file or directory: 'G:\\fakes\\Data_B\\alignments.json'
    이부분은 어찌해야할까요 계속 학습을 종료했을때 alignments.json이 생성이 안됩니다

    답글삭제
  27. 힘드네요 트레인과정에서 자꾸
    training process ended if you did not end it yourself,an error occurred.check the end of the log.txt file for details,and feel free
    to post it on fakeapp.org/forum for help.
    에러 팝업창뜹니다;;; 검색해봐도 저같은 에러는없는거같아서요...ㅠㅠ

    답글삭제
  28. 이제서야 읽지만, 좋은정보 감사합니다.
    10700k+2070s 트레인시 레이어4에서 오류, 8에서 정상가동하네요. 이유는 모르겠습니다.

    답글삭제