GIF 動画のつくりかた - ControlNet m2m script

세부 정보

파일 다운로드

모델 설명

ControlNet m2m 스크립트를 사용하면 동영상 프레임을 기반으로 이미지를 생성해 마지막에 한 번에 모아 GIF 동영상으로 내보내줍니다. (movie to movie)

다음 사항들을 유의해서 읽어주세요.

  • 프롬프트만으로 동영상을 생성할 수는 없습니다

  • 개인의 방법에 대한 예시일 뿐입니다

  • 반드시 이 글의 방법을 따를 필요는 없습니다

  • 이 글의 방법대로 하더라도 '확실한 완성'은 보장하지 않습니다

또한, 수고스러운 시간을 들여도 나오는 것은 짧은 동영상 한 편뿐이므로, 쓸모없는 시간을 보내는 기분이 들 수밖에 없습니다.

제목에 "ControlNet m2m script" 따위의 문구를 넣고 있지만, m2m 스크립트 자체는 아주 간단하게 사용할 수 있는 스크립트이므로, 이 글에서는 주로 m2m 스크립트 사용 전후에 어떤 작업을 하는지 소개하는 데 중점을 두고 있습니다.

제가 올린 GIF는 여기 에서 볼 수 있습니다.

사용 소프트웨어

이들은 제가 개별적으로 사용하는 소프트웨어입니다. 대체 방법이나 다른 소프트웨어는 세상에 수많이 있으므로, 자신에게 적합한 것을 선택하세요.

각 소프트웨어의 다운로드 및 설치 방법, 이번 목적 외의 설정 및 사용법은 다루지 않습니다. 직접 찾아보세요.

본인도 이 소프트웨어들에 대한 깊은 지식은 없으며, 직접 사람에게 배운 경험이 전혀 없습니다. 여기에 적힌 대부분의 내용은 검색하면 나오는 것입니다.

수행 절차

대략적인 절차는 다음과 같습니다.

  1. 소스 동영상을 준비합니다.

  2. 동영상을 자르고 ControlNet에 테스트용 이미지로 불러옵니다.

    1. 프롬프트를 테스트합니다.

    2. Seed 값을 테스트합니다.

  3. ControlNet m2m 스크립트에 소스 동영상을 불러와 출력합니다.

1. 소스 동영상을 준비합니다.

저는 OBS Studio를 활용해 3D 성인 게임을 녹화했습니다. Blender에서 출력한 애니메이션 동영상이나 MMD의 영상 등도 활용할 수 있을 것으로 생각됩니다. 가역 압축 방식인 utvideo 코덱을 사용해 캡처하고 AVI 컨테이너에 저장합니다.

아래는 OBS Studio의 녹화 설정 예시입니다.

이미 소스 동영상을 준비하셨다면 OBS Studio는 필요 없습니다만, 직접 PC 상의 애플리케이션을 녹화해야 한다면 매우 유용한 툴입니다. 기본적으로 라이브 스트리밍용 툴이지만, 녹화 목적에도 충분히 사용 가능합니다.

녹화가 끝나면 aviutl을 이용해 필요 부분만 자릅니다.

이때 너무 긴 구간을 자르면 출력에 매우 오랜 시간이 걸리므로, 짧은 것이 좋습니다. 저는 대략 0.5~1초 정도를 기준으로 삼고 있습니다. 짧다고 느끼는 분도 있지만, 예를 들어 30fps 동영상이라면 단 1초만으로도 30장의 이미지를 생성하게 됩니다.

또한, 루프 재생이 가능하게 미리 촬영된 샷을 자릅니다. 루프 재생에 부적합한 내용이라면 시작 및 끝에 페이드 인/아웃 효과 등을 적용하는 것이 좋습니다. 다만, 이 단계에서는 효과를 추가하지 않습니다.

피사체나 배경이 크게 변화하는 영상이나 카메라가 크게 움직이는 영상의 경우, 오히려 다른 장면으로 분할하는 것이 바람직합니다. 나중에 프롬프트를 작성할 때 내용에 맞게 프롬프트를 세밀하게 설정해야 하기 때문입니다.

예를 들어 피사체가 한 바퀴 회전하는 영상이라면, 전면이 보이는 프레임과 등이 보이는 프레임이 존재할 것입니다. 전면이 보이는 프레임은 모두 좋아하는 breasts 같은 표현을 넣으면 되지만, 등이 보이는 프레임의 프롬프트는 breasts를 삭제하고 back 같은 표현을 넣어야 할 것입니다. (어쩌면 backboob일 수도 있겠네요.)

자르기가 끝나면 x264 인코더를 이용해 mp4 형식으로 인코딩합니다. aviutl이면 x264guiEx 플러그인이 있으면 편리합니다.

