# 이미지 전처리

전처리는 데이터셋이 표준 형식(예: 모든 이미지의 크기가 동일함)인지 확인해 줍니다. 이 단계는 모델을 학습하기 전에 데이터셋의 일관성을 보장하는 데 필수적입니다.

전처리는 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는 이미지 크기를 변경하고, 필요에 따라 원하는 치수로 스케일링합니다. annotations는 비례적으로 조정됩니다(아래의 “fill” 경우는 제외).

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

* **Stretch to:** 이미지를 선호하는 픽셀 단위 치수로 늘립니다. annotations는 비례적으로 스케일링됩니다. 이미지는 정사각형이 되고 왜곡되지만, 원본 이미지 데이터는 손실되지 않습니다.
* **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는 기본적으로 annotations도 반사합니다. 이미지는 정사각형이며 패딩이 추가되고, 종횡비와 원본 데이터가 유지됩니다.
* **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 phosphors가 동일한 가중치보다 빨강, 초록, 파랑에 대한 인간의 지각을 더 잘 나타내기 때문에 사용됩니다. (출처 [Scikit-Image](https://scikit-image.org/docs/dev/auto_examples/color_exposure/plot_rgb_to_gray.html).)

### Auto-Adjust Contrast

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

* **Contrast Stretching**: 이미지는 2백분위와 98백분위 사이에 포함되는 모든 강도를 포함하도록 재스케일됩니다. [더 보기](http://homepages.inf.ed.ac.uk/rbf/HIPR2/stretch.htm).
* **Histogram Equalization**: 이미지에서 가장 자주 나타나는 강도 값을 “퍼뜨립니다”. 균등화된 이미지는 대체로 균일한 분포를 가지며, 모든 색상의 픽셀이 تقريب적으로 동일하게 표현됩니다. [더 보기](https://en.wikipedia.org/wiki/Histogram_equalization).
* **Adaptive Equalization**: Contrast Limited Adaptive Histogram Equalization(CLAHE). 이미지의 서로 다른 타일 영역에 대해 계산된 히스토그램을 사용하는 국소 대비 향상 알고리즘입니다. 따라서 이미지의 대부분보다 더 어둡거나 밝은 영역에서도 국소 세부 정보를 향상시킬 수 있습니다. (출처 [Scikit-Image](https://scikit-image.org/docs/dev/api/skimage.exposure.html#skimage.exposure.equalize_adapthist).)

## 고급 전처리 기능

### 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은 작은 객체를 탐지할 때 도움이 될 수 있습니다(특히 항공 이미지나 microscopy 같은 상황에서). 기본 설정은 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 변환을 사용하면 데이터셋의 이미지 중 특정 비율이 주석(annotation)되어 있도록 요구할 수 있습니다. 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 Annotations와 Null Annotations의 차이](https://blog.roboflow.com/missing-and-null-image-annotations/)

"Missing Annotations"는 이미지에 주석이 없는 경우에 발생합니다(이미지를 주석 처리하지 않으면 학습된 데이터셋의 성능에 문제가 생기고, 학습 실패로 이어질 수 있습니다). Null annotations는 *아무것도* 해당 이미지 안에 존재하지 않을 때만 적용해야 합니다. 즉, 모델이 탐지하길 원하는 대상이 없는 경우입니다.
{% 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>
