Pythonで画像を分類②
こんにちは、データ事業部2部アナリストのヤマモトです。
「何となくでいいから機械学習(Machine Learning)、深層学習(Deep Learning)を理解してみたい」、「AIに興味がある」、そんな方々に向けたこの連載。
前回の記事では、AIについての概要をお話しました。
本記事では、機械学習を用いてPythonという言語で、実際に画像を分類してみたいと思います。
行うことは、手書きの画像を読み込んで0〜9までの数字に分類すること。
今からの道のりは次の画の通りです。
※環境構築(特定のシステムが動作できるようにコンピューターの状態を整えること)の方法はこちらの記事をご参照ください。
目次
●使用するデータ
使用するデータはOpenCVで配布されている、手書き数字の画像(digits.png)です。
このままだと見にくいので一部を拡大して見てみましょう。
このように0〜9までの各数字が500個、合計5000個の手書きの数字が一枚の画像に収められています。
この一枚の画像を5000個に分割して、それぞれの画像を20×20=400画素のデータに変換します。
ここでは、一つの数字につき500個あるデータのうち、最初から250のデータを学習用、残りの250のデータをテスト用(学習させた後に分類をさせてみるため)のデータにします。
Pythonのコードは以下のようになります。
コンピュータープログラムなんてサッパリという方も、日本語訳付きの外国語の本のようにこんな風に書くんだなぁと目を通してみてください。
●Pythonに必要なライブラリのインポート
まずはこれから必要になるライブラリを、使用できるようにインポートします。
イメージとしては、こんな魔法が使えるよ!という呪文の巻物を手に入れる、みたいな感じです。
import numpy as np import cv2 import sklearn from sklearn.linear_model import LogisticRegression
numpyというベクトルや行列の計算に便利なライブラリや、OpenCVという画像処理・解析の機能をもつライブラリ、sklearnという機械学習のライブラリをインポートします。
●画像の読み込みと分割をする
先ほどの手書き数字の画像を読み込みます。
img = cv2.imread('digits.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
画像のデータをimgという名前で読み込み、その画像のデータをグレースケールに変換しています。
cells = [np.hsplit(row,100) for row in np.vsplit(gray,50)]
5000個の20×20=400画素のデータに分割します。
●読み込んだデータを配列に変換する
画像のデータをこの後の作業がしやすいように配列という箱に詰めます。
x = np.array(cells)
xという名前の箱に詰めました。
●学習データとテストデータに分ける
xの箱に入れたデータを、コンピュータに学習させるためのデータのセットと、学習をさせた後に分類をさせるためのテストデータのセットに分けます。
train = x[:,:50].reshape(-1,400).astype(np.float32) test = x[:,50:100].reshape(-1,400).astype(np.float32)
trainが学習データ(トレーニング(training)の略ですね)、testがテストデータです。
余談ですが、私は機械学習を始めた初期の頃、trainを電車の意味だと勘違いして「なんで電車なんだろう?」と思っていました。学習データは訓練データと言うこともあります、故にトレーニングデータです。
●学習データとテストデータにラベルをつける
読み込んだ手書きのデータセットにそれがどの数字かという正解のラベルを作ります。
k = np.arange(10) train_labels = np.repeat(k,250) test_labels = train_labels.copy()
後で分類させた結果が合っているかどうか確かめるため、テストデータ用のラベルも作ります。
●モデルを使って学習及びテストデータの分類をさせる
ここではロジスティック回帰という分類モデルでコンピューターに学習をさせ、その後、テストデータの分類をさせてみます。
logr = LogisticRegression() logr_model = logr.fit(train, train_labels) pred = logr_model.predict(test)
●分類した結果を評価する
コンピュータに分類をさせた結果が、どのくらい正解のラベルと一致しているかを調べます。
print('判別結果') print('観測:', test_labels) print('予測:', pred) print('正答率:', logr_model.score(test, test_labels))
今回の正答率は81.04%という値になりました。
判別結果 観測: [0 0 0 ..., 9 9 9] 予測: [0 0 0 ..., 9 9 7] 正答率: 0.8104
●まとめ
今回はロジスティック回帰というモデルを使いましたが、分類するためのモデルは他にもあります。
次回の記事ではモデルも含め、このPythonのコードで行っていることをわかりやすくお話する予定です。
連載の最終目標は深層学習(Deep Learning)を用いて画像を分類することです、ぼちぼち記事をアップしていきますのでお付き合いくださると幸いです。
データ活用、分析基盤やAIの構築、データサイエンティストの養成研修については、お気軽に弊社までお問い合わせください。
DATUM STUDIOは、クライアントの事業成長と経営課題解決を最適な形でサポートする、データ・ビジネスパートナーです。
データ分析の分野でお客様に最適なソリューションをご提供します。まずはご相談ください。
Contact
Explore Jobs
関連記事