틀린그림찾기를 자동 생성하려다 22커밋 만에 기능을 껐습니다


“내 사진으로 틀린그림찾기를 자동으로 만들 수 있을까?” 이 한 문장으로 시작한 프로젝트가 있습니다.

결론부터 말하면 작동하는 건 만들었는데, 처음에 제일 그럴듯해 보였던 기능은 결국 껐습니다. 실패에 가까운 기록이지만 배운 게 많아서 정리해둡니다.

1. 문제 정의가 생각보다 까다롭습니다

틀린그림찾기의 핵심은 사진을 고치되 찾을 수는 있게, 그러나 티는 안 나게 바꾸는 겁니다. 모순처럼 들리는데 실제로도 모순이에요.

  • 너무 티 나면 → 1초 만에 찾음, 재미없음
  • 너무 자연스러우면 → 못 찾음, 짜증남
  • 어색하면 → “아, 여기 지웠네” 하고 방식이 들켜서 나머지도 다 찾힘

세 번째가 제일 무서운 함정이었습니다.

2. 처음엔 “지우기”가 정답인 줄 알았습니다

가장 먼저 시도한 건 인페인팅(Object Removal)이었어요. 사진에서 물체 하나를 지우고 배경으로 자연스럽게 메우는 방식입니다.

개념적으로는 완벽하죠. 물체가 사라졌으니 명확한 차이고, 잘 되면 티도 안 납니다.

문제는 “잘 되면”이었습니다. 실제로는 지운 자리에 뭉개진 얼룩이 남았고, 사용자는 그 얼룩을 보고 답을 찾았어요. 물체가 없어진 걸 발견한 게 아니라 인페인팅 흔적을 발견한 겁니다. 이러면 게임이 성립하지 않습니다.

3. 스티커로 갈아타고, 붙이는 법을 다듬었습니다

방향을 틀어서 물체를 지우는 대신 없던 걸 붙이기로 했습니다. 만화풍 스티커를 얹는 방식인데, 이건 이것대로 문제가 있었어요. 그냥 붙이면 명백하게 “붙인 것”처럼 보입니다.

그래서 붙이는 방법을 계속 손봤습니다.

  • 3D 원근 왜곡 + 그림자 + 텍스처 블렌딩 — 사진에 얹힌 게 아니라 사진 안에 있는 것처럼
  • 엣지 밀도 기반 배치 — 복잡한 영역에 놓아야 덜 튐
  • 크기 축소, 경계면 배치 최적화

4. YOLO를 붙였다가, 인페인팅을 껐습니다

후반부엔 yolov8-seg로 의미 기반 객체 분할을 넣었습니다. 아무 데나 건드리는 대신 “이건 화분이다”를 알고 그 객체를 조작하는 거예요. 사람은 마스크로 제외했습니다. 사람 얼굴이 이상해지면 바로 티가 나니까요.

마지막 커밋이 이 프로젝트의 결론입니다.

길쭉한 객체를 종횡비로 걸러내고, 정사각형에 가까운 후보에 점수를 주고, 인페인팅을 비활성화하고, 큰 객체에는 부드러운 이동만 적용

가장 먼저 시도했고 가장 오래 붙잡았던 기능을 끄는 게 최종 답이었습니다.

💡 배운 것 & 주의할 점

  • 팁: 한국어 파일명을 쓴다면 OpenCV의 imread/imwrite는 그냥 실패합니다. imread_unicode 같은 래퍼를 직접 만들어 쓰세요. 저는 이것 때문에 “왜 특정 사진만 안 열리지”로 한참 헤맸습니다.
  • 주의할 점: 고급 기법이 항상 나은 답은 아니었어요. 인페인팅은 스티커보다 기술적으로 훨씬 정교하지만, 이 문제에서는 스티커가 이겼습니다. “무엇이 가능한가”가 아니라 “사용자가 무엇을 발견하는가”를 기준으로 봤어야 했어요.

정리

22개 커밋의 궤적을 다시 보면 고전 CV에서 딥러닝 세그멘테이션으로 갔다가 결국 단순한 방법으로 돌아왔습니다.

제자리로 온 것 같지만, 어떤 게 왜 안 되는지 알고 고른 단순함이라 처음의 단순함과는 다르다고 생각해요.

기능을 끄는 커밋이 가장 잘한 결정일 때도 있더라고요.


태그: #컴퓨터비전, #OpenCV, #YOLO, #YOLOv8, #인페인팅, #이미지처리, #틀린그림찾기, #AI개발, #삽질기록, #개인프로젝트