SlideShare a Scribd company logo
リアルタイム手書き数字
認識AIを作って遊ぼう
作業環境・必要機材
• JupyterNotebook(Python環境)
• TensorFlow、Keras、h5py、OpenCV for Pythonのインストール・動作
確認済みを前提
• カメラ付きのマシンまたは外付け(USB)カメラ+マシン
なお、ぼくの環境はWin10ですので、それを前提にお話していきます。
• 甲斐 研造(Ka-k)
名前
• 福岡県産業・科学技術振興財団(ふくおかIST)
• システム開発技術カレッジ事務局
所属
• ゲーム、イラスト
趣味
• 色彩検定1級、UC級
• パーソナルカラー検定モジュール3
特技
自己紹介
大分県のマスコット
めじろん
Qiita ID:Ka-k
今日の内容とほぼ同じものを載せてます
いいねよろしくお願いします
こういうことやってます
主に技術者さん、技術を学びたい人向けに、ハンズオン
or 勉強会形式で実施している少人数制の企画
CONNPASS上でグループ運営しています
URL:https://tech-cafe.connpass.com/
おしながき
作成コンテンツの構成
AIと機械学習と深層学習
Keras
まずは深層学習を体験
OpenCV
画像処理を組み込む
遊んでみよう
はじめに
• 今回は、ディープラーニングの仕組みや原理等については詳し
くお話しません。
• ディープラーニングでモデルを作って、それを使ったコンテン
ツの制作例をお話します。
今日つくるコンテンツ
環境の準備
Anacondaのインストール
https://ai-inter1.com/python-install/
こちらのサイトを参考に、Anaconda3.7をインストールしてください
5分で簡単!AnacondaでPython3をインストール
(Windows/Mac編)
Anacondaを起動
メニューから
Anaconda3
→Anaconda Navigator
を選んで起動する
※起ち上がるまで時間がかかります
Anacondaの準備…仮想環境をつくる
※3.7しか選べない場合は3.7を選択
※環境の名前は任意の半角英数
例)Keras 等
必要なライブラリのインストール
pip install tensorflow==1.14
pip install h5py
pip install keras
pip install opencv-python
必要なライブラリのインストール
Pythonターミナル(黒い画面)上で、以下のコマンドを順番に実行
※プロンプト(こういうやつ→ >_ )が返ってきてから、次のコマンド、という風に実行
Pythonターミナル画面
Jupyter Notebookの準備
①左のメニューからHomeを選択
②Jupyterのアイコン下にある
「Install」をクリック
③「Install」が「Launch」に変
わったらOK
JupyterNotebookを起動させる
「Launch」をクリックすると、
ブラウザが起ち上がる
※既にブラウザが起ち上がってい
る場合は、新しいタブが開く
新規作業用フォルダーを作る
右上の「New」をクリック
「Folder」を選択
フォルダーの名前を変える
「Untitled Forder」という名前でフォルダーが
作られるので、名前左のチェックボックスを
チェック
左上の「Rename」をクリックする
「test」にフォルダー名を変更する
※わかる人はほかの名前でもOK
名前変更後、「test」フォルダをクリックして開く
新規ファイルを作る
右上の「New」メニューから「Python3」を選択
新規ファイルが別タブで立ち上がるので、
「Untitled」をクリック
ファイルの名前を「test」に変更
※初回は使用ブラウザを聞かれます
(次ページ参照)
※はじめてJupyterを起ち上げる場合、ブラウザを聞かれるので、普段使っているブラウザを選択
ちゃんとインストールできてるかの確認
以下のコードを入力する
import keras
import h5py
セルの実行
画面上の「Cell」メニューから、「Run Cells」を選択して実行
実行結果
以下のようになったらOK
・Using TensorFlow backend. という表示が出てくる
・左側の表示がIn[]→In[*]→In[1]のように変遷する
・エラーメッセージが出てこなければOK
・FutureWarning(次ページ)は今回は無視してOK
実行した際に、FutureWarning(以下の画像のようなやつ)が出る場合は、今回はス
ルーしてだいじょうぶです(将来的にその関数なくなるよ、という警告)
Kerasのimportでエラーが出る場合
pip uninstall tensorflow
pip install tensorflow==1.14
Pythonターミナル上で、以下のコマンドを順番に実行
※Kerasで動作するバージョンのTensorFlowをインストールし直す
AIと機械学習と深層学習
コンピュータの得意な事と不得意な事
• 2×3=?と聞いて、「6」と回答させる
• 「猫の画像を見せて」と言われたらあらかじめ用意した「猫の画像」を見せる
コンピュータは、既知の情報に既知の答えを返すのは強い
• デジタルでも手書きでも、「6」という数字は人間から見れば「6」だけど、
コンピュータは手書きの数字を「6」と認識するのが苦手
• 「猫の絵を描いて」と言われても返せない
一方で、未知のデータに対して、答えを返すのは弱い
AIと機械学習と深層学習
AI(人工知能)
マシンラーニング
(機械学習)
ディープラーニン
グ(深層学習)
マシンラーニング(機械学習)はAIに判
断材料を学習させる手法の1つ
ディープラーニング(深層学習)はさら
にそのうちの1ジャンル
コンピュータが学習した結果によって、未知の事象に
対しても応用して対応できるようになる仕組み(汎化と
いいます)
AI(人工知能)
ディープラーニングとは
今回、仕組みの話は省略します
ディープラーニングって何?
機械学習の1ジャンルで、人間の脳の仕組みをコンピュータで再現しようとしたもの
6
入力データ(画像) 出力結果画像認識
学習した結果から推
測を返す
ここで、「6」と返せるようにコンピュータに学ばせる手法がディープラーニング
ディープラーニングって何?
引用元:https://ainow.ai/2019/08/06/174245/
入力されたデータ(画像)から、例えば猫の
「耳の部分」とか「目の部分」のような特
徴を読み取り、そのデータ(画像)が何かを推
測する
小さい〇の1つ1つが、「猫のひげ」
「耳」「目」といった細かい特徴に該当
ディープラーニングのざっくりした理解
試験勉強用の問題集を用意
する
• 学習用データセット
• 正解ラベル
問題集を使って、コン
ピュータに試験勉強させる
• ディープラーニング
大学入試を受けさせる
• 画像判別
• 数値予測
Q.これは誰?
A.ガッキー
試験勉強の仕方は、人間が指示する
(モデル構築)
独学だったり
・独自モデル
有名な塾だったり
・既存モデル引用:https://qiita.com/tokkuman/items/1d83cd84bf2731f11774
ディープラーニングのプロセス
• データ収集
• 学習モデルセット作成
予想問題集を作る
• ディープラーニングモデル構築
勉強の仕方を教える
• ディープラーニング
勉強をさせる
• テストデータで学習精度を評価
実際にテストを受けさせる
ディープラーニングの注意点
• 配列データでないといけない
• 配列の要素の値が0~1じゃないといけない 等
Kerasで扱える形は決まっている
• 例えば画像判別なら最低でも以下は揃えないといけない
• 白黒か、フルカラーか
• 解像度(120px×120pxで統一、みたいな感じ)
学習したデータと同じ形じゃないと判別できない
TensorFlowとKeras
TensorFlow
• 読み方は「テンソルフロー」または「テンサーフロー」。
• Googleが提供している機械学習ライブラリ
• 自分で1からコーディングしなくてもDLモデルを構築できる
• CPUだけじゃなくてGPUも使える
テンソル
出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動検索に移動
テンソル(英: tensor, 独: Tensor)とは、線形的な量または線形的な幾何概念を一般化したもので、基底を選べば、多次元の配列として表現できるようなも
のである。しかし、テンソル自身は、特定の座標系によらないで定まる対象である。個々のテンソルについて、対応する量を記述するのに必要な配列の添
字の組の数は、そのテンソルの階数とよばれる。
例えば、質量や温度などのスカラー量は階数0のテンソルだと理解される。同様にして力や運動量などのベクトル的な量は階数1のテンソルであり、力や加
速度ベクトルの間の異方的な関係などをあらわす線型変換は階数2のテンソルで表される。
物理学や工学においてしばしば「テンソル」と呼ばれているものは、実際には位置や時刻を引数としテンソル量を返す関数である「テンソル場」であるこ
とに注意しなければならない。いずれにせよテンソル場の理解のためにはテンソルそのものの概念の理解が不可欠である。
TensorFlow
機械学習においては、テンソルは入れ物です
ぐらいのざっくりした理解でOKです
Kerasとは
ディープラーニング用のPythonライブラリ
バックエンドでTheano(テアノ)やTensorFlow(テンソルフロー)等の機械
学習ライブラリが動く(公式はTensorFlow推奨)
直感的に記述できる反面、処理そのものはブラックボックス
(裏でTensorFlow等がどう動いているかは可視化されない)
要するに、(主に)TensorFlowを操作するためのフレームワーク
読み方は「ケラス」
Kerasとは
• データ収集
• 学習モデルセット作成
予想問題集を作る
• ディープラーニングモデル構築
勉強の仕方を教える
• ディープラーニング
勉強をさせる
• テストデータで学習精度を評価
実際にテストを受けさせる
主にこの部分をやって
くれるのがTensorFlow
とKeras
まずはKerasを体験
まずはKerasを体験
• Kerasにはディープラーニングを体験するための、いくつかの
データセットが用意されている
• そのうちの1つが「MNIST」と呼ばれる、手書き数字のデータ
セット
• 今回は、この「MNIST」を遊びつくそう、というのがコンセプ
ト
MNISTとは
・0~9の手書き数字のデータセット
・60,000の訓練用データと10,000のテスト用データ
・それに対応したラベルセット(回答集)
・Kerasには内包されているので、importで呼び出せる
ディープラーニング界の「Hello World!」
MNISTの中身
28×28サイズの白黒の手書き数字画像データが
入っている
引用元:https://www.codexa.net/cnn-mnist-keras-beginner/
0~9までの手書き数字と、その手書き数字が何か
の答えのデータ(label)のセット
テスト勉強用のデータセット60,000個と、テスト
用のデータセット10,000個に最初から分けられて
いる
MNISTとは
• データ収集
• 学習モデルセット作成
予想問題集を作る
• ディープラーニングモデル構築
勉強の仕方を教える
• ディープラーニングの実行
勉強をさせる
• テストデータで学習精度を評価
実際にテストを受けさせる
この部分にあたるの
がMNIST
JupyterNotebookの使い方
ここでおさらいをかねて
JupyterNotebookを起動させる
「Launch」をクリックすると、
ブラウザが起ち上がる
※既にブラウザが起ち上がってい
る場合は、新しいタブが開く
新規作業用フォルダーを作る
右上の「New」をクリック
「Folder」を選択
フォルダーの名前を変える
「Untitled Forder」という名前でフォルダーが
作られるので、名前左のチェックボックスを
チェック
左上の「Rename」をクリックする
「ARFukuoka」にフォルダー名を変更する
作業フォルダを移動する
「ARFukuoka」というフォルダ名に変わっているので、それをクリックして移動
配布したファイルをアップロードする
右上の「New」の横の「Upload」をク
リック
3つともドラッグ(またはCtrl+A)で選択し
て、「開く」を選択
右の画面のようになるので、「Upload」
を選択してアップロードを完了させる
MNISTを使って実際にディー
プラーニングをやってみる
既存ファイルの起動
アップロードした「MNIST_test.ipynb」をクリックすると、新しいタブでファイル
が起ち上がる
今回は流れだけ体験
引用元:https://ainow.ai/2019/08/06/174245/
もう一度、ディープラーニングの概念図
こういう流れでモデルを作るのだな、という感じで聞き流してください
今からやるのは、これをつく
る作業です
ディープラーニングの注意点
• 配列データでないといけない
• 配列の要素の値が0~1じゃないといけない 等
Kerasで扱える形は決まっている
• 例えば画像判別なら最低でも以下は揃えないといけない
• 白黒か、フルカラーか
• 解像度(120px×120pxで統一、みたいな感じ)
学習したデータと同じ形じゃないと判別できない
MNISTをKerasで使える形に整える
import numpy as np
from keras.datasets import mnist
from keras.utils import np_utils
#MNISTデータセット呼び出し
(X_train, y_train), (X_test, y_test) = mnist.load_data()
#データの正規化
X_train = np.array(X_train)/255.
X_test = np.array(X_test)/255.
#CNNに入れるために次元を追加
X_train = np.expand_dims(X_train, axis=-1)
X_test = np.expand_dims(X_test, axis=-1)
#ラベルのバイナリ化
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
※初回はMNISTのロードが入ります
画面上の「Cell」メニューから、「Run Cells」を選択して実行
※今いるセル(左側が青か緑になってる)が実行される
セルの実行
実行すると、左上がIn[] → In[*] → In[1] という風に変わっていく
DLモデルの構築
from keras.layers import Input, Dense, Conv2D, MaxPooling2D
from keras.models import Model
from keras.layers.core import Flatten
inputs = Input(shape=(28,28,1)) #入力層
conv1 = Conv2D(16, (3, 3), padding='same', activation='relu')(inputs) #畳込み層1
pool1 = MaxPooling2D((2, 2))(conv1)
conv2 = Conv2D(32, (3, 3), padding='same', activation='relu')(pool1) #畳込み層2
pool2 = MaxPooling2D((2, 2))(conv2)
flat = Flatten()(pool2) #全結合層に渡すため配列を一次元化
dense1 = Dense(784, activation='relu')(flat) #全結合層
predictions = Dense(10, activation='softmax')(dense1) #出力層
model = Model(inputs=inputs, outputs=predictions) #モデルの宣言(入力と出力を指定)
左上のIn[]がIn[2]になればOK
ディープラーニングの実行
#モデルのコンパイル、学習実行
model.compile(optimizer="sgd", loss="categorical_crossentropy", metrics=["accuracy"])
hist = model.fit(X_train, y_train, batch_size=16, verbose=1, epochs=3 validation_split=0.3)
学習結果の評価
#学習結果の評価
score = model.evaluate(X_test, y_test, verbose=1)
print("正解率(acc):", score[1])
今回は正解率(どれだけ合ってたか、で評価)
モデルの保存
#モデルを保存
model.save(“mnist.h5")
これを行うことで、学習済みモデルの使いまわしができるようになる
正解率90%でした、と言われてもイマイチピンとこない
本当にそれだけ正解できてるのか、確かめたい、可視化したい
ここまでの内容は、ディープラーニングのことを調べると結構TIPSが出てくる
改めて、今回作るコンテンツをおさらい
6
入力データ(画像) 出力結果画像認識
学習した結果から推測を
返す
見た画像がなにかを推測する
今体験してもらったのは、この
部分をつくる作業
ディープラーニングの実行と、モデルの保存で、コンピュータが手書
き数字を認識できるAI(脳の部分)が完成した
自分で書いた手書き数字を認識させ、答えさせるためには、画像を
取得する「目の部分」が必要
ディープラーニングの注意点をおさらい
• 例えば画像判別なら最低でも以下は一致していないといけない
• 白黒か、フルカラーか
• 解像度(120px×120px等)
学習したデータと同じ形じゃないと判別できない
MNISTの中身をおさらい
28×28サイズの白黒の手書き数字画像データが
入っている
引用元:https://www.codexa.net/cnn-mnist-keras-beginner/
0~9までの手書き数字と、その手書き数字が何か
の答えのデータ(label)のセット
テスト勉強用のデータセット60,000個と、テスト
用のデータセット10,000個に最初から分けられて
いる
判別させたい画像データ
引用元:https://www.codexa.net/cnn-mnist-keras-beginner/
学習した画像データ
判別させたい画像データを、MNISTに近づけることで画像判別できるようにする!
MNISTの画像としての特徴
• 28×28サイズ
• グレースケール
• 黒バックに白い文字
• 白い部分は少しぼやけてる
• 背景の黒は「完全に黒」(値がゼロ)
• 画像の縦横が同じ正方形、白い部分は完
全に白のところとグレーのところが混在
ポイント
引用元:https://www.codexa.net/cnn-mnist-keras-beginner/
画像加工処理
トリミング・
グレースケール化
2値化 白黒反転 ブラー 28×28に縮小
カメラから映像を取得して、Kerasで認識でき
るように加工するまでのプロセスイメージ
この画像処理をすべて手作業で実装すると非常に大変…
なので、今回はOpenCVという画像処理ライブラリを使って
実装していきます
OpenCV
いきなり動画は大変なので・・・
OpenCVとは
• 画像処理用のライブラリ
• カメラの呼び出しや加工が簡単に行える
• 動画を扱うことができる
必要な画像処理を実装
• ここからはコーディングしていただきます
• いきなり動画は大変なので、まずは静止画を使って練習していき
ます
新しく、「OpenCV_test.ipynb」というファイルを作ります
新規ファイルを作る
右上のメニューから「Python3」を選択
新規ファイルが別タブで立ち上がるので、
「Untitled」をクリック
ファイルの名前を「OpenCV_test」に変更
画像の読み込み準備
ソースコードと同じディレクトリに、配布データの中にある”Lenna.png“を
保存
画像を表示
import cv2 # OpenCVのインポート
image = cv2.imread(“Lenna.png”, 1) # 画像のロード
cv2.imshow(“test”, image) # 画像の表示
cv2.waitKey(0) # 何かしらの操作があるまで待つ
cv2.destroyAllWindows()# ウィンドウを破棄する
cv2.waitKey(1) # Macの人はこの行が必要
※ウィンドウはバックエンドに出てくることがあります
Cell → Run Cells もしくはShift + Enter で実行
コメントは書かなくてOK
(以降も同じ)
読み込んだ画像をグレーに変える
import cv2
image = cv2.imread(“Lenna.png”, 1)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # グレースケールに変換
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray) # 別のウィンドウで表示
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像に四角を描く
import cv2
image = cv2.imread(“Lenna.png”, 1)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.rectangle(image, (50, 50), (100, 100), (255,0,0))
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
(0, 0) 50
50
100
100
OpenCVは左上の座標が原点(0,0)
Cell → Run Cells もしくはShift + Enter で実行
画像に文字を書く
import cv2
image = cv2.imread(“Lenna.png”, 1)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.rectangle(image, (50, 50), (100, 100), (255,0,0))
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255),
1, cv2.LINE_AA) # (窓, 書き込む文字列, 座標, フォント, サイズ, 色, 太さ, 線の種類)
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像を二値化する
#前略
cv2.rectangle(image, (50, 50), (100, 100), (255,0,0))
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1,
(255,255,255), 1, cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像を白黒反転する
#前略
cv2.rectangle(image, (50, 50), (100, 100), (255,0,0))
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1,
cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
th = cv2.bitwise_not(th) # 白黒反転
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像にブラーをかける
#前略
cv2.rectangle(image, (50, 50), (100, 100), (255,0,0))
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1,
cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
th = cv2.bitwise_not(th) # 白黒反転
th = cv2.GaussianBlur(th,(9,9),0) # ブラーをかける
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像をトリミングする
#前略
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1,
cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
th = cv2.bitwise_not(th) # 白黒反転
th = cv2.GaussianBlur(th,(9,9),0) # ブラーをかける
th = th[50:150, 50:150] # トリミング
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
(0, 0) 50
50
150
150
th = th[50:150, 50:150]
トリミングの書き方
他と順番が逆(高さ, 幅)なので注意
画像をトリミングする
#前略
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1,
cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
th = cv2.bitwise_not(th) # 白黒反転
th = cv2.GaussianBlur(th,(9,9),0) # ブラーをかける
th = th[50:150, 50:150] # トリミング
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
画像を縮小する
#前略
cv2.putText(image, “Hello World”, (0,30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1,
cv2.LINE_AA)
_, th = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) # 大津の方法で二値化
th = cv2.bitwise_not(th) # 白黒反転
th = cv2.GaussianBlur(th,(9,9),0) # ブラーをかける
th = th[50:150, 50:150] # トリミング
th = cv2.resize(th, (50,50), cv2.INTER_CUBIC) # 50×50にリサイズ
cv2.imshow(“test”, image)
cv2.imshow(“gray”, gray)
cv2.imshow(“thres”, th)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
Cell → Run Cells もしくはShift + Enter で実行
コードを保存!
MNISTの中身を見てみよう
画像を表示させる方法がわかったので、ちょっと脱線してMNISTの中身
を表示させてみます
新規ファイルを作る
右上のメニューから「Python3」を選択
新規ファイルが別タブで立ち上がるので、
「Untitled」をクリック
ファイルの名前を「MNIST_nakami」に変更
MNISTの中身を見てみよう
from keras.datasets import mnist
import cv2
(X_train, _), (_, _) = mnist.load_data() # MNISTをロード
cv2.imshow(“MNIST”, X_train[100]) # 画像を表示
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人のみ
・MNISTをロード(画像部分だけ)
・画像の高さと幅を取ってくる
・高さと幅を表示
・画像を表示
新規ファイルを作る
右上のメニューから「Python3」を選択
新規ファイルが別タブで立ち上がるので、
「Untitled」をクリック
ファイルの名前を「Camera_test」に変更
カメラにアクセスしてみる
import cv2
cap = cv2.VideoCapture(1) # カメラを指定
ret, frame = cap.read() # カメラから読み込み
cv2.imshow(“frame”, frame) # 表示
cv2.waitKey(0) # 操作されるまで待機
cap.release()
cv2.waitKey(1) # Macの人は追記
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人は追記
OpenCVの動画の考え方
• カメラから画像を取得できたが、静止画だった
• カメラにアクセスした瞬間の画像を表示させているだけ
• 動画として表示させるためには、カメラにアクセスしている間、
表示させた画像を更新し続ける必要がある
カメラからの映像を動画として表示する
import cv2
cap = cv2.VideoCapture(1)
#ここに追記
while(True):
ret, frame = cap.read()
cv2.imshow(“frame”, frame)
cv2.waitKey(0)
cap.release()
cv2.waitKey(1) # Macの人は追記
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人は追記
インデント下げる
ret, frame = cap.read()
cv2.imshow(“frame”, frame)
Pythonでは、whileやif等の中に処理を入れる場合、インデントを下げるというルール
カメラからの映像を動画として表示する
import cv2
cap = cv2.VideoCapture(1)
while(True):
ret, frame = cap.read()
cv2.imshow(“frame”, frame)
cv2.waitKey(0)
if k == ord(“q”) : break
cap.release()
cv2.waitKey(1) # Macの人は追記
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人は追記
ループの終了条件
キーボードの「q」が押されたらループを抜ける
ようにする
k = cv2.waitKey(1) & 0xFF
コードを保存!
リアルタイム認識
以下の動作は、できるようになった
静止画を、MNIST的な見た目にする
カメラからの映像を動画として表示する
これを組み合わせて、リアルタイム動画を加工できるようにする
リアルタイムにカメラ映像を加工する
それを都度Kerasに渡す
判定結果をリアルタイムに画面に表示させる
これで、リアルタイム手書き数字認識の実現ができる!!
コーディング
• カメラから画像を取得するコードを拡張する
import cv2
cap = cv2.VideoCapture(1)
while(True):
ret, frame = cap.read()
cv2.imshow(“frame”, frame)
k = cv2.waitKey(1) & 0xFF
if k == ord(“q”) : break
cap.release()
cv2.waitKey(1) # Macの人は追記
cv2.destroyAllWindows()
cv2.waitKey(1) # Macの人は追記
まずは、カメラの映像を加工する処理を加えていく
トリミング・
グレースケール化
2値化 白黒反転 ブラー 28×28に縮小
カメラの映像の中心に、四角を描く
OpenCVでは、左上の点が原点(0, 0)になり、右下の座標が画像の幅と高さの値になる。
(0, 0)
(800, 600)
800
600
画像の幅と高さを取得して、2で割れば、画像の
中心点がわかる!
400
300
中心が分かれば、そこから「どれだけ離れているか」
を指定すれば、中心に四角が描ける
画像の真ん中を(x,y)として、中心に100×100の四角を描きたい場合、左上の点
(x-50, y-50)と右下の点(x+50, y+50)を指定してやれば、四角を描ける
(400,300)
(400-50, 300-50)
(400+50, 300+50)
import cv2
cap = cv2.VideoCapture(1)
while(True):
ret, frame = cap.read()
#ここにコードを書く
h, w, _ = frame.shape[:3] # 画像の形(高さ,幅,チャンネル数)を取得
h_center = h//2 # y軸の中心点を取得
w_center = w//2 # x軸の中心点を取得
cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71), (255, 0, 0))
cv2.imshow(“frame”, frame)
k = cv2.waitKey(1) & 0xFF
#後略
中心点を求めて142×142サイズの四角を描く
※最終的に、140×140のサイズできれいに切り抜きたいので、四角は一回り大きくしておく
wとhの順番に注意
ターゲットができたので、あ
とはその部分を加工していく
各種画像処理を加えていく
#前略
ret, frame = cap.read()
h, w, _ = frame.shape[:3] # 画像の形(高さ,幅,チャンネル数)を取得
h_center = h//2 # y軸の中心点を取得
w_center = w//2 # x軸の中心点を取得
cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71), (255, 0, 0))
#ここにコードを書く
im = frame[h_center-70:h_center+70, w_center-70:w_center+70] # トリミング
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # グレースケール化
_, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) # 二値化
th = cv2.bitwise_not(th) # 白黒反転
th = cv2.GaussianBlur(th,(9,9),0) # ブラーをかける
th = cv2.resize(th,(28,28), cv2.INTER_CUBIC) # 28×28にリサイズ
cv2.imshow(“frame”, frame)
cv2.imshow(“im”, im )# 途中経過を見るために追記
k = cv2.waitKey(1) & 0xFF
#後略
th
コードを保存!
ディープラーニングさせたモデルを読み込む
• モデルデータを読み込む処理を加える
• 学習させた「mnist.h5」をソースと同じディレクトリに保存
import cv2
#ここに処理を加える
from keras.models import load_model
import numpy as np
model = load_model(“mnist.h5")
cap = cv2.VideoCapture(1)
while(True):
ret, frame = cap.read()
#後略
学習させたデータと比較できるように、カメラの映像データを加工する
import cv2
from keras.models import load_model
import numpy as np
model = load_model(“mnist.h5")
cap = cv2.VideoCapture(1)
while(True):
# 判定用データを格納する配列の初期化
Xt = []
Yt = []
ret, frame = cap.read()
#後略
判定できるように形を変換する・判定する
#前略
im = frame[h_center-70:h_center+70, w_center-70:w_center+70]
im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
_, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU)
th = cv2.bitwise_not(th)
th = cv2.GaussianBlur(th,(9,9),0)
th = cv2.resize(th,(28,28), cv2.INTER_CUBIC)
Xt.append(th)
Xt = np.array(Xt)/255
Xt = np.expand_dims(Xt, axis=-1)
result = model.predict(Xt, batch_size=1) # Xtと学習したデータを比較して判定結果を返す
cv2.imshow(“frame”, frame)
#後略
predictがどういう値を返すか
配布データの中の、predict_test.ipynb
※手元で実行する必要はありません。
MNISTの場合、左上から[0の可能性 1の可能性 2の可能性 …]という風に並んでいる
1番近い可能性だけ返してほしい
resultの中には、順番に0~9に一致する確率がセットされている
該当する数字(0~9)までと、その確率をセットにして、確率が高いものが右端に並
ぶようにソートする
[ [ 3, 0.1 ] [ 0 , 0.2 ] [2, 0.6] [ 1, 0.7 ] ]
[ [ 0 , 0.2 ] [ 1, 0.7 ] [2, 0.6] [ 3, 0.1 ] ]
例)
確率順で並べ替えておけば、表示するときに呼び出しやすくなる!
表示用データの作成・判定結果のソート
#前略
Xt.append(th)
Xt = np.array(Xt)/255
result = model.predict(Xt, batch_size=1)
for i in range(10):
r = round(result[0,i],2) # 小数点以下第2位までで四捨五入
r = “{0:0.2f}”.format(r) # OpenCVで表示できる型に変換
Yt.append([i, r]) # その数字が何かと一致する確率をセットで格納
Yt = sorted(Yt, key=lambda x:(x[1]))# ソート実行
cv2.imshow(“frame”, frame)
#後略
一番一致してる確率が高いものがYt[9]に[数字,一致する確率]という形で収納される
for内のインデントは下げる!
判定結果の上位1番目を画面上に表示
#前略
for i in range(10):
r = round(result[0,i],2)
r = "{0:.2f}".format(r)
Yt.append([i, r])
Yt = sorted(Yt, key=lambda x:(x[1]))
cv2.putText(frame, "1st:"+str(Yt[9]), (10,40), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
(255,255,255), 1, cv2.LINE_AA)
cv2.imshow(“frame”, frame)
#後略
遊んでみよう
判定結果の上位3番目までを画面上に表示
#前略
for i in range(10):
r = round(result[0,i],2)
r = "{0:.2f}".format(r)
Yt.append([i, r])
Yt = sorted(Yt, key=lambda x:(x[1]))
cv2.putText(frame, "1st:"+str(Yt[9]), (10,40), cv2.FONT_HERSHEY_SIMPLEX, 0.8,
(255,255,255), 1, cv2.LINE_AA)
cv2.putText(frame, "2nd:"+str(Yt[8]), (220,40), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(255,255,255), 1, cv2.LINE_AA)
cv2.putText(frame, "3rd:"+str(Yt[7]), (360,40), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
(255,255,255), 1, cv2.LINE_AA)
cv2.imshow(“frame”, frame)
#後略

