728x90

이미지 분류 작업에서 SVM(Support Vector Machine)은 높은 정확도와 안정적인 결과를 제공하는 대표적인 머신러닝 알고리즘입니다. 특히 OpenCV는 SVM을 간단하게 사용할 수 있는 API를 제공하며, HOG, Hu Moments와 같은 특징 추출 방법과 결합하면 다양한 이미지 인식 문제에 적용할 수 있습니다.


이미지 특징 기반 분류

SVM 모델은 cv2.ml.SVM_create()(Python), cv::ml::SVM::create()(C++)를 통해 구현할 수 있으며, HOG, SIFT, ORB 등 다양한 특징 기술자와 결합해 학습 데이터를 구성합니다. 작업 흐름은 다음과 같습니다.

1. 이미지 로드 및 전처리 – 크기 조정, 그레이스케일 변환 등
2. 특징 추출 – HOG로 벡터 추출
3. SVM 학습 – 커널 설정(RBF/Linear), 학습 수행
4. 예측 및 검증 – 테스트 이미지에서 특징 추출 후 클래스 예측

특히 커널 선택은 분류 성능에 중요한 영향을 미치며, 원라인으로 간단히 적용 가능합니다.


Python SVM 이미지 분류 예제


import cv2
import numpy as np

hog = cv2.HOGDescriptor()
svm = cv2.ml.SVM_create()
svm.setKernel(cv2.ml.SVM_RBF)

def extract_hog(img):
    return hog.compute(img).reshape(-1)

train_images = [...]
train_labels = [...]

train_features = np.array([extract_hog(img) for img in train_images])
svm.train(train_features, cv2.ml.ROW_SAMPLE, np.array(train_labels))

test_img = cv2.imread("test.jpg", 0)
test_feature = extract_hog(test_img).reshape(1, -1)
_, result = svm.predict(test_feature)

print("Predict:", result)

C++ SVM 이미지 분류 예제


#include <opencv2/opencv.hpp>
using namespace cv;
using namespace cv::ml;

int main(){
    HOGDescriptor hog;
    Ptr<SVM> svm = SVM::create();
    svm->setKernel(SVM::RBF);

    std::vector<Mat> trainImages;
    std::vector<int> trainLabels;

    Mat trainFeat;
    for(auto &img : trainImages){
        std::vector<float> desc;
        hog.compute(img, desc);
        trainFeat.push_back(Mat(desc).t());
    }

    svm->train(trainFeat, ROW_SAMPLE, Mat(trainLabels));

    Mat test = imread("test.jpg", IMREAD_GRAYSCALE);
    std::vector<float> desc;
    hog.compute(test, desc);
    Mat predFeat = Mat(desc).t();

    float res = svm->predict(predFeat);
    std::cout << "Predict: " << res << std::endl;
}

728x90

+ Recent posts