OpenPose 활용 Image Data Augmentation — 담장 침입 장면

데이터: AI Hub 무인 플랜트 안전 감시를 위한 데이터(71677) 샘플 · intrusion_climb-over-fence_rgb_0080_cctv2 · frame 18

문제 :

일반적인 행동
일반적인 행동 · 담장을 넘기 전 이동
증강할 행동
증강할 행동 · 담장을 오르는 동작

일반적인 행동 데이터에 비해 담을 넘는 행위의 데이터는 수가 매우 적다. 부족한 행동 데이터를 보완하기 위해, 담장을 넘는 자세와 CCTV 배경은 유지하고 인물의 외형만 바꾸는 방식으로 학습 데이터 후보를 증강한다.


결론 :

사람 검출 → 크롭 → OpenPose(DWPose) 스켈레톤 → 마스크 → 인페인팅 → 원위치 합성으로 구현. VLM으로 원본 인물·자세·장면을 묘사한 뒤 인물만 바꾼 프롬프트를 만들고, 같은 원본·크롭·마스크·스켈레톤·seed로 생성했다. 아래는 그중 세 종류.

원본
작업 전 (원본)
Woman with a long brown ponytail, no hat, light gray zip-up hoodie, black leggings, white sneakers
작업 후 · Woman with a long brown ponytail, no hat, light gray zip-up hoodie, black leggings, white sneakers
Man with short black hair, black baseball cap, black short-sleeve t-shirt, blue denim jeans, black sneakers
작업 후 · Man with short black hair, black baseball cap, black short-sleeve t-shirt, blue denim jeans, black sneakers
Male worker in a yellow safety helmet, orange high-visibility vest over a dark long-sleeve shirt, gray work trousers, brown safety boots
작업 후 · Male worker in a yellow safety helmet, orange high-visibility vest over a dark long-sleeve shirt, gray work trousers, brown safety boots

자세한 수행 과정

사용 모델: FLUX.1-Fill + ControlNet Union Pro 2.0 · DWPose · ComfyUI.

1. 목표 : 인물만 바꿔서 같은 행동 데이터를 양산

같은 침입 동작과 배경에서 인물 외형을 바꿔 학습 데이터 후보를 만든다. 침입 탐지 성능 개선 여부는 별도 학습·평가가 필요하다.

2. 사람 검출

YOLO 사람 검출
YOLOv8x 사람 검출 결과 · 외접 사각형(bbox)

YOLO 사람 검출 모델로 인물을 찾고 외접 사각형을 얻는다. 되돌려 붙일 때 쓰기 위해 좌상단 x, y 와 크기를 함께 저장한다.

3. 인물 높이 50% 크롭

크롭

인물 높이가 크롭 한 변의 약 50%가 되도록 정사각으로 자른다. (이유: 생성 영역이 너무 작으면 모델이 그 부분을 덮어버리는 이슈가 있음.) 크롭은 1024² 로 확대해 생성한다.

4. DWPose 스켈레톤 추출

DWPose

DWPose(openpose 개선판)로 자세의 뼈대인 스켈레톤을 추출한다. 이 스켈레톤이 생성 시 자세 조건(ControlNet openpose)이 된다.

5. 스켈레톤 → 그레이 마스크

그레이 마스크

스켈레톤을 단일 채널로 바꾸고 임계값을 적용해 마스크를 만든다.

6. 마스크 dilate

dilate 마스크

마스크를 팽창(dilate)시켜 인물 주변까지 새로 그릴 영역에 포함한다. 흰색 영역만 인페인팅(선택 영역 다시 그리기)한다.

7. 프롬프트 — VLM 묘사 기반 베리에이션

짧은 프롬프트("back of brown hair woman")만 주면 자세·장면 정보가 부족해 결과가 흔들린다. 그래서 VLM(claude-fable-5-1)에 크롭 이미지를 보여주고 장면·카메라·자세·인물을 먼저 묘사하게 한 뒤, 인물 외형만 바꾼 프롬프트를 만들게 했다. 생성 프롬프트에는 자세를 세세히 적지 않고 "담을 넘으려고 하고 있다(trying to climb over the fence)" 정도만 남긴다. 자세는 ControlNet 스켈레톤이 담당하므로, 프롬프트가 자세를 과하게 지시하면 스켈레톤과 충돌한다.