이때 x264 옵션에 --qp 0을 지정하면 무손실 압축(가역 압축)이 됩니다. 소스 동영상에 인코딩 노이즈가 포함되는 경우 생성되는 이미지에 악영향을 미칠 수 있으므로 저는 무손실 압축을 사용합니다.

mp4 외의 형식의 동영상을 m2m 스크립트에 집어넣으면 자동으로 mp4로 변환되지만, 그 과정에서 노이즈가 발생할 가능성이 있으므로 직접 인코딩합니다.

2. 동영상을 자른 이미지를 ControlNet에 불러와 테스트합니다.

즉시 동영상을 m2m 스크립트에 넣고 대충 프롬프트나 매개변수로 출력하면 좋은 동영상은 나오지 않습니다.

먼저 동영상을 자르고 만든 이미지를 이용해 다양한 프롬프트나 매개변수를 시도해 봅니다.

스クリーン샷처럼 이미지를 추출하는 방법은 수없이 있지만, 저는 FFMpeg의 연속 이미지 추출 기능을 사용해 모든 프레임을 이미지로 변환합니다. (여러 프레임을 테스트하고 싶을 때가 있어서 말이죠.)

아래는 FFMpeg로 동영상에서 연속 이미지를 추출하는 예시 명령어입니다.

ffmpeg -hide_banner -i "src.mp4" -ss "0:00" -f "image2" -start_number 1 "%04d.png"

옵션에 대해 설명드리면:

  • -ss는 이미지화를 시작할 동영상 시간을 지정합니다. 이 경우 0:00을 지정했으므로 첫 번째 프레임부터 이미지화됩니다.

  • -t 옵션으로 초를 지정하면 지정된 만큼만 이미지화하지만, 이번엔 모든 프레임을 이미지화하므로 지정하지 않았습니다.

  • -f는 출력 포맷을 지정합니다. 이미지 출력 시 사용하나, 파일 이름에 .png를 지정했기 때문에 자동으로 판단할 것으로 예상됩니다.

  • -start_number는 연속 번호를 시작하는 숫자를 지정합니다. 0을 지정하면 0 기반으로 설정됩니다.

  • 출력 파일명에 %04d를 사용하면 ‘0-padding 4자리’를 의미합니다. %d로 하면 0-padding이 없으며, %05d로 하면 0-padding 5자리가 됩니다.

아래는 PowerShell에서 명령어를 실행하는 예시입니다

https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/46d46135-0113-48a6-9aa3-fc60cbddacb6/transcode=true,width=800/ffmpeg.mp4

이러한 짧은 명령어를 한 줄로 입력만 하면 일순간에 모든 프레임을 이미지로 변환할 수 있습니다. 매우 편리합니다.

물론이지만, 긴 동영상을 모두 이미지화하면 폴더가 엄청난 양의 이미지로 가득 차므로 주의해 주세요.

동영상을 다룰 때 FFMpeg는 매우 유용한 도구입니다. 자르기, 리사이징, 필터 처리, 스트림 분리, 인코딩 등 목적은 무수히 많지만, FFMpeg 명령어로 다양한 작업을 수행할 수 있습니다. (지금 소개한 OBS Studio도 FFMpeg를 래핑한 것입니다.)

FFMpeg에 국한되지 않아도, 궁금한 점이 생기면 일단 인터넷에서 검색하는 것이 우선이지만, FFMpeg는 도움도 풍부해서 검색과 함께 읽어보는 것이 좋습니다.

아래는 도움말을 불러오는 명령어 예시입니다.

ffmpeg -hide_banner -h

더 상세한 도움말을 필요로 하면 아래 명령어를 사용할 수 있지만, 매우 긴 문장이 출력되므로 리다이렉트하여 텍스트 파일로 출력하는 예를 제시합니다.

# long help
ffmepg -hide_banner -h long > longhelp.txt

# full help
ffmpeg -hide_banner -h full > fullhelp.txt

필터를 제한하여 도움말을 가져올 수도 있습니다.

ffmpeg -hide_banner -h type=name

type=name 부분만 바꿔 명령어를 실행할 수 있습니다.

예를 들어, 앞서 소개한 이미지 출력 시 사용한 image2에서 어떤 옵션이 사용 가능한지 검색해 봅시다.

ffmepg -hide_banner -h muxer=image2

이 글을 쓰는 시점에서 다음과 같은 출력이 나왔습니다.

Muxer image2 [image2 sequence]:
    Common extensions: bmp,dpx,exr,jls,jpeg,jpg,jxl,ljpg,pam,pbm,pcx,pfm,pgm,pgmyuv,phm,png,ppm,sgi,tga,tif,tiff,jp2,j2c,j2k,xwd,sun,ras,rs,im1,im8,im24,sunras,vbn,xbm,xface,pix,y,avif,qoi.
    Default video codec: mjpeg.
