手書き数字の画像をCNNで機械学習するのに必要な画像とPythonファイル†
- /home/kouzou/Morii25/hikitugi 内にある画像とPythonファイルについて
5/14†
- 新たに作成したPythonファイルについて説明していく
- 1, Gazou-Kakou.py … 判別させたい画像に点や直線, 円や多角形等の図形を加えて画像処理させるためのものであり、わざと数字を見せづらくすることで正確に読み取ることができるのか確かめるためのもの。点の数や多角形の頂点を増減したい場合は一括処理関数の "処理を適用:ランダムで描画" の部分を書き換える必要がある。ちなみにこのスクリプトで画像加工すると以下のようになる
ー画像加工→

ー画像加工→

ー画像加工→

- 1-1, Gazou-Kakou-Sen_only.py … 上記のGazou-Kakou.pyから "線だけ" を加えた画像処理を行うスクリプトのこと。
- 1-2, Gazou-Kakou-Ten_only.py … 上記のGazou-Kakou.pyから "点だけ" を加えた画像処理を行うスクリプトのこと。
- 1-3, Gazou-Kakou-Zukei_only.py … 上記のGazou-Kakou.pyから "図形だけ" を加えた画像処理を行うスクリプトのこと。
- ※1-1~3 はGazou-Kakou.py内において "処理を適用:ランダムで描画" の部分からでも "#"の有無で自身の好きなようにカスタムできる。
- 2, Suuji-Gazou-Seisei.py … 0~9までの数字を自動で生成するスクリプト。一応手書き風文字フォント(KGPrimaryPenmanship.ttf)を使用しているが、似通った文字が複数枚生成されてしまうため使用はあまりおすすめしない。もし自身で画像をペイントツール等を使用して作成するのが面倒だと感じる場合は後述する "Mnist-tyuusyutsu.py" の使用を勧める。
- 3, Mnist-tyuusyutsu.py … Mnist上にある画像データを抽出して保存するスクリプトで、保存する枚数は任意で決められる。("画像1クラスあたりの保存枚数"で変更可能)
- 4, Hanbetsu-Full_auto.py … 判別画像の処理からそれらの判別及び数字ごとの正答率をテキストファイルに保存するまでの流れを一括で行えるようにしたスクリプトで、Mnist.pyを実行した後にこれを使用することになる。判別画像の名前は ○_1.png または ○_1.jpg とつけておく必要がある。丸には画像の数字を入力する必要があり、後ろの数字には何枚目なのかを記すこと。例) 9_8.png … "9"と書かれた画像の"8"番目
- 5, Mnist-Hanbetsu-Full_auto.py … 上記の Hanbetsu-Full_auto.py にMnistの機械学習を付け加えたスクリプトで基本的に指定されたフォルダ(デフォでは "digits_dataset" になっている)を作成しあとはこのスクリプトを実行するだけで正答率をテキストファイルに保存するまでを自動的に行ってくれる。またMnistを用いた機械学習を行うごとに結果がh5ファイルとして保存されると思うが、ファイルを消さずに上書きという形で学習させるとかえって正答率が下ってしまう過学習という状況が発生しかねないので常に新しいh5ファイルが作成されるようにした。(それまでのファイルは削除されてしまうので注意)
- 6, Mnist-Hanbetsu-Full_auto2.py … 5の Mnist-Hanbetsu-Full_auto.py ではデータ(Mnist)を画像処理することなく(下図左側3枚)機械学習させていたが、こちらではMnistのデータを下図右側3枚(イメージ 実際に学習する画像とは異なる)のように画像処理を行ってから機械学習させた。こうすることで識別率を上げることができる。