More Related Content

What's hot (20)

PDF
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
 
PPTX
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
Fujio Kojima
 
PDF
Deep Learning を実装する
Shuhei Iitsuka
 
PPTX
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
 
PDF
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
PDF
高位合成でDeep learning
Mori Labo.
 
PDF
TensorFlowの使い方(in Japanese)
Toshihiko Yamakami
 
PPTX
LUT-Network Revision2
ryuz88
 
PPTX
機械学習入門
Fujio Kojima
 
PDF
実装ディープラーニング
Yurie Oka
 
PDF
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Yasutomo Kawanishi
 
PDF
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
 
PDF
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Yasutomo Kawanishi
 
PDF
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
 
PDF
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
UnityTechnologiesJapan002
 
PDF
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
Hiroki Nakahara
 
PDF
NumPy闇入門
Ryosuke Okuta
 
PPTX
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
 
PDF
mxnetで頑張る深層学習
Takashi Kitano
 
PDF
Deep Learningの基礎と応用
Seiya Tokui
 
「ゼロから作るDeep learning」の畳み込みニューラルネットワークのハードウェア化
marsee101
 
C# でニューラルネットワークをスクラッチで書いて機械学習の原理を理解しよう
Fujio Kojima
 
Deep Learning を実装する
Shuhei Iitsuka
 
