머신러닝 이미지 전처리

김승혁·2023년 7월 11일
0

ML

목록 보기
1/9
post-thumbnail

컴퓨터에게 이미지를 어떻게 인식시킬까

“우선, 기계가 분석할 수 있는 데이터로 변환해주자”

이를 데이터를 “정형화” 해준다고 한다.

비정형 데이터 → 정형 데이터
(이미지) (숫자)

컴퓨터에게 이미지를 인식시키는법

(이미지) (숫자) → (벡터)

색의 밝기를 기준으로

검정 : 0
회색 : 1~254
흰색 : 255

이미지 인식하는법

(라벨
)

(숫자)

(벡터
)

(인코딩
)
신발 : 0
바지 : 1
셔츠 : 2
가방 : 3
...

신발

1000...0

(원핫 인코딩
)

0
→ 1 0 0 0 ... 0
1
→ 0 1 0 0 ... 0
2
→ 0 0 1 0 ... 0
3
→ 0 0 0 1 ... 0 ...

Resize

이미지를 수집했다고 가정해보자. 이제 수집한 이미지를 숫자로 바꾸는 작업(벡터화)을 수행해야 한다.
그러나, 아까 이야기한대로 바로 픽셀 단위로 색을 숫자로 바꾸는 작업을 진행해도 될까?
수집한 이미지가 아래와 같은 상황이라면? 이미지를 학습시킬 모델에 입력해주기 위해서는 보통의 경우 모든 이미
지를 동일한 사이즈로 맞춰줘야 한다. 모델의 형태에 따라 이미지의 크기를 꼭 맞춰줄 필요가 없는 경우도 있지만,
일단, 일관성 있게 같은 크기의 이미지를 입력해주는 것이 기본적인 방식이라고 생각하자.

맞춰주는 방식은 아래와 같다.
1. 이미지의 shape은 정방형으로 정하고, 한 변의 길이를 특정 값(=a)로 정해준다. (ex. A = 224 → 224 x 224)
2. (당연하게도) 길이가 긴 쪽을 a에 맞추고, 비율을 유지하여 키우거나 줄인다.
3. 짧은 쪽은 검정색(0)으로 채워서 정방형으로 맞춘다.

Zero-centering

앞서 이미지 데이터는 색을 기준으로 숫자 형태로 변환한다고 설명했다. 숫자는 0~255 사이의 숫자로 변환된다.
여기서 이 숫자 즉, feature값들은 모두 양수이다. 이를 평균이 0이 되고, 양수와 음수를 모두 갖도록 하기 위해 각
픽셀의 데이터를 평균값으로 빼주는 전처리를 수행한다. 이를 소위 ‘제로 센터링'이라고 표현하기도 하는데, 이는
일반적으로 이미지 분류에서 효과적인 전처리 방법 중 하나로 알려져 있다. Alexnet, VGGNet 등 초창기 주요
이미지 분류 모델 논문에서 제로 센터링(논문 상 Subtracting Zero-mean) 외에 다른 전처리 방법은 사용하지
않았다고 언급했을 정도로, 효과적인 전처리 방법이다. 뿐만 아니라, 최근 딥러닝 모델링에서도 이미지 처리의 경우
제로 센터링만 사용하여 전처리하는 경우도 많다고 알려져 있다.

X −= np. mean(X, axis = 0)

Feature값들이 모두 양수일 경우, 학습할 때 학습이 매우 비효율적으로 행해진다. 이는 입력값이 모두 양수일 경우,
gradient가 항상 모두 양수거나 음수가 나오기 때문이다. 즉, 효율적인 학습을 위해서는 입력값이 양수와 음수가
공존해야 한다. 0~255사이에 분포되어 있는 숫자들을 양수와 음수가 모두 공존하도록 변경하기 위해 모든
feature 값에 zero-centering 작업을 수행한다.

Zero-centering이란 학습시킬 데이터셋의 각 feature값들의 평균값을 계산하여 feature값에 평균값을 빼주는
작업을 말한다.

X −= np. mean(X, axis = 0)

Grayscalling

