이미지와 영상처리

📅 2025년 4월 7일 - 머신러닝 모델 비교와 OpenCV 이미지 처리 실습

EasyHanAI 2025. 4. 7. 13:12

 

오늘은 머신러닝의 대표적인 분류 알고리즘인 SVM, 로지스틱 회귀, KNN을 Iris 데이터셋에 적용해보고, OpenCV를 활용해 이미지 불러오기와 전처리도 실습했습니다. 각각의 모델이 데이터를 어떻게 처리하고 예측하는지 살펴보고, 그 결과를 평가하는 방법도 함께 배웠습니다. 또한 이미지 파일을 열고, 회색조로 변환한 뒤 저장 및 출력하는 과정을 익혔습니다.


1. 🌸 Iris 데이터셋 분류 실습

Iris 데이터셋은 머신러닝 입문자들이 가장 많이 활용하는 꽃잎 길이/너비 데이터를 포함한 분류용 데이터입니다.

(1) 데이터셋 불러오기

from sklearn import datasets

# 사이킷런에서 제공하는 아이리스 데이터셋 불러오기
d = datasets.load_iris()
print(d.DESCR)  # 데이터셋 설명 출력

# 전체 데이터 출력
for i in range(0,len(d.data)):
    print(i+1, d.data[i], d.target[i])

(2) SVM 분류기 학습 및 예측

from sklearn import svm

s = svm.SVC(gamma=0.1, C=10)
s.fit(d.data, d.target)  # 전체 데이터로 학습

# 새로운 샘플 2개를 예측
new_d = [[6.4,3.2,6.0,2.5], [7.1,3.1,4.7,1.35]]
res = s.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

(3) 교차검증으로 SVM 평가

from sklearn.model_selection import cross_val_score

accuracies = cross_val_score(s, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean()*100, accuracies.std()))

(4) SVM + Confusion Matrix

from sklearn.model_selection import train_test_split
import numpy as np

x_train, x_test, y_train, y_test = train_test_split(d.data, d.target, train_size=0.6)
s.fit(x_train, y_train)
res = s.predict(x_test)

conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)

no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

2. 🔢 로지스틱 회귀 실습

from sklearn.linear_model import LogisticRegression

logreg = LogisticRegression()
logreg.fit(d.data, d.target)
res = logreg.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

교차검증

accuracies = cross_val_score(logreg, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean()*100, accuracies.std()))

Confusion Matrix

logreg.fit(x_train, y_train)
res = logreg.predict(x_test)

conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)

no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

3. 👥 KNN (K-최근접 이웃) 실습

from sklearn.neighbors import KNeighborsClassifier

k = 3
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(d.data, d.target)
res = knn.predict(new_d)
print("새로운 2개 샘플의 부류는", res)

교차검증

accuracies = cross_val_score(knn, d.data, d.target, cv=5)
print(accuracies)
print("정확률(평균)=%0.3f, 표준편차 =%0.3f" % (accuracies.mean()*100, accuracies.std()))

Confusion Matrix

knn.fit(x_train, y_train)
res = knn.predict(x_test)

conf = np.zeros((3, 3))
for i in range(len(res)):
    conf[res[i]][y_test[i]] += 1
print(conf)

no_correct = sum(conf[i][i] for i in range(3))
accuracy = no_correct / len(res)
print(no_correct)
print("테스트 집합에 대한 정확률은", accuracy * 100, "%입니다.")

4. 🖼️ OpenCV 이미지 처리

(1) 이미지 불러오기 및 표시

import cv2 as cv
import sys

img = cv.imread('plant2_test1.jpg')  # 이미지 경로 주의
if img is None:
    sys.exit("파일을 찾을 수 없습니다.")

cv.imshow('Image Display', img)
cv.waitKey()
cv.destroyAllWindows()

(2) 이미지 축소

img_small = cv.resize(img, dsize=(0,0), fx=0.25, fy=0.25)
print(img.shape)

cv.imshow('Image Display', img_small)
cv.waitKey()
cv.destroyAllWindows()

(3) 흑백 변환 및 저장

gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
gray_small = cv.resize(gray, dsize=(0,0), fx=0.5, fy=0.5)

cv.imwrite('gray.jpg', gray)
cv.imwrite('gray_small.jpg', gray_small)

cv.imshow('Color image', img)
cv.imshow('Gray image', gray)
cv.imshow('Gray image small', gray_small)

cv.waitKey()
cv.destroyAllWindows()

5. 🔁 콜백 함수 이해하기

def callback_func(func):
    for i in range(5):
        func(i)

def print_hello(num):
    print("hello", num)

def print_python(num):
    print("python", num)

callback_func(print_hello)
callback_func(print_python)

👉 어떤 함수를 인자로 받아서 반복 실행시키는 “콜백 함수” 개념을 실습했습니다.


✏️ 느낀 점 (부족했던 부분)

  • 이미지 경로 오류가 자주 났습니다. 파일을 프로젝트 폴더와 같은 위치에 정확하게 넣지 않으면 imread에서 파일을 못 찾습니다.
  • 로지스틱 회귀는 max_iter 설정이 없어서 에러 날 수 있으므로, 모델 생성 시 max_iter=200 정도로 지정해주는 게 좋습니다.
  • Confusion Matrix의 행과 열 위치가 조금 헷갈렸습니다. 예측값/실제값 순서를 주의해야 합니다.

🛠 개선할 점

  • 각 모델의 파라미터 튜닝(C, gamma, k 등)을 바꿔보며 성능 차이를 비교하는 실험이 부족했습니다.
  • 정확도 외에 정밀도(precision), 재현율(recall)도 함께 출력하면 더 실용적인 분석이 될 것 같습니다.
  • 이미지 전처리 후, 머신러닝 모델과 연동해 식물 분류기를 만들어보면 재미있을 것 같습니다.

📌 요약 정리

  • Iris 데이터셋을 통해 SVM, 로지스틱 회귀, KNN 모델을 학습하고 성능을 평가해보았습니다.
  • OpenCV를 이용한 이미지 읽기, 흑백 변환, 축소 및 저장을 실습하였습니다.
  • 콜백 함수의 원리를 이해하고 간단한 함수로 적용해보았습니다.