ImageNet で事前学習済みの畳み込みニューラルネットワーク (CNN) を用いた画像分類(MobileNetV2,ResNet50,DenseNet 121,DenseNet 169,NASNetを使用)(Google Colaboratroy へのリンク有り)
画像分類は,画像からそのクラス名を求めるもの.
Keras では,ImageNet で事前学習済みのモデルを,簡単に使うことができる.
このページでは, Keras の ImageNet で事前学習済みの MobileNetV2, Inception Resnet, ResNet50, DenseNet 121, DenseNet 169, NASNetを用いて画像分類を行う.
Keras で利用可能な画像分類のモデルは,https://keras.io/api/applications/ で説明されている.
【目次】
- Google Colaboratory での実行
- Windows での実行
- このページで説明のために使用する画像
- ImageNet で学習済みの MobileNetV2 を用いた画像分類
- ImageNet で学習済みの ResNet50 を用いた画像分類
- ImageNet で学習済みの Inception-ResNet を用いた画像分類
- ImageNet で学習済みの DenseNet 121 を用いた画像分類
- ImageNet で学習済みの DenseNet 169 を用いた画像分類
- ImageNet で学習済みの NASNet Large を用いた画像分類
このページの URL: https://www.kkaneko.jp/ai/imclassify/resnet50.html
参考文献:
- ResNet50: Deep Residual Learning for Image Recognition, https://arxiv.org/abs/1512.03385
- Inception-ResNet: Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning, https://arxiv.org/abs/1602.07261
- DenseNet: Densely Connected Convolutional Networks, https://arxiv.org/abs/1608.06993
- NASNet: Learning Transferable Architectures for Scalable Image Recognition, https://arxiv.org/abs/1707.07012
- MobileNetV2: https://arxiv.org/abs/1801.04381
1. Google Colaboratory での実行
Google Colaboratory のページ:
次のリンクをクリックすると,Google Colaboratory のノートブックが開く. そして,Google アカウントでログインすると,Google Colaboratory のノートブック内のコード等を編集したり再実行したりができる.編集した場合でも,他の人に影響が出たりということはない.そして,編集後のものを,各自の Google ドライブ内に保存することもできる.
https://colab.research.google.com/drive/1c0uJaZB7B6SDTnxS_5FJukKd9FbYg4-e?usp=sharing
2. Windows での実行
Python のインストール(Windows上)
注:既にPython(バージョン3.12を推奨)がインストール済みの場合は,この手順は不要である.
winget(Windowsパッケージマネージャー)を使用してインストールを行う
- Windowsで,コマンドプロンプトを管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
- winget(Windowsパッケージマネージャー)が利用可能か確認する:
winget --version
- Pythonのインストール(下のコマンドにより Python 3.12 がインストールされる).
- Python詳細ガイド:Pythonまとめ »
- Windows で,コマンドプロンプトを管理者権限で起動する(例:Windowsキーを押し,「cmd」と入力し,「管理者として実行」を選択)
次のコマンドを実行する.
python -m pip install -U numpy matplotlib seaborn scikit-learn pandas pydot
- Windows での GraphViz のインストール: 別ページ »で説明
- Ubuntu での GraphViz のインストール
sudo apt -y insatll graphviz python3-graphviz libgraphviz-dev
- モデルの作成
次の Python プログラムを実行
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow as tf from tensorflow.keras import backend as K K.clear_session() import numpy as np import tensorflow_datasets as tfds from tensorflow.keras.preprocessing import image %matplotlib inline import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings from tensorflow.keras.applications.mobilenet_v2 import MobileNetV2 from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions IMG_SIZE = 224 m = MobileNetV2(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
- モデルの作成
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds from tensorflow.keras.applications.resnet50 import ResNet50 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions import numpy as np IMG_SIZE = 224 m = ResNet50(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
- モデルの作成
次の Python プログラムを実行
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds from tensorflow.keras.applications.inception_resnet_v2 import InceptionResNetV2 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.inception_resnet_v2 import preprocess_input, decode_predictions import numpy as np IMG_SIZE = 299 m = InceptionResNetV2(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
- モデルの作成
次の Python プログラムを実行
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds from tensorflow.keras.applications.densenet import DenseNet121 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.densenet import preprocess_input, decode_predictions import numpy as np IMG_SIZE = 224 m = DenseNet121(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
- モデルの作成
次の Python プログラムを実行
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds from tensorflow.keras.applications.densenet import DenseNet169 from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.densenet import preprocess_input, decode_predictions import numpy as np IMG_SIZE = 224 m = DenseNet169(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
- モデルの作成
次の Python プログラムを実行
from __future__ import absolute_import, division, print_function, unicode_literals import tensorflow.compat.v2 as tf import tensorflow_datasets as tfds from tensorflow.keras.applications.nasnet import NASNetLarge from tensorflow.keras.preprocessing import image from tensorflow.keras.applications.nasnet import preprocess_input, decode_predictions import numpy as np IMG_SIZE = 331 m = NASNetLarge(weights='imagenet') m.summary()
- 確認のため,モデルのプロット
from tensorflow.keras.utils import plot_model import pydot plot_model(m)
- 画像分類の実行
「C:/image/fruits.jpg」, 「C:/image/home.jpg」のところには,画像ファイル名を指定すること.
from matplotlib import pyplot as plt %matplotlib inline import warnings warnings.filterwarnings('ignore') # Suppress Matplotlib warnings import PIL def preprocess_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) x = image.img_to_array(img) x = np.expand_dims(x, axis=0) return preprocess_input(x) def plot_image(img_path, img_size): img = image.load_img(img_path, target_size=(img_size, img_size)) plt.imshow(img) return img_path = 'C:/image/fruits.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
img_path = 'C:/image/home.jpg' plot_image(img_path, IMG_SIZE) print('Predicted:', decode_predictions(m.predict(preprocess_image(img_path, IMG_SIZE)), top=3)[0])
【関連する外部サイト】
【サイト内の関連ページ】
TensorFlow,Keras のインストール
Windows での TensorFlow,Keras のインストール: 別ページ »で説明
(このページで,Build Tools for Visual Studio 2022,NVIDIA ドライバ, NVIDIA CUDA ツールキット, NVIDIA cuDNNのインストールも説明している.)
Graphviz のインストール
Windows での Graphviz のインストール: 別ページ »で説明
numpy,matplotlib, seaborn, scikit-learn, pandas, pydot のインストール
GraphViz のインストール
3. このページで説明のために使用する画像
画像ファイル fruits.jpg, home.jpg のダウンロード
画像ファイル fruits.jpg, home.jpg のダウンロードは, Windows でコマンドプロンプトを管理者として開き 次のコマンドを実行する.
mkdir c:\image
cd c:\image
curl -L https://github.com/opencv/opencv/blob/master/samples/data/fruits.jpg?raw=true -o fruits.jpg
curl -L https://github.com/opencv/opencv/blob/master/samples/data/home.jpg?raw=true -o home.jpg
上のコマンドがうまく
https://github.com/opencv/opencv/tree/master/samples/data
で公開されている fruits.jpg, home.jpg を使用する(謝辞:画像の作者に感謝します)
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
ResNet50 を使用.
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
DenseNet 121 を使用.
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
DenseNet 169 を使用.
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
NASNet Large を使用.
【関連する外部ページ】
https://keras.io/ja/applications/
謝辞:ここでは、https://keras.io/ja/applications に記載のプログラムを変更して使用している
4. ImageNet で学習済みの MobileNetV2 を用いた画像分類
5. ImageNet で学習済みの ResNet50 を用いた画像分類
6. ImageNet で学習済みの Inception-ResNet を用いた画像分類
7. ImageNet で学習済みの DenseNet 121 を用いた画像分類
8. ImageNet で学習済みの DenseNet 169 を用いた画像分類
9. ImageNet で学習済みの NASNet Large を用いた画像分類