AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: 이미지 분류

이미지 증강 2

qordnswnd123 2025. 2. 20. 16:13

1. 라이브러리 로드

import torch
import torchvision.transforms as transforms

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

import albumentations as A
from albumentations.pytorch import ToTensorV2

 


2. 이미지를 시각화하는 함수 정의

def show_image(img, title):
    plt.imshow(img)
    plt.title(title)
    plt.axis('off')
    
image_path = 'dog.png'
image = Image.open(image_path).convert("RGB")
image_np = np.array(image)

 


3. 글래스 블러(GlassBlur)

A.GlassBlur는 이미지에 유리 효과를 적용하여, 마치 유리를 통해 보는 것처럼 이미지를 흐리게 만드는 데이터 증강 기법입니다. 이 기법은 Albumentations 라이브러리에서 제공되며, 특히 이미지에서 세부 정보를 의도적으로 감소시키고 싶을 때 사용됩니다.
GlassBlur는 주로 데이터의 과적합을 줄이고, 모델이 다양한 시각적 효과에 강인하게 학습하도록 돕기 위해 사용됩니다.

GlassBlur은 이미지의 각 픽셀을 무작위로 이동시키는 방식으로 작동합니다. 이 과정에서 특정 반경 내의 픽셀이 서로 섞이게 되어, 유리로 인해 발생하는 흐림 효과를 모방합니다. 이는 이미지의 세부적인 텍스처와 패턴을 흐리게 하여, 이미지 내 명확한 구분이 어려워 질 수 있습니다.


※ 주요 파라미터
1) sigma: 흐림의 정도를 제어합니다. 실제로는 유리 블러의 강도를 조절하는 데 사용됩니다.
2) max_delta: 픽셀을 이동시킬 최대 거리를 지정합니다. 이 값이 클수록 더 많은 픽셀이 원래 위치에서 멀리 이동할 수 있으며, 더 강한 흐림 효과를 나타냅니다.
3) iterations: 이 파라미터는 블러를 적용하는 반복 횟수를 정의합니 다. 반복 횟수가 많을수록 이미지는 더욱 흐려집니다.

transform = A.GlassBlur(sigma=0.7, max_delta=4, iterations=2, always_apply=True)
    
augmented_image = transform(image=image_np)['image']
    
plt.figure(figsize=(10, 5)) 

plt.subplot(2, 3, 1) 
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 2)  
show_image(augmented_image, 'Glass Blurred Image')

plt.show()

4. CLAHE

A.CLAHE (Contrast Limited Adaptive Histogram Equalization)는 이미지의 대비를 개선하기 위한 고급 히스토그램 평준화 기법입니다. 이 기법은 일반적인 히스토그램 평준화와는 달리 이미지 전체에 적용되는 것이 아니라, 이미지를 작은 구역(tiles) 으로 나누고 각 구역에 대해 히스토그램 평준화를 적용합니다. 이 방식은 특히 의료 영상, 위성 영상 등에서 세부 사항이 중요한 이미지의 대비를 개선하는 데 유용합니다.

CLAHE는 먼저 이미지를 작은 구역으로 나눕니다. 각 구역의 히스토그램을 계산하고, 지정된 '대비 제한(Contrast Limit)'을 적용하여 극단적인 히스토그램의 빈도수를 제한합니다. 이는 히스토그램 평준화 시 발생할 수 있는 노이즈 증폭을 방지합니다. 그 다음, 각 구역의 히스토그램을 평준화하여 대비를 개선합니다. 마지막으로, 구역 경계에서 발생할 수 있는 인공적인 경계선 을 부드럽게 만들기 위해 인접 구역과의 보간을 수행합니다.


※ 주요 파라미터
1) clip_limit 이는 대비 제한을 설정하는 파라미터로, 히스토그램의 '빈도 클리핑'을 얼마나 강하게 적용할지 결정합니다. 낮은 값은 대비 개선을 더 세밀하게 제한하며, 높은 값은 더 강한 대비 개선을 가능하게 합니다.
2) tile_grid_size: 이미지를 몇 개의 구역으로 나눌지 결정합니다. 예를 들어 tile_grid_size=(8. 8)은 이미지를 8x8의 그리드로 나눈다는 것을 의미합니다.

 