LUT-Network ~本物のリアルタイムコンピューティングを目指して~
ryuz88
 
Chainerの使い方と自然言語処理への応用
Seiya Tokui
 
高位合成でDeep learning
Mori Labo.
 
TensorFlowの使い方(in Japanese)
Toshihiko Yamakami
 
LUT-Network Revision2
ryuz88
 
機械学習入門
Fujio Kojima
 
実装ディープラーニング
Yurie Oka
 
Pythonによる機械学習入門 ~SVMからDeep Learningまで~
Yasutomo Kawanishi
 
Chainerチュートリアル -v1.5向け- ViEW2015
Ryosuke Okuta
 
Pythonによる機械学習入門〜基礎からDeep Learningまで〜
Yasutomo Kawanishi
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
Ryo Sakamoto
 
【Unite Tokyo 2019】たのしいDOTS〜初級から上級まで〜
UnityTechnologiesJapan002
 
2値化CNN on FPGAでGPUとガチンコバトル(公開版)
Hiroki Nakahara
 
NumPy闇入門
Ryosuke Okuta
 
LUT-Network ~Edge環境でリアルタイムAIの可能性を探る~
ryuz88
 
mxnetで頑張る深層学習
Takashi Kitano
 
Deep Learningの基礎と応用
Seiya Tokui
 

