0. 개요
우리팀이 기획한 주제는 Scratch CAPTCHA 다.
- 마치 스피또 긁듯이 드래그로 덮개 이미지를 긁는다.
- 1의 행동을 통해 노이즈 이미지가 드러난다.
- 사람 혹은 로봇은 2의 이미지를 보고 어떤 사물인지 정답을 맞춰야 한다.
1차적으로, 덮개 이미지를 긁는 행동 패턴을 분석하여 로봇인지 인간인지 구분할 수 있다.
2차적으로, 사람은 인식하기 쉽지만, 로봇은 인식하기 어려운 이미지를 보고 어떤 사물인지 맞춰야 한다.
우리는 노이즈 이미지에 강한 AI를 만들어야 하므로 이미지 학습은 필수이다.
ImageNet 데이터셋을 이용하는게 필수사항이기 때문에 꼭 이용해야 하지만 ImageNet 의 데이터셋은 매우 방대하다.
가장 흔한 ILSVRC2012의 학습 데이터만 총 약 128만 장인데, 이걸 전부 학습하는 것은 자원도 부족하고 비효율적이기 때문에
팀 회의를 통해 ImageNet의 1,000개 클래스 중 일부만을 학습에 이용하기로 결정되었다.
1. ImageNet 클래스 분류 실험
어떤 클래스를 이용할지 분류하는 작업이 필요했는데 상대적으로 여유가 있는 내가 AI 파트의 작업을 일부 도와주기로 했다.
우선 ImageNet의 1,000개 클래스 중에 어떤 클래스들을 선택할 것인가? 에 대한 기준이 필요하다.
인간은 알아볼 수 있으면서, 노이즈를 추가했을 때 로봇이 인식하기 힘들어야 한다.
1. 원본 이미지와, 노이즈를 추가한 이미지를 로봇에게 인식시킨다.
2. 원본 이미지는 정답을 맞췄지만 노이즈를 추가한 이미지는 정답을 맞추지 못했다면, 학습시키기 좋은 이미지다.
위 기준에 따라 실험을 설계했고 실험 모델과 실험노이즈는 CLIP과 Alpha Blended Noise 로 진행했다.
CLIP
최종적으로 사용할 모델은 YOLO이지만, YOLO는 추론 속도가 느려서 비교적 빠른 CLIP을 이용했다.
Alpha Blended Noise
약하지만 정제된 교란 방식의 노이즈로, 인식이 어려운 클래스를 사전에 식별하는 데에 효율적이다.
이 노이즈로도 충분히 교란되는 이미지에 더 강한 노이즈를 적용한다면 문제가 더 어려워질거라 생각했다.
# alpha blended noise 생성
def add_alpha_blended_noise(img: Image.Image, alpha=0.3):
arr = np.array(img).astype(np.float32)
noise = np.random.randint(0, 256, arr.shape).astype(np.float32)
blended = arr * (1 - alpha) + noise * alpha
blended = np.clip(blended, 0, 255).astype(np.uint8)
return Image.fromarray(blended)
다음 예시 이미지는 ImageNet 클래스 중 하나인 Kit Fox 다. (n02119789)
굉장히 명확한 이미지인 편인데 노이즈 강도 0.4 부터는 사람도 보기 불편해지기 시작하기 때문에, 노이즈 강도는 0.1~0.3으로 정했다.