그레이스케일은 다중 채널 이미지를 단일 채널 이미지로, 쉽게 말해 컬러 이미지를 흑백이미지로 변환하는 작업을
말한다. 이는 데이터의 양을 줄여 계산의 효율성을 높이는 효과를 가져온다. 좀더 정확하게 말하자면, 다중 채널은
채널이 보통 3개인데, 그레이스케일은 1개의 채널을 가지고 있으므로 데이터의 양이 1/3 로 줄어드는 효과를
가져온다.
많은 알고리즘이 이미지의 소스(source)를 그레이스케일 이미지를 사용하여 처리한다. 물론, 그레이스케일을
적용하지 않아야 하는 경우도 존재하기 때문에 문제의 목적에 따라 사용해야 한다.

Binarization

이진화 작업은 모든 픽셀을 흑과 백으로만 표현하는 변환 기법이다. 이전에 살펴본 그레이스케일은 0~255 사이의
숫자로 표현하는 것이라면, 이진화는 0과 255만으로 표현하는것이다. 그레이스케일과 마찬가지로 이는 데이터의
양을 줄여 계산의 효율성을 높이는 효과를 가져온다.
0과 255만으로 변환하기 때문에 데이터의 특징을 보다 명확하게 추출할 수 있다는 장점이 있다. 단, 모든 경우에
그런 것은 아니고, 오히려 질이 악화되는 경우도 있다는 것을 알아두자. 그레이스케일과 마찬가지로 이진화 또한
적용하지 않아야 하는 경우도 존재하기 때문에 문제의 목적에 따라 사용해야 한다.

Denoising

노이즈는 모델학습을 방해하는 요인 중 하나다. 노이즈는 카메라의 성능, 촬영 시 상황, 이미지 저장 및 전송 등
다양한 과정에서 발생할 수 있다. 성능을 높이기 위해 노이즈를 제거하는 과정을 진행해야 한다. 이 작업을
Denoising이라 합니다.
Denoising은 이미지의 불필요한 부분을 제거하거나 변경하여 데이터를 깔끔하게 만든다.대표적인 Denoising
방법으로는 Blur 처리, 필터링, 모폴로지(Morphology) 등이 있다.
1) 블러 처리는 이미지를 부드럽게 하거나 흐릿하게 하여 노이즈를 제거하는 방법이다.
2) 필터링은 원하지 않는 데이터를 걸러내어 필요한 데이터만 남기는 방법이다. 임의의 필터를 이미지나 영상에
적용하여 원하지 않는 데이터를 제거하거나, 노이즈를 감소시킨다.
3) 모폴로지(Morphology) 는 영상이나 이미지의 픽셀값을 대체하기 위해 사용한다. 영상이나 이미지에서
팽창(Dilate)과 침식(Erode)을 이용해 이미지의 정확도를 높인다. 팽창은 이웃한 화소를 최대 픽셀로 대체하여
어두운 영역이 줄어들며 밝은 영역이 늘어나게 하는 것이다. 침식은 이웃한 화소를 최소 픽셀로 대체하여 밝은
영역이 줄어들며 어두운 영역이 늘어나게 하는 것이다. 이 두 연산을 혼합한 열림(Opening), 닫힘(Closing) 등이있다.
침식과 팽창

이미지 Augmentation

Augmentation 왜 해야 하는가

머신러닝 방식은 데이터 양에 대한 의존도가 높다는 것은 이미 여러 번 다루었다. 그렇다는 것은 애초부터 데이터수집을 준수한 분석이 가능한 수준만큼 많이 해줘야 한다는 의미다. 문제는 데이터 수집에 어려움을 겪는 경우다.
데이터 수집에 한계에 놓인 상황에서는 어떻게 해야 할까.

기존에 데이터를 새로 수집하는것은 어려우므로 기존 데이터에 변형을 줘서 데이터 양을 늘려 다양성을 높인다

어그멘테이션 vs 직접 수집