Similar to Enjoy handwritten digits recognition AI !! (20)

PDF
Python初心者がKerasで画像判別をやってみた
KAIKenzo
 
PPTX
ディープラーニングハンズオン・レクチャー資料
Yoshihiro Ochi
 
PDF
Raspberry Pi Deep Learning Hand-on
Yoshihiro Ochi
 
PDF
MANABIYA Machine Learning Hands-On
陽平 山口
 
PPTX
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
fukuoka.ex
 
PPTX
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
fukuoka.ex
 
PPTX
「機械学習とは?」から始める Deep learning実践入門
Hideto Masuoka
 
PDF
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
Yasuyuki Sugai
 
PDF
ハンズオン セッション 2: DIGITS による物体検出入門
NVIDIA Japan
 
PDF
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
aitc_jp
 
PPTX
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
Daiyu Hatakeyama
 
PDF
DIGITSによるディープラーニング画像分類
NVIDIA Japan
 
PDF
JAWS DAYS 2017 lunch session
陽平 山口
 
PDF
TensorflowとKerasによる深層学習のプログラム実装実践講座
Ruo Ando
 
PDF
NGK2022S
陽平 山口
 
PDF
GCPUG Sapporo vol.2 ML Night
陽平 山口
 
PPTX
Lecuture on Deep Learning API
Naoki Watanabe
 
