OpenCVを使って顔認識を試してみます。
まずは、画像に写っている顔の範囲を調べます。
1 | import cv2 |


正常に顔の範囲が認識できました。
次に顔にモザイクをかけてみます。
1 | import cv2, sys, re |

(Google Colaboratoryで動作確認しています。)
OpenCVを使って顔認識を試してみます。
まずは、画像に写っている顔の範囲を調べます。
1 | import cv2 |


正常に顔の範囲が認識できました。
次に顔にモザイクをかけてみます。
1 | import cv2, sys, re |

(Google Colaboratoryで動作確認しています。)
前回使用したテストデータは10種ですが、次にもっと大きなデータを使ってテストするときのために正解率を表示できるようにしておきます。
1 | # 結果判定リスト |
【結果】
現状7割の正解率ですが学習データを増やしたり学習回数、学習率を調整してみます。
これまでは学習データ100個、テストデータ10個で簡単に動作確認してきましたが、今回は学習データ60,000個、テストデータ10,000個を使ってどのくらい正確に手書き文字を認識するかテストします。
おさらいとして、自作した完成版のニューラルネットワークを確認します。
1 | import numpy |
次に今回使用する学習データ60,000個とテストデータ10,000個をダウンロードしておきます。
1 | !wget https://www.pjreddie.com/media/files/mnist_train.csv |
60,000個の学習データを学習率0.2、学習回数(エポック)1回で学習させます。
1 | # 60,000個のデータを学習 |
10,000個のテストデータで正解率を算出します。
1 | # 10,000個のテストデータで正解率を算出 |
【結果】
1 | # 正解率 # 95.38% |
正解率をあげるため学習率や学習回数(エポック)を調整しようと考えていたのですが、もうすでに正解率95%以上と十分な正解率(認識率)となっています。
次に正解率がどう変動するのかを確認したいと思います。
学習処理と検証処理を関数化します。引数に学習率を設定すると、その学習率での正解率が返ります。
1 | import numpy |
上記で定義した関数を学習率を変化させながら実行し、その結果を折れ線グラフに表示します。
1 | %matplotlib inline |
X軸に学習率、Y軸に正解率が表示されます。
上記の結果から学習率が0.1の場合が一番正解率が高いことがわかりました。
次回は学習率を0.1に固定し、学習回数(エポック)を変化させると正解率がどのように変化するかを調べてみます。
さきほど関数化したものの引数に学習回数を追加します。
1 | import numpy |
上記で定義した関数を学習回数を変化させながら実行し、その結果を折れ線グラフに表示します。
(学習率は前回もっとも結果のよかった0.1を指定します。)
1 | %matplotlib inline |
X軸に学習回数、Y軸に正解率が表示されます。
もともと学習回数が1回でも正解率95.75%となかなかの精度がでているのですが、学習回数をふやすとやや結果がよくなっていっているのがわかります。
ただ2%以内の増減なので、処理時間がすごく増える割には効果があるとは思えませんでした。
次回は学習率を0.1、学習回数を5回に固定し、隠れ層の数を変化させると正解率がどのように変化するかを調べてみます。
関数化したものの引数に隠れ層の数を追加します。
1 | import numpy |
上記で定義した関数を隠れ層を変化させながら実行し、その結果を折れ線グラフに表示します。
1 | # 隠れ層と正解率の関係 |
X軸に隠れ層の数、Y軸に正解率が表示されます。
100層から200層で1%弱の情報がありますがそれ以降はあまり変化がありません。
これまでに、学習率・学習回数・隠れ層の数と正解率の関係を見てきましたがもともとの正解率が高かったこともありほんとに微調整といった感じです。
このあたりのパラメータ調整は、正解率が低い場合には調整する意味合いが大きくなるかと思います。
(Google Colaboratoryで動作確認しています。)
学習メソッドtrainを実装します。前回実装した照会メソッドqueryと似ています。
重みをかけて発火させたあとに目標出力との誤差を算出しそれを学習率に応じて重みに反映する・・・これがニューラルネットワークの最重要ポイントかと思われます。
1 | import numpy |
これで自作ニューラルネットワークが完成しました。
このクラスを使ってMNISTデータの判定を行ってみます。
まず、学習データ(100種類)とテストデータ(10種類)をダウンロードします。
1 | !wget https://raw.githubusercontent.com/makeyourownneuralnetwork/makeyourownneuralnetwork/master/mnist_dataset/mnist_test_10.csv |
データを読み込んで、どんなデータか表示してみます。
1 | import numpy |

データを学習し、テストデータの1つを選んでどの数字と合致する確率が高いかを表示します。
1 | import numpy |

