この記事では、ディープラーニングの入門チュートリアルとしてよく登場するMNIST(手書き数字画像認識)をWEBアプリケーション化する手順について説明していきます。はじめに「お前だれよ?」という方が99.999%だと思いますので、簡単に自己紹介します。Python、Djangoは始めて1年未満(もうちょっとで1年)アプリ開発は初心者で、2018年になり趣味でプログラミングを始めた。2018年にpyconJPを初めて見に行く。AIにも興味を持ち始め、此方も独学で勉強を始めて先月ディープラーニングのG検定を取得つい最近akiyokoさんの輪読会に初めて参加。最近Django入門者向けのチュートリアル記事を作ってます。(一部公開済み)2018年は私にとっては「Python,Djangoとの出会い」の年でした。プログラミングという世界に踏み出した年でもありました。Calendarを覗いたところ12/13分が空いていたので、勢いで参加ボタンをポチってしまいました・・・https://twitter.com/shinya_hd/status/1073828276135649280あまり時間もなかったのですが、今できることから何が良いか考えた結果「AI+Django」で比較的簡単にできそうな題材を選んでみました。入門書やセミナーなどでは必ずと言っていいほどMNISTの手書き数字画像認識がでてきてこんな感じで進んでいきます。データセットを以下のような感じで読み込む。datasets.load_digits()何かよくわかんないけど、これ実行しておけば画像データがロードされて、訓練データとテストデータに分けてくれる模様(なんか便利!)続いて学習モデルを定義して、モデルをコンパイルして、model.fit流すと学習が進んで、正解率とかLOSSの確率がでてきて、以下のようにグラフ化すると精度がだんだん上がって95%でいい感じになっていることが確認できた!チュートリアルが終わった後、現実のケースに合わせて適用しようと思った場合に、「あれ、入力データってどうやって取り込むの?、ラベル付けってどこでやってたんだっけ?」みたいになるわけです。大体MNISTを終わって次にCNNとかGANがでてきて、自然言語が出てくるともうおなか一杯になってくるわけです。(私も例外ではなく・・)この時点でモチベーションが保てずに挫折してしまう人が多いんじゃないかなと思います。2018年になってDjangoに手を出し始めていたので、MNISTをWEBアプリ化してとにかく見える形にしたらよいんじゃないかと考えました。「見える形にしてみる」という発想はビジネスにおいても非常に重要だと思います。DX(デジタルインフォーメーション)とデザイン思考まとめ2018.12.15こんにちわ。最近、職場では新規サービス創出が命題となっており、様々な新しい取り組みにチャレンジし始めています。0に近い独学なので、こちらからもっといいやり方やアドバイスを頂けると助かります!環境についてこの記事の内容は、以下の環境で構築しました。Chrome※開発はローカル環境で開発サーバを起動して動作確認しています。※python,Django,AIの専門家ではないのでコーディングがきれいじゃないとか、変なバグあるかもしれません。WEBアプリ化するまでの全体の流れ兎にも角にも、初学者にとってはまずはイメージするのが大事だと思ったので、今回作成した画像認識アプリの簡単な解説動画を作りましたのでご覧ください。(突貫で作った動画なので見ずらい点はご了承ください・・)https://sinyblog.com/wp/wp-content/uploads/2018/12/ceae2083aeca6528b543a9e1c366d242.mp4こんな感じで自分が勉強している成果を見える形にできると、モチベーションが上がって挫折しづらくなると思うんですよね。WEBアプリ化までの全体の流れを説明します。1MNISTデータセットのダウンロードとタグ付け準備2必要なモジュールのインストール(pipコマンド)※そもそもPython環境がない方は以下の記事等を参考に導入してください。管理人のsinyです。この記事では、Python初心者向けにAnacondaを利用したPython開発環境の構築方法について丁寧に説明します。ユーザ作成、ぐらいまで。※学習結果をファイルに保存しておく。※4で作成したモデルを利用する。6URLパターン(urls.py)の設定7テンプレートの作成(htmlファイル)やることは以上です。今回のアプリの動作、仕様は以下の通りです。◆数字(0~9)を手書きしたjpgファイル画像をアップロード後に「判定」ボタンを押すと自動判定した結果を画像データ付きで一覧表示します。「白」で作成する必要がある。※チュートリアル簡易用の学習モデルのため、上記以外のルールで作成した画像は正しく判定されません。入力画像サイズは28*28ピクセルにすると判定確率が高くなります。※任意の画像サイズデータを入力してもエラーにはならず、自動で28x28にリサイズした後学習モデルで判定されます。画像ファイルは複数同時に選択してアップロードすることができます。あと、普通のMNISTチュートリアルだと28x28サイズ固定ですが、この記事では学習時にちょっとだけ違うサイズの画像を与えることで、多少サイズが違う入力画像を与えた場合もそれなりに言い当ててくれる学習モデルを目指して作っていきたいと思います。DEMOアプリについて実際に動かせるデモアプリ(Djangoプロジェクト)を作りました。https://github.com/sinjorjob/django-mnist※Windowsのみ動作確認済み。※ReadMeの手順に従ってセットアップしてください。※アプリを動作させるところまでは簡単に実装できるようになっています。実際にAIアプリを実装していくときにこんなことをしなくてはいけないんだろうな~ということをイメージしながら作ってみたので、最初からかなり面倒くさいことしてます!(実務でAIやったことないので細かい部分はわかりませんが・・)では1つずつ説明していきます。実際にデータセットのファイルをダウンロードして準備します。search」からダウンロードします。ALLの順でデータセットファイルをダウンロードします。ダウンロードしたmnistasjpg.zipを解凍して手書き数字画像データをフォルダに配置していきます。解凍すると以下の2つのフォルダ内にデータファイル(JPG)が入っています。trainingSampleフォルダ(600ファイル)testSample(350ファイル)今回は、以下のような感じでtrainingSampleフォルダ内のファイルは訓練用フォルダに、testSampleフォルダ内のファイルは検証用フォルダへ画像に描かれている数字毎にフォルダ(0~9)を作成してデータを格納していきます。検証用データを入れる以下のような感じです。なんでこんな面倒くさいことやるのか?というと、きっと実務でも最初にこうしたデータセットの準備、ラベル付けといった面倒くさくて泥臭い作業があって大変なんだろうなと思ったのでやってみました。データの前処理を行うツールなどもあるようですが、結局は人手でこうしたラベル付け等の作業を行う必要があるのかなと思います。今回は1データファイルずつ目視で数字を確認して数字毎のフォルダに振り分けしました。(これが一番大変だったかもしれない・・)あと、目で見てもよくわからない画像がいくつかあったのでそれらは除外しちゃいました。(実はこういう作業も結構大事だったりするのかな?)MNISTのデータは28x28ピクセルと固定サイズで決め打ちされているので、普通に学習させるとそれ以外の画像サイズを入力に与えると、ことごとく誤判定になるのですが、それじゃちょっとつまらない!ということで、多少サイズが違う入力画像を与えた場合もそれなりに言い当ててくれる学習モデルになることを狙って、28x28以外のサイズの0~9の数字を書いた自作の画像を20枚ほど作成して訓練データに紛れ込ませてみました。※ちなみに「背景が黒」という部分は前提条件からはずしてないため、入力データの背景色は真っ黒にして作成します。目視でフォルダに振り分けたデータは最終的に以下のようになりました。30ファイルの合計数は、後々のことを考えて一の位が0になる数に微調整しました。こんな感じで、訓練(train)、検証用(test)フォルダ毎&数字(0~9)毎にフォルダを掘って画像を分けておくと、あとでKeras君がフォルダ名を見て勝手にデータファイルに対してラベル付けを行ってくれます。以上で、データの下準備は完了です。2必要なモジュールのインストール(pipコマンド)ここは簡単で、以下のモジュールをpipでインストールするだけです。tensorflow3Django初期設定ここも簡単なので、実行コマンドだけ記載しておきます。runserverでWEBにアクセスできることを確認。・settings.pyのINSTALLED_APPSにbootstrapform、mnistを追加しておく。createsuperuser)※ちなみに今回モデル(models.py)の設定は不要です。以上でDjango初期設定は完了です。4学習モデルの定義と学習の実行Kerasを使ってモデリングと学習を行います。notebookでコーディングと学習を実施しましたが、数分で学習できましたのでGPUは不要です。こんな感じ(コード汚いですが・・・)で訓練と検証用フォルダ内のデータ数を確認しておきます。訓練用が610ファイル、検証用が340ファイルあります。30続いて学習モデルを定義します。今回は、以下のような基本的なCNNモデルを定義します。数字の0~9なのでDenseは10です。activation='softmax'))補足ですが、入力データの形状はグレースケールの場合は、(28x28x1)、カラーの場合は(28x28x3)になります。上記の入力形状が何言ってるかよくわからないという方は、以下の記事を参考にスカラー、ベクトル、テンソルについてまず理解することをお勧めします。【ディープラーニング入門】4つの例で学ぶスカラ、ベクトル、テンソル2018.12.18こんにちは。先日、G検定に合格したのですが、改めて基礎知識について復習をしていてスカラー、ベクトル、テンソルの考え方がややこしいなというのがあったので改めて整理して...さて、先ほど定義したCNNモデルのmodel.summary()の結果はこんな感じです。0つづいて、モデルをコンパイルします。多クラス単一ラベル分類なので損失関数にcategorical_crossentropy(最終層はsoftmax)を利用します。optimizersmodel.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['acc'])つづいて、Kerasの「ImageDataGenerator」という機能を使って、データの前処理やラベル付けをしていきます。ImageDataGeneratorでは以下のようなこと実施してくれます。以下のディレクトリからデータを読み込んで28x28にリサイズして形状が(20,28,28,1)のバッチデータと形状が(20,10)の10クラスのラベルを生成してくれます。C:\django\ML\mnist\data\testC:\django\ML\mnist\data\trainImageDataGeneratorを使うとフォルダ名をデータのラベル名として自動で割り当ててくれます。#以下のジェネレータは28x28のグレースケール画像からならるバッチ((20,28,28,1)と10クラスのラベル(形状は(20,10)を生成する。#バッチごとに10のサンプルが存在する。#グレースケール指定(今回はグレースケール画像なので。categorical_crossentropyをつかうので多クラス分類が必要。train_datagenと同じことをしているだけ。10#以下のジェネレータは28x28のグレースケール画像からならるバッチ((20,28,28,1)と10クラスのラベル(形状は(20,10)を生成する。#バッチごとに10のサンプルが存在する。28),#グレースケール指定(今回はグレースケール画像なので。categorical_crossentropyをつかうので多クラス分類が必要。train_datagenと同じことをしているだけ。・どんなサイズのデータが来ても28x28ピクセル固定にしたい。・画像はグレースケール指定とする。→color_mode='grayscale'を指定(カラーなら'rgb'を指定する)・categorical_crossentropyをつかうので多クラス分類が必要。バッチサイズ(610/10)が割り切れるようにしておく。