항목VLM 묘사
장면Outdoor industrial plant yard: a chain-link fence with a metal top rail in the foreground, beige electrical control cabinets, a red-and-white Korean warning sign on the left, a white notice board on the right, steel pipe racks and a leafy tree behind, concrete ground with a small plastic stool at the bottom.
카메라Fixed CCTV camera, slightly elevated, daylight with strong sunlight and hard shadows, mild motion blur and compression, seen from behind the person.
자세A person climbing over the chain-link fence from the near side: body turned away from the camera, both hands gripping the top rail (left hand on the rail to the left of the head, right hand further right), left knee raised and pressed onto the fence mesh near the top rail, right foot planted on the lower rail with the leg extended, torso leaning forward over the rail, head tilted slightly down.
원본 인물Adult man of average build seen from behind, black baseball cap, cream-white long-sleeve sweatshirt, dark navy jogger pants tapered at the ankle, white sneakers with dark socks.

인물만 바꾼 베리에이션 프롬프트 4종:

8. 인페인팅 (FLUX.1-Fill + ControlNet openpose)

FLUX.1-Fill 에 원본 크롭과 마스크를 넣고 ControlNet Union Pro 2.0(openpose)으로 스켈레톤을 자세 조건으로 준다. 20 steps · guidance 30.0 · ControlNet 강도 0.8 · seed 12345 · DifferentialDiffusion.

9. 포즈 제어 강도 비교

베리에이션 3(Male worker in a yellow safety helmet, orange high-visibility vest over a dark long-sleeve shirt, gray work trousers, brown safety boots)으로 강도 6단계 × seed 10개 = 60장을 생성한 뒤 검수해, 인물이 철망을 뚫고 들어가거나 철망 선이 몸 위에 그려진 장을 제외했다. 아래 세트는 seed를 고정하지 않고, 각 강도에서 통과한 장 가운데 1.0→0.0 자세 변화가 가장 잘 보이는 것을 골랐다(캡션에 seed 표기). Fill 모델도 가끔 인물을 철망 뒤에 그리므로 seed 선별이 필요하다.

1.0
control scale 1.0 · seed 12345
0.8
control scale 0.8 · seed 20003
0.6
control scale 0.6 · seed 20007
0.4
control scale 0.4 · seed 20005
0.2
control scale 0.2 · seed 20003
0.0
control scale 0.0 · seed 20002

Fill 모델은 마스크와 마스크 밖 원본을 자기 입력 채널로 받으므로, 강도를 낮춰도 인물의 위치·크기·합성 경계는 그대로 유지되고 포즈 구속만 풀린다. 1.0·0.8은 스켈레톤대로 무릎을 높이 올린 자세, 0.6은 무릎이 낮아지고, 0.4는 한 발만 레일에 걸친 채 다리가 내려오며, 0.2는 두 발로 레일 위에 서서 담장을 잡고, 0.0은 담장에 몸을 기대는 자세까지 풀린다. 몸이 잘리거나 인물이 사라지는 실패는 없다.

강도 0.0은 ControlNet을 완전히 우회한 순수 인페인트라 자세가 seed에 맡겨진다. 같은 강도에서도 seed마다 자세가 달랐고(서 있음·한 발 올림·무릎 올림 유지), 일부 seed는 dilate 마스크의 실루엣만으로도 원본과 비슷한 자세를 그렸다. 즉 스켈레톤 모양 마스크 자체가 자세 정보를 일부 담고 있어, 강도 효과는 seed에 따라 크게도 작게도 보인다.

60장 검수 결과: 10개 seed 중 3개(20001·20006·20009)는 인물이 철망 뒤에 그려졌고, 2개(12345·20008)는 0.2 이하에서 철망 선이 상체 위에 겹쳤다. 결론: 강도 0.6 이상에서 seed 여러 개를 뽑아 철망 관통을 걸러내는 방식이 안전하며, 문서는 0.8로 고정한다.

10. 원위치 합성

생성 패치를 원래 크롭 크기로 줄이고, dilate 마스크 경계를 feather로 부드럽게 섞어 저장해 둔 x, y 에 붙인다. 결론의 두 인물은 한쪽 무릎을 올린 뒷모습을 유지하지만 원본보다 머리와 상체가 조금 곧게 서 있고, 인물 주변 제어반·철망·기둥에 형태 변화가 남는다. 손과 신발이 난간에 닿는 경계도 확인해야 한다.

11. 다음 작업

서로 다른 장면에서 동일 인물 유지 · 정면/측면/후면 판정 자동화 · 생성 데이터를 이용한 탐지 모델 재학습과 성능 비교.