Python とディープラーニング (14): CNN と IKUN モデル II

1. 説明

この記事では、前回の記事で IKUN モデルで学習させたモデルをテストします。1 つ目は、トレーニングされたモデルを再ロードし、次に opencv を使用して画像をロードし、最後にロードされた画像をモデルに送信して結果を表示することです。

2. IKUNモデルのCNNモデルテスト

2.1 関連ライブラリのインポート

ここに必要なサードパーティ ライブラリ (cv2 など) をインポートします。そうでない場合は、自分でダウンロードする必要があります。自分でダウンロードする場合は、ダウンロードを高速化するために、通常、ソースをミラーリングすることをお勧めします。

from tensorflow import keras
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np
# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras

2.2 モデルをロードする

また、トレーニング済みモデルを読み込みます。データは自作なので、ここでデータを読み込む必要はありません。

# 加载my_ikun.h5文件,重新生成模型对象
recons_model = keras.models.load_model('my_ikun.h5')

2.3 画像を保存するパスを設定する

データセットの特定のデータを画像形式で保存すると、テストの視覚化に便利です。ここでは、テストセットはすでに分割されているので、画像のパスを設定するだけです。
ここで画像の保存場所を設定すると、画像を保存しやすくなります。

# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test1', '4.jpg')

上記のコードは、test フォルダー内の 4.jpg をテストするものですが、その他をテストしたい場合は、それを x.jpg に変更するだけです。
ここに画像の説明を挿入

2.4 画像をロードする

cv2 を使用して画像を読み込みます。opencv ライブラリ、つまり cv2 を使用して画像を読み取る場合、画像は 3 チャネルであり、トレーニング済みモデルは 3 チャネルであるため、単一チャネルだけではなく 3 チャネルになります。 . ここと前ではグレースケール画像が異なります。

# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(150,150)
test_img = cv2.resize(test_img, (150,150))

2.5 画像の前処理

画像の前処理、つまり形状の正規化と変更は、予測のためにトレーニングされたモデルへの画像の入力を容易にするためのものです。ここで形状を 150 150 3 に変更します。前の 1 はサンプル数なので、(1,150,150,3) になります。

# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 150,150, 3)

2.6 画像の予測

トレーニング済みモデルに画像を入力し、予測を行います。
二値分類なので予測結果は確率値なので加工が必要ですが、0.5より大きい場合はクンクン、0.5より小さい場合はチキンとなります。

# 预测
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])
if y_pre_pro[0, class_id] > 0.5:
    print('png的所属类别:', '坤哥')
else:
    print('png的所属类别:', '鸡哥')

2.7 画像を表示する

予想画像を表示し、画像上に予想数字を表示します。
次の 5 行のコードは、ウィンドウの作成、ウィンドウ サイズの設定、画像の表示、画像の停止、メモリのクリアを行っています。

# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()

3. コードを完成させて結果を表示する

以下は完全なコードと結果を示す図です。

from tensorflow import keras
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np
# 导入tensorflow
import tensorflow as tf
# 导入keras
from tensorflow import keras


# 加载my_ikun.h5文件,重新生成模型对象
recons_model = keras.models.load_model('my_ikun.h5')
# 创建图片保存路径
test_file_path = os.path.join(sys.path[0], 'imgs', 'test1', '4.jpg')
# 加载本地test.png图像
image = cv2.imread(test_file_path)
# 复制图片
test_img = image.copy()
# 将图片大小转换成(150,150)
test_img = cv2.resize(test_img, (150,150))
# 预处理: 归一化 + reshape
new_test_img = (test_img/255.0).reshape(1, 150,150, 3)
# 预测
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])
if y_pre_pro[0, class_id] > 0.5:
    print('png的所属类别:', '坤哥')
else:
    print('png的所属类别:', '鸡哥')
# # 显示
cv2.namedWindow('img', 0)
cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
cv2.imshow('img', image)
cv2.waitKey()
cv2.destroyAllWindows()

To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
1/1 [==============================] - 0s 315ms/step
test.png的预测概率: [[1.]]
test.png的预测概率: 1.0
png的所属类别: 坤哥

ここに画像の説明を挿入

4. 完全なコードと複数の画像を使用したテスト結果

より多くの画像をテストするために、複数のテストを実行するループが導入され、効果が向上します。

from tensorflow import keras
import skimage, os, sys, cv2
from PIL import ImageFont, Image, ImageDraw  # PIL就是pillow包(保存图像)
import numpy as np

# 加载my_ikun.h5文件,重新生成模型对象
recons_model = keras.models.load_model('my_ikun.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('imgs', 'test1', path1)
    # 加载本地test.png图像
    image = cv2.imread(test_file_path)
    # 复制图片
    test_img = image.copy()
    # 将图片大小转换成(150,150)
    test_img = cv2.resize(test_img, (150, 150))
    # 预处理: 归一化 + reshape
    new_test_img = (test_img / 255.0).reshape(1, 150, 150, 3)
    # 预测
    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])
    if y_pre_pro[0, class_id] > 0.5:
        print('png的所属类别:', '坤哥')
    else:
        print('png的所属类别:', '鸡哥')
    # # 显示
    cv2.namedWindow('img', 0)
    cv2.resizeWindow('img', 500, 500)  # 自己设定窗口图片的大小
    cv2.imshow('img', image)
    cv2.waitKey()
    cv2.destroyAllWindows()
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:3.jpg
1/1 [==============================] - 0s 170ms/step
test.png的预测概率: [[0.99739295]]
test.png的预测概率: 0.99739295
png的所属类别: 坤哥

ここに画像の説明を挿入

input the test picture path:10.jpg
1/1 [==============================] - 0s 163ms/step
test.png的预测概率: [[0.09064844]]
test.png的预测概率: 0.09064844
png的所属类别: 鸡哥

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_47598782/article/details/132072019