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で画像処理プログラミングを行う方法を入門者向けにソースコード付きで解説するページです。
コメント