※ 사용 예

  • 의료 영상 처리: 의료 영상에서 미세한 조직의 차이를 더 잘 파악할 수 있도록 대비를 개선하는 데 사용됩니다.
  • 저조도 영상 개선: 어두운 환경에서 촬영된 이미지의 세부 사항을 더 잘 드러내기 위해 사용됩니다.
  • 실외 영상 분석: 위성 영상이나 야외 감시 카메라의 영상에서 대비를 개선하여 더 많은 정보를 추출할 수 있도록 합니다.

A.CLAHE는 이미지에서 보다 정밀한 대비 개선을 달성하고자 할 때 선택할 수 있는 강력한 도구로, 다양한 분야에서 세부 정보가 중요한 이미지 처리에 활용됩니다.

 

transform = A.CLAHE(clip_limit=2.0, tile_grid_size=(8, 8), always_apply=True)
    
augmented_image = transform(image=image_np)['image']
    
plt.figure(figsize=(10, 5)) 

plt.subplot(2, 3, 1) 
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 2)  
show_image(augmented_image, 'Color brightness Image')

plt.show()


5. CoarseDropout

A. CoarseDropout은 이미지에서 무작위로 선택된 영역을 삭제(드롭아웃)하는 방법입니다. 이 기법은 일반적으로 인공 신경망에서 네트워크의 일부 뉴런을 임의로 활성화하지 않는 드롭아웃 기술을 이미지에 적용한 것입니다. CoarseDropout은 이미지의 일부 픽셀을 대체하여, 모델이 누락된 정보에 대해 강인하게 반응하도록 훈련시키는 데 도움을 줍니다.

CoarseDropout은 이미지 내에서 임의의 직사각형 영역을 선택하고, 이 영역 내의 픽셀을 특정 값(예를 들어 0 또는 평균 픽셀 값)으 로 대체합니다. 이러한 변형은 모델이 부분적으로 가려진 객체를 인식하는 능력을 향상시키고, 과적합을 방지하는 데 유용합니다.

 

※ 주요 파라미터

  • max_holes: 이미지에 만들 최대 구멍(드롭아웃 영역)의 수입니다.
  • max_height: 최대 구멍 높이입니다.
  • max_width: 최대 구멍 너비입니다.
  • min_holes: 이미지에 만들 최소 구멍의 수입니다.
  • min_height: 최소 구멍 높이입니다.
  • min_width: 최소 구멍 너비입니다.
  • fill_value: 구멍을 채울 값입니다. 이는 일반적으로 픽셀 값(예: 검은색, 흰색 또는 이미지의 평균 픽셀 값)으로 설정됩니다.

※ 사용 예
CoarseDropout은 다양한 시각적 조건 하에서 객체를 인식해야 하는 컴퓨터 비전 시스템에서 특히 유용합니다. 예를 들어, 실외 감시 카메라나 자동차의 자동 운전 시스템에서는 부분적으로 가려진 객체를 정확하게 인식하는 것이 중요할 수 있습니다. 또한, 의료 이 미징 분석에서는 일부 데이터가 누락되거나 가려진 경우에도 정확한 진단을 내려야 하는 상황에서 이 기법이 도움이 될 수 있습니 다.


A. CoarseDropout은 이미지 내 중요한 정보의 일부를 의도적으로 삭제함으로써, 모델이 데이터의 중요 부분을 더 강조하여 학습하도록 유도하며, 이를 통해 모델의 일반화 능력을 개선할 수 있습니다.

 

transform = A.CoarseDropout(max_holes=20, max_height=8, max_width=8, 
                                min_holes=2, min_height=4, min_width=4,
                                fill_value=0, always_apply=True)
    
augmented_image = transform(image=image_np)['image']
    
plt.figure(figsize=(10, 5)) 

plt.subplot(2, 3, 1) 
show_image(image_np, 'Original Image')

plt.subplot(2, 3, 2)  
show_image(augmented_image, 'Color CoarseDropout Image')

plt.show()