【ITニュース解説】[Part 2] Your first steps in Computer Vision on AWS: training a custom CNN model
2026年10月31日に「Dev.to」が公開したITニュース「[Part 2] Your first steps in Computer Vision on AWS: training a custom CNN model」について初心者にもわかりやすく解説しています。
ITニュース概要
AWS上で画像認識用のCNNモデルを訓練する手順を解説した。データ準備からGPUインスタンスでのCNN設計、訓練、評価、S3へのモデル保存までを順に説明。生の画像データで訓練したモデルが最も高い99.34%の精度を達成した。
ITニュース解説
この記事では、AWS上でコンピュータビジョンを実現するための第一歩として、カスタムの畳み込みニューラルネットワーク(CNN)モデルを訓練する方法について解説する。システムエンジニアを目指す皆さんが、画像認識技術の基礎とクラウド上での実践的な手順を理解する良い機会となるだろう。
まず、なぜモデル訓練に高性能な計算資源が必要なのかを説明する。データ処理には比較的シンプルなCPU(中央処理装置)搭載のSageMakerノートブックインスタンスを使用できるが、モデル訓練にはGPU(画像処理装置)が不可欠となる。CPUは複雑で連続的な計算を得意とするが、CNNの訓練では、数百万にも及ぶ単純な行列計算や畳み込み演算を同時に実行する必要がある。一方、GPUは何千もの小さなコアを持ち、数千の計算を同時に処理する「並列性」に特化している。この圧倒的な並列処理能力が、訓練時間を大幅に短縮するために必要となる。例えば、CPUで20〜25エポック(訓練データセット全体をモデルに一度通すこと)を実行すると数週間かかる可能性のある訓練が、GPUを使うことで数分から数時間で完了するのだ。
このため、GPUを搭載したSageMakerノートブックインスタンスを用意する。具体的には、NVIDIA A10G Tensor Core GPUと24 GiBのVRAM(ビデオメモリ)を持つAWSのml.g5.xlargeインスタンスが推奨される。このインスタンスはml.t3.mediumのような低コストのものに比べて高価なので、データ処理やアップロードが完了したら、インスタンスを停止または終了することを忘れないように注意が必要だ。クラウドサービスでは、使っていないリソースにも料金が発生するため、コスト管理は非常に重要となる。
次に、この訓練の中心となるCNNモデルについて掘り下げていく。CNNは、視覚データを処理し、理解するために特別に設計されたニューラルネットワークの一種である。簡単に言うと、これはフィルターやカーネルを使って画像のごく小さな部分を調べ、エッジや線のような単純な形状を検出する。その後、「プーリング」という手法で画像サイズを縮小しながら、最も有用な情報を保持する。こうして検出された単純な形状は、車輪や目といったより複雑な特徴へと組み合わされていき、最終的にモデルが「これは車だ」「これは人だ」といった画像の判断を下す。CNNは、画像分類において優れた性能を発揮し、かつ比較的軽量なモデルであるため、良い出発点となる。
CNNのアーキテクチャは複数の層を積み重ねて構築される。入力画像は200×200ピクセルの解像度を持ち、生画像やフィルター処理されたRGB画像は3つのチャネル(色情報)を持つが、エッジ画像は1つのチャネルを持つ。畳み込み層は入力データに対して、学習可能な小さなフィルター(カーネル)を適用し、局所的な視覚パターンを抽出する。プーリング層は、例えば2×2のプーリングによって画像サイズを半分にする。これにより、計算量を減らしつつ、特徴の空間的な位置のずれに強くなる。グローバル平均プーリング層は最後の特徴マップを、例えば128個の値に集約する。これにより、全結合層への入力次元が削減される。全結合層(Dense layer)は抽出された特徴を組み合わせて最終的な判断を下す層で、ここでは128個のニューロンが使われる。ドロップアウト層は訓練時に全結合層のニューロンの50%をランダムに無効にすることで、モデルが特定のデータパターンに過度に適合してしまう「過学習」を防ぐ。出力層では、29個のニューロンが29種類のクラス(手話の文字など)を表し、Softmax関数によってそれらの出力が確率に変換され、最も高い確率のクラスが最終的な予測となる。
このモデルでは、最初の畳み込み層がエッジのような単純な特徴を学習し、2番目の層ではそれらの特徴の組み合わせ(指の形など)を、3番目の層ではさらに複雑な手やサインのパターンを学習する。フィルターの数は層が進むごとに増え(32→64→128)、これによりネットワークはより多くの種類の複雑な特徴を捉えることができるようになる。モデルには約11万3千個のパラメータがあり、これらは訓練中に自動的に調整・最適化される内部の学習可能な変数(重みとバイアス)である。
SageMakerインスタンスの準備ができたら、JupyterまたはJupyterLabを開き、訓練用のJupyterノートブックをアップロードして実行する。訓練開始前には!nvidia-smiコマンドを実行すると、GPUの状態(メモリ使用量や温度など)を確認できるので便利だ。訓練データはAmazon S3に保存されているため、!aws s3 syncコマンドを使って、前処理済みのデータをSageMakerインスタンスにコピーする。
次に、実際に3種類のCNNモデルを訓練する。今回は、元の「生画像(Raw RGB)」データ、ガウスフィルターで処理された画像、Cannyエッジ検出器で処理された画像の3種類のデータセットを用意し、それぞれでCNNを訓練する。訓練のプロセスは基本的に同じで、画像を入力としてモデルが予測を行い、その予測を正しい答えと比較して誤差を計算し、その誤差に基づいてモデルの重みを調整するというサイクルを繰り返す。
各ノートブックで行われる主要なステップは以下の通りである。まず、訓練用、検証用、テスト用のデータセットを作成する。これは、モデルの学習用、学習中の性能評価用、そして最終的な性能評価用にデータを分割することである。検証セットは各エポック後のモデル性能を評価するために使われ、テストセットは訓練が完了したモデルの最終的な性能を評価するために使用される。次に、設計したCNNモデルをmodel.compileメソッドで準備する。この際に、モデルの重みを調整する最適化アルゴリズム(ここではAdamが使われる)、モデルの予測と実際の正解との差を数値で表す損失関数(ここではSparseCategoricalCrossentropyが用いられる)、そしてモデルの性能を測定する評価指標(ここではSparseCategoricalAccuracy、つまり精度が使われる)を指定する。損失関数の値が小さいほど、モデルの予測が正確であることを意味する。
モデルのコンパイルが完了したら、model.fitメソッドを使って、モデルを25エポック訓練する。訓練中には、最高の性能(最低の検証損失または最高の検証精度)を達成した時点のモデルと、最後の訓練エポックが終了した時点のモデルの両方を保存する。これは、訓練の最終状態が必ずしも最高の性能を持つわけではないためである。訓練中は、精度が上昇し、損失が減少していく様子がグラフで確認できる。これはモデルが順調に学習している良い兆候である。訓練が完了した後、モデルがまだ見たことのない「テストデータセット」を使って、モデルの最終的な性能を評価する。今回は生画像モデルで99.34%という非常に高い精度を達成した。最後に、訓練済みの最終モデル、ベストモデル、そして訓練履歴をAWS S3バケットにアップロードする。これにより、将来的にこれらのモデルを簡単に再利用したり、デプロイしたりすることが可能になる。
最後に、3種類のデータセット(生画像、ガウスフィルター処理画像、Cannyエッジ画像)で訓練したモデルの性能を比較する。結果として、生画像(Raw RGB)を使ったモデルが最も優れた性能(損失0.0324、精度99.34%)を示した。これは、生画像が豊かな色情報やグラデーション、肌の質感など、分類に必要な詳細な特徴を保持しているためだと考えられる。一方、ガウスフィルター処理は指の輪郭などの高周波情報をぼかし、Cannyエッジ検出は手の内部の詳細を失わせてしまう可能性があり、これが性能低下につながったと推測される。
このパートでは、3つの異なるデータセットを使ってCNNモデルをゼロから訓練する方法を学んだ。最も優れた性能を発揮したのは生画像を使用したモデルであった。S3に保存されたこれらのベストモデルは、次回のパートで手話予測アプリケーションにデプロイされる予定だ。