머신러닝 기반 이미지 색상 반전 시스템 구현

1. 프로젝트 소개

이 프로젝트는 지도학습 기반 회귀 모델을 활용하여 이미지의 색상을 자동으로 반전시키는 시스템을 구현하는 것을 목표로 합니다. 일반적인 색상 반전은 수학적으로 255-RGB 연산을 적용하면 간단히 구현할 수 있습니다. 그러나 본 프로젝트에서는 이러한 단순 연산을 직접 사용하는 대신, 머신러닝 모델이 데이터의 패턴을 학습하여 동일한 결과를 예측하도록 설계하였습니다. 이를 통해 단순 계산과 학습 기반 예측의 차이를 비교하고, 머신러닝의 구조와 동작 원리를 시각적으로 이해하는 데 목적을 두었습니다. 또한 단순 기능 구현에 그치지 않고, 데이터 생성부터 모델 학습, 성능 평가, 이미지 적용, 후처리, 시각화까지 하나의 완성된 프로젝트 흐름으로 구성하여 실제 인공지능 응용 프로젝트와 유사한 구조를 갖추도록 설계하였습니다.


2. 프로젝트 과정

  • 학습 데이터 설계
  • 먼저 RGB 색상 값을 무작위로 많이 만들었습니다. 그리고 각 색상에 대해 정답은 255 - RGB 방식으로 만들었습니다. 완벽하게 이상적인 데이터만 사용하지 않고, 실제 상황처럼 약간의 작은 오차를 추가하였습니다. 이러면 조금 더 현실적인 데이터를 학습하게 됩니다.

  • 모델 구조 설계
  • 단순한 선형회귀 대신 조금 더 발전된 구조를 사용하였습니다. StandardScaler로 데이터 정규화, Ridge 회귀로 과적합 방지 등 하나의 흐름으로 만들었습니다. 이렇게 하면 전처리와 학습이 체계적으로 진행됩니다.

  • 이미지 처리 설계
  • 이미지를 URL에서 불러온 뒤 OpenCV를 사용해 RGB 형태로 변환하였습니다. 이미지는 2차원 구조이지만, 머신러닝 모델은 1차원 형태의 입력을 받기 때문에 이미지 데이터를 한 줄로 펼쳐서 모델에 넣었습니다. 또한 모든 픽셀을 한 번에 처리하지 않고, 일정 개수씩 나누어 예측하도록 하여 메모리 문제를 방지하였습니다.

  • 후처리
  • 모델이 예측한 결과에 보정을 추가하였습니다. 이 과정을 통해 색 대비를 조절하고, 결과 이미지를 조금 더 자연스럽게 보이도록 만들었습니다.


3. 코드

import cv2
import numpy as np
import matplotlib.pyplot as plt

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.linear_model import Ridge
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

from urllib.request import urlopen, Request


# 학습 데이터 생성
np.random.seed(42)
train_X = np.random.randint(0, 256, (5000, 3))
train_y = 255 - train_X

# 작은 오차 추가
noise = np.random.normal(0, 5, train_y.shape)
train_y = np.clip(train_y + noise, 0, 255)
X_train, X_test, y_train, y_test = train_test_split(
    train_X, train_y, test_size=0.2, random_state=42
)

# 비선형 회귀 모델 구성
model = Pipeline([
    ("poly", PolynomialFeatures(degree=2)),
    ("scaler", StandardScaler()),
    ("ridge", Ridge(alpha=1.0))
])
model.fit(X_train, y_train)

# 성능 확인
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"Test MSE: {mse:.4f}")


# 이미지 로드
url = "https://cdn.sunrin-security.com/b2b37dcdedbd588546d9de09cb9931ea.png"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
req = Request(url, headers=headers)
resp = urlopen(req)
image = np.asarray(bytearray(resp.read()), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_COLOR)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
h, w, c = image.shape
flat_image = image.reshape(-1, 3)

# 메모리 안정
batch_size = 10000
predicted_colors = []
for i in range(0, len(flat_image), batch_size):
    batch = flat_image[i:i+batch_size]
    pred = model.predict(batch)
    predicted_colors.append(pred)
predicted_colors = np.vstack(predicted_colors)
predicted_colors = np.clip(predicted_colors, 0, 255).astype(np.uint8)

# 후처리
gamma = 1.2
normalized = predicted_colors / 255.0
gamma_corrected = np.power(normalized, gamma)
gamma_corrected = np.clip(gamma_corrected * 255, 0, 255).astype(np.uint8)
result_image = gamma_corrected.reshape(h, w, c)

# 시각화
plt.figure(figsize=(12, 6))
plt.subplot(1, 2, 1)
plt.imshow(image)
plt.title("Original")
plt.axis("off")
plt.subplot(1, 2, 2)
plt.imshow(result_image)
plt.title("Advanced AI Inversion")
plt.axis("off")
plt.tight_layout()
plt.show()
    

4. 시연 및 프로젝트 결과

    색반전 결과

    모델을 학습시킨 후 테스트 데이터에 대해 MSE(평균제곱오차)를 출력하여 성능을 확인하였습니다. 노이즈가 포함된 데이터였지만 오차가 낮게 나왔고, 이는 모델이 색상 반전 규칙을 잘 학습했다는 의미입니다. 실제 이미지에 적용해본 결과, 원본 이미지와 비교했을 때 색상이 반전된 이미지를 안정적으로 생성하였습니다.


5. 소감

    이번 프로젝트를 통해 단순한 이미지 연산도 머신러닝 구조로 구현할 수 있다는 점을 직접 확인할 수 있었습니다. 단순히 결과만 만들어내는 것이 아니라, 데이터를 생성하고 모델을 구성하며, 학습과 평가 과정을 거쳐 실제 이미지에 적용하는 전 과정을 경험함으로써 머신러닝 프로젝트의 전체 흐름을 이해하는 데 큰 도움이 되었습니다. 특히 이미지 데이터를 모델 입력 형태로 변환하는 과정과, 후처리 단계의 중요성을 체감할 수 있었습니다. 단순히 모델의 예측 결과를 사용하는 것이 아니라, 감마 보정과 같은 추가 처리 과정을 통해 출력 품질을 개선할 수 있다는 점이 인상 깊었습니다. 또한 이번 프로젝트를 통해 머신러닝은 단순히 복잡한 알고리즘을 사용하는 것이 아니라, 데이터 설계와 처리 구조, 평가 과정까지 포함하는 하나의 체계적인 흐름이라는 것을 배우게 되었습니다. 단순 구현을 넘어 하나의 완성된 프로젝트 형태로 발전시킬 수 있었던 의미 있는 경험이었습니다.