옵티컬 플로우: 프레임 사이의 움직임 읽기
옵티컬 플로우 모션 트래킹은 AutoScript Sync의 모든 스크립트가 바탕으로 삼는 유일한 신호입니다. 샘플링된 프레임 쌍마다 DIS 밀집 옵티컬 플로우가 움직이는 영역의 픽셀이 어떻게 이동했는지 측정합니다. 이것이 속도를 주고, 엔진은 이를 누적해 위치 궤적을 만든 뒤 드리프트를 억제하기 위해 앵커에 고정합니다. 플로우는 모든 PC에서 CPU로 실행됩니다.
2026년 9월 21일에 앱의 코드와 대조해 확인했습니다.
움직이는 영역에 대한 DIS 옵티컬 플로우
기본 적응형 AI 엔진은 OpenCV의 DIS(Dense Inverse Search) 옵티컬 플로우를 FAST 프리셋으로 사용합니다. 가로 320 px로 축소한 프레임 안에서, 엔진이 찾은 움직이는 영역이나 Set Motion Region… 또는 Live Track으로 직접 그린 상자에 대해 실행됩니다. 그와 함께 ultrafast 프리셋을 쓰는 절반 해상도의 두 번째 DIS 패스가 실행되어 플로우를 신뢰할 수 있는지 확인합니다.
- Fast
- 4프레임 간격의 플로우: 30 fps 영상에서 초당 7.5회.
- Balanced
- 3프레임 간격: 30 fps 영상에서 초당 10회. 기본값.
- High
- 2프레임 간격: 30 fps 영상에서 초당 15회. 가로 640 px 이상의 평면(비 VR) 영상에서는 추적 영역의 플로우를 640 px에서도 측정합니다. 개발자 메모에는 분석 시간이 약 1.4배 늘어나는 대신 약간의 개선(두 영상에서 스트로크 F1 +0.007, +0.003)이 기록되어 있습니다.
간격은 고정된 프레임 수이므로, 60 fps 영상에서는 모든 빈도가 두 배가 됩니다.
다른 곳에서 AutoScript Sync가 Farneback 옵티컬 플로우를 쓴다는 글을 볼 수 있습니다. 주 엔진은 그렇지 않습니다. Farneback은 기본 Generate 버튼에서 Use adaptive AI engine의 체크를 해제하면 쓰이는 기본 엔진과, AI Bulk Learn의 샘플러에만 있습니다.
속도에서 위치로
플로우는 무언가가 얼마나 빨리 움직였는지는 알려 주지만 어디에 있는지는 알려 주지 않습니다. 속도를 더해 가면 위치가 나오지만, 작은 오차도 함께 쌓여 궤적이 떠돌게 됩니다. 그래서 엔진은 누적된 플로우를 앵커에 고정합니다. 앵커는 더 느리지만 절대적인 위치 측정값으로, 움직이는 영역의 중심, 자세 키포인트, 상대 깊이 중에서 영상마다 선정됩니다. 기본적으로 앵커는 읽을 수 있는 모든 채널을 샘플마다 섞은 블렌드가 되는데, 그 블렌드가 단일 우승 채널 이상의 점수를 받을 때에 한합니다.
RTS 스무더(영상 전체에 대한 순방향 패스 뒤의 역방향 패스)를 갖춘 Kalman 필터가 이 둘을 하나의 위치 궤적으로 융합합니다. Depth priority 설정(30~90, 기본값 85)은 그 궤적 중 얼마만큼을 속도에서 가져올지 정합니다: 값이 높을수록 앵커의 가중치가 낮아집니다. 설정의 툴팁이 그 절충을 설명합니다: 속도는 스트로크 크기를 담고, 앵커는 드리프트를 막지만 깊이를 평평하게 만들고 빠른 스트로크를 따라가지 못합니다. 이 설정을 바꾸면 다시 보내는 것만으로는 안 되고 다시 생성해야 합니다.
추적이 끊긴 곳은 양쪽 스트로크에서 이어지는 리듬 있는 움직임으로 채우며, 이렇게 채운 타임라인의 비율은 스크립트 메타데이터에 기록됩니다.
리듬 정리
완성된 궤적에는 기본적으로 두 가지 정리 작업이 실행됩니다. 하모닉 폴딩은 실제 스트로크 빈도의 두 배로 나타나는 지그재그를 제거합니다. 리듬 정규화는 신뢰도가 낮은 피크를 주변 박자 쪽으로 옮깁니다. 그다음 AI funscript 생성의 원리에서 설명한 대로 반전 지점마다 점을 찍습니다.
코덱 모션 벡터와 오디오 곡선
주 패스가 실행되는 동안 백그라운드 스레드가 PyAV로 두 가지 신호를 더 읽습니다. 둘 다 선택 사항입니다: PyAV나 오디오 트랙이 없으면 영상만 쓰는 경로가 그대로 실행됩니다.
- 코덱 모션 벡터. 압축된 영상에는 이미 프레임마다 화면의 블록이 어떻게 움직였는지가 저장되어 있습니다. 앱은 샘플링된 프레임만이 아니라 모든 프레임의 벡터를, 영상 길이에 비례하는 25~150초의 시간 예산 안에서 읽습니다. 그 속도는 영상의 90% 이상을 커버할 때만 신호로 사용됩니다.
- 50 Hz 오디오 음량 곡선, 20~120초의 예산 안에서 읽습니다. 오디오는 채워 넣은 움직임이 사운드트랙의 박자와 위상이 맞도록 유지합니다.
예산 때문에 긴 영상은 일부만 커버될 수 있습니다. 이 신호들의 주된 역할은 빈도 증인입니다: 어떤 구간을 전체 프레임 속도로 다시 읽는 두 번째 패스를 적용할지 결정하는 데 도움을 줍니다. 그 패스는 움직임이 샘플링 빈도에 비해 너무 빨라 보이거나 추적 품질이 낮은 구간을 대상으로 합니다. 그 패스는 최대 4개 구간, 영상의 최대 35%까지만 다룹니다. 개발자의 측정에서는 구간이 시간순으로 유지되기 때문에 실제로 각 테스트 영상의 0.2~0.6%만, 그것도 모두 처음 40초 안에서만 커버했습니다. 영상 전체를 전체 프레임 속도로 처리하는 패스가 아닙니다. 직접 고른 구간에 대해서는 타임라인 편집기의 Re-analyze가 원할 때 그렇게 해 줍니다.
장면 전환 감지
컷을 가로질러 플로우를 누적하면 카메라 전환을 엄청난 움직임으로 취급하게 됩니다. 그래서 엔진은 샘플링된 프레임 쌍마다 확인합니다: 평균 픽셀 차이가 28을 넘으면 컷 후보로 표시하고, 두 그레이스케일 프레임의 밝기 히스토그램 상관관계도 0.80 미만일 때만 컷으로 인정합니다. 히스토그램 검사는 실제 컷과 빠른 움직임을 구분합니다. 빠른 움직임은 많은 픽셀을 바꾸지만 같은 화면을 옮길 뿐 교체하지는 않기 때문입니다. 컷은 코덱 모션 벡터가 아니라 이 방법으로 감지됩니다.
플로우의 비용
플로우는 비싼 부분이 아닙니다. 개발자의 플로우 실험에서 CPU 플로우 단계는 Balanced 설정에서 샘플당 중앙값 4.8~5.1 ms, 영역 해상도가 두 배인 High에서 7.6~9.1 ms가 걸렸습니다. 이 수치는 영상 세 편에서 각각 200~400개 샘플로 전체 생성이 아닌 플로우 단계만 측정한 것이므로, 벤치마크가 아니라 규모 감각으로 봐 주세요. 깊이 추정이 GPU로 옮겨간 이후, 개발자의 측정에서 가장 큰 단계는 자세 추론입니다.
한계
- 빠른 스트로크와 샘플링 빈도. 30 fps 영상에서 Balanced일 때 엔진은 초당 10프레임을 봅니다. 개발자가 직접 스크립트를 쓴 테스트 클립과 비교했을 때, 가장 빠른 두 영상의 스트로크가 사람의 것보다 훨씬 작게 나왔으며, 현재 가설은 이 빈도가 빠른 움직임을 뭉개 버린다는 것입니다. High는 더 촘촘하게 샘플링하고, Re-analyze는 선택한 구간을 전체 프레임 속도로 읽습니다.
- 플로우는 의미가 아니라 움직임을 측정합니다. 추적 영역 안의 모든 움직임이 기록되며, 그것이 원하는 스트로크인지는 상관없습니다. 사람이 동작 없음으로 표시한 구간에서도 엔진은 분당 약 85회의 방향 전환을 만들어 냈습니다.
- CPU 전용. 플로우는 모든 PC에서 OpenCV의 CPU 구현으로 실행됩니다. 더 빠른 GPU는 자세와 깊이 추정을 빠르게 할 뿐, 플로우는 빨라지지 않습니다.
질문
앱은 왜 Farneback 대신 DIS를 사용하나요?
기본값인 적응형 AI 엔진은 FAST 프리셋의 DIS에 절반 해상도 신뢰성 검사를 더해 사용합니다. Farneback은 기본 엔진과 AI Bulk Learn 샘플러에만 남아 있습니다. 둘은 서로 다른 OpenCV 밀집 플로우 방식이며, 이 페이지는 코드가 실제로 실행하는 것을 설명할 뿐 저희가 공개한 직접 비교가 아닙니다.
영상에 소리가 있어야 하나요?
아니요. 사운드트랙이 있으면 오디오 곡선이 채워 넣은 구간을 박자에 맞추는 데 도움을 줍니다. 없으면 영상만 쓰는 경로가 그대로 실행됩니다.
플로우가 화면의 특정 부분을 따라가게 할 수 있나요?
네. Set Motion Region…은 영상 전체에 상자 하나를 지정하고, Live Track은 영상이 재생되는 동안 상자를 움직일 수 있게 해 줍니다. 트랙은 영상 옆에 .roitrack.json 파일로 저장됩니다.
다음 읽을거리
- 전체 생성 파이프라인디코딩과 저장 파일 사이에서 플로우의 위치.
- 플로우가 놓치는 축을 위한 깊이 추정카메라 쪽으로 다가오고 멀어지는 움직임.
- YOLOv8 자세 키포인트플로우 궤적이 떠돌지 않게 막는 앵커 중 하나.
- 느낌이 이상한 스크립트 고치기스트로크를 놓치거나 너무 작을 때 해 볼 것.
여러분의 영상으로 직접 사용해 보세요
체험판은 하루 동안 여러분의 PC에서 실행됩니다. 영상은 로컬에서 분석되며 절대 업로드되지 않습니다.