2018년 3월 18일 일요일

Deepfakes(9) - encoder파일공유/ 연속적인 트레이닝을 통해서 시간을 단축/ 모델 파일을 효율적으로 활용하기.


  정상적으로 트레이닝까지 진행을 한 model 폴더안에는 총 4종류의 파일이 있습니다.
encoder는 프로그램에서 어떤 얼굴인지를 정확하게 인식 혹은 처리할 수 있도록 변경해주는것으로 보입니다.
  따라서 트레이닝이 아예 진행되지 않은 encoder파일이 아닌 이전에 사용한 encoder파일을 이용하여 다른 학습을 진행하더라도 트레이닝이 빠르게 진행됩니다.
 decoder_A, B는 그렇게 처리된 얼굴 이미지를 A,B에 맞는 얼굴로 변환해줍니다. 결론적으로 모델 폴더 전체를 복사하지 않고 일부만 복사하여 사용이 가능하다는 의미입니다.

  단 이전에 개별적으로 A, B/ C, D의 트레이닝을 진행하였을 때 A,C의 트레이닝을 하기 위해 decoder_C를 decoder_B 대신에 붙여넣어도 정상적으로 진행이 되지 않았습니다.??? (A, B로 만들어진 파일을 기반으로 A,C를 트레이닝 후 A,B-B(A,B트레이닝으로 만들어진 B)와 A,C-C를 이용해 B,C 트레이닝이 되는것 같기도??? 아직 이부분은 잘모르겠음.)

  A,B/ A,C의 트레이닝을 진행할 때 A, C의 트레이닝을 A,B의 model 파일을 이용하여 진행했다면 A,B의 트레이닝을 통해 얻은 decoder_A파일과 A, C의 트레이닝을 통해 얻은 decoder_A파일은 서로 호환이 가능합니다. 즉 트레이닝이 이어지므로 A, B/ A, C의 트레이닝이 분리되는 것이 아니고 A의 얼굴 트레이닝은 연속적으로 가능하므로 두번의 트레이닝을 통해 모두 A의 Loss를 줄여나갈 수 있으므로 시간 단축이 가능합니다. 또한 encoder파일도 서로 호환가능합니다.

  예를 들어 이렇게 이용가능합니다. 주로 사용하는 A, B라는 인물의 트레이닝을 동시에 진행하여 model파일을 생성합니다. 이후 축구선수 C의 몸에 A의 얼굴을 붙여넣기 위해 A, B의 model파일을 기반으로 트레이닝을 하여 합성을 완료한 후 A, C의 트레이닝을 통해 발전된 encoder.h5와 decoder_A.h5 파일을 A, B의 model 폴더에 붙여넣어 A 얼굴에 대해 Loss를 감소시킨 model을 얻을 수 있습니다. 다시 B의 얼굴을 사용하여 D의 몸에 붙여넣을 경우 위와 같은 과정을 반복하면 A, B 트레이닝을 직접 진행하지는 않았지만 결과적으로 A, B의 Loss가 줄어든 model 파일을 얻을 수 있습니다.

  이를 통해 이전에 개별적인 2단계 혹은 3단계의 과정을 거칠 필요없이 연속적인 하나의 A, B모델을 얻음으로써 시간을 크게 단축하고 계속해서 Loss를 줄여나갈 수 있습니다.

ps. 최근에 dfake, myfakeapp등이 새로 나온것 같네요. 얼굴 인식률이 좋아지거나 얼굴의 범위를 크게 잡아 좀더 자연스럽게 하려는 방향으로 나아가고 있습니다.

  즉 위에 주황색 부분의 이야기까지 맞다면 encoder.h5은 계속 누적해서 사용하면 됨.
인물별로 각 인물에 해당하는 decoder_땡.h5 파일만 돌려서 사용(Loss를 계속 줄이는 것이 가능)하면 됨. 어차피 본인이 사용하는 Node, Layer값은 동일할 것임으로.

180407 현재 알고있는 바로는 encoder가 호환의 기준이되는 것으로 보임. 동일한 encoder를 계속 사용한다면 모든 decoder끼리도 돌려가며 사용가능해보임. (encoder 파일을 족발집 육수마냥 우리기 가능)

