#03. [알약검출] 데이터 세팅
데이터셋 설명
1. 도메인 특성
AI 경구 약제 데이터는 일반적인 사물 인식과 비교했을 때 매우 까다로운 도메인 특성을 가집니다.
- 미세 분류의 극한 : 시중 약제 상당수는 '하얀색 원형 정제' 혹은 '흰색/초록색 경질 캡슐' 형태를 띱니다. 모양과 색상이 동일한 약이 수백 종에 달하며, 오직 2~3mm 크기의 양각/음각 식별 분자나 분할선으로만 구분해야 합니다.
- 치명적인 오분류 리스크 : 일반적인 이미지 분류와 달리, 약제 식별은 1%의 오분류가 심각한 투약 사고로 직결될 수 있습니다. 높은 재현율과 정밀도를 동시에 요구합니다.
- 물리적 재질의 다양성 : 무광택 정제, 빛 반사가 심하고 표면이 쭈글쭈글해지기 쉬운 연질 캡슐, 두 가지 색상이 결합된 경질 캡슐 등 재질에 따라 빛은 반사하는 특성이 완전히 다릅니다.
2. 데이터 구성 및 구조
국내에서 다빈도로 처방 및 판매되는 5,000종의 약제를 대상으로 구축된 대규모 데이터셋입니다.
| 구분 | 세부 구성 내용 |
| 규모 | 총 250만장 이상, 약 4.4TB 달하는 방대한 용량 => 1.79G 정제된 일부 데이터 사용 |
| 이미지 종류 | 단일 약제 이미지 + 3~4개의 약이 섞여 있는 조합 이미지 |
| 촬영 환경 | 다양한 카메라 각도, 조도 변화, 다양한 배경 위에서 촬영 |
| 라벨링 (JSON) | 객체 위치를 나타내는 바운딩 박스(Bounding Box) 제공 |
| 메타데이터 | 약제 정보(의약품 코드, 이름, 제조사, 효능, 제형, 색상), 카메라/촬영 메타정보 |
3. 분석 및 모델링 시 주의사ㅐ항
1. 이미지 리사이징에 따른 정보 유실
- 모델 학습을 위해 이미지를 224x224, 416x416 크기로 무작정 줄이면, 알약 표면의 미세한 각인 (문자) 픽셀이 뭉개져 식별이 불가능해집니다. 원본 비율을 유지하면서 크롭(Crop)하거나, 고해상도를 유지하는 패치(Patch) 기반 학습 방식이 필요합니다.
2. 조명 반사와 그림자
- 연질 캡슐 표면에 맺힌 강한 빛 반사(Specular Reflection)가 식별 문자를 가리는 경우가 많습니다. 데이터 증강시 밝기와 대비 조절, 혹은 빛 반사를 억제하는 전처리 기법을 신중하게 적용해야 합니다.
3. 데이터 누수를 동반한 Train/Val 분할
- 동일한 낱알을 각도만 조금씩 바꿔 촬영한 이미지들이 훈련셋(Train)과 검증셋(Validation)에 섞여 들어갈 수 있습니다. 이 경우 모델이 '약'을 학습하는 것이 아니라 '해당 약이 촬영된 특정 배경이나 그림자 패턴'을 암기해버려, 검증 정확도는 99%가 나오지만 실제 환경에서는 성능이 처참하게 떨어질 수 있습니다.
4. 극심한 OOM(Out of Memory) 문제
- 4TB가 넘는 데이터를 한 번에 메모리에 올리거나 로컬 디스크에 압축을 푸는 것 자체가 큰 장벽입니다. 필요한 약제 클래스만 샘플링하여 먼저 파이프라인을 구축한 뒤, 점진적으로 전체 데이터로 확장(Data Generator 또는 TFRecord 활용)하는 전략이 필수적입니다.
경구약제 EDA 워크플로우
[데이터 구조 파악] - [메타데이터 분석] - [시각적 탐색] - [바운딩 박스 검증] - [전처리 전략 수립]
가장 먼저 데이터셋의 폴더 구조를 파악하고, 이미지 파일(.jpg 또는 .png)과 어노테이션 파일(.json)이 1:1로 정확하게 매칭되어 있는지 확인합니다.
- 샘플 데이터를 5~10개 정도 무작위로 열어 JSON 파일 내에 어떤 정보(예: 약품 코드, 모양, 색상, 식별 문자, Bounding Box 좌표 등)가 포함되어 있는지 눈으로 직접 확인합니다.
이미지를 직접 열기 전, JSON 파일들을 데이터프레임(Pandas 등)으로 변환하여 메타데이터 분포를 확인합니다. AI Hub 데이터의 경우 특정 약품에 데이터가 편중되어 있을 확률이 높습니다.
- 약품별 데이터 개수: 클래스(약품 종류)별 이미지 빈도수를 시각화하여 데이터 불균형(Class Imbalance) 정도를 파악합니다.
- 외형적 특징 분포: 모양(원형, 타원형, 장방형 등), 색상(하양, 노랑, 분홍 등), 제형(정제, 경질캡슐 등)별 분포를 분석합니다.
파이썬의 matplotlib과 cv2를 사용하여 원본 이미지 위에 JSON 파일에 있는 Bounding Box 좌표를 겹쳐서(Overlay) 그립니다.
- 알약이 정확히 박스 안에 위치하는지, 여백이 너무 많거나 잘린 곳은 없는지 확인합니다.
- 알약의 앞면, 뒷면 이미지가 어떻게 촬영되었는지(조명 반사, 배경, 그림자 유무) 육안으로 확인하여 이미지 품질의 편차를 파악합니다.
모델 학습 시 이미지를 일정한 크기로 조정해야 하므로, 원본 이미지들의 해상도(너비, 높이) 분포를 분석합니다.
- 이미지 크기 분포(Width vs Height Scatter plot)를 그려 최적의 Resize 차원을 결정합니다.
- 데이터셋 전체의 RGB 채널별 평균(Mean)과 표준편차(Std)를 계산해 둡니다. 이는 이후 정규화(Normalization) 과정에서 필수적으로 사용됩니다.