CHALLENGE
클라이언트는 마라톤과 사이클 대회에서 촬영한 수만 장의 사진을 참가자가 직접 찾을 수 있게 해야 했습니다. 그러나 배번호가 접히거나 일부 가려지고, 한 사진에 여러 선수가 함께 나오며, 처리 중인 사진도 계속 추가돼 단순 파일명 검색만으로는 안정적인 탐색이 어려웠습니다.
클라이언트가 필요로 한 이유
클라이언트가 사진 검색 기능에서 먼저 해결해야 한 문제는 배번호 인식 결과를 곧바로 정답으로 사용할 수 없다는 점이었습니다. 잘못 읽은 한 글자가 참가자에게 전혀 다른 사진을 보여줄 수 있고, 사진 한 장에 여러 선수가 있거나 OCR이 비슷한 번호를 여러 개 제안할 수도 있었습니다. 자동화 속도를 높이면서도 오매칭을 사람이 확인하고 고칠 근거가 필요했습니다.
그래서 검출 영역, 문자 후보, 참가자 명단 대조, 최종 매치를 각각 보존하고 신뢰도에 따라 자동 공개·검토 대기·보류로 나눴습니다. 대회 운영 중 사진이 순차적으로 들어오는 특성도 반영해, 처리 중인 사진과 검색 가능한 사진을 구분하고 색인이 끝난 결과만 갤러리에 점진적으로 노출하도록 설계했습니다.
사진 한 장에 하나의 정답만 가정하지 않고, 검출 영역·OCR 후보·배번호 매치·신뢰도·수동 검수를 단계별로 보존했습니다.
| 검색 과제 | 시스템에서 다룬 방식 |
|---|---|
| 배번호 일부 가림 | 후보 문자열과 신뢰도를 여러 개 저장 |
| 다중 인물 사진 | 사진 아래 복수 검출과 매치를 연결 |
| 오매칭 수정 | 운영자의 수정 값과 이전 값을 감사 이력으로 보존 |
| 처리 중인 대회 | 색인된 사진 수를 기준으로 갤러리를 점진적으로 공개 |
클라이언트 요청사항과 기획 방향
자동 인식률만 높이는 문제로 보지 않고, 참가자는 사진을 빨리 찾고 운영자는 불확실한 결과만 집중 검수할 수 있도록 탐색 화면과 처리 콘솔의 책임을 나눴습니다.
| 클라이언트 요청 | 이렇게 기획한 이유 | 해결 방식 |
|---|---|---|
| 참가자가 배번호로 자신의 사진을 찾게 하고 싶다 | 파일명과 폴더만으로는 수만 장의 사진을 개인별로 탐색할 수 없음 | 대회·배번호를 우선 검색하고 이름·팀·부문·촬영 지점으로 결과 축소 |
| 가려진 번호와 다중 인물도 처리하고 싶다 | OCR 1순위만 정답으로 쓰면 오매칭이 곧바로 공개될 수 있음 | 검출별 복수 후보와 명단 대조 점수를 보존해 자동 공개·검토·보류로 분기 |
| 대회 중 새 사진을 계속 공개하고 싶다 | 처리 중인 사진을 검색 실패로 보여주면 참가자가 결과 없음으로 오해함 | 수신 수와 색인 완료 수를 분리하고 완료된 사진만 점진적으로 노출 |
SOLUTION
클라이언트의 참가자 탐색과 운영자 검수 업무가 섞이지 않도록 사진 갤러리와 처리 콘솔을 분리했습니다. 참가자는 배번호를 가장 먼저 입력하고 이름·팀·부문·촬영 지점으로 결과를 좁힙니다. 운영자는 문자 인식(OCR) 작업의 진행률과 저신뢰·실패 건수를 보고, 사진 상세에서 후보 근거를 확인해 잘못 연결된 배번호를 수정합니다.
사진이 검색 결과에 나타나는 과정
사진이 들어오면 먼저 한 장 안에서 배번호로 보이는 영역을 찾습니다. 한 사진에 선수가 세 명이면 검출 영역도 세 개가 될 수 있습니다. 각 영역에서 OCR 후보를 여러 개 만들고, 대회 참가자 명단에 실제로 있는 번호인지 확인합니다. 312와 372처럼 비슷한 후보가 나오면 한 값을 바로 정답으로 확정하지 않습니다.
OCR 신뢰도, 1·2순위 후보의 점수 차이, 명단 존재 여부, 배번호 영역의 가림 정도를 합산합니다. 85점 이상은 검색에 자동 반영하고, 60~84점은 운영자가 사진과 후보를 직접 확인합니다. 명단에 없는 번호는 인식 점수가 높아도 공개하지 않습니다. 운영자가 312를 372로 고치면 이전 값과 수정자, 시각, 사유를 함께 남깁니다.
참가자는 대회와 배번호를 입력해 현재까지 색인된 사진을 찾습니다. 사진 처리가 계속 진행 중이라면 전체 수신 사진 수와 지금 검색 가능한 수를 따로 보여줍니다. ‘사진이 없다’와 ‘아직 처리 중이다’를 구분하기 위한 표시입니다. 새 사진의 색인이 끝나면 같은 검색 결과에 순차적으로 추가됩니다.
시스템 흐름
검출·OCR·이미지 저장 영역은 서로 분리했습니다. 인식 방식이나 저장 위치가 달라져도 사진 ID, 후보, 매치 점수, 검수 상태라는 운영 기준은 유지됩니다.
배번호 매치 점수
한 후보의 OCR 확률만 사용하지 않고, 후보 간 격차와 참가자 명단 유효성, 검출 품질을 함께 계산합니다.
| 판단 항목 | 반영 비중 | 판단 기준 |
|---|---|---|
| OCR 신뢰도 | 40% | 선택 후보의 문자 인식 확률 |
| 후보 간 격차 | 25% | 1순위와 2순위 후보의 점수 차이 |
| 명단 유효성 | 20% | 해당 대회 참가자 배번호 존재 여부 |
| 검출 품질 | 15% | 배번호 영역 크기·각도·가림 정도 |
85점 이상은 자동 색인, 60~84점은 운영자 검토, 59점 이하는 보류로 분류합니다. 단, 명단에 없는 번호는 점수가 높아도 자동 공개하지 않습니다. 수동 수정 시에는 새 값만 덮어쓰지 않고 이전 후보, 수정자, 수정 시각, 사유를 감사 이력에 남깁니다.
갤러리 공개 조건
사진은 파일 수신 완료, 썸네일 준비, 매치 구간 확정, 대회 공개 상태라는 네 조건을 통과해야 검색 결과에 나타납니다. 처리 작업이 진행될수록 색인 완료 수가 증가하고, 참가자 화면에는 전체 수신량과 현재 검색 가능량을 구분해 보여줍니다.
참가자 갤러리
- 대회와 배번호를 중심으로 이름·팀·부문·촬영 지점 보조 검색
- 신뢰도와 정렬 조건, 25·50건 묶음, 100장 점진 로딩
- 사진 상세에서 검출 영역·OCR 후보·매치 근거 확인
- 현재 검색 조건 CSV 내보내기
처리 콘솔
- 작업 진행률, 처리·저신뢰·실패 건수와 마지막 갱신 시각
- 정상·장애·복구와 시작·일시정지·재개·초기화
- 저신뢰 후보 검토와 오매칭 수정·감사 이력
- 실패 작업 재시도와 색인 공개 범위 변경
BUILD
대회, 참가자, 사진 메타데이터, 검출, OCR 후보, 배번호 매치, 처리 작업, 상태 이력, 수정 이력을 관계형 운영 데이터로 분리했습니다. 정확한 배번호 검색은 복합 인덱스를 사용하고, 작업 상태와 갤러리 노출 범위가 같은 데이터 값을 읽도록 구성했습니다.
데이터를 검색 결과로 푸는 방식
사진 인벤토리에서 작업 단위를 만들고, 각 검출 영역 아래 여러 OCR 후보를 저장합니다. 매칭 규칙은 대회 참가자 명단과 후보를 대조해 최종 점수와 근거를 생성합니다. 검색 API는 배번호 복합 인덱스로 후보 사진을 찾은 뒤 대회·팀·부문·촬영 지점 조건을 적용하며, 페이지 이후 상세에서도 동일한 매치 ID를 사용합니다.
검증한 데이터 규모
| 데이터 | 규모 |
|---|---|
| 대회 / 참가자 | 16 / 8,400 |
| 사진 메타데이터 | 80,800 |
| 검출 | 118,367 |
| OCR 후보 | 252,513 |
| 배번호 매치 | 112,795 |
| 처리 작업 / 상태 이력 | 34 / 101 |
VALIDATION
- 자동 테스트 12건 통과
- 프로덕션 빌드 완료
- 100장 점진 로딩과 64번째 사진 상세·수정 확인
- 명단 밖 번호가 자동 공개되지 않고 저신뢰가 검토 대기로 가는지 확인
- 2회 이상 상태 변화, 일시정지·재개, 장애·복구와 새로고침 지속성 확인
- 배번호 검색 성능과 DB 무결성 확인
- 데스크톱·태블릿·모바일에서 예상 밖 콘솔 오류 없음
RESULT
| 처리 장면 | 기존에 생기던 문제 | 구축 후 처리 방식 |
|---|---|---|
| 사진 검색 | 파일명이나 OCR 한 값만 믿어 다른 선수 사진이 노출 | 복수 후보와 참가자 명단을 대조해 신뢰도별로 공개 범위 결정 |
| 저신뢰 검수 | 잘못 연결된 번호의 근거와 수정 이력이 남지 않음 | 사진·검출 영역·후보를 함께 보고 이전 값과 수정 사유 보존 |
| 대회 중 공개 | 처리 중인 사진을 ‘검색 결과 없음’으로 오해 | 전체 수신량과 현재 색인량을 나누고 완료 사진을 점진적으로 공개 |
80,800개 사진 메타데이터와 25만 개 이상의 OCR 후보는 다중 인물과 유사 배번호가 반복되는 상황에서도 후보 근거와 수정 이력을 잃지 않는지 확인하는 데 사용했습니다.
비슷한 업무에 적용할 수 있는 부분
같은 검수 구조는 문서 OCR, 제품 라벨 판독, 부품 이미지 분류처럼 자동 인식과 사람의 최종 확인이 함께 필요한 업무에도 쓰입니다. 확률 한 값보다 후보 근거와 수정 가능성이 중요한 경우에 알맞습니다.
본 프로젝트는 고객사 실제 업무 요건을 바탕으로 설계한 결과물이며, 보안 정책에 따라 일부 화면만 공개했습니다.