그럼 어그멘테이션을 해서 데이터의 개수를 보완할 수 있다면, 직접 수집할 필요가 없는걸까?
이를 좀 더 직관적으로 이해해보자.
직접 사자 사진 10000장을 수집한 경우와 사자 1장을 가지고 어그멘테이션 9999장한 경우를 생각해보자.
둘다 사자 사진 1만장인데, 두 경우 간의 데이터셋 품질의 차이는 어떨 것 같은가?
직접 수집한 1만장의 품질이 더 좋다고 생각하는 것은 어렵지 않다. 그럼, 이 품질은 어떤 기준에서 판단한 것인지
생각해보자.
그렇다. 어그멘테이션으로 얻은 데이터들 간에는 아무리 개수가 늘어나도 원본 1장으로부터 파생된 데이터들이기
때문에 다양성에 한계가 있다.
데이터셋의 품질이 달라지기 때문

Augmentation은 원본데이터와의 distribution이 큰 데이터를 만들어 내지는 않기 때문에 데이터의 양을 충분히
늘려서 작업을 해야 그나마 효과를 보는 것이 보통이다. 아니면 애초부터 최대한 distribution을 키우는 참신한
방식의 어그멘테이션 기법이 필요하다. 그런 직관적 이해 안에서 기본적인 augmentation기법부터 진화된
기법까지 살펴보자.
어그멘테이션은 기본적인 방식부터 정말 참신한 방식들까지 다양한 접근이 존재한다. 이런 많은 노력들을 통해
어그멘테이션은 한계를 뚫고 성능 개선에 많은 기여를 해오고 있다.

어그멘테이션 종류

  1. Flipping
    Flipping은 이미지를 좌우 또는 상하로 뒤집는 기법이다. 이를 통해 좌우 대칭인 이미지
    데이터를 생성하거나, 일부 물체나 특징들의 위치 변화를 모델이 더 잘 학습할 수
    있도록 도와준다. TensorFlow에서는 tf.image.flip_left_right(),
    tf.image.flip_up_down()를 사용하여, 좌우, 상하 뒤집힌 이미지를 생성할 수 있다.

  2. Cropping
    Cropping은 이미지를 잘라내는 기법이다. 이를 통해 이미지의 일부분만을 사용하여
    모델이 더 강인한 특징을 학습할 수 있도록 도와준다. TensorFlow에서는 tf.image에서
    central_crop(), random_crop()를 사용하여 이미지를 잘라낼 수 있다.

  3. Rotation (CNN은 회전에 약함)
    Rotation은 이미지를 회전시키는 기법이다. 이를 통해 이미지의 방향 변화를 모델이 더
    잘 학습할 수 있도록 도와준다. TensorFlow에서는 tf.image.rot90(), rotated()를
    사용하여 이미지를 회전시킬 수 있다.

  4. Brightness & Saturation (+other color jittering)
    Brightness & Saturation는 이미지의 밝기를 조정하는 기법이다. 이를 통해 이미지의
    밝기&채도 변화를 모델이 더 잘 학습할 수 있도록 도와줍니다. TensorFlow에서는
    tf.image.brightness(), tf.image.saturation()으로 각각 밝기와 채도를 바꿀 수 있다.
    이 외에도 tf.image.random_contrast(), tf.image.random_hue() 등 다양한 색상
    변화를 줄 수 있다.

이외에도 다양한 기본적인 어그멘테이션 기법이 있다. Tensorflow에서 가장 보편적으로 어그멘테이션을 사용하는
방법 중 하나가 ImageGenerator 클래스를 이용하는 것이다. ImageGenerator 클래스에서는 어그멘테이션 관련
매개변수를 지원하고, 이 매개변수를 조정하는 것으로 사용자가 원하는 어그멘테이션을 사용할 수 있다. 매개변수는
다음과 같다.

  1. rotation_range: 랜덤하게 이미지를 회전할 각도 범위 (0-180)
    2.width_shift_range: 이미지를 수평으로 이동할 범위 (전체 너비 대비 비율)
    3.height_shift_range: 이미지를 수직으로 이동할 범위 (전체 높이 대비 비율)
    4.shear_range: 랜덤하게 이미지를 shift(편향)시키는 각도 범위
    5.zoom_range: 랜덤하게 이미지를 확대/축소할 범위
    6.horizontal_flip: 랜덤하게 이미지를 수평으로 뒤집을지 여부
    7.vertical_flip: 랜덤하게 이미지를 수직으로 뒤집을지 여부
    8.fill_mode: 이미지를 변형시킨 후 생긴 빈 픽셀을 채우는 방식
profile
어떻게 오셨나요

0개의 댓글