畳み込みニューラルネットワークに基づく画像分類アルゴリズム

畳み込みニューラルネットワークに基づく画像分類アルゴリズム

翻訳者 | 朱 仙中

校正:孫淑娟

1. 畳み込みニューラル ネットワーク (CNN) とは何ですか?

一般的に、畳み込みニューラル ネットワークは、画像データから固有の画像特徴を抽出する機能を備えた特殊なタイプのニューラル ネットワークです。たとえば、畳み込みニューラル ネットワークは、画像データ内の複雑な特徴を識別するのに非常に役立つため、顔の検出と認識に広く使用されています。

2. 畳み込みニューラルネットワークはどのように機能しますか?

他の種類のニューラル ネットワークと同様に、CNN は数値データを処理します。したがって、これらのネットワークに送られる画像は、まずデジタル表現に変換する必要があります。画像はピクセルで構成されているため、CNN に渡される前にデジタル形式に変換されます。

次のセクションで説明するように、デジタル表現層全体がネットワークに渡されるわけではありません。これがどのように機能するかを理解するために、CNN をトレーニングする手順をいくつか見てみましょう。

畳み込み

CNN に送信されるデジタル表現のサイズは、畳み込み演算によって縮小されます。このプロセスは、画像分類に重要な特徴のみがニューラル ネットワークに送信されるようにするために重要です。これにより、ネットワークの精度が向上するだけでなく、ネットワークのトレーニング時に最小限の計算リソースが使用されることも保証されます。

畳み込み演算の結果は、特徴マップ、畳み込​​み特徴、または活性化マップと呼ばれます。特徴検出器を適用すると、特徴マップを生成できます。特徴検出器は、カーネルやフィルターなどとも呼ばれます。

カーネルは通常 3x3 行列です。カーネルは入力画像と要素ごとに乗算され、合計されて特徴マップを出力します。これは、カーネルを入力画像上でスライドさせることによって実現されます。このスライドは段階的に発生します。もちろん、CNN を作成するときに、カーネルのストライドとサイズを手動で設定することもできます。

典型的な3X3畳み込み演算

たとえば、5X5 の入力が与えられた場合、3X3 カーネルは 3X3 の出力特徴マップを出力します。

パディング

上記の操作では、畳み込み演算を適用する過程で、特徴マップのサイズが縮小されることがわかります。では、特徴マップを入力画像と同じサイズにしたい場合はどうすればよいでしょうか?これはパディングによって実現されます。

パディング操作とは、画像をゼロで「埋める」ことによって入力画像のサイズを増やすことを指します。したがって、このようなフィルターを画像に適用すると、入力画像と同じサイズの特徴マップが生成されます。

網掛けされていない部分は塗りつぶされた部分を表します

パディング操作は、畳み込み操作で失われる情報の量を減らすだけでなく、畳み込み操作中に画像のエッジがより頻繁に区切られるようにします。

CNN を構築するときに、必要なパディングの種類を定義するか、パディングをまったく定義しないかを選択できます。ここでの一般的なオプションには、valid または same が含まれます。このうち、valid はパディングが適用されないことを意味し、same は特徴マップのサイズが入力画像のサイズと同じになるようにパディングが適用されることを意味します。

3×3カーネルは5×5の入力を3×3の出力に縮小する。

下の図は、上で説明した特徴マップとフィルターの要素ごとの乗算がどのようになるかを示しています。

活性化関数

非線形性を保証するために、各畳み込み演算の後に ReLU (Rerectified Linear Unit) 変換が適用されます。 ReLU は現在最も人気のある活性化関数ですが、選択できる活性化関数は他にもあります。

変換後、ゼロ未満の値はすべてゼロに戻されますが、他の値は変更されません。

ReLu 関数図

プーリング

プーリング操作では、特徴マップのサイズがさらに縮小されます。現在、さまざまなプーリング方法が利用可能です。