5/7†
- 1~9 のjpg画像 … CNNで手書き数字を機械学習させたものに数字を判別させるためのもの。ただし判別精度は良くない。
- mnist.py … mnistという6万枚の手書き数字データ(学習用が5万枚, 判別用が1万枚)を学習してそれがどのくらいの精度で正解できたかをMATE端末上で表示し、その結果を h5 ファイルとして保存するものである。
- mnist-hosei.py … mnist.pyとの違いは画像が傾いていたり文字が歪んでいたりしている状態で機械学習させる事だけで、その他は mnist.py と同じ。
- Hukusuu-hanbetsu.py … mnist.py または mnist-hosei.py を実行した後に用いるファイルで、複数枚の画像を一度に判別するプログラムコードが書かれている。あらかじめ保存しておいた h5 ファイルの名前や複数枚の画像を保存したファイル名が一致しているか確認しておく必要がある。
- Suuji-kakuritsu.py … mnist.py または mnist-hosei.py を実行した後に用いるファイルで、ある1枚に書かれた数字を機械が何と判別したか またその判別結果にはどのくらいの精度があるかをMATE端末上で表示されるものである。あらかじめ保存しておいた h5 ファイルの名前や判別したい画像のファイル名がプログラムコードと一致しているか確認しておく必要がある。
- kani.py … mnist.py または mnist-hosei.py を実行した後に用いるファイルで、判別した画像に何の数字(0 ~ 9)が描かれているかに加えてどのくらいの信頼度があるかをグラフ化した画像が表示されるものである。あらかじめ保存しておいた h5 ファイルの名前や判別したい画像のファイル名がプログラムコードと一致しているか確認しておく必要がある。
- suuji-hanbetsu.py … mnist.py または mnist-hosei.py を実行した後に用いるファイルで、ある1枚に書かれた数字を機械が何と判別したかを確認する。あらかじめ保存しておいた h5 ファイルの名前や判別したい画像のファイル名がプログラムコードと一致しているか確認しておく必要がある。
錆の写真からSVMで機械学習するまでの流れ†
この一連の流れは同じファイル内に保存するのが望ましい
- (1) RGBrironti.py について (コマンド)
- 1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi)
- 2, py ファイルを呼び出す (python RGByomitori.py)
- 3, フォルダーのパス入力が求められるので錆の写真があるフォルダーを入力する → Enterキー (一例: /home/kouzou/sato24/gr/data/1_ppm)
- 4, 保存するファイル名を入力する → Enterキー (一例: /home/kouzou/sato24/gr/data/1_ppm/RGBkekka.csv ) この場合錆の写真があるフォルダーに "クリックした座標" , "RGB値"の結果がcsv形式で保存される。
- 5, その後ウィンドウのどこかしらに錆の画像が表示されるので、カラースケールの "シアン" , "イエロー" , "マゼンタ" の部分を順番にクリックする。そうするとMATE端末上に [ 画像: ファイル名(.ppm) | クリック位置: (x座標, y座標), RGB値: (R(0~255), G(0~255), B(0~255),) ]
と表示される。
- 6, ファイル内にある写真すべての "シアン" , "イエロー" , "マゼンタ" の部分を順番にクリックする。すべての写真で "シアン" , "イエロー" , "マゼンタ" の部分をクリックすると下のようになり、これと同じような感じでcsvファイルにも保存されている。