PPTX
機械学習 / Deep Learning 大全 (6) Library編
Daiyu Hatakeyama
 
PPTX
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
fukuoka.ex
 
PDF
iOS_Consortium_20170120
陽平 山口
 
Python初心者がKerasで画像判別をやってみた
KAIKenzo
 
ディープラーニングハンズオン・レクチャー資料
Yoshihiro Ochi
 
Raspberry Pi Deep Learning Hand-on
Yoshihiro Ochi
 
MANABIYA Machine Learning Hands-On
陽平 山口
 
AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」【旧版】※新版あります
fukuoka.ex
 
【macOSにも対応】AI入門「第3回:数学が苦手でも作って使えるKerasディープラーニング」
fukuoka.ex
 
「機械学習とは?」から始める Deep learning実践入門
Hideto Masuoka
 
第3回機械学習勉強会「色々なNNフレームワークを動かしてみよう」-Keras編-
Yasuyuki Sugai
 
ハンズオン セッション 2: DIGITS による物体検出入門
NVIDIA Japan
 
2018年01月27日 Keras/TesorFlowによるディープラーニング事始め
aitc_jp
 
機械学習 / Deep Learning 大全 (2) Deep Learning 基礎編
Daiyu Hatakeyama
 
DIGITSによるディープラーニング画像分類
NVIDIA Japan
 
