目次
1. 説明
この記事では、前の記事でトレーニングしたモデルをテストします。1 つ目は、トレーニングされたモデルを再ロードし、次に opencv を使用して画像をロードし、最後にロードされた画像をモデルに送信して結果を表示することです。
2. 手書き数字認識のための CNN モデルテスト
2.1 関連ライブラリのインポート
cv2 などの必要なサードパーティ ライブラリをここでインポートします。そうでない場合は、自分でダウンロードする必要があります。
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw # PIL就是pillow包(保存图像)
import numpy as np
2.2 データとモデルのロード
MNIST データセットをロードし、トレーニングされたモデルをロードします。
# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_mnist.h5')
2.3 画像を保存するパスを設定する
データセットの特定のデータを画像の形式で保存すると、テストの視覚化に便利です。
ここで画像の保存場所を設定します。
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test100.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[100]).save(test_file_path)
上記のコードを記述した後、次のように、コードの現在のパスに画像を保存するための imgs フォルダーを作成する必要があります。
上記のコードを実行すると、次のように、imgs ファイル内にもう 1 つの画像が見つかります (以下で何度もテストしています)。
2.4 画像をロードする
cv2 を使用して画像をロードします。以下のコードの最後の行が 1 つのチャネルを使用する理由は、opencv ライブラリ、つまり cv2 を使用して画像を読み取る場合、画像は 3 チャネルであり、トレーニングされたモデルは 1 つのチャネルであるためです。チャネルなので、シングルチャネルが使用されます。
# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(28,28)
test_img = cv2.resize(test_img, (28, 28))
# 取单通道值
test_img = test_img[:, :, 0]
print(test_img.shape)
2.5 画像の前処理
画像の前処理、つまり形状の正規化と変更は、予測のためにトレーニングされたモデルへの画像の入力を容易にするためのものです。
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 28, 28, 1)
2.6 画像の予測
トレーニング済みモデルに画像を入力し、予測を行います。
予測結果は10個の確率値なので処理が必要ですが、np.argmax()は予測値である確率値の最大値の通し番号です。
# 预测
y_pre_pro = recons_model.predict(new_test_img, verbose=1)
# 哪一类数字
class_id = np.argmax(y_pre_pro, axis=1)[0]
print('test.png的预测概率:', y_pre_pro)
print('test.png的预测概率:', y_pre_pro[0, class_id])
print('test.png的所属类别/手写体数字:', class_id)
class_id = str(class_id)
2.7 画像を表示する
予想画像を表示し、画像上に予想数字を表示します。
次の 6 行のコードは、ウィンドウの作成、ウィンドウのサイズの設定、数値の表示、画像の表示、画像の停止、メモリのクリアです。
# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500) # 自己设定窗口图片的大小
cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()
3. コードを完成させて結果を表示する
以下は完全なコードと結果を示す図です。
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw # PIL就是pillow包(保存图像)
import numpy as np
# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_mnist.h5')
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test100.png')
# 存储测试数据的任意一个
Image.fromarray(x_test[100]).save(test_file_path)
# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(28,28)
test_img = cv2.resize(test_img, (28, 28))
# 取单通道值
test_img = test_img[:, :, 0]
print(test_img.shape)
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 28, 28, 1)
# 预测
y_pre_pro = recons_model.predict(new_test_img, verbose=1)
# 哪一类数字
class_id = np.argmax(y_pre_pro, axis=1)[0]
print('test.png的预测概率:', y_pre_pro)
print('test.png的预测概率:', y_pre_pro[0, class_id])
print('test.png的所属类别/手写体数字:', class_id)
class_id = str(class_id)
# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500) # 自己设定窗口图片的大小
cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
(28, 28)
1/1 [==============================] - 0s 210ms/step
test.png的预测概率: [[2.3381226e-05 1.1173951e-09 2.5884110e-09 2.3000638e-10 1.5515226e-07
3.6373976e-07 9.9997604e-01 5.8317045e-13 1.0071908e-07 1.6725430e-09]]
test.png的预测概率: 0.99997604
test.png的所属类别/手写体数字: 6
4. 完全なコードと複数の画像を使用したテスト結果
より多くの画像をテストするために、複数のテストを実行するループが導入され、効果が向上します。
from tensorflow import keras
# 引入内置手写体数据集mnist
from keras.datasets import mnist
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw # PIL就是pillow包(保存图像)
import numpy as np
# 加载mnist数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 加载cnn_mnist.h5文件,重新生成模型对象, 等价于之前训练好的cnn_model
recons_model = keras.models.load_model('cnn_mnist.h5')
prepicture = int(input("input the number of test picture :"))
for i in range(prepicture):
path1 = input("input the test picture path:")
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', path1)
# 存储测试数据的任意一个
num = int(input("input the test picture num:"))
Image.fromarray(x_test[num]).save(test_file_path)
# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(28,28)
test_img = cv2.resize(test_img, (28, 28))
# 取单通道值
test_img = test_img[:, :, 0]
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 28, 28, 1)
# 预测
y_pre_pro = recons_model.predict(new_test_img, verbose=1)
# 哪一类数字
class_id = np.argmax(y_pre_pro, axis=1)[0]
print('test.png的预测概率:', y_pre_pro)
print('test.png的预测概率:', y_pre_pro[0, class_id])
print('test.png的所属类别/手写体数字:', class_id)
class_id = str(class_id)
# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500) # 自己设定窗口图片的大小
cv2.putText(image, class_id, (2, 5), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 0.2, (255, 0, 0), 1)
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()
次のテスト ピクチャの番号は、実際の値の番号ではなく、データ セット内のデータのシリアル番号 (0 ~ 59999) を指します。
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
input the number of test picture :2
input the test picture path:1.jpg
input the test picture num:1
1/1 [==============================] - 0s 156ms/step
test.png的预测概率: [[4.3549915e-07 4.7153802e-07 9.9998319e-01 5.7891691e-07 2.7986115e-08
5.3348625e-08 7.1938064e-09 1.4849566e-05 3.6678301e-07 2.2624316e-09]]
test.png的预测概率: 0.9999832
test.png的所属类别/手写体数字: 2
input the test picture path:2.jpg
input the test picture num:2
1/1 [==============================] - 0s 26ms/step
test.png的预测概率: [[1.4249144e-10 9.9994874e-01 6.1170212e-08 2.7543174e-09 1.9512597e-06
5.1548787e-09 1.5619334e-07 3.3457465e-07 4.5184272e-05 3.6284032e-06]]
test.png的预测概率: 0.99994874
test.png的所属类别/手写体数字: 1