실험 환경
- 실험 환경은 집에 있는 컴퓨터에 GPU가 있기 때문에 이를 이용했다.
- GPU - CUDA (RTX 3060Ti 8GB)
- RAM - 8GB
- 사용 모델 : 이미지 분류용 사전학습 모델인 OpenAI의 CLIP (ViT-B/32)을 사용
- 사용 데이터셋 : ImageNet ILSVRC2012 학습 데이터 (총 약 128만 장)
- 사용 이미지 : 클래스당 최대 10장까지 샘플링하여 처리 (성능 상의 이유)
- 실험에 사용된 노이즈 : alpha blended color noise
분류 방식
- 모델 : OpenAI CLIP (ViT-B/32, 1000 클래스 토큰으로 토큰화된 prompt 사용)
- Prompt 형식 : "a photo of a {label}"
- 각 이미지에 대해 CLIP 모델이 생성한 1000개 클래스 중 top-3 예측과 정답 비교
- 비교 항목 :
- 정확도 (correct_clean, correct_noisy)
- confidence (conf_clean, conf_noisy, conf_drop)
- top-3 예측 클래스 (top3_clean, top3_noisy)
2. 실험 결과
나는 실험결과를 csv 로 출력했고 헤더 각 항목의 의미는 다음과 같다.
- file: 이미지 파일명
- correct_clean: 노이즈 없는 원본 이미지에서 예측이 정답인지 여부 (1/0)
- correct_noisy: 노이즈가 추가된 이미지에서 정답 예측 여부 (1/0)
- top3_clean: 원본 이미지에서 CLIP이 예측한 top-3 클래스
- top3_noisy: 노이즈 이미지에서의 CLIP이 예측한 top-3 클래스
- conf_clean: 정답 클래스의 confidence (원본)
- conf_noisy: 정답 클래스의 confidence (노이즈 적용)
- conf_drop: confidence 하락량 (conf_clean - conf_noisy)
- true_label: 실제 라벨 이름 (정답)

중요한 것은 conf_clean, conf_noisy, conf_drop 이 3가지 항목이다.
- conf_clean (0) conf_noisy (0) : 원본도 노이즈 이미지도 인식하지 못했다.
- conf_clean (1) conf_noisy (0) : 원본은 인식했지만 노이즈 이미지는 인식하지 못했다.
- conf_clean (0) conf_noisy (1) : 원본은 인식하지 못했지만 노이즈 이미지는 인식했다. →???
- conf_clean (1) conf_noisy (1) : 원본도 노이즈 이미지도 인식에 성공했다.
위 결과값을 통해 다음 3그룹으로 나눴다. (conf_clean, conf_noisy)
A: 결과값이 0-0, 1-0 인 최종 클래스에 포함해야 한다. (AI가 교란에 약한 클래스임)
B: 결과값이 1-0이고 confidence가 상승한 클래스는 반드시 포함해야한다. (AI가 완전히 교란된 클래스임)
C: 결과값이 0-1, 1-1 은 최종 클래스에 포함하지 말아야 한다. (AI가 교란에 강한 클래스임)
포함해야 할 클래스에서 포함하지 말아야 할 클래스를 제외했고 (A+B-C) , 결과적으로 총 283개의 클래스가 남았다.
3. 향후 계획
- CLIP 결과 기반으로 노이즈에 취약한 ImageNet 클래스를 리스트화 (283개)
- 해당 클래스를 COCO Dataset의 클래스로 라벨 매핑
※ YOLO가 학습하고 성능을 평가하는 데 자주 사용하는 대표적인 데이터셋이 COCO이기 때문 - YOLO 모델로 여러 유형의 노이즈에 대해 인식률 테스트 진행
- 인식률이 낮은 클래스를 중심으로 YOLO 재학습 → 최종 모델 구성
본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.
'학습일지 > K-Digital Traing' 카테고리의 다른 글
| [KDT] AIaaS 마스터클래스 20주차 - 리디자인 및 정책 설정 (3) | 2025.08.06 |
|---|---|
| [KDT] AIaaS 마스터클래스 19주차 - AI 이미지 클래스 분류작업 (1) | 2025.08.01 |
| [KDT] AIaaS 마스터클래스 18주차 - 카카오 클라우드 본사 특강 (3) | 2025.07.23 |
| [KDT] AIaaS 마스터클래스 17주차 - 개인프로젝트 마무리 (0) | 2025.07.18 |
| [KDT] AIaaS 마스터클래스 16주차 - 최종프로젝트 기획단계 (0) | 2025.07.12 |