일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 9020
- end to end
- 실버
- 파이싼
- n과 m
- 그리디 알고리즘
- 1101
- 백트래킹
- 15649
- 가상환경
- Python
- 신경망 학습
- 파이썬
- 4948
- BOJ
- 경사하강법
- 설정
- 밑바닥부터 시작하는 딥러닝
- 손실함수
- 기계학습
- streamlit
- 백준
- N-Queen
- 개발환경
- Mac
- pyenv
- 재귀
- 1002
- Today
- Total
파이톨치
[BoostCamp AI Tech] Image Processing 본문
현재 대회를 진행하면서 감을 못 잡겠는 부분 중 하나이다.
현재는 단순히 모델만을 사용했고 전처리를 건들지도 못했다. 어떻게 해야 모델을 성능을 높일 수 있을지 생각해보면 이미지 전처리를 해야 한다. 하지만 아직 잘 못하고 있다는 생각이 든다. 어떻게 해야할지 내용정리를 하면서 감을 잡아보려고 한다.
이미지 처리(Image Processing)는 컴퓨터 비전 파이프라인에서 중요한 단계이다. 이 과정은 모델의 성능과 일반화에 직접적인 영향을 미치며, 이미지로부터 의미 있는 특징(feature)과 표현(representation)을 추출하는 데 도움을 준다. 따라서 효과적인 이미지 처리를 통해 더 나은 모델 성능을 기대할 수 있다.
Geometric Transformation은 이미지 처리에서 중요한 역할을 한다. 그 종류에는 이동(Translation), 회전(Rotation), 스케일링(Scaling), 기울이기(Shearing), 투시 변환(Perspective) 등이 있다. 이러한 변환이 중요한 이유 중 하나는 CNN의 입력 크기와 출력 특징 맵(Feature Map)의 크기에 영향을 미치기 때문이다.
대부분의 CNN 모델은 ImageNet을 사용하여 224x224 크기의 이미지로 사전 학습되었다. CNN은 완전 합성곱 구조(Fully Convolutional)로, 다양한 입력 크기를 받아들일 수 있지만 입력 이미지의 크기가 출력 특징 맵의 크기에 영향을 준다. 예를 들어, 224x224 크기의 입력 이미지는 7x7 크기의 특징 맵을 생성하고, 512x512 크기의 입력 이미지는 16x16 크기의 특징 맵을 생성한다.
CNN은 사전 학습 시 특정 크기의 패턴을 찾는 방법을 학습한다. 예를 들어, 지름이 50px인 원이나 변의 길이가 30px인 삼각형의 패턴을 학습한다. 따라서 입력 이미지의 크기를 조정하면 이러한 학습된 패턴의 크기가 변경되며, 이로 인해 객체를 찾을 수 있는지 여부가 달라질 수 있다. 사이즈가 크다고 꼭 좋은 것도 아니고, 작다고 나쁜 것도 아닌 점은 주목할만 한다.
각기다른패턴의의미는문제의관점에따라달라질수있다. ○ 예시1)꽃의크기가크고작던간에그것이꽃인건변함이없다. ○ 예시2)상처의크기가크면작은것에비해심각도가높을수있다. ● 다양하게변형된이미지가주어진문제에잘맞을지생각해보고검증이필요(가설과실험)
Translation
물체의위치이동 ● Transformation Matrix:
PerspectiveTransformation
원근변환적용 ● TransformationMatrix:
일반적인 데이터 증강(Common Augmentations) 기법으로는 이미지의 수평 및 수직 플립, 회전, 랜덤 및 중앙 크롭, 색상 조절(Color Jittering) 등이 있다. 이러한 증강 기법은 다양한 라이브러리를 통해 사용할 수 있는데, 대표적인 라이브러리로는 Albumentations, Torchvision, Imgaug 등이 있다.
고급 기법으로는 AutoAugment와 RandAugment가 있다. AutoAugment는 데이터셋에 맞춰 최적의 증강 정책을 자동으로 탐색하는 반면, RandAugment는 무작위 크기로 증강의 하위 집합을 무작위로 적용하는 방식이다.
증강 전략과 모범 사례로는 다음을 고려할 수 있다.
먼저, 증강을 무작위로, 그리고 독립적으로 적용해야 한다. 주어진 문제에 적합한 증강 방법을 사용하고, 다양한 유형과 강도의 증강을 실험하는 것이 중요하다. 하지만 과도한 증강을 피하기 위해 모델의 성능을 주기적으로 모니터링해야 한다. 예를 들어, AutoAugment는 많은 연산량을 발생시킬 수 있고, 무리한 증강 적용은 학습 프로세스에 비효율을 초래할 수 있다.
또한, mini-batch 단위로 입력 데이터를 정규화하여 내부 공변량 변화(Internal Covariate Shift) 문제를 개선할 수 있다. 정규화를 통해 더 높은 학습률(Learning Rate)을 허용하고, 가중치 초기화에 대한 민감도를 감소시킬 수 있다. 학습 시에는 mini-batch에 대한 통계치를 기록하고, 추론 시에는 이 값을 사용하여 정규화를 수행한다.
이때 model.train()과 model.eval()에 따라 추적이 활성화되며, 부주의하게 사용하면 데이터 누수(Data Leakage) 문제가 발생할 수 있다.
스케치 이미지 분류에 적합한 증강 기법은 이미지의 주요 형태와 윤곽을 보존하면서도 다양한 변형을 시도하는 것이 중요하다. 스케치 이미지는 일반적인 사진 이미지와 달리 색상 정보가 없고, 선과 모양이 중요하기 때문에 일반적인 증강 기법 중 색상 변화(Color Jittering)보다는 기하학적 변환에 집중하는 것이 좋다. 다음은 스케치 이미지 분류에 적합한 몇 가지 증강 기법과 해당 코드이다:
# 스케치 이미지에 적합한 증강 기법 정의
def get_sketch_augmentations():
return A.Compose([
A.RandomRotate90(p=0.5), # 90도 단위 회전
A.Rotate(limit=30, p=0.5), # 랜덤 회전, 각도 제한 30도
A.RandomResizedCrop(height=224, width=224, scale=(0.8, 1.0), p=0.5), # 랜덤 크롭 및 리사이즈
A.GaussianBlur(blur_limit=(3, 7), p=0.3), # 가우시안 블러
A.InvertImg(p=0.5), # 이미지 반전
A.GaussNoise(var_limit=(10.0, 50.0), p=0.3), # 가우시안 노이즈 추가
A.Affine(scale=(0.9, 1.1), translate_percent=(0.1, 0.1), rotate=(-20, 20), p=0.5), # Affine 변환
A.Normalize(mean=(0.5,), std=(0.5,)), # 정규화
ToTensorV2() # 텐서로 변환
])
이제까지 이미지 분류에 필요한 재료들을 이해했다면, 이제는 그 재료를 어떻게 활용할지 생각해 볼 차례이다. 이미지를 분류한다는 것은 이미지를 특정한 클래스로 할당하는 과정을 의미하며, 이러한 과정에는 다양한 종류가 존재한다.
이미지 데이터 + 분류는 이미지가 내포하는 의미에 대해 사전에 정의된 클래스로 할당하는 것을 뜻한다. 여기서 "내포하는 의미"란, 예를 들어 이미지 속의 고양이, 검은색, 앉아있는 자세와 같은 것들이 될 수 있다. 또한, 하나의 클래스도 다양한 형태로 존재할 수 있기 때문에 모델은 그 변형된 모습을 모두 인식할 수 있어야 한다.
이미지 분류는 다양한 유형으로 나눌 수 있으며, 각 유형은 특정한 문제를 해결하기 위해 사용된다. 대표적인 유형으로는 이진 분류(Binary Classification), 다중 클래스 분류(Multi-class Classification), 다중 레이블 분류(Multi-label Classification) 등이 있다. 이들은 분류해야 할 이미지의 범주에 따라 달라진다.
또한, 이미지 분류는 상대적으로 큰 범주(Coarse-grained)와 세부적인 하위 범주(Fine-grained)로 나눌 수 있다. Coarse-grained 분류는 크게 구분된 범주를 분류하는 것이며, Fine-grained 분류는 상위 범주 내의 세부적인 차이를 구분하는 것이다.
이미지 분류를 정의할 때는 주어진 이미지가 어떤 방식으로 분류되어야 하는지 생각해봐야 한다. 예를 들어, 이진 분류로 할지, 다중 클래스/다중 레이블 분류로 할지 결정해야 한다. 또한, 분류하려는 데이터의 속성이 특별한지 고려해야 한다. 예를 들어, 구분해야 할 클래스들이 매우 세밀한 차이를 필요로 하는 경우라면 더 정교한 방법이 필요하다. 이러한 과정을 통해 문제의 특성에 따라 적합한 분류 방법을 찾아 적용할 수 있다.