【Python】 서포트 벡터 머신(SVM)을 사용해 화소치로부터 사과 배를 분류

1. 개요



이번에는 기계 학습의 일종인 지원 벡터 머신(영어: Support Vector Machine, SVM)을 사용하여 사과 배의 분류를 실시했습니다. 사과, 배 각각 10개의 화상의 화소치(평균치)를 이용해 2성분으로 SVM에 걸치는 것으로 분류할 수 있는지 조사했습니다.
덧붙여서, SVM이라고 하는 것은 모든 데이터 포인트가 아니고, 경계 부근의 일부의 데이터 포인트를 픽업해, 경계를 결정하는 수법이 됩니다. 그리고 그 경계 부근의 데이터 포인트를 서포트 벡터라고 부릅니다.

2. 준비할 데이터



미리 사과와 배의 RGB 픽셀 값의 평균값을 가져옵니다.
참고로 사과의 픽셀 값의 평균값 csv 파일은 아래 apple.csv를 사용했습니다. opencv를 사용하고 있으므로 정렬 순서가 BGR입니다. 사과만 있어, Red의 화소치가 높네요.
덧붙여서, 이 csv 파일의 작성 방법은 다른 기사로 소개하고 있으므로 꼭 봐 주세요! ↓↓↓
【Python】 대상물의 화소값 RGB의 평균값을 계산한다

사과의 csv 파일 이외에 배의 csv 파일도 미리 작성해 둡니다.

apple.csv
,blue,green,red
0,39.88469583593901,28.743374377331637,137.23369201906283
1,83.72563703792319,79.59471228615863,164.77884914463453
2,66.8231805177587,74.52501570023027,141.8854929872305
3,55.2837418388098,45.28968211495237,148.4160869099861
4,37.59397951454073,49.82323881039423,137.30237460066527
5,53.68868757437335,50.963264366051206,142.6121454070861
6,51.277953772145956,64.07145371348116,152.98116860260473
7,50.47702848900108,48.37151099891814,124.46714749368914
8,40.35442093843233,52.0682126390019,137.8299091402224
9,48.18758094199441,55.87655919841865,145.6361529548088

3. 환경



이번에는 도서관에서
· matplotlib
・numpy
· scikit-learn
・mglearn
사용하기 때문에 이러한 라이브러리를 설치해야합니다. 아직 들어 있지 않은 라이브러리는 아래 명령으로 설치하십시오.
pip install matplotlib
pip install numpy
pip install mglearn
pip install scikit-learn

4. 코드



이번에는 2 차원으로 SVM을 걸었으므로 BGR의 BG, GR, BR의 3 패턴으로 관찰합니다.
코드에 코멘트를 붙여 두었으므로 참고로 해 주세요.
덧붙여서 일본 배는 영어로 "Japanese pear"라고 말하는 것 같습니다. "pear"는 서양 배 같다. (코드에서는 「Japanese pear」라고 하면 길고 읽기 어렵기 때문에 「pear」로 했습니다.)

SVM_bgr_2D.py
import os
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
from sklearn.svm import LinearSVC
import mglearn

def main():
    path = 'output'
    os.makedirs(path, exist_ok=True)

    apple = np.loadtxt('input/apple.csv', delimiter=',', skiprows=1,usecols=[1,2,3])   #appleのcsvファイルから画素値データを取得
    pear = np.loadtxt('input/pear.csv', delimiter=',', skiprows=1,usecols=[1,2,3])
    #pearのcsvファイルから画素値データを取得

    SVM2D(np.delete(apple,2,1), np.delete(pear,2,1),'blue','green',path)    #bgrのbgをSVMにかける
    SVM2D(np.delete(apple,0,1), np.delete(pear,0,1), 'green', 'red',path)    #bgrのgrをSVMにかける
    SVM2D(np.delete(apple,1,1), np.delete(pear,1,1), 'blue', 'red',path)    #bgrのbrをSVMにかける

def SVM2D(ap_pv, pe_pv, xlabel, ylabel, path):

    yap=[0]*ap_pv.shape[0]  #りんごのデータ数分の0の並んだ配列を作成
    ype=[1]*pe_pv.shape[0]  #梨のデータ数分の0の並んだ配列を作成
    y = np.array(yap+ype)   #りんごと梨の訓練データ分類の配列
    X = np.concatenate([ap_pv,pe_pv],0)    #りんごと梨のデータ(RGB画素値)の配列

    #SVMの境界図を作成
    linear_svm = LinearSVC().fit(X, y)
    fig=plt.figure(figsize = (10, 6))
    ax = fig.add_subplot(1,1,1)
    ax.axis('normal')
    mglearn.plots.plot_2d_separator(linear_svm, ap_pv)
    mglearn.discrete_scatter(X[:, 0], X[:, 1], y)

    ax.legend(['apple', 'pear'])
    ax.xaxis.set_major_locator(ticker.MultipleLocator(20))
    ax.yaxis.set_major_locator(ticker.MultipleLocator(20))
    ax.tick_params('x', labelsize =15)
    ax.tick_params('y', labelsize =15)
    ax.set_xlabel(xlabel, fontsize= 20)
    ax.set_ylabel(ylabel, fontsize= 20)
    plt.savefig(path+'/SVM_'+xlabel+'_'+ylabel+'.png')

    #訓練データの正答率を出力
    print('score on training set: {:.2f}'.format(linear_svm.score(X,y)))

if __name__=='__main__':
    main()



5. 결과와 고찰



3 패턴 「Blue-Green」, 「Green-Red」, 「Blue-Red」에 대해 SVM을 실시한 결과, 각각의 경계선은 아래 그림이 되었습니다.



Blue-Red는 데이터 포인트가 섞여 버려 분류가 되어 있지 않습니다. 그에 비해, Blue-Green, Green-Red의 그림을 보면, 분명히 사과 배를 나눌 수 있었습니다.
이것으로부터, 배와 사과의 판별에는 빨강도 파랑도 아니고, 녹색의 정보가 중요한 것을 알았습니다.
RGB 이미지에서 사과는 Red를 기조로 하지만 배는 황록색이므로 Green과 Red를 기조로 합니다.
그래서 사과와 배에서는 녹색에 명료한 차이가 나왔네요.

6. 참고문헌



★사이트
· [python 머신러닝 초보자용] scikit-learn으로 SVM 구현하기

· 「배」의 영어 | 서양 배나 「일본의 배」의 올바른 발음과 관련 영어

★책
· Python으로 시작하는 기계 학습 (발행 : 오라일리 재팬)

「Python으로 시작하는 기계 학습」은 기계 학습의 공부를 하고 있는 사람에게 있어서, 매우 참고가 되는 서적입니다. 실제로 기계 학습할 때의 샘플 코드 등이 실려 있어 나도 매우 편리하고 있습니다. 내용은 읽기 쉬운 편입니다만, Python과 기계 학습이나 심층 학습의 기초를 알고 있는 사람을 위한 것이라고 생각합니다. 꼭 손에 읽어보세요!

좋은 웹페이지 즐겨찾기