그런 의미에서 encoder파일을 공유합니다.
이를 사용하시면 빈파일을 사용하시는것에 비해 굉장히 빠르게 좋은 결과를 얻으실 수 있을거라 생각합니다. 사용방법은 model폴더를 만드실 때 decoder는 기존 빈파일을 이용하고 encoder와 config 파일만 이파일로 넣으시면 됩니다.
batch size:32
save period:32
Layers:4
Nodes:256

download - (Ver Date.180407)

댓글 7개:

  1. 신버전 받으려면 검색어 뭘로 입력해야 할까요? 알려주시면 감사하겠습니다.

    답글삭제
  2. Gmdori 님이 올려주신 게시글 보면서 차근히 배우고 있습니다! 감사합니다 ㅎㅎ
    제가 알고 싶은 것이 있는데,
    저는 항상 data_A 에는 몸을 남길 모델, data_B 에는 얼굴을 남길 모델 자료를 넣어서
    A의 몸에, B의 얼굴을 적용하는 러닝을 하는데요, 이러한 상황에서
    앞으로 B의 얼굴에 다른 A'의 몸을 적용하는 새로운 러닝을 할때
    러닝 타임을 줄이고 좀더 자연스러운 결과물이 나오게 하는
    유의미한 헤더파일(?)이 무엇인가요? decoder_A.h5인가요? decoder_B.h5 인가요?
    아니면 둘다 일까요? ㅠ
    또, 글을 읽어보니 encoder.h5 의 경우 이전 러닝 결과에 의해
    학습된 변환 데이터들이 축적돼있고 이후 다른 러닝을 할때 data_A, data_B에 전과는 다른
    자료들을 넣어 러닝해도 대체할 필요없이 계속 사용하면서 더 업그레이드 시키는 있는것으로
    이해했는데 잘 이해한거 맞나요??

    답글삭제
    답글
    1. -> 더 업그레이드 시킬수 있는것으로.. ㅎㅎ

      삭제
    2. 예 잘 이해하셨습니다.

      1. B의 얼굴에 다른 A'의 몸
      : decoder_B.h5 입니다. 말그대로 A는 바뀌었으니 A의 decoder_A.h5를 사용할 경우 다른 A에 관한 결과도 빨리 얻을 수는 있으나 얼굴특성이 섞입니다. 물론 A는 몸만 사용하니 상관없긴하겠네요.

      2.학습된 변환 데이터들이 축적
      : 맞습니다. 다만 축적 하는데에는 한계가 있는것같습니다. 다른 학습을 하다보면 원래의 파일들을 트레이닝 했을떄 Loss가 다시 증가하는것으로 보이는현상이 있네요.

      삭제
  3. 제가 잘 이해를 못해서 제가 하면서 느낀게 맞는건지 질문드립니다.
    A몸에 B의 얼굴을 이식하려고 합니다.
    그런데 처음에 A몸에 B를 이식할때 많은 트레이닝 시간이 걸립니다. (노드 2048에 배치 330 거의 3일 정도 해야 0.013까지 가는데도 흐릿하네요, GPU 로드도 별로 안걸립니다 2~30%갔다가 간혹 100% 가는식)
    근데 Loss를 0.013까지 보내놓고 몸을 다른 사람으로 바꾸려고 합니다
    그러면 C의 몸에 B의 얼굴이 되는데 Openfaceswap에서 FACE A만 C로 바꾸고 FACE B는 유지하고 MODEL도 유지한 상태로 진행하니 LOSS도 처음부터 낮은값으로 진행하고 얼굴도 그만큼 빨리 윤곽이 잡힙니다.

    이게 제가 해보면서 느낀건데 맞는건가요?
    그리고 윗 댓글에서 얼굴의 특성이 섞인다는게 제가 하는 방식에서는 상관 없는건가요?

    답글삭제
  4. 그리고 배치가 한번 연산하는데 드는 사진 수로 알고 있는데 배치가 적을수록 Loss가 빨리 떨어지는데 64로 지정시 50% 사용하고 330으로 지정시 평균 20% 간혹 100%사용하는데
    왜 이런 차이가 발생하는건지 아시나요?

    그리고 7980xe랑 1080ti, vega 56을 사용하는데 세가지 한번에 러닝시키는 방법은 없을까요?
    마지막으로 램을 64기가를 사용하는데 램이 많이 노는데 보통 몇기가 사용이 정상인가요?

    답글삭제
  5. 정보 공유 감사합니다. 아직 적응 단계이긴 한데 오류도 잡아가면서 잘되고있어요 ㅎ

    답글삭제