【Python/OpenCV】SVMで画像分類①(手書き数字編)

Pythonライブラリ「OpenCV」でSVM(サポートベクタマシン)を実装し、手書き数字画像から数字を判別します。

【SVM】手書き数字画像から数字を判別

OpenCVには、SVM(サポートベクタマシン)で学習する機能があり、画像の分類器を作成できます。
今回は、手書き数字画像(0~2の3種類)を適当にいくつかペイントソフトを使って作成し、学習して検証してみました。使って数字判別をSVM(サポートベクターマシン)で行ってみます。

サポートベクターマシンの基礎については以下記事で解説しています。

404 NOT FOUND | Python入門速報

学習する手書き画像の例

C++版のOpenCVですが、公式リファレンス(https://docs.opencv.org/4.3.0/d1/d2d/classcv_1_1ml_1_1SVM.html)に説明があります。

項目 概要
画像ファイル https://github.com/nishizumi-lab/sample/tree/master/python/opencv/svm/ex1_data
学習に使用した画像 img0フォルダに「0」と描いた画像、img1フォルダに「1」と描いた画像、img2フォルダに「2」と描いた画像をそれぞれ5枚ずつ格納しています。
検証に使用した画像 test_img0フォルダに「0」と描いた画像、test_img1フォルダに「1」と描いた画像、test_img2フォルダに「2」と描いた画像をそれぞれ2枚ずつ格納しています。なお、学習用と検証用では別の画像を使用する必要があります。

動画解説

サンプルコード


パラメータ 説明
svm.setGamma(1) rbf, poly, sigmoidカーネル(ガウシアンカーネル)のパラメータです。(値が大きいほど境界が複雑になる)
svm.setC(1) どれだけ誤分類を許容するかのパラメータです。(値が小さいほど誤分類を許容)
svm.setKernel(cv2.ml.SVM_LINEAR) カーネル関数の種類。cv2.ml.SVM_LINEAR(線形カーネル)以外にcv2.ml.SVM_POLY(多項式カーネル) , cv2.ml.SVM_RBF(RBFカーネル), cv2.ml.SVM_SIGMOID(シグモイドカーネル)なども使える

今回は試しに0~2の手書き画像を5枚ずつ学習し、最後に2枚ずつ検証用画像を入力しましたが、うまくすべて分類できました。

【Python版OpenCV超入門】使い方とサンプルコードを解説
Python版OpenCVで画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。

コメント