TOP
class="layout-aside-left paging-number">
본문 바로가기
[파이썬 Projects]/<파이썬 머신 | 딥러닝 & AI>

[이미지 전처리] OpenCV를 통한 이미지 Resize 작업

by 기록자_Recordian 2024. 9. 6.
728x90
반응형

수집된 이미지들을 머신 러닝 모델 학습에 사용하거나 YOLO와 같은 객체 감지 모델에서 실행하기 전에 크기를 통합하거나 기타 작업을 수행하여 이미지를 전처리 하는 것이 중요하다.

 

이미지 크기 통일이 중요한 이유

 

1. 모델 입력의 일관성: YOLO를 포함한 많은 모델은 입력 이미지가 특정 크기(예: YOLO의 경우 416x416 또는 640x640)를 가질 것으로 예상. 크기가 다른 이미지를 공급하면 오류가 발생하거나 성능이 저하될 수 있다.

2. 효율적인 학습: 균일한 크기의 이미지가 있으면 모델이 다양한 이미지 크기를 처리할 필요가 없으므로 학습 프로세스가 단순화되고 수렴이 향상된다.

3. 왜곡 방지: 신중하게 크기를 조정하면 이미지 내의 객체가 모델 성능에 영향을 줄 수 있는 왜곡되지 않도록 할 수 있다.


이미지 전처리 단계(크기 조정)

 

1. 왜곡 없이 이미지 크기 조정
이미지 크기를 조정할 때 이미지의 개체가 왜곡되지 않도록 종횡비를 유지하는 것이 중요하다.

다음은 종횡비를 유지하면서 이미지 크기를 조정하고 필요한 경우 검은색 테두리로 채우는 OpenCV를 사용하는 Python 스크립트이다.

 

물론, 먼저 OpenCV 라이브러리 설치가 선행되어야 한다. (cmd 에서)

pip install opencv-python

 

그리고 주피터 노트북을 켜고, 해당 코드를 실행하였다.

import cv2
import os

# Input and output directories
input_folder = "C:/Users/pc02/Documents/Python Prac/Tire Scanner/raw images"
output_folder = "C:/Users/pc02/Documents/Python Prac/Tire Scanner/preprocessed images"

# Desired size for the images
desired_size = 416

# Create the output directory if it doesn't exist
if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# Resize and pad the images
def resize_and_pad(image, size):
    h, w = image.shape[:2]
    scale = size / max(h, w)
    new_w, new_h = int(w * scale), int(h * scale)

    # Resize the image
    resized_image = cv2.resize(image, (new_w, new_h), interpolation=cv2.INTER_AREA)

    # Create a new image with the desired size and fill it with black
    padded_image = cv2.copyMakeBorder(resized_image, 
                                      (size - new_h) // 2, 
                                      (size - new_h) // 2, 
                                      (size - new_w) // 2, 
                                      (size - new_w) // 2, 
                                      cv2.BORDER_CONSTANT, 
                                      value=[0, 0, 0])

    return padded_image

# Process all images in the input folder
for filename in os.listdir(input_folder):
    if filename.endswith(".jpg"):
        image_path = os.path.join(input_folder, filename)
        image = cv2.imread(image_path)

        if image is not None:
            resized_image = resize_and_pad(image, desired_size)
            output_path = os.path.join(output_folder, filename)
            cv2.imwrite(output_path, resized_image)

print("Image resizing and padding completed.")

 

리사이징된 이미지가 저장될 새로운 폴더인 <preprocessed images> 폴더가 생성되고,

그 안에 사이즈가 통일된 이미지들이 잘 저장된 것을 확인할 수 있다. (약 900개의 데이터 사이즈가 조정되는데 10초도 안 걸렸다)

 


기타 전처리

 

크기 조정 외에도 모델 및 데이터세트에 따라 다른 전처리 작업을 수행해야 할 수도 있다.

1. 정규화: 255로 나누어 픽셀 값을 [0, 1]과 같은 범위로 조정

normalized_image = resized_image / 255.0

 

2. 데이터 확대: 뒤집기, 회전, 확대/축소와 같은 무작위 변환을 적용하여 데이터 세트를 인위적으로 확장하고 모델 견고성을 향상시킨다.

3. 색상 변환: 모델에 회색조 또는 RGB 이미지가 필요한 경우 이미지가 올바른 색상 형식인지 확인


 

728x90
반응형