# Preprocess Images

전처리는 데이터셋이 표준 형식(예: 모든 이미지의 크기가 동일함)으로 되어 있도록 보장합니다. 이 단계는 모델을 학습하기 전에 데이터셋의 일관성을 보장하는 데 필수적입니다.

전처리는 Train, Valid, Test 세트의 모든 이미지에 적용됩니다(반면 [Augmentations](https://docs.roboflow.com/roboflow/roboflow-ko/datasets/dataset-versions/image-augmentation)는 Train 세트에만 적용됩니다).

Roboflow 플랫폼은 다음과 같은 전처리 옵션을 제공합니다:

* Auto-Orient
* Resize
* Grayscale
* Auto-Adjust Contrast
* Isolate Objects
* Static Crop
* Tile
* Modify Classes
* Filter Null
* Filter by Tag

각 옵션은 아래에 설명되어 있습니다.

### Auto-Orient

Auto-orient는 이미지의 EXIF 데이터를 제거하여 디스크에 저장된 방식과 동일하게 이미지가 표시되도록 합니다.

EXIF 데이터는 특정 이미지의 방향을 결정합니다. (Mac의 Preview 같은) 애플리케이션은 이 데이터를 사용해 디스크에 저장된 방향과 다르더라도 이미지를 특정 방향으로 표시합니다. 참고 [**이**](https://news.ycombinator.com/item?id=21207411) Hacker News 토론의 첫 페이지를 보면 이것이 object detection 모델을 조용히 망가뜨릴 수 있는 방법을 확인할 수 있습니다.

* Roboflow는 기본적으로 이 옵션을 켜둔 상태로 두고, inference에서 이미지가 모델에 어떻게 입력되는지 확인할 것을 권장합니다.
* 이미지에 auto-orient를 적용해야 하는지 여부를 더 알아보고 싶다면, [블로그를 확인해 보세요](https://blog.roboflow.com/exif-auto-orientation/).

### Resize

Resize는 이미지 크기를 변경하고, 선택적으로 원하는 차원으로 크기를 조정합니다. 주석은 비례에 맞게 조정됩니다(아래의 “fill”의 경우는 예외).

현재는 축소만 지원합니다. 다음에 대한 가이드를 제공합니다. [어떤 resize 옵션이 사용 사례에 가장 적합한지](https://blog.roboflow.com/you-might-be-resizing-your-images-incorrectly/).

* **Stretch to:** 이미지를 선호하는 픽셀 단위 차원으로 늘립니다. 주석은 비례적으로 조정됩니다. 이미지는 정사각형이 되며 왜곡되지만, 원본 이미지 데이터는 손실되지 않습니다.
* **Fill (with center crop) in:** 생성된 이미지는 원하는 출력 차원의 중앙 크롭입니다. 예를 들어 원본 이미지가 2600x2080이고 resize 옵션이 640x640으로 설정되어 있다면, 출력 resize는 원본 이미지의 중앙 640x640이 됩니다. 종횡비는 유지되지만 원본 이미지 데이터는 손실됩니다.
* **Fit within:** 원본 이미지의 종횡비를 유지하면서 원본 차원이 출력 이미지의 차원에 맞게 조정됩니다. 예를 들어 원본 이미지가 2600x2080이고 resize 옵션이 640x640으로 설정되어 있다면, 더 긴 차원(2600)은 640으로 조정되고 두 번째 차원(2080)은 약 512픽셀로 조정됩니다. 이미지의 종횡비와 원본 데이터는 유지되지만 정사각형은 아닙니다.
* **Fit (reflect edges) in:** 원본 이미지의 종횡비를 유지하면서 원본 차원이 출력 이미지의 차원에 맞게 조정되고, 새로 생성된 패딩은 원본 이미지의 반사본입니다. 예를 들어 원본 이미지가 2600x2080이고 resize 옵션이 416x416으로 설정되어 있다면, 더 긴 차원(2600)은 416으로 조정되고 두 번째 차원(2080)은 약 335.48픽셀로 조정됩니다. 남는 픽셀 영역(416-335.48, 즉 80.52픽셀)은 원본 이미지의 반사 픽셀입니다. 특히 Roboflow는 기본적으로 주석도 반사합니다. 이미지는 정사각형이며 패딩이 추가되고, 종횡비와 원본 데이터는 유지됩니다.
* **Fit (black edges) in:** 원본 이미지의 종횡비를 유지하면서 원본 차원이 출력 이미지의 차원에 맞게 조정되고, 새로 생성된 패딩은 검은색 영역입니다. 예를 들어 원본 이미지가 2600x2080이고 resize 옵션이 416x416으로 설정되어 있다면, 더 긴 차원(2600)은 416으로 조정되고 두 번째 차원(2080)은 약 335.48픽셀로 조정됩니다. 남는 픽셀 영역(416-335.48, 즉 80.52픽셀)은 검은색 픽셀입니다. 이미지는 정사각형이며 검은색 패딩이 추가되고, 종횡비와 원본 데이터는 유지됩니다.
* **Fit (white edges) in:** 원본 이미지의 종횡비를 유지하면서 원본 차원이 출력 이미지의 차원에 맞게 조정되고, 새로 생성된 패딩은 흰색 영역입니다. 예를 들어 원본 이미지가 2600x2080이고 resize 옵션이 416x416으로 설정되어 있다면, 더 긴 차원(2600)은 416으로 조정되고 두 번째 차원(2080)은 약 335.48픽셀로 조정됩니다. 남는 픽셀 영역(416-335.48, 즉 80.52픽셀)은 흰색 픽셀입니다. 이미지는 정사각형이며 흰색 패딩이 추가되고, 종횡비와 원본 데이터는 유지됩니다.

### Grayscale

RGB 채널이 있는 이미지를 단일 grayscale 채널의 이미지로 변환하여 메모리를 절약할 수 있습니다. 각 grayscale 픽셀의 값은 해당하는 빨강, 초록, 파랑 픽셀의 가중합으로 계산됩니다: Y = 0.2125 R + 0.7154 G + 0.0721 B.

이 가중치는 CRT 형광체에서 사용되며, 동일한 가중치보다 빨강, 초록, 파랑에 대한 인간의 인식을 더 잘 반영하기 때문입니다. (Via [Scikit-Image](https://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_rgb_to_gray.html).)

### Auto-Adjust Contrast

대비가 낮은 이미지를 향상시킵니다. 우리는 [전처리 단계로 contrast를 사용할지 여부](https://blog.roboflow.com/when-to-use-contrast-as-a-preprocessing-step/).

* **Contrast Stretching**에 대해 살펴보았습니다: 이미지가 2번째 및 98번째 백분위수 범위에 속하는 모든 intensity를 포함하도록 다시 스케일링됩니다. [더 보기](http://homepages.inf.ed.ac.uk/rbf/HIPR2/stretch.htm).
* **Histogram Equalization**: 이미지에서 “가장 자주 나타나는 intensity 값들을 퍼뜨립니다.” equalized 이미지는 대략 균일한 분포를 가지며, 모든 색상의 픽셀이 거의 동일하게 표현됩니다. [더 보기](https://en.wikipedia.org/wiki/Histogram_equalization).
* **Adaptive Equalization**: Contrast Limited Adaptive Histogram Equalization(CLAHE)입니다. 이미지의 서로 다른 타일 영역에 대해 계산된 histogram을 사용하는 국소 대비 향상 알고리즘입니다. 따라서 이미지의 대부분보다 더 어둡거나 밝은 영역에서도 국소 세부 사항을 향상시킬 수 있습니다. (Via [Scikit-Image](https://scikit-image.org/docs/dev/api/skimage.exposure.html#skimage.exposure.equalize_adapthist).)

## Advanced Preprocessing Features

### Isolate Objects

Isolate Objects 변환은 각 bounding box를 잘라 개별 이미지로 추출합니다. 이 단계는 Object Detection 데이터셋을 Classification 데이터셋으로 변환합니다.

데이터셋 내 많은 클래스가 서로 비슷한 경우, 두 개의 모델을 순차적으로 사용하는 것이 일반적입니다. 첫 번째 모델(object detection)은 객체를 찾고, 두 번째 모델(classification)은 그 객체가 무엇인지 식별합니다. Isolate Objects 변환은 두 번째 모델을 학습하는 데 필요한 데이터셋을 만드는 데 유용합니다.

### Static Crop

![Static crop 기능과 예시 출력입니다.](https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-4f30e8b0a744bea04bcf0dadd480f55d4cb9a034%2FScreenshot%202025-05-20%20at%2009.44.47.png?alt=media)

### Tile

Tile은 작은 객체를 감지할 때 도움이 될 수 있습니다(특히 항공 이미지나 현미경 이미지 같은 상황에서). 기본 설정은 2x2 tiling이지만 필요에 따라 조정할 수 있습니다. Tiling은 전처리 파이프라인에서 *이전에* resize보다 먼저 수행됩니다.

![tiling 도구와 출력의 미리보기(“grid”로 표시됨)입니다.](https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-7a09d308f703e2805c36bee439ee95451f05ca8b%2FScreenshot%202025-05-20%20at%2009.45.19.png?alt=media)

### Modify Classes

새로운 버전의 데이터셋을 생성할 때 특정 클래스를 제외하거나 클래스를 재매핑(이름 변경)하는 데 사용하는 전처리 도구입니다. 이러한 변경은 생성하는 버전에만 적용됩니다. 기본 데이터셋에는 변경이 가해지지 않습니다.

!["Apple leaf" 클래스를 제외합니다.](https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-37b01b8cc97b0d694bed8bf5d7a445fce3dbd8c9%2FScreenshot%202025-05-20%20at%2009.45.43.png?alt=media)

!["scratches" 클래스를 "scratch"로 재매핑합니다.](https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-6c39656c789b92a25f4a7775bb027f33382c706c%2FScreenshot%202025-05-20%20at%2009.46.57.png?alt=media)

### Filter Null

Filter Null 변환을 사용하면 데이터셋 내 이미지의 일정 비율이 주석 처리되도록 요구할 수 있습니다. null annotation으로 표시된 이미지 또는 Modify Classes 도구를 적용한 후 "unannotated"가 된 이미지만 Filter Null을 사용할 때 영향을 받습니다.

이 변환은 데이터셋의 상당 부분에 관심 대상 객체가 없는 경우 유용합니다.

![Filter Null 전처리 단계를 적용합니다.](https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-438a722d13a06de4d81a8508b0f1204e3e61fc30%2FScreenshot%202025-05-20%20at%2009.47.41.png?alt=media)

{% hint style="warning" %}
이 도구를 사용하기 전에 데이터셋 내 모든 이미지에 올바르게 주석을 달고, 적절한 이미지를 null annotation으로 지정하고, 필요한 경우 불필요한 클래스를 제외했는지 확인하세요.
{% endhint %}

{% hint style="info" %}
[Missing Annotation과 Null Annotation의 차이](https://blog.roboflow.com/missing-and-null-image-annotations/)

"Missing Annotations"는 이미지에 주석이 달려 있지 않을 때 발생합니다. 이미지를 주석 없이 두면 학습된 데이터셋의 성능에 문제가 생기고, 학습 실패로 이어질 수 있습니다. Null annotation은 *아무것도* 해당 이미지 안에 모델이 감지하길 원하는 것이 없을 때만 적용해야 합니다.
{% endhint %}

### Filter by Tag

Filter by Tag 변환을 사용하면 어떤 이미지가 버전에 포함되거나 포함되지 않아야 하는지, 어떤 [Tags](https://docs.roboflow.com/datasets/add-tags-to-images) 가 적용되었는지를 기준으로 필터링할 수 있습니다. 이 변환은 새로운 데이터 하위 집합으로 모델을 학습하거나 학습에서 원치 않는 이미지를 제외하는 데 유용합니다.

각 Tag에는 세 가지 옵션이 있습니다:

* **Require:** Required 태그가 있는 이미지만 버전에 포함됩니다.
* **Exclude**: Excluded 태그가 있는 이미지는 버전에 포함되지 않습니다.
* **Allow:** Allowed 태그가 있는 이미지는 Exclude 및 Require 규칙에 따라 버전에 포함됩니다.

<figure><img src="https://3958014485-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-M6S9nPJhEX9FYH6clfW%2Fuploads%2Fgit-blob-a4764e905f41d1e1b4e83aa437ce5ebdb7328219%2FScreenshot%202025-05-20%20at%2009.49.32.png?alt=media" alt=""><figcaption><p>이 예시에서는 결과 Version에 <code>do-not-include</code> 태그가 없는 이미지만 포함됩니다.</p></figcaption></figure>