JAWS DAYS 2017 lunch session
陽平 山口
 
TensorflowとKerasによる深層学習のプログラム実装実践講座
Ruo Ando
 
NGK2022S
陽平 山口
 
GCPUG Sapporo vol.2 ML Night
陽平 山口
 
Lecuture on Deep Learning API
Naoki Watanabe
 
機械学習 / Deep Learning 大全 (6) Library編
Daiyu Hatakeyama
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
fukuoka.ex
 
iOS_Consortium_20170120
陽平 山口
 
Ad

Recently uploaded (9)

PDF
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
PDF
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
PDF
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
PDF
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
PPTX
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
VMUG Japan book vsan 20250515 CPU/Memory vSAN
Kazuhiro Sota
 
LoRaWAN ウェザーステーションキット v3 -WSC3-L 日本語ユーザーマニュアル
CRI Japan, Inc.
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
第三世代 ウェザーステーションキット v3 ー WSC3-L 日本語カタログ
CRI Japan, Inc.
 
20250726_Devinで変えるエンプラシステム開発の未来
Masaki Yamakawa
 
2025_7_25_吉祥寺_設計ナイト_ADR運用におけるデータ利活用の考え方.pptx
ssuserfcafd1
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
Ad

Enjoy handwritten digits recognition AI !!