一般的な方法は最大プーリングです。プーリング フィルターのサイズは通常 2×2 行列です。最大プーリング法では、2×2 フィルターが特徴マップ上をスライドし、指定された範囲の長方形のボックス内の最大値を選択します。この操作により、プールされた特徴マップが生成されます。

2×2プーリングフィルタを4×4特徴マップに適用する

プーリングにより、ニューラル ネットワークは、画像内の主要な特徴の位置を考慮することなく、主要な特徴を識別するようになります。さらに、画像サイズが小さくなると、ネットワークのトレーニングも少し速くなります。

ドロップアウト正規化

ドロップアウト正規化を適用することは、CNN では一般的な方法です。これには、バックプロパゲーション中に更新されないように、特定のネットワーク レイヤー内の一部のノードをランダムに削除することが含まれます。これにより、過剰適合が防止されます。

フラット

フラット化の主なタスクは、プールされた特徴マップを単一の列に変換し、それを完全に接続されたレイヤーに渡すことです。これは、畳み込み層から完全接続層への移行時によく行われる手法です。

完全接続層

次に、平坦化された特徴マップが完全接続レイヤーに渡されます。特定の問題とネットワークの種類に応じて、完全に接続されたレイヤーが複数存在する場合があります。このうち、最後の完全接続層は予測結果を出力する役割を担います。

問題の種類に応じて、最後の層で活性化関数が使用されます。その中で、シグモイド活性化関数は主にバイナリ分類に使用され、ソフトマックス活性化関数は通常、マルチカテゴリ画像分類に使用されます。

完全接続畳み込みニューラルネットワーク

3. 畳み込みニューラル ネットワークが従来のフィードフォワード ニューラル ネットワークよりも優れているのはなぜですか?

CNN について学んだ後、なぜ通常のニューラル ネットワークを使用して画像の問題を解決できないのか疑問に思うかもしれません。主な理由は、通常のニューラル ネットワークでは CNN のように画像から複雑な特徴を抽出できないためです。

CNN はフィルターを適用することで画像から追加の特徴を抽出できるため、画像の問題の処理に適しています。さらに、フィードフォワードニューラルネットワークに画像を直接取り込むと、計算コストが高くなる可能性があります。

4. 畳み込みニューラルネットワークアーキテクチャ

CNN をゼロから設計することも、公開されて開発およびリリースされている多数の CNN アーキテクチャを活用することもできます。これらの CNN ネットワークの一部には、独自の使用要件に簡単に適応できる事前トレーニング済みのモデルが付属していることも注目に値します。選択できる一般的な CNN アーキテクチャをいくつか紹介します。

  • レスネット50
  • VG19 19 19 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 290 300 310 320 330 340 350 360 380 490 500 400 520 530
  • 例外
  • インセプション

これらのアーキテクチャは、Keras アプリケーションを通じて使い始めることができます。たとえば、次のコードは、VGG19 フレームワークを使用してフレームワークを開発する方法の例を示しています。

 tensorflow .keras .applications .vgg19 からVGG19 をインポートします
tensorflow .keras .p ​​reprocessing から画像をインポート
tensorflow .keras .applications .vgg16 からpreprocess_input をインポートします
numpyをnp としてインポートする

モデル= VGG19 (重み= 'imagenet' include_top = False )

img_path = '象.jpg'
img = image .load_img ( img_path , target_size = ( 224 , 224 ) )
x = image.img_to_array (画像)
x = np .expand_dims ( x = 0 )
x =前処理入力( x )

特徴= model.predict ( x )

5. TensorFlow における畳み込みニューラル ネットワーク (CNN) の応用

それでは、食品データセットを使用して食品分類 CNN を構築してみましょう。データセットには、101 のカテゴリに分類された 100,000 枚を超える画像が含まれています。

画像の読み込み

最初のステップは、データをダウンロードして抽出することです。

 ! wget --no-check-certificate \