- 補足:保存するファイル名を以前作成したファイル名と同じにすると新たに上書きされるのではなく、既存のデータに加えられる形で保存される。
- (2) matrix.py について (コマンド)
- 1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi) ←必要であれば
- 2, py ファイルを呼び出す (python matrix.py) → Enterキー
- 3, 結果を書き込むファイルを入力してください と表示されるので入力する。ここでは保存する場所に加えて結果ファイルの名前も”名前 + .txt ”と入力する必要がある。(例: kekka.txt) → Enterキー
- 4, シアン・イエロー・マゼンタの各RGB値を入力してください と表示されるので入力する。(0~255 の間) → 入力する値はどれか1枚の写真における"シアン" , "イエロー" , "マゼンタ" のRGB値
- (3) henkan.py について (コマンド)
- 1, MATE端末を開き py ファイルのある hikitugi に移動する (cd hikitugi) ←必要であれば
- 2, py ファイルを呼び出す (python henkan.py)
- 3, 変換行列ファイルのパスを入力してください と表示されるので(2)で作成したtxtファイルを入力する(一例: kekka.txt ) → Enterキー
- 4, 補正したいPPM画像のパスを入力してください と表示されるのでppm画像のパス入力する。(例: rating○_○.ppm) → Enterキー
- 基本的に/home/kouzou/sato24/gr/data内にある ○_ppm や hg_○_ppm と書かれたファイルから選択するはず (例: /home/kouzou/sato24/gr/data/1_ppm/rating1_1.ppm)
- 5, 補正後の画像を保存するパスを入力してください と表示されるので変換後のppm画像をどのパスに保存したいか入力する (例: henkan-after.ppm と入力すると henkan-after というppmファイルが保存される) → Enterキー
- (4) グレースケール化とedge.py について(コマンド)
- 1, $ convert rating○_○.ppm -colorspace Gray gray.pgm → gimp と打って Enterキー
- 2, py ファイルを呼び出す (python edge.py)
- 3, 入力ディレクトリパスの入力が求められる。なお edge.py はpgmファイルのみ対応しているのでpgmファイルで保存されていいる写真のあるフォルダー名を入力する → Enterキー (一例: edge)
- 4, 出力ディレクトリパスの入力が求められる。ここでは3で入力したファイルをエッジ処理したものをどこに保存するかを設定する。ここでは一例として(edge_150)と入力する。
- 3のedgeはエッジ処理したものを入れておくファイル名であり、もしファイル名を入れずにEnterキーを押してしまうとこの場合hikitugiのフォルダー内に保存されてしまうので注意すること。
- 5, エッジ処理の閾値1, 2を入力してくださいと表示される
- エッジ処理の閾値1は "Cannyエッジ検出の「低い方のしきい値」" のことである。画像の中で「ここはエッジ」と判断するための数値で、50〜300くらい(50刻み)に設定しておくとよい。
- エッジ処理の閾値2は "Cannyエッジ検出の「高い方のしきい値」" であり、100〜400くらい に設定しておくとよい。
- 6, 閾値1, 2 を入力して Enterキー を押してしばらくするとhikitugi内にedge_150というフォルダーが作成される。そのフォルダーを開いて錆の写真が左下 (edge) から右下 (edge_150) のような感じに変換されていれば成功。
→ 
- (5) svm.py について (コマンド)
- 1, py ファイルを呼び出す前に svm.py ファイル(編集画面)を開く
- 2, ファイルを開いたら13行目に書いてある data_dir = 〜 の部分を確認する。data_dir = ( "〜" ) の部分を " edge " に変更してclass_namesも定義する必要があり、そうしないとエラーがでる。今回はclass_namesを作成・定義してこなかったので佐藤さんが作成した 150_300_edge を機械学習= svm させる。
- ① 150_300_edgeファイルをhikitugiファイル内にコピーする。
- ② 編集画面の13行目: data_dir = "150_300_edge" と編集する。
- ③ 編集画面の15行目: class_names = ["mk1_pgm", "mk2_pgm", "mk3_pgm", "mk4_pgm"] になっているのを確認する。
- 3, 編集が完了したら python svm.py と入力 → Enterキー
GIMPでの画像の切り取り方(200×200ピクセルの場合)†
- 1, GIMPで画像を開き上のツールバーから 画像 → ガイド → 新規ガイド と進む
- 2, 新規ガイドを選択すると方向と位置を決めることができ、初めは方向を"水平"として位置を"200"に設定する。そうすると画像に青の破線が表示されたと思う。再びツールバーから 画像 → ガイド → 新規ガイド と進み、方向を"水平"位置を"400"に設定する。今度は前に引かれた青の破線よりも200ピクセル分右側に破線が引かれた。これを "600" , "800" , ...と繰り返していく
- 3, 水平方向に200ピクセル間隔で線を引けたら次に垂直方向に200ピクセル間隔で線を引いていく。ツールーバーから 画像 → ガイド → 新規ガイド と進み、方向を"垂直" 位置を"200"とする。水平の時と同様に位置を200ずつ変えながら線を引いていくと碁盤状に線が引けたのではないかと思う。
- 4, そうしたらツールバーから 画像 → ガイドを使用して切り分け と選択すると200×200ピクセルで分割した画像が出来上がる。