image2 muxer AVOptions:
  -update            <boolean>    E.......... continuously overwrite one file (default false)
  -start_number      <int>        E.......... set first number in the sequence (from 0 to INT_MAX) (default 1)
  -strftime          <boolean>    E.......... use strftime for filename (default false)
  -frame_pts         <boolean>    E.......... use current frame pts for filename (default false)
  -atomic_writing    <boolean>    E.......... write files atomically (using temporary files and renames) (default false)
  -protocol_opts     <dictionary> E.......... specify protocol options for the opened files

연속 번호 시작 지정에 사용한 -start_number 외에도 사용 가능한 옵션 설명도 출력됩니다.

2-1. 프롬프트를 테스트합니다.

지금까지 만든 테스트 이미지를 이용해 다양한 프롬프트와 ControlNet 매개변수로 출력 테스트를 합니다. 이때는 임의의 Seed로 테스트를 진행합니다.

ControlNet에서 어떤 모델을 사용하고 매개변수를 어떻게 조정할지는 어떤 소스 동영상이냐에 따라 달라지지만, 저는 선형도도(Lineart)나 타일(Tile) 모델을 각각 weight 0.5 정도로 많이 사용합니다.

최근 추가된 참조 전용 이미지를 준비하면 이미지와 매우 유사하게 생성할 수 있을 것입니다.

아래는 프롬프트에 따라 다른 결과 예시입니다 (ControlNet 모델과 매개변수는 동일함)

원본 이미지

품질에 영향을 미치는 프롬프트만 작성

(masterpiece:1.2, best quality)

Negative prompt: (worst quality, low quality:1.4), EasyNegative

품질과 묘사해야 할 사항을 함께 포함한 프롬프트

thigh sex, clothed female nude male, simple background, black background, sad face young girl, silver short hair, diagonal bangs, blue eyes, green sportswear, covered nipples, panties aside, evil simle ugly man, frottage, grinding, penis, bald, (beard:0.8), (masterpiece:1.2), (best quality)

Negative prompt: (worst quality), (low quality:1.4), EasyNegative, (haze:1.4), (steam:1.4), (breath:1.4), text, subtitled, watermark, (logo:1.4), signature, username, artist name, title, subtitle, date stamp, header, footer, (clothes writing:1.4), tag, name tag, green skin

원본 동영상이 있으니 프롬프트는 대충 써도 된다는 말은 전혀 아닙니다. 2번째 이미지처럼 옷 색상이 달라지거나 남성의 생식기가 사라지는 일도 생깁니다. (허벅지 핥기 동영상인데 성기 사라지면 참 아쉽죠.)

이러한 큰 차이가 나타나는 부분은 프롬프트에 명시해서 그리도록 해야 합니다.

원본 동영상에 없는 물건을 프롬프트로 생성할 수도 있지만, 모든 프레임에서 일관되게 동일하게 그려주는 것은 거의 불가능합니다. 옷 색을 바꾸는 정도는 가능하지만, 무늬가 생기거나 색조가 변해 일관성 있게 작동하지 않습니다.

또한 프롬프트를 작성해 봤지만, 3번째 이미지처럼 AI가 의도치 않은 부분에 신경을 써서 그려버립니다. 이 경우 프롬프트로 지우는 것은 어렵기 때문에 다음 Seed 값 테스트로 넘어갑니다. (선택)

2-2. Seed 값을 테스트합니다.

대체로 어느 Seed 값이든 비슷한 경향성을 보이게 되면, 프롬프트는 고정합니다.

프롬프트는 바꾸지 않고 Seed 값만 바꿔 여러 이미지를 출력해, 마음에 드는 이미지를 찾으면 그 이미지의 Seed 값을 고정합니다.

좋은 이미지가 항상 나오지 않으면, 원본 동영상과 모델 간의 궁합이 안 맞거나, 프롬프트에 부족하거나 과도한 부분이 있거나, 너무 세부적인 부분에 집착하고 있는 것일 수 있습니다.

아래는 앞서 소개한 3번째 이미지와 동일한 프롬프트지만 Seed 값이 다른 이미지 예시입니다.

이 두 Seed 값은 옷 색이 달라져서 큰 차이가 나므로 채택할 수 없습니다. 그러나 이런 큰 차이가 아니라면 크게 신경 쓸 필요는 없습니다.

100% 완벽하고 세부적으로 완벽한 이미지를 출력해 주는 것은 불가능하므로, 어느정도 타협은 필요합니다.

예를 들어 30fps 동영상의 1프레임은 겨우 0.033...초만 표시됩니다.

1프레임의 결과가 좋을수록 좋지만, 전후 프레임의 변화가 커질수록 결국 동영상으로 봤을 때 어색함이 커질 것입니다.

이 어색함을 줄이기 위해 Seed 값을 고정합니다.

3. ControlNet m2m 스크립트에 동영상을 넣고 출력합니다.