http://data.vision.ee.ethz.ch/cvl/food-101.tar.gz \
-O食品.tar .gz
! tar xzvf 食品.tar .gz

データセット内の画像の 1 つを見てみましょう。

 plt .imshow (画像.open ( "food-101/images/beignets/2802124.jpg" ) )
plt .axis ( 'オフ' )
plt .show ( ) 関数

tf.data.Dataset を生成する

次に、画像を TensorFlow データセットに読み込みます。データの 20% をテストに使用し、残りをトレーニングに使用します。したがって、トレーニング セットとテスト セット用の画像データのコレクションを作成する必要があります (トレーニング セット ジェネレーター関数 ImageDataGenerator を呼び出すことによって)。

トレーニング セット ジェネレーター関数では、画像のスケーリングや反転など、いくつかの画像拡張手法も指定する必要があります。注目すべき点の 1 つは、拡張によってネットワークの過剰適合を防ぐことができることです。

 base_dir = 'food-101/images'
train_datagen = ImageDataGenerator (再スケール= 1 . / 255 ,
せん断範囲= 0.2
ズーム範囲= 0.2
水平反転= True
幅シフト範囲= 0.1
高さシフト範囲= 0.1
検証分割= 0.2

validation_gen = ImageDataGenerator (再スケール= 1. / 255 validation_split = 0.2 )

画像セット ジェネレーターを作成したら、次のタスクは、それらを使用してベース ディレクトリの場所から食品画像を読み込むことです。画像を読み込むときは、画像のターゲット サイズを指定する必要があります。すべての画像は指定されたサイズに変更されます。

画像サイズ= ( 200 , 200 )
トレーニングセット= train_datagen.flow_from_directory ( base_dir
シード= 101
ターゲットサイズ=画像サイズ
バッチサイズ= 32
サブセット= "トレーニング"
class_mode = 'カテゴリ' )

画像を読み込むときには、次のことも指定する必要があることに注意してください。

  • 画像を読み込むディレクトリの場所。
  • この場合のバッチ サイズは 32 で、画像は 32 個のバッチで読み込まれることを意味します。
  • サブセット。トレーニングか検証かを指定する必要があります。
  • 画像の種類が複数あるため、タイプモードはマルチ分類モードになります。カテゴリが 2 つの場合、このパラメータは 2 進数を使用して指定できます。
 validation_set = validation_gen.flow_from_directory ( base_dir 
ターゲットサイズ=画像サイズ
バッチサイズ= 32
サブセット= "検証"
class_mode = 'カテゴリ' )

モデル定義

次のステップは、CNN モデルを定義することです。ニューラル ネットワークのアーキテクチャは、前述の「畳み込みニューラル ネットワークの仕組み」セクションで説明した手順と似ています。ネットワークを定義するには、Keras ネットワーク フレームワークの Sequential API を使用します。このうち、CNN部分はConv2Dレイヤーを使用して定義されます。

モデル=シーケンシャル( [
Conv2D (フィルター= 32 カーネルサイズ= ( 3 3 ) 入力シェイプ= ( 200 200 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )

Conv2D (フィルター= 32 カーネルサイズ= ( 3 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )
ドロップアウト( 0.25 )

Conv2D (フィルター= 64 カーネルサイズ= ( 3 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )
ドロップアウト( 0.25 )

平坦化
( 128 活性化= 'relu' )
ドロップアウト( 0.25 )
( 101 活性化= 'softmax' )
]

Conv2D レイヤーには次の期待があります。

  • この例では、使用されるフィルターの数は 32 です。
  • この例では、使用されるカーネル サイズは 3X3 です。
  • 入力画像のサイズ。 200X200 は画像のサイズで、3 はカラー画像であることを指定します。
  • 活性化関数には通常、ReLu 関数が使用されます。

上記のネットワークでは、プーリングに 2X2 フィルターを使用し、過剰適合を防ぐためにドロップアウト レイヤーを適用します。最後のレイヤーには、食品カテゴリが 101 個あるため、101 個のユニットがあります。複数カテゴリの画像分類問題を解決しているため、使用される活性化関数はソフトマックス関数です。

CNNモデルのコンパイル

次に、複数のクラスが関係するため、分類損失アルゴリズムと正確なアルゴリズムを使用してネットワークをコンパイルします。

モデル.compile (オプティマイザ= 'adam' 
損失= keras .losses .CategoricalCrossentropy ( )
metrics = [ keras.metrics.CategoricalAccuracy ( ) ] )

CNNモデルのトレーニング

次に、CNN モデルのトレーニングを開始します。

それでは、CNN モデルのトレーニングを始めましょう。トレーニング プロセス中に、EarlyStopping コールバック関数を適用します。この目的は、モデルが一定回数反復しても改善されない場合、トレーニングを停止することです。この場合、3 つのトレーニング エポックが使用されました。

コールバック= EarlyStopping (モニター= 'loss' 忍耐力= 3 )
history = model .fit ( training_set validation_data = validation_set epochs = 100 callbacks = [コールバック] )

この場合、扱う画像データセットが非常に大きいため、このモデルをトレーニングするには GPU を使用する必要があります。モデルのトレーニングには、LayerのWebサイト([翻訳者注]残念ながらこのWebサイトは開くことができません。読者はアイデアを知るだけでいいのです。実際、市場にはすでにAI学習用の無料オンラインGPUサービスが数多く存在しています)が提供する無料のGPUを使用しましょう。これを実現するには、上記で開発したすべてのコードを 1 つの関数に「バンドル」する必要があります。この関数はモデルを返す必要があります。この場合、TensorFlow モデルが返されます。

GPU を使用してモデルをトレーニングするには、ファブリック デコレータ (https://docs.app.layer.ai/docs/reference/fabrics) を使用して指定される GPU 環境パラメータで関数を装飾するだけです。

 #pip レイヤーをインストール- SDK - qqq
インポートレイヤー
layer.decorators からmodel fabric pip_requirements をインポートします
#認証層アカウント
#トレーニング済みのモデルはここに保存されます。
レイヤー.login ( )
#プロジェクトを初期化すると、トレーニング済みのモデルがこのプロジェクトに保存されます。
レイヤー.init ( "画像分類" )
@pip_requirements (パッケージ= [ "wget" "tensorflow" "keras" ] )
@fabric ( "f-gpu-small" )
@model (名前= "food-vision" )
定義トレイン :
tensorflow .keras .p​​reprocessing .image からImageDataGenerator をインポートします
テンソルフローをtf としてインポートする
テンソルフローからkerasをインポート
tensorflow.keras からSequentialをインポートする
tensorflow.keras.layers からDense Conv2D MaxPooling2D Flatten Dropout をインポートします
tensorflow .keras .p​​reprocessing .image からImageDataGenerator をインポートします
tensorflow.keras.callbacks からEarlyStopping をインポートします
インポートOS
matplotlib .pyplotを plt としてインポートします。
PIL インポート画像から
numpyをnp としてインポートする
pandasをpd としてインポートする
tarファイルをインポートする
wgetをインポートする
wget .download ( "http://data.vision.ee.ethz.ch/cvl/food-101.tar.gz" )
food_tar = tarファイル.open ( 'food-101.tar.gz' )
food_tar .extractall ( '.' )
food_tar .close ( )
plt .imshow (画像.open ( "food-101/images/beignets/2802124.jpg" ) )
plt .axis ( 'オフ' )
レイヤー.log ( { "サンプル画像" : plt .gcf ( ) } )
base_dir = 'food-101/images'
クラス名= os .listdir (ベースディレクトリ)
train_datagen = ImageDataGenerator (再スケール= 1 . / 255 ,
せん断範囲= 0.2
ズーム範囲= 0.2
水平反転= True
幅シフト範囲= 0.1
高さシフト範囲= 0.1
検証分割= 0.2

validation_gen = ImageDataGenerator (再スケール= 1. / 255 validation_split = 0.2 )
画像サイズ= ( 200 , 200 )
トレーニングセット= train_datagen.flow_from_directory ( base_dir
シード= 101
ターゲットサイズ=画像サイズ
バッチサイズ= 32
サブセット= "トレーニング"
class_mode = 'カテゴリ' )
validation_set = validation_gen.flow_from_directory ( base_dir
ターゲットサイズ=画像サイズ
バッチサイズ= 32
サブセット= "検証"
class_mode = 'カテゴリ' )
モデル=シーケンシャル( [
Conv2D (フィルター= 32 カーネルサイズ= ( 3 3 ) 入力シェイプ= ( 200 200 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )

Conv2D (フィルター= 32 カーネルサイズ= ( 3 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )
ドロップアウト( 0.25 )

Conv2D (フィルター= 64 カーネルサイズ= ( 3 3 ) アクティベーション= 'relu' )
MaxPooling2D (プールサイズ= ( 2 , 2 ) )
ドロップアウト( 0.25 )

平坦化
( 128 活性化= 'relu' )
ドロップアウト( 0.25 )
( 101 活性化= 'softmax' ) ] )
モデル.compile (オプティマイザ= 'adam'
損失= keras .losses .CategoricalCrossentropy ( )
metrics = [ keras.metrics.CategoricalAccuracy ( ) ] )
コールバック= EarlyStopping (モニター= 'loss' 忍耐力= 3 )
エポック= 20
history = model .fit ( training_set validation_data = validation_set epochs = epochs callbacks = [コールバック] )
metrics_df = pd .DataFrame (履歴.history )
レイヤー.log ( { "メトリクス" : metrics_df } )
損失精度=モデル.evaluate (検証セット)
レイヤー.log ( { "テストデータセットの精度" :精度} )
metrics_df [ [ "損失" , "val_loss" ] ] .plot ( )
レイヤー.log ( { "損失プロット" : plt .gcf ( ) } )
metrics_df [ [ "カテゴリ精度" , "val_categorical_accuracy" ] ] .plot ( )
レイヤー.log ( { "精度プロット" : plt .gcf ( ) } )
リターンモデル

モデルをトレーニングするタスクは、トレーニング関数を「layer.run」関数に渡すことによって実行されます。ローカル インフラストラクチャでモデルをトレーニングする場合は、「train()」関数を呼び出すことでトレーニングできます。

レイヤー.run ( [列車] )

予測する

モデルの準備ができたら、次の手順に従って新しい画像に対する予測を行うことができます。

  • 上記のオンライン GPU サービス Web サイトからトレーニング済みモデルを取得します。
  • トレーニング画像で使用したのと同じサイズの画像を読み込みます。
  • 画像を配列に変換します。
  • 配列内の数値を 255 で割り、0 から 1 の間になるようにします。覚えておいてください: すべてのトレーニング イメージは同じ形式である必要があります。
  • 画像サイズを拡大します。単一の画像に対して予測を行っているため、batch_size を 1 増やします。
 keras .p ​​reprocessing から画像をインポート
numpyをnp としてインポートする
image_model =レイヤー.get_model ( 'layer/image-classification/models/food-vision' ) .get_train ( )
! wget --no-check-certificate \
https://upload.wikimedia.org/wikipedia/commons/b/b1/ バターミルク_ベニエ_% 284515741642 %29.jpg \
-O / tmp / バターミルク_ベニエ_.jpg
test_image = image .load_img ( '/tmp/Buttermilk_Beignets_.jpg' target_size = ( 200 200 ) )
test_image = image.img_to_array (テストイメージ)

テストイメージ=テストイメージ/ 255.0
test_image = np .expand_dims ( test_image axis = 0 )

予測= image_model.predict (テストイメージ)

予測[ 0 ] [ 0 ]

これはマルチクラス ネットワークなので、結果を解釈するには softmax 関数を使用します。この関数は、ロジットを各カテゴリの確率に変換します。

クラス名= os .listdir (ベースディレクトリ)
スコア= tf .nn .softmax (予測[ 0 ] )
スコア= スコア.numpy ( )
f "{class_names[np.argmax(scores)]}、信頼度は{(100 * np.max(scores)).round(2)}パーセントです。"

6. まとめ

この記事では、畳み込みニューラルネットワークについて詳しく説明しました。具体的には、この記事では以下の内容を取り上げます。

  • CNNとは何ですか?
  • CNNの仕組み
  • CNN アーキテクチャ
  • 画像分類問題のための CNN の構築方法

オリジナルリンク:

https://www.kdnuggets.com/2022/05/image-classification-convolutional-neural-networks-cnns.html

翻訳者紹介

Zhu Xianzhong 氏は、51CTO のコミュニティ エディターであり、51CTO の専門ブロガー兼講師であり、濰坊の大学のコンピューター教師であり、フリーランス プログラミング コミュニティのベテランです。初期にはさまざまな Microsoft テクノロジに注力し (ASP.NET AJX および Cocos 2d-X に関連する 3 冊の技術書を編纂)、オープンソースの世界に 10 年近く携わってきました (人気のフルスタック Web 開発テクノロジに精通)。OneNet/AliOS+Arduino/ESP32/Raspberry Pi をベースとした IoT 開発テクノロジや、Scala+Hadoop+Spark+Flink などのビッグデータ開発テクノロジを理解しています。

<<:  古典的な論文を実装するための60行のコード:ポアソンディスクサンプリングを完了するのに0.7秒、Numpyよりも100倍高速

>>:  Google 研究者: AI が優秀すぎて「ラインを落とした」

ブログ    
ブログ    

推薦する

seq2seq モデルよりも 90 倍高速です。 Google、新しいテキスト編集モデルFELIXを発表

[[397649]]シーケンスツーシーケンス (seq2seq) モデルは、自然言語生成タスクに対す...

GPT-4 の王冠は落ちていません!クロード3アリーナの人間投票結果が発表されました: 3位のみ

クロード 3 のアリーナ ランクがついに登場:わずか 3 日間で 20,000 票が集まり、リストの...

自動運転車は複雑な相互作用の問題をどのように解決するのでしょうか?清華大学とMITが共同でM2Iソリューションを提案

自動運転車が公道を走るようになると、必然的に道路上の「暗黙のルール」のいくつかを学習する必要が出てき...

ロボットになることでのみロボットを倒すことができる

人類はロボットの時代に突入している。ロボット工学の専門家や哲学者の中には、将来、高度に知能化されたロ...

MIT は隠れた物体を「認識」できるロボットを開発中。「私たちはロボットに超人的な認識力を与えようとしている」

MITの研究者らは、視覚と無線周波数(RF)センシングを組み合わせて、視界から隠れている物体でも見...

...

...

大好きです!初心者に適した 7 つの高品質 AI プロジェクト

人工知能が本格的に普及しつつあります。AIの知識を学ばなければ、自分が新時代の後継者だと言えるでしょ...

...

2020 年に AI、分析、データ ガバナンスに影響を与える 5 つのトレンド

企業レベルの人工知能は、まさに臨界質量に達しました。 AI があらゆるビジネスの主要な構成要素となる...

AI によって雇用が失われる場合、バックアップ プランはありますか?

[[425784]]人工知能などの主要な破壊的技術は現在、生産性と出力を向上させるために世界中のさ...

報告書によると、プログラマーの70%がプログラミングにさまざまなAIツールを使用している。

6月14日、プログラミングに関する質問と回答のウェブサイト「Stack Overflow」が発表し...

...

...