crop 생성 후 되돌리기 작업 방식 정리

데이터: AI Hub 71677 「공장 내 안전사고 예방 CCTV 영상」 · intrusion_damage-to-facilities_rgb_0131_cctv1

문제 :

전체 프레임(1792×1008)에 이벤트 위치를 빨간 박스로 표시하고, 프롬프트에 "in the red box"만 덧붙여 Seedance에 넣으면:

제멋대로 화각을 바꾸거나 (누유, 720p seed 20261063)
이벤트 크기가 너무 작거나 (누유, 720p seed 20261066)
지정한 위치가 유지되지 않는다 (누수, 720p seed 20261077)

화면에서 작은 부분을 차지하는 이벤트(누유·누수)는 전체 프레임을 입력하면 모델이 박스를 지워 버리고 위치·크기·화각을 제멋대로 정한다. 이를 해결하기 위해 이벤트가 생길 자리만 crop 해서 생성한 뒤, 원래 자리에 되돌려 붙이는 방식으로 생성한다.

배경과 crop 박스
배경 전체와 crop 박스 (빨강 G2 누유 120×120 · 초록 H3 누수 480×480). 위 실패 예시의 입력은 이 박스를 빨간 선으로 그린 전체 프레임(full_redbox_G2/H3.png)
crop G2
누유 crop G2 (120×120 → 6배 업스케일 720×720 입력)
crop H3
누수 crop H3 (480×480, 업스케일 없음)

결론 :

매우 자연스럽게 합성 가능. 이벤트 위치만 잘라 생성하면 전체 프레임에서는 나오지 않던 작은 누유·누수도 안정적으로 생성되고, 되돌린 뒤에도 경계·색·그레인이 배경과 구분되지 않는다.

누유 · 작업 전 (뒤틀린 생성물을 리사이즈해 그대로 붙임)
누유 · 작업 후 (정합 → feather → 색·그레인 매칭)
누수 · 작업 전 (뒤틀린 생성물을 그대로 붙임 — 경계와 배관이 어긋남)
누수 · 작업 후

누유·누수 예시의 '작업 전' 생성물은 채택 클립에 x·y 비등방 스케일(×1.05, ×1.03)과 이동 (+8, -11)px 를 가한 것이다. 좌하단 한 점(640px 기준 (140, 520))이 제자리에 남도록 기준점을 잡아 그 부근은 일치하고 우상단으로 갈수록 최대 25px 까지 어긋난다. 이번 입력(480×480 crop, 업스케일 없음)에서는 Seedance가 첫 프레임 구도를 거의 픽셀 단위로 유지해(정합 결과 H ≈ 0.75 스케일 + 0.05px 이동) 정합 단계가 할 일이 없었기 때문에, 모델이 구도를 살짝 바꾼 경우를 재현해 3~11단계가 실제로 보정하는 모습을 보인다. 인위적 뒤틀림 파라미터와 코드는 perturb_clip.py에 있다.


자세한 수행 과정

각 단계별 변화는 align_stages_water.zip(02 rigid → 09 final 누적 영상 8편, 누수 예시)을 확인하는 것을 추천한다.

1. 목표 : 크롭해서 생성 뒤 되돌려 붙여넣기

step1

입력은 두 가지다. (A) crop 을 Seedance에 넣어 받은 생성 클립(640×640, 480p adaptive), (B) 원본 CCTV 프레임과 crop 박스 좌표. 목표는 (A)를 (B)의 빨간 박스 자리에 티 나지 않게 되돌려 넣는 것이다.

2. 그냥 붙이면 왜 안되는가

step2

모델이 latent space를 거쳐 영상을 내놓기 때문에 생성 후 구도가 약간씩 뒤틀릴 수 있다. 리사이즈만 해서 붙이면 (C)처럼 배관·철망 전체가 어긋난다 (|A−B| 평균 48.7).

3. SIFT 특징점 검출

step3

영상 프레임(A)과 배경 참조 영역(B) 양쪽에서 SIFT 특징점을 뽑는다. 조명·스케일 변화에 강인해서 두 이미지의 같은 지점(모서리·구조물·텍스처)을 찾는 기준이 된다.

논문 (Lowe, IJCV 2004)

4. 매칭 & Homography 추정 (RANSAC)

step4

특징점 기술자를 매칭(ratio test 0.75)하고 RANSAC으로 이상치를 걸러 호모그래피 H를 푼다. inlier 2178개(기준 25개 이상이면 warp, 미만이면 rigid로 후퇴). 구한 H는 x 스케일 0.7142·y 스케일 0.7281, 이동 (+5.0, +11.3)px 로, 주입한 뒤틀림(×1.05, ×1.03, 이동 (+8, -11)px → 480px 기준 역변환 x 0.7143·y 0.7282)과 일치한다.
카메라가 고정이니 H는 프레임 0에서 한 번만 풀고 전체 프레임에 재사용한다.

5. Homography warp

step5

단순 리사이즈(B)보다 warp(C)의 차이 |Δ|가 크게 줄어든다 (평균 48.7 → 7.6). 남는 차이는 생성 영상의 색·노이즈 차이와 누수 자체다.

6. Feather

step6

경계면이 튀므로 warp 유효 영역 안쪽으로 alpha를 0→1로 올린다. feather 폭은 박스 짧은 변의 1/6(480px → 80px)로 잡았다. 원래 상수 96px를 120px 박스(누유 G2)에 그대로 쓰면 패치 전체가 반투명이 되어 기름이 옅어졌기 때문에 박스 크기에 비례하도록 바꿨다.

7. 조도 매칭 (illumination)

step7

feather 링 밴드(이벤트가 없는 정적인 띠)에서 배경과 생성 영상의 채널별 중위값 비율(gain)을 구해 곱한다. 이벤트가 있는 중앙은 통계에서 제외된다.

8. 색온도/ Tint 매칭 (CIELAB)

step7b

gain은 채널별 밝기는 맞추지만 warm/cool·green/magenta 같은 색조(tint)는 남는다. 그래서 색을 밝기(L)와 색도(a,b)로 분리하는 CIELAB로 바꿔, 링 밴드에서 배경과의 a·b 중앙값 차이만큼 색도를 이동한다(최대 ±25). L(밝기)은 건드리지 않아 노출은 그대로 두고 색온도만 배경에 맞춘다. 이번 클립은 실제 차이가 거의 없어(위 행) 아래 행에 색 cast를 일부러 넣어 보정되는 모습을 함께 보였다.

9. 생성 영상 Denoise

step8a

생성 영상에는 자체적인 노이즈가 배어 있어 배경 그레인과 성격이 다르다. 그레인을 새로 얹기 전에 non-local means로 먼저 노이즈를 제거(h=5)해 깨끗한 신호만 남긴다(B). (C) |A−B|가 제거된 노이즈다. 이렇게 하면 다음 단계에서 배경과 동일한 그레인을 전체 프레임에 균일하게 다시 입힐 수 있다.

10. 그레인/샤프니스 매칭

step8

정지 배경은 프레임마다 노이즈가 바뀌지 않아 "얼어 있는" 느낌이 나므로, 생성 영상의 노이즈 수준(σ)을 재서 배경 전체에 프레임마다 새 그레인을 얹는다. 동시에 라플라시안 에너지 비율로 생성 영상의 선명도를 배경에 맞춘다(×1.43).

11. 최종 합성

Seedance 생성 클립 (crop H3, seed 20261050)
작업 후 — 배경 전체 프레임에 되돌려 붙인 결과