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

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

翻訳者 | 朱 仙中

校正:孫淑娟

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 が優秀すぎて「ラインを落とした」

ブログ    
ブログ    
ブログ    

推薦する

AIエンジニアの成長ストーリー~働き方編~

[[409282]]この記事では、特に仕事の方法について取り上げます。エンジニアの中には非常に頭の...

陳根:人工知能は人間と機械の間の感情的な溝を埋めている

長い間、感情があるかどうかは、人間と機械を区別する重要な基準の一つでした。つまり、機械が感情を持って...

AIが日常のエンターテインメントを向上させるためにどのように活用されているか

今では、ほとんどの人が人工知能の概念をよく知っています。 AI は今日最も人気のあるテクノロジーの ...

2023年雲奇会議開幕 アリババの蔡崇馨氏:AI時代の最もオープンなクラウドを構築

10月31日午前、杭州雲棲鎮で2023年雲棲会議が開幕した。アリババグループのジョセフ・ツァイ会長は...

カリフォルニア工科大学、プロペラアームを使って滑空する二足歩行ロボットを開発

LEONARDO は、カリフォルニア工科大学の航空宇宙ロボット工学および制御研究所の言語の天才たちの...

12 のシナリオ アプリケーション、100 を超えるアルゴリズム、AI はどのようにして経済を征服するのか?

[[328065]] 2020年2月7日、第34回アメリカ人工知能学会年次会議(AAAI 2020...

初心者に適した機械学習アルゴリズムの選び方

この記事の主な対象読者は、機械学習の愛好家やデータサイエンスの初心者、そして機械学習アルゴリズムを学...

TensorFlow を使用してシンプルなロジスティック回帰モデルをゼロから構築する

TensorFlow は Python ベースの機械学習フレームワークです。 Coursera でロ...

...

元アップル社員によって設立されたアルトマンは、同社初のAIハードウェアに投資し、ChatGPTへのアクセスをサポートした。

次に購入する電話はなぜ携帯電話であるべきなのでしょうか?ご覧のとおり、首輪にクリップするこの小さなガ...

自動運転の実用化にはまだいくつかのハードルがある

ここ数年、世界的な自動運転はまだ発展途上であったとすれば、各国の政策の推進により、自動運転に関する最...

ChatGPTの医療版ライブレビュー!治療計画は実際の医師のものと96%一致しています

同国初の大規模医療モデルはすでに患者を「診察」している。最近、病院内の AI 医師の実際の監視データ...

大きな模型 = 容器に入った脳?同源病院の朱松春氏のチームがAGIの主な欠陥を分析

最近、ChatGPT/GPT-4シリーズの製品は世界的な注目と議論を集めており、それらに代表される大...