hswork.win

사진 검수를 미니PC 안에서 돌리기로 했다

2026-10-25 · 사진 검수

Vision API가 결제 계정을 요구했다

글연은 회원이 사진 두 장을 올려야 이용할 수 있습니다. 사진은 서로 호감을 보낸 상대에게만 보이지만 그래도 음란물이 올라오면 바로 걸러야 했습니다. 처음 계획은 Google Cloud Vision의 SafeSearch였습니다. 월 1,000건까지 무료라 베타 규모에서는 비용이 거의 없을 거라 봤습니다.

그런데 API를 켜자 403이 돌아왔습니다. 무료 구간 안에서 쓰더라도 결제 계정을 연결해야 한다는 뜻이었습니다. 아직 사업자등록 전이고 매출도 없는 서비스에 카드부터 묶어 두기는 망설여졌습니다. 그래서 다른 방법을 찾았습니다.

판별 모델을 미니PC 안에서 돌리기로 했다

글연은 집에 있는 Intel N100 미니PC에서 돕니다. GPU는 없지만 사진 한 장을 판별하는 정도라면 CPU로도 될 것 같았습니다. 공개된 모델 가운데 크기가 작고 라이선스가 분명한 것을 골랐습니다. Apache-2.0 라이선스의 ViT 기반 모델로, 파일이 22MB 남짓이고 결과는 '음란물 / 정상' 두 가지입니다.

서버 컨테이너에 PyTorch를 넣으면 이미지가 수 GB로 불어나서 모델을 ONNX로 바꿨습니다. 변환은 일회용 컨테이너에서 하고 결과 파일만 서버의 데이터 폴더에 넣었습니다. 변환 전후 출력 차이는 소수점 여섯째 자리 수준이라 그대로 쓰기로 했습니다.

측정해 보니 한 장에 0.3초 정도 걸리고 메모리는 150MB쯤 더 씁니다. 가입할 때 사진 두 장을 검사하는 데는 충분했습니다. 무엇보다 사진이 서버 밖으로 나가지 않습니다. 외부 API를 쓰면 처리방침에 국외 이전을 적어야 하는데 그 항목 하나가 통째로 빠졌습니다.

모델은 생각보다 자주 헷갈린다

문제는 정확도였습니다. 이런 모델은 수영복, 운동복, 민소매 사진에서 자주 헷갈립니다. 일반 예시 사진은 대부분 음란물 확률이 0.1 아래로 나왔지만 합성한 무늬 그림 하나는 0.69가 나왔습니다. 소개팅 프로필 사진에는 바닷가 사진이 꽤 많을 텐데, 모델이 같은 정상 사진을 계속 잘못 판정하면 그 회원은 영문도 모른 채 막힙니다.

그래서 처벌을 약하게 잡았습니다. 판정에 걸리면 사진만 반려하고 계정은 그대로 둡니다. 원래 규칙은 30일 안에 세 번 반려되면 이용을 멈추는 것이었는데, 로컬 모델을 쓸 때는 이 규칙을 껐습니다. 대신 자주 반려되는 회원을 운영자 검토 목록에 올리고 운영자가 반려 기록을 보고 판단합니다. 확인을 마치면 '확인 완료'를 눌러 목록에서 내리고, 그 뒤로 새 반려가 다시 쌓일 때만 목록에 올라옵니다.

회원에게도 미리 알립니다. 사진 칸 아래에 "수영복·비키니 사진이나 노출이 많은 사진은 승인되지 않을 수 있어요"라고 적어 두었습니다. 반려된 다음에 이유를 찾게 하는 것보다 올리기 전에 아는 편이 낫습니다.

사람의 판단이 빠지는 순간을 줄이고 싶었다

개인정보 보호법에는 완전히 자동으로 내린 결정에 대해 설명이나 재검토를 요구할 수 있는 권리가 있습니다. 사진을 반려하는 정도는 다시 올리면 되지만 계정을 막는 결정은 무게가 다릅니다. 모델이 틀릴 수 있다는 걸 전제로 하면 기계가 할 일은 '의심스러운 것을 골라내기'까지이고 '막을지 정하기'는 사람에게 남겨 두는 게 맞다고 봤습니다.

나중에 정식 서비스를 시작하고 결제 계정을 연결하면 Vision으로 다시 바꿀 수 있도록 공급자를 설정 하나로 고르게 해 두었습니다. 그때도 판정이 계정 정지로 바로 이어지지 않게 하는 원칙은 그대로 둘 생각입니다.

← 개발 기록 목록