ControlNet이 설치되어 있다면 스크립트 목록에 controlnet m2m가 있습니다.

이 스크립트는 간단하므로,

  1. 스크립트 창에서 controlnet m2m를 선택

  2. 동영상을 프레임 안으로 드래그 앤 드롭

  3. Duration 설정

이 정도만 하면 사용할 수 있습니다.

이곳에서 1번 단계에서 인코딩해 준비한 mp4 형식 소스 동영상을 m2m 스크립트에 불러옵니다.

Duration에는 "1 프레임이 표시되는 시간"을 지정합니다. (밀리초?)

Generate 버튼을 누르면 각 프레임이 이미지로 출력되고, 전체 프레임 처리가 끝나면 GIF 동영상이 완성됩니다.

이것이 m2m를 통해 동영상을 출력하는 기본 흐름입니다.

기타

효과 등 편집이 필요할 경우

m2m 스크립트는 GIF를 생성하지만 동시에 연속 이미지도 출력해줍니다.

FFMpeg를 사용하면 이 연속 이미지에서 AVI 동영상을 만들 수 있습니다.

아래는 연속 이미지를 AVI 형식의 동영상으로 변환하는 명령어 예시입니다.

ffmpeg -hide_banner -framerate "30" -i "%05d-<SEED_VALUE>.png" -vcodec "utvideo" -pix_fmt "yuv444p" -r "30" "output.avi"

-i "%05d-<SEED_VALUE>.png"<SEED_VALUE>는 본인이 출력에 사용한 Seed 값을 치환합니다. 중괄호(<>)는 필요 없습니다.

-framerate, -r로 원하는 프레임 레이트를 지정할 수 있습니다.

AVI 형식의 동영상으로 변환하면, 동영상 편집 소프트웨어로 자유롭게 편집할 수 있습니다.

편집한 동영상을 GIF로 만들고 싶을 경우

FFMpeg를 사용하면 (ry

ffmpeg -hide_banner -i "src.avi" -filter_complex "[0:v] fps=30,scale=512:512,split [a][b];[a] palettegen [p];[b][p] paletteuse=dither=floyd_steinberg" "output.gif"

디저링 알고리즘은 다른 것도 있으므로, 직접 시도해 보세요. 시각적 느낌이나 파일 크기에서 작은 차이가 생깁니다.

아래는 디저링 알고리즘 목록을 표시하는 명령어 예시입니다.

ffmpeg -hide_banner -h filter=paletteuse

게시물이나 본 페이지에 있는 질문에 대한 답변

Q. i2i를 사용하고 있나요?
A. 지금까지 사용해본 적은 없지만, 프레임 단위로 세부 수정이 필요하다면 가능할 수는 있겠습니다. 하지만 정말 많은 노력이 들 것 같습니다.
Q. 배경을 제거하고 있나요?
A. 지금까지는 제거하지 않았습니다. 기본적으로 단순한 검정 배경의 동영상을 소스로 사용하고 있습니다. 만약 배경을 제거하고 싶다면 고가이고 고성능인 After Effects의 '로토브러시' 같은 기능이 필요할 것입니다. 아니면 GIMP로 모든 프레임을 단계적으로 배경을 지워야 할지도 모릅니다...
Q. 이 글을 영문으로 번역해 주세요.
A. 불가능합니다. 중학교 영어조차도 의심스러운 저에게 영문 번역은 불가능합니다. 각 개인이 DeepL이나 ChatGPT 등을 이용하거나, 일본어에 능숙한 사람을 찾아 읽어보라고 권장해주세요. (그 번역의 정확성 역시 각자가 사실 확인해야 할 필요가 있습니다...).
결국 일본어로 이 페이지를 쓰는 것조차 제게 어떤 이익도 없는데, 더해 영문 번역을 하려는 동기는 전혀 없습니다. 게다가 만약 영문 번역을 했다고 해도, 일본어 기사가 변경되면 영문 기사도 함께 변경해야 하는 등, 시간이 두 배로 증가합니다. 생각만 해도 짜증납니다.

잡담이지만, EF EPI에 따르면 일본인의 영어 이해도는 111개국 중 80위 정도였다고 합니다. (2022년)
능력 수준은 "낮음"이며, 아시아만 봐도 24개국 중 14위로 낮은 편입니다.
https://www.ef.com/wwen/epi/regions/asia/japan/
https://www.efjapan.co.jp/epi/
대부분의 일본인에게 영문을 기대하는 것은 어렵다는 뜻입니다.

"토론"이라고 할 수 있는 건설적인 논의는 거의 없었고, Chat GPT로 이 글이 어떻게 잘못 번역되어 올라오는지 불쾌하지만, 이 페이지의 토론 기능은 비활성화했습니다. 이해해 주시기 바랍니다.

이 모델로 만든 이미지

이미지를 찾을 수 없습니다.