今回は[7]の合致率が97%以上ときちんと認識しているようです。
10種類あるテストデータをすべて試してみましたが、なかなかよい結果がでてました。
ただ人間でもよくわからないデータ(手書き数字)だとはっきり認識するのは難しいようです。(あたり前か・・・)
隠れ層のノード数、学習率、学習回数の範囲をいろいろ試してみて認識率がどうかわるかを試すのもよいかと思います。
(Google Colaboratoryで動作確認しています。)
ニューラルネットワークを試してみます。
まずは、基本メソッド、各層の数と学習率をもつニューラルネットワーククラスを定義します。
中身はなにもありませんが、これがニューラルネットワーク・クラスの骨格となります。
1 | # ニューラルネットワークを表すクラス |
このクラスに少しずつ実装していきます。
初期化のところで重みを生成し、活性化関数にシグモイド関数を設定してます。
また照会メソッドで、入力に対し入力・隠れ層の重みをかけシグモイド関数で発火させます。
さらにその結果に隠れ・出力層の重みをかけシグモイド関数で発火させ、その結果を返しています。
1 | import numpy |
上記で定義したクラスが問題なく動くか、テストするコードを簡単に書いて実行してみます。
1 | in_node = 3 # 入力層のノード数 |
【結果】
1 | array([[0.55799198], |
まだ学習するメソッドを実装していないので意味のない出力ではありますが、エラーなしで動作することを確認できました。
次回は学習メソッドを実装していきます。
(Google Colaboratoryで動作確認しています。)
| 用語 | 英語 | 説明 |
|---|---|---|
| 教師あり学習 | Supervised Learning | 正解となるデータをもとに機械学習を行う手法。データの分類や数値の予測などに使用する。 |
| 教師なし学習 | Unsupervised Learning | 正解が用意されていないデータに対して行う手法。データのクラスタリングなどに使用する。 |
| 強化学習 | Reinforcement Learning | ある環境の中での行動に対して報酬を与えて学習させる手法。ゲームや自動運転などにおいて、振る舞いを最適化するために使用する。 |
| 分類 | Classification | 教師あり学習でデータがどのグループに属するか(ラベル)を予測すること。 |
| 回帰 | Rgression | 教師あり学習でデータに対して数値を予測すること。 |
| クラスタリング | Clustering | 教師なし学習で、似ているデータをグループ化すること。分類とは異なり正解が存在しない。 |
| アルゴリズム | Algorithm | 機械学習ではそれぞれの機械学習を行うための手順のことを指す。主要なアルゴリズムはscikit-learnで用意されている。 |
| アンサンブル学習 | Ensemble Learning | 複数のモデルの結果を組み合わせて多数決などで決定する手法。 |
| ラベル | Label | 分類で、データの正解を表す値。 |
| モデル | Model | 機械学習アルゴリズムが作成した予測を行うためのパラメータの集まり。予測プログラムで使用する。 |
| 用語 | 英語 | 説明 |
|---|---|---|
| 線形回帰 | Linear Regression | 回帰に使用するアルゴリズムの1つ。 |
| ロジスティック回帰 | Logistic Regression | アルゴリズムの名前には回帰が付いているが、主に分類に使用するアルゴリズム。 |
| サポートベクターマシン | Support Vector Machine : SVM | 分類、回帰に使用できるアルゴリズム。 |
| 決定木 | Decision Tree | データを分類するルールを定義して分類を行うアルゴリズム。 |
| ランダムフォレスト | Random Forest | 複数の決定木の予測結果から、多数決で予測を行うアルゴリズム。アンサンブル学習の1つ。 |
| 用語 | 英語 | 説明 |
|---|---|---|
| 学習データ | Data | 学習済みモデルを作成するための機械学習アルゴリズムの入力に使用するデータの集まり。あらかじめ用意したデータを学習データとテストデータに分割する。教師データ、訓練データともいう。 |
| テストデータ | Test Data | モデルの精度評価を行うために使用するデータ。 |
| 混合行列 | Confusion Matrix | 分類の制度を計算するために予測と正解の組み合わせを集計した表。 |
| 陽性 | Positive | 分類で目的としているデータの持つ性質。 |
| 陰性 | Negative | 分類で目的としていないデータの持つ性質。 |
| 真陽性 | True Positive : TP | 陽性と予測して(Positive)、予測が当たった(True)データの性質。 |
| 偽陽性 | False Positive : FP | 陽性と予測して(Positive)、予測が外れた(False)データの性質。 |
| 偽陰性 | False Negative : FN | 陰性と予測して(Negative)、予測が外れた(False)データの性質。 |
| 真陰性 | True Negative : TN | 陰性と予測して(Negative)、予測が当たった(True)データの性質。 |
| 正解率 | Accuracy | 全体のうち予測当たった割合。(TP + TN) / (TP + FP + FN + TN) |
| 適合性 | Precision | 陽性と予測したうち実際に陽性だった割合。TP / (TP + FP) |
| 再現率 | Recall | 陽性のデータのうち、陽性と予測した割合。TP / (TP + FN) |
| F値 | F-Value | 適合率と再現率のバランスをとった値。適合率と再現率の調和平均で求める。 |
Pandasのデータフレームにデータを読み込んでおくとMatplotlibで簡単にグラフを描けます。
1 | import os |
[結果]
pandas_bokehというパッケージをインストールしておくと同じように簡単にBokehでグラフを描けます。
まず次のパッケージをインストールしておきます。
1 | !pip install pandas_bokeh |
コードとしてはpandas_bokehをimportしてplot関数をplot_bokeh関数に置き換えるだけとなります。
1 | import os |
[結果]
こんな少ないコード量でこれだけのグラフを描けるのは素晴らしいと思います。
(Google Colaboratoryで動作確認しています。)
chainer-goghを使ってある画像をスタイル画像に合わせて合成してみます。
(結構時間がかかります・・・)
まず、作成する画像を出力するディレクトリを作成しておきます。
1 | !mkdir result |
次に画像合成に必要な関数を定義します。
1 | import chainer |
いよいよ合成処理を実行します。
139行目から147行目で入力画像や各パラメータを設定しています。
1 | import argparse |
| 入力ファイル | 内容 |
|---|---|
![]() |
オリジナルファイル |
![]() |
スタイルファイル(オリジナルファイルをこのファイルっぽく画像合成する) |
| nin_imagenet.caffemodel | 学習済みモデルファイル(ネットに落ちてます) |





合成時間がかかるものの写真をマンガ風にしたり、ゴシック調にしたりとなにかに使えるような気がしないでもありません。。。
(Google Colaboratoryで動作確認しています。)
前回作成した学習モデルを使って手書き数字を判定します。
判定したい画像ファイルを36行目に指定して実行します。
1 | from __future__ import print_function |
200x200の画像ファイルに手書きで数字をかいた画像ファイルを3つ用意して判定しました。
[入力ファイル]
[結果]
1 | 自分の手書き文字を学習したモデルで評価してみるプログラム |
[入力ファイル]
[結果]
1 | 自分の手書き文字を学習したモデルで評価してみるプログラム |
[入力ファイル]
[結果]
1 | 自分の手書き文字を学習したモデルで評価してみるプログラム |
1問不正解となりました。。。最後の手書き数字はどうみても9ですよね。
(Google Colaboratoryで動作確認しています。)
畳み込みニューラル・ネットワーク(CNN)は画像処理に強いディープ・ラーニングとのことです。
CNNを使って手書きの文字を入力し文字を認識させてみます。
1 | from __future__ import print_function |
[実行結果]
1 | GPU: -1 |
各項目の意味は下記の通りです。
| 名称 | 内容 |
|---|---|
| epoch | 学習回数 |
| main/loss | 出力と学習データの誤差 |
| validation/main/loss | 出力とテスト・データの誤差 |
| main/accuracy | 学習データの正答率 |
| validation/main/accuracy | テスト・データの正答率 |
| elapsed_time | 経過時間(秒) |
最終的なテスト・データの正答率(validation/main/accuracy)は99.05%とのかなり優秀な結果となりました。
エポック数と正答率(main/accuracy、validation/main/accuracy)の関係は下記のグラフのようになります。
(validationがテストデータの方を表します。)
エポック数と誤差(validation/main/loss)の関係は下記のグラフのようになります。
(Google Colaboratoryで動作確認しています。)
Pythonではfor文でのループよりもmap関数を使うのがいいコードとのことです。
例えば文字列を数字に変換する場合、for文で書くと次のようになります。
1 | in_data = ["1", "2", "3"] |
map関数で書き換えると下記のようになります。
1 | in_data = ["1", "2", "3"] |
だいぶコンパクトなコードになりいい感じです。
上記は関数のとる引数が1つの場合ですが、引数を複数とる関数の場合はカンマで区切って別のリスト型変数を指定すればいいです。
1 | in_data1 = [1, 2, 3] |
引数のデータサイズ数が違う場合は自動で短い配列の方に合わせられるようです。
1 | in_data1 = [1, 2, 3] |
リスト型データからある条件に合致するデータを抽出します。
filter関数の第一引数は抽出用の関数で、第二引数はデータとなります。
1 | in_data = ['a.txt', 'b.doc', 'c.txt', 'd.jpg'] |
関数を別定義するのはちょっとまどろっこしい感じがしますが、下記のようにlambdaを使うと1行で書けるようになり便利&シンプルです。
1 | in_data = ['a.txt', 'b.doc', 'c.txt', 'd.jpg'] |
配列のすべてのデータに関して順次処理を行います。
ポイントとしては第一引数には引数を2つとる関数を指定します。
Python3からはreduce関数を使うためにはimportを書かないといけないとのことです。
1 | from functools import reduce |
上記は1+2した結果にさらに3を足して6になる・・・ということらしいです。
reduceの第3引数には下記のように初期値を設定することができます。
1 | from functools import reduce |
初期値10に1足して、それに2足して、最後に3を足して16となります。
実務処理で私はこの関数を使ったことがありません。。。ですが、機械学習とかで便利なことがあるのかもしれません・・・タブン。
(Google Colaboratoryで動作確認しています。)