Python入門トップページ


手書き数字を認識するAIを作ってみよう : 目次

  1. 画像データの準備と確認
  2. 画像データを読み込んでみよう
  3. 画像データの一覧を読み込んでみよう
  4. 学習データとテストデータを準備する
  5. 保存したデータを開いてみる
  6. モデルを作る
  7. 学習(トレーニング)させてみよう
  8. モデルを評価しよう
  9. 学習データで認識させてみよう(1)
  10. 学習データで認識させてみよう(2)
  11. 学習データで認識させてみよう(3)
  12. テストデータで認識させてみよう
  13. モデルと重みパラメータを保存しよう
  14. 学習済みモデルをロードしよう
  15. 学習済みモデルをロードして,認識してみよう

画像データを読み込んでみよう

モジュールのインポート

Python で画像処理をするためのモジュールは Pillow (PIL)である.この Pillow のドキュメントは https://pillow.readthedocs.io/en/stable/ にある. さらに,numpy と os をインポートする.

モジュールを読み込む (01-readfile.py(抜粋))
from PIL import Image
import numpy as np
import os

目次に戻る

画像データの読み込み

モジュールの読み込みができれば,ファイルを開いて numpy の配列に変換して表示してみよう.なお,Windows 環境では,フォルダの区切りが円マーク(またはバックスラッシュ)で,Mac や Linux で '/' になる.この違いを吸収するために os.path.sep.join( ) を利用している.詳細はここを参照してください.

画像データを読み込み,配列として表示 (01-readfile.py)
from PIL import Image
import numpy as np
import os

filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
data = np.asarray(img)
print(data)
[[[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [ 34  24  21 255]
  [ 34  24  21 255]
  [ 34  24  21 255]
  [ 34  24  21 255]
  [ 34  24  21 255]
  [ 34  24  21 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]

  ...(中略)...

 [[255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]
  [255 255 255 255]]]

上記の出力はピクセル(画素)ごとの RGBA データである.ここで A は透明度を意味している.つまり,出力の最初の15行は画像データの1行目の各ピクセルの RGBA 値であり,出力の最後の15行は画像データの最後の1行の RGBA 値である.画像データの最初の1行は5番目のピクセルから10番目のピクセルが RGBA = [34, 24, 21, 255] の色(黒に近い色)で,それ以外のピクセルは RGBA =[255, 255, 255, 255] の白色であることを意味している.さらに,最後の15行はすべてのピクセルが白である.なお,Python での配列の添字(インデックス)は0番目からスタートすることにも注意しておこう.

tegaki-0-01-rgba

目次に戻る

画像データの変換

画像データを RGBA 形式で読み込むことができたので,データを様々な形式変換してみよう.

目次に戻る

RGBデータに変換

まず,RGBA データを RGB に変換する.つまり,透明度の指定を削除する変換である.これには img.convert("RGB") を実行するとよい.

画像データをRGBに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os

filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("RGB")   ## RGBカラーに変換
data = np.asarray(img)
print(data)
[[[255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [ 34  24  21]
  [ 34  24  21]
  [ 34  24  21]
  [ 34  24  21]
  [ 34  24  21]
  [ 34  24  21]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]

  ...(中略)...

 [[255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]
  [255 255 255]]]

目次に戻る

CMYKデータに変換

次に,CMYK に変換する.これには img.convert("CMYK") を実行するとよい.

画像データをCMYKに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os

filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("CMYK")   ## CMYKカラーに変換
data = np.asarray(img)
print(data)
[[[  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [221 231 234   0]
  [221 231 234   0]
  [221 231 234   0]
  [221 231 234   0]
  [221 231 234   0]
  [221 231 234   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]]

  ...(中略)...

 [[  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]
  [  0   0   0   0]]]

目次に戻る

グレースケールに変換

次に,グレースケールに変換する.これには img.convert("L") を実行するとよい.実行結果を確認すると,0が黒,255が白となるようなグレースケールになっていることがわかる.

画像データをグレースケールに変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os

filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("L")   ## グレースケールに変換
data = np.asarray(img)
print(data)
[[255 255 255 255  26  26  26  26  26  26 255 255 255 255 255]
 [255 255 255  26  26  26  26  26  26  26  26 255 255 255 255]
 [255 255  26  26  26  26 255 255  26  26  26  26 255 255 255]
 [255 255  26  26  26 255 255 255 255  26  26  26  26 255 255]
 [255 255  26  26 255 255 255 255 255 255  26  26  26 255 255]
 [255 255  26  26 255 255 255 255 255 255 255  26  26  26 255]
 [255 255  26  26 255 255 255 255 255 255 255  26  26  26 255]
 [255 255  26  26  26 255 255 255 255 255 255 255  26  26 255]
 [255 255  26  26  26 255 255 255 255 255 255 255  26  26 255]
 [255 255 255  26  26  26 255 255 255 255 255  26  26  26 255]
 [255 255 255  26  26  26  26 255 255 255  26  26  26 255 255]
 [255 255 255 255  26  26  26  26  26  26  26  26  26 255 255]
 [255 255 255 255 255  26  26  26  26  26  26  26 255 255 255]
 [255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]
 [255 255 255 255 255 255 255 255 255 255 255 255 255 255 255]]

目次に戻る

白黒データに変換

最後に,白黒データに変換する.これには img.convert("P") を実行するとよい.実行結果を確認すると,0が白,1が黒となるような白黒データになっていることがわかる.

画像データを白黒に変換 (01-readfile.py)
from PIL import Image
import numpy as np
import os

filepath = os.path.sep.join(['png', '0-01.png'])
img = Image.open(filepath)
img = img.convert("P")   ## 白黒に変換
data = np.asarray(img)
print(data)
[[0 0 0 0 1 1 1 1 1 1 0 0 0 0 0]
 [0 0 0 1 1 1 1 1 1 1 1 0 0 0 0]
 [0 0 1 1 1 1 0 0 1 1 1 1 0 0 0]
 [0 0 1 1 1 0 0 0 0 1 1 1 1 0 0]
 [0 0 1 1 0 0 0 0 0 0 1 1 1 0 0]
 [0 0 1 1 0 0 0 0 0 0 0 1 1 1 0]
 [0 0 1 1 0 0 0 0 0 0 0 1 1 1 0]
 [0 0 1 1 1 0 0 0 0 0 0 0 1 1 0]
 [0 0 1 1 1 0 0 0 0 0 0 0 1 1 0]
 [0 0 0 1 1 1 0 0 0 0 0 1 1 1 0]
 [0 0 0 1 1 1 1 0 0 0 1 1 1 0 0]
 [0 0 0 0 1 1 1 1 1 1 1 1 1 0 0]
 [0 0 0 0 0 1 1 1 1 1 1 1 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]

目次に戻る