深層学習による画像分類・タギングのテキスト

深層学習による画像分類では、CNN(例:ResNet)の畳み込み演算により局所特徴を抽出する。Vision Transformer(ViT)は画像パッチ間の関係性を計算する。ViTの系統に属するEVA-02は、マスク画像モデリングによる事前学習により、ImageNet-1kでTop-1精度90.0%を達成している。用途に応じたモデル選択が重要であり、高精度用途にはEVA-02、リアルタイム処理にはResNetを選択する。

【目次】

画像認識

画像認識とは、コンピューターが画像の内容を自動的に理解・分類する技術である。人間が写真を見て「これは猫だ」と判断するのと同様に、機械が画像から特徴を抽出し、事前に定義されたカテゴリに分類する。

第1章:深層学習の基礎理論と用語

基礎用語

深層学習(Deep Learning):多層ニューラルネットワークによる機械学習手法

事前学習(Pre-training):大規模データセットで汎用的な特徴を学習する段階。事前学習済みモデルを利用すると、少量の学習データでも高い精度が得られ、学習に要する計算コストも削減できる。

ファインチューニング(Fine-tuning):特定タスクに合わせて事前学習モデルを調整する段階。事前学習で獲得した汎用的な特徴表現を活用し、新しいタスクに適応させる。

ImageNet:約1,400万枚・約2万カテゴリの大規模画像データセット。画像分類の標準ベンチマークとして使われるのは、その部分集合であるImageNet-1k(ILSVRC-2012)で、1,000カテゴリ・訓練用約128万枚・検証用5万枚からなる。事前学習には約2万カテゴリのImageNet-21kが使われることが多い。

Top-1精度:モデルが最も確信度の高いクラスを予測した際の正解率。85%であれば、100枚中85枚を正しく分類することを意味する。

Top-5精度:確信度上位5つの予測のいずれかが正解である割合。似たカテゴリが多いImageNet-1kでは、Top-1と併記されることが多い。

FLOPs:1回の推論に要する浮動小数点演算数。同じ精度であればFLOPsが小さいモデルほど高速・省電力に動作するため、リアルタイム処理では精度とあわせて確認する指標である。

畳み込み(Convolution):画像の局所的な特徴を抽出するための数学的操作

受容野(Receptive Field):ニューラルネットワークの各ニューロンが入力画像のどの範囲の情報を統合して処理しているかを示す領域

自己注意機構(Self-Attention):入力の各要素が他の全ての要素との関係を計算する機構

マスク画像モデリング(MIM):画像の一部を隠して、その部分(または対応する特徴量)を予測させる自己教師あり学習手法

ゼロショット学習:訓練時に見たことのないクラスに対して、事前学習で獲得した知識のみで分類を行う手法

物体検出:画像内の物体の位置と種類を同時に特定するタスク

セマンティックセグメンテーション:画像の各ピクセルにクラスラベルを割り当てるタスク

深層学習の数学的基礎

画像認識における深層学習は、数値計算によって画像から意味のあるパターンを抽出する。以下の数学的概念が中核となる。

ソフトマックス関数

複数のクラスから1つを選ぶ分類問題では、各クラスの確率を計算する必要がある。ソフトマックス関数は実数値を0と1の間の値に変換し、すべての合計を1にする。

数式:softmax(x_i) = exp(x_i) / Σexp(x_j)

ここで、x_iは第iクラスの出力値(ロジット)、exp()は指数関数、Σは全クラスに対する総和を表す。指数関数により大きな値がより強調され、正規化により確率分布となる。

ソフトマックス関数の動作例:
入力値: [2.0, 1.0, 0.1] → 確率分布: [0.66, 0.24, 0.10]
計算過程: exp(2.0)=7.39, exp(1.0)=2.72, exp(0.1)=1.11
総和=11.22, 確率=[7.39/11.22, 2.72/11.22, 1.11/11.22]

なお、ソフトマックスの出力値は確率の形式をとるが、実際の正解率と一致するとは限らない。学習済みモデルは確信度を過大に出力する傾向があり、確信度をそのまま信頼度として扱うことはできない。

勾配降下法

機械学習では予測誤差を最小化するためのパラメータ調整が必要である。勾配降下法は誤差の勾配を計算し、誤差が減少する方向にパラメータを更新する。

数式:θ = θ - α(∂L/∂θ)

ここで、θはパラメータ、αは学習率、∂L/∂θは損失関数の勾配を表す。学習率が大きすぎると最適解を飛び越え、小さすぎると学習が進まない。実際の学習では、Adamなどの最適化アルゴリズムと、学習の進行に応じて学習率を減衰させるスケジューラが併用される。

画像データの数値表現

グレースケール画像(3×3ピクセル):
[0.2, 0.5, 0.8]
[0.1, 0.9, 0.3]
[0.7, 0.4, 0.6]

カラー画像(RGB 3チャンネル):
R: [0.8, 0.2, ...] G: [0.3, 0.7, ...] B: [0.1, 0.9, ...]

第2章:主要技術の概要と性能比較

技術発展の概要

技術系統の分類

画像認識技術
├── CNN系(畳み込みベース)
│   ├── AlexNet (2012) → VGG (2014) → ResNet (2015)
│   └── ConvNeXt (2022) ← Transformerの設計要素を導入
└── Transformer系(注意機構ベース)
    ├── ViT (2020) → DeiT → Swin Transformer
    └── EVA-02 (2023) ← マスク画像モデリングによる事前学習

主要技術の比較

Top-1精度はImageNet-1k検証セットにおける値である。事前学習データ、入力解像度、学習手法(学習レシピ)によって同一アーキテクチャでも数ポイント変動するため、下表はこの節で扱う具体的な公開重みの値である。

ViT-Base/16は、ImageNet-1kのみで学習した場合には同規模のCNNを下回る。大規模データでの事前学習を前提として初めて優位性が現れる点が、CNNとの重要な違いである。

モデル選択指針

精度要求 > 85% ?
├─ Yes → 計算資源は潤沢?
│   ├─ Yes → EVA-02 Large (大容量メモリと448×448入力が必要)
│   └─ No → EVA-02 Base / Small
└─ No → リアルタイム処理が必要?
    ├─ Yes → ResNet-18, 50, 101
    └─ No → ConvNeXt / ViT-Base

用途別推奨技術

高精度要求用途(不良品検査、専門的な画像の分類)

一般的な業務用途(商品分類、文書処理)

リアルタイム用途(監視カメラ、IoTデバイス)

第3章:CNN(ResNet)

CNNの基礎

畳み込み演算の原理

画像の局所的なパターンを検出する。小さなフィルタを画像全体に適用することで、エッジやテクスチャなどの特徴を抽出する。同じフィルタを画像全体で共有するため、全結合層に比べてパラメータ数が少なく、物体の位置がずれても同じ特徴を検出できる。

数式:(f * g)(x, y) = ΣΣ f(m, n) × g(x-m, y-n)

CNNの処理フロー:
入力画像 → 畳み込み層 → 活性化関数 → プーリング層 →
畳み込み層 → 活性化関数 → プーリング層 → 全結合層 → 出力

受容野の概念

各層のニューロンが入力画像のどの範囲の情報を統合しているかを示す領域を受容野と呼ぶ。層を重ねるほど受容野は広がり、浅い層ではエッジなどの細かな特徴を、深い層では物体全体の形状といった大域的なパターンを捉える。

3×3畳み込みを重ねた場合の受容野の拡大(ストライド1):
入力層: 1×1 → 第1層: 3×3 → 第2層: 5×5 → 第3層: 7×7

CNNでは層を重ねることで受容野を段階的に拡大するが、Transformerは最初の層から画像全体(グローバル受容野)を扱う点で構造が異なる。

ResNetの技術的特徴

層を深くすると勾配が伝わりにくくなり、かえって精度が下がる問題があった。ResNetは、層の出力に入力をそのまま加算する残差接続(スキップ接続)を導入し、各層が入力との差分のみを学習すればよい構造とした。これにより勾配が浅い層まで伝わりやすくなり、152層の学習が可能になった。残差接続はその後、Transformerを含む多くのアーキテクチャで標準的に使われている。

第4章:Vision Transformer(ViT・EVA-02)

ViTの理論的基礎

自己注意機構の原理

画像を固定サイズのパッチに分割し、各パッチをベクトル化してTransformerに入力する。各パッチが他のすべてのパッチとの関係を直接計算するため、最初の層から画像全体の情報を統合できる。一方で、計算量はパッチ数の2乗に比例して増加する。

数式:Attention(Q, K, V) = softmax(QK^T/√d_k)V

ViTの処理フロー:
入力画像(224×224×3)→ パッチ分割(16×16パッチ×196個)→
パッチ埋め込み → 位置埋め込み追加 → Transformer Encoder×12層 →
[CLS]トークン出力 → 分類ヘッド → クラス確率

CNNが持つ「近くの画素は関係が深い」「物体が移動しても同じ特徴」といった前提(帰納バイアス)をViTは持たない。そのため学習に必要なデータ量が多く、ImageNet-21kやそれ以上の規模での事前学習が前提となる。

EVA-02の技術的特徴

EVA-02は北京智源人工智能研究院(BAAI)が公開したVision Transformerである。SwiGLU、回転位置埋め込み(RoPE)、追加のLayerNormといった構成要素をViTに導入したうえで、マスク画像モデリングにより事前学習されている。

マスク画像モデリング(MIM)による事前学習

画像の一部を隠し、隠した領域を予測させる自己教師あり学習である。ラベルが不要なため、大量の画像を学習に利用できる。EVA-02では、予測対象を元の画素値ではなくEVA-CLIPが出力する特徴量としており、画像とテキストの対応関係から得られた表現をMIMを通じて受け継ぐ設計になっている。

数式(画素を予測対象とする素朴な形):L_MIM = E[||f(x_masked) - x_original||²]

MIMの学習プロセス:
原画像 → パッチのマスク → 隠した領域の特徴量を予測 → 画像の構造的理解

第5章:実践応用、技術別実装例

Python 3.12 のインストール

Pythonのインストールを行い、Pythonのプログラムを実行する環境を整える。扱う環境は、Windows搭載パソコンである。金子研究室では、Python 3.12.10を推奨する。

[Windows での Python 3.12 のインストール手順を見るには、ここをクリック]

Windows での Python 3.12 のインストール

以下のいずれかの方法でPython 3.12をインストールする。Pythonがインストール済みの場合、この手順は不要である。

方法 1:winget によるインストール

インストールコマンドの実行方法

管理者権限コマンドプロンプトを起動する(手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして、コマンド全体をコマンドプロンプトにコピー&ペーストする。

--scope machine を指定することで、システム全体(全ユーザー向け)にインストールされる。このオプションの実行には管理者権限が必要である。インストール完了後、コマンドプロンプトを再起動するとPATHが反映される。

REM Python 3.12 をシステム領域にインストール
winget install --id Python.Python.3.12 -e --scope machine --silent --accept-source-agreements --accept-package-agreements --override "/quiet InstallAllUsers=1 PrependPath=1 Include_test=0 Include_pip=1 Include_launcher=1 InstallLauncherAllUsers=1 TargetDir=\"C:\Program Files\Python312\""
if not "%ERRORLEVEL%"=="0" ( color 0c & echo Python 3.12 のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )

REM Python と Scripts を PATH 先頭に追加
powershell -NoProfile -Command "$p='C:\Program Files\Python312'; $s=\"$p\Scripts\"; if(Test-Path $p){$k=[Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\CurrentControlSet\Control\Session Manager\Environment',$true); $c=$k.GetValue('Path','',[Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames); $t=$k.GetValueKind('Path'); $new=$c; if((';'+$new+';') -notlike \"*;$p;*\"){$new=$p+';'+$new}; if((';'+$new+';') -notlike \"*;$s;*\"){$new=$s+';'+$new}; if($new -ne $c){$k.SetValue('Path',$new,$t)}; $k.Close()}"

REM 現在のセッションにも反映(システムPATHを再取得して連結)
for /f "usebackq tokens=2,*" %A in (`reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path`) do set "PATH=%B"

REM pip / wheel の更新
python -m pip install --no-user -U pip wheel
if not "%ERRORLEVEL%"=="0" ( color 0c & echo pip / wheel の更新に失敗しました & ping 127.0.0.1 -n 6 >nul & color )

方法 2:インストーラーによるインストール

  1. Python公式サイト(https://www.python.org/downloads/)にアクセスし、「Download Python 3.x.x」ボタンからWindows用インストーラーをダウンロードする。
  2. ダウンロードしたインストーラーを実行する。
  3. 初期画面の下部に表示される「Add python.exe to PATH」にチェックを入れてから「Customize installation」を選択する。このチェックを入れ忘れると、コマンドプロンプトから python コマンドを実行できない。
  4. 「Install Python 3.xx for all users」にチェックを入れ、「Install」をクリックする。

インストールの確認

コマンドプロンプトで以下を実行する。

python --version

バージョン番号(例:Python 3.12.x)が表示されればインストール成功である。「'python' は、内部コマンドまたは外部コマンドとして認識されていません。」と表示される場合は、インストールが正常に完了していない。

Python の開発環境 Visual Studio Code のインストールと Python 用の設定

Python の開発環境Visual Studio Code(プログラムを編集するソフトウェア。以下、VS Code)を整える。

[Windows での Visual Studio Code のインストールと Python 用の設定手順を見るには、ここをクリック]

Windows での Visual Studio Code のインストールと Python 用の設定手順

1. VS Code と拡張機能のインストール

以下のコマンドにより,既存の VS Code を削除し,全ユーザー共有の設定で再インストールしたうえで,拡張機能(VS Code に機能を追加するソフトウェア)をまとめて導入する.

インストールコマンドの実行方法

管理者権限コマンドプロンプトを起動する(手順:Windows キーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。そして,コマンド全体をコマンドプロンプトにコピー&ペーストする。

インストールコマンド


REM ============================================================
REM Microsoft Visual Studio Code
REM ============================================================
REM Build Tools + Desktop development with C++(VCTools)+ 追加コンポーネント(一括)
REM 未インストール時: winget で新規インストール
REM インストール済み時: setup.exe modify でコンポーネント追加(バージョンは変更しない)
winget list --id Microsoft.VisualStudio.BuildTools 2>nul | findstr /i "BuildTools" >nul 2>&1
if %ERRORLEVEL% EQU 0 (
    for /f "usebackq delims=" %P in (`"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -products Microsoft.VisualStudio.Product.BuildTools -property installationPath`) do start /wait "" "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" modify --installPath "%P" --add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64 --includeRecommended --quiet --norestart --nocache
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のコンポーネント追加に失敗しました & ping 127.0.0.1 -n 6 >nul & color )
) else (
    winget install --scope machine --id Microsoft.VisualStudio.BuildTools -e --silent --disable-interactivity --force --accept-source-agreements --accept-package-agreements --override "--quiet --wait --norestart --nocache --add Microsoft.VisualStudio.Workload.VCTools --includeRecommended --add Microsoft.VisualStudio.Workload.MSBuildTools --add Microsoft.VisualStudio.Component.VC.CMake.Project --add Microsoft.VisualStudio.Component.VC.Llvm.Clang --add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset --add Microsoft.VisualStudio.Component.Windows11SDK.26100 --add Microsoft.VisualStudio.Component.VC.v143.x86.x64"
    if not "%ERRORLEVEL%"=="0" ( color 0c & echo Build Tools のインストールに失敗しました & ping 127.0.0.1 -n 6 >nul & color )
)

REM 全ユーザー共有の拡張機能フォルダ
if not exist "C:\ProgramData\vscode-extensions" mkdir "C:\ProgramData\vscode-extensions"
icacls "C:\ProgramData\vscode-extensions" /grant "Everyone:(OI)(CI)M" /T

REM スタートメニューのショートカットを --extensions-dir 付きで再作成
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code" rmdir /s /q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code"
if exist "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk" del "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk"
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); $lnk.TargetPath='C:\Program Files\Microsoft VS Code\Code.exe'; $lnk.Arguments='--extensions-dir \"C:\ProgramData\vscode-extensions\"'; $lnk.Save()"
REM ショートカットの検証
powershell -NoProfile -Command "$s=New-Object -ComObject WScript.Shell; $lnk=$s.CreateShortcut('C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio Code.lnk'); Write-Host 'TargetPath:' $lnk.TargetPath; Write-Host 'Arguments:' $lnk.Arguments"

REM ファイル / フォルダ右クリックの「Code で開く」を登録
reg add "HKLM\SOFTWARE\Classes\*\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%1\"" /f
reg add "HKLM\SOFTWARE\Classes\Directory\Background\shell\VSCode\command" /ve /d "\"C:\Program Files\Microsoft VS Code\Code.exe\" --extensions-dir \"C:\ProgramData\vscode-extensions\" \"%V\"" /f

REM --extensions-dir 付きで起動する code.cmd ラッパを作成
REM (%* を echo で書くと対話的 cmd で失われるため、PowerShell で [char]37+'*' を書き出す)
powershell -NoProfile -Command "$pct=[char]37; $q=[char]34; $c='@echo off'+[char]13+[char]10+$q+'C:\Program Files\Microsoft VS Code\bin\code.cmd'+$q+' --extensions-dir '+$q+'C:\ProgramData\vscode-extensions'+$q+' '+$pct+'*'+[char]13+[char]10; [IO.File]::WriteAllText('C:\ProgramData\vscode-extensions\vscode.cmd',$c,[Text.Encoding]::ASCII)"

REM 拡張機能のインストール
set "CODE=C:\Program Files\Microsoft VS Code\bin\code.cmd"
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --uninstall-extension GitHub.copilot-chat
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.python
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.vscode-pylance
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension ms-python.debugpy
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension MS-CEINTL.vscode-language-pack-ja
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension saoudrizwan.claude-dev
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension rust-lang.rust-analyzer
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension tamasfe.even-better-toml
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension anthropic.claude-code
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --install-extension almenon.arepl
"%CODE%" --extensions-dir "C:\ProgramData\vscode-extensions" --list-extensions --show-versions

REM settings.json を作成(自動更新オフ、Python、Claude Code 設定)
if not exist "%APPDATA%\Code\User" mkdir "%APPDATA%\Code\User"
python -c "import json,os;data={'update.mode':'none','update.enableWindowsBackgroundUpdates':False,'extensions.autoUpdate':False,'python.defaultInterpreterPath':r'C:\Program Files\Python312\python.exe','claudeCode.environmentVariables':[{'name':'ANTHROPIC_API_KEY','value':'not-needed'},{'name':'ANTHROPIC_AUTH_TOKEN','value':'ollama'},{'name':'ANTHROPIC_BASE_URL','value':'http://localhost:11434'},{'name':'ANTHROPIC_MODEL','value':'glm-4.7-flash'},{'name':'CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC','value':'1'}]};p=os.path.join(os.environ['APPDATA'],'Code','User','settings.json');open(p,'w',encoding='utf-8').write(json.dumps(data,indent=4));print('Done:',p)"

REM 自動更新の抑止ポリシー(settings.json に加えて、レジストリ側でも明示的にオフ)
reg add "HKLM\SOFTWARE\Policies\Microsoft\VSCode" /v "UpdateMode" /t REG_SZ /d "none" /f
echo === セットアップ完了 ===

2. Python インタプリタの選択

同一マシンに複数の Python がインストールされている場合,VS Code で使用する Python 本体(インタプリタ:Python プログラムを解釈・実行するソフトウェア)を選択する必要がある.

  1. コマンドパレット(コマンド名で機能を呼び出す VS Code の入力欄)を開く(Ctrl+Shift+P
  2. Python: Select Interpreter と入力する
  3. 表示される一覧から,使用する Python(例:C:\Program Files\Python312\python.exe)を選択する.

NVIDIA CUDA Toolkit 12.8のインストール

以下のコマンドを管理者権限コマンドプロンプトで実行する (手順:Windowsキーまたはスタートメニュー → cmd と入力 → 右クリック → 「管理者として実行」)。

REM NVIDIA CUDA Toolkit 12.8 をシステム領域にインストール
winget install --scope machine --id Nvidia.CUDA --version 12.8 -e --silent --disable-interactivity --force --uninstall-previous --accept-source-agreements --accept-package-agreements --override "-s -n"

REM 環境変数TEMP, TMPの設定(一時ファイルの保存先を短いパスに変更)
mkdir C:\TEMP
set "TEMP_PATH=C:\TEMP"
setx TEMP "%TEMP_PATH%" /M >nul
setx TMP "%TEMP_PATH%" /M >nul

PyTorch のインストール

PyTorch がインストール済みの場合、この手順は不要である。管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

REM PyTorch をインストール
set "CUDA_TAG=cu128"
set "PYTHON_PATH=C:\Program Files\Python312"
"%PYTHON_PATH%\Scripts\pip" install --no-user -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/%CUDA_TAG%

必要なライブラリのインストール

管理者権限コマンドプロンプトで以下を実行する。管理者権限のコマンドプロンプトを起動するには、Windows キーまたはスタートメニューから「cmd」と入力し、表示された「コマンドプロンプト」を右クリックして「管理者として実行」を選択する。

pip install transformers timm pillow requests matplotlib opencv-python

本テキストのプログラムでは、matplotlibでの日本語表示にWindows標準搭載のフォント(メイリオ)を指定する。

ResNet-18, 50, 101による画像分類

Pythonプログラム

# プログラム名: ResNet画像分類モデル比較プログラム
# 特徴技術名: ResNet (Residual Networks)
# 出典: He, K., Zhang, X., Ren, S., & Sun, J. (2016). Deep residual learning for image recognition. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 770-778).
# 特徴機能: 残差接続による深層ネットワーク学習。入力を出力に直接加算するスキップ接続により、勾配が浅い層まで伝わりやすくなり、152層規模のネットワークの学習を可能にする技術
# 学習済みモデル: Microsoft ResNet (ImageNet-1k学習済み、1000クラス分類モデル)
#   - ResNet-18: 18層、11.7Mパラメータ、高速推論向け (https://huggingface.co/microsoft/resnet-18)
#   - ResNet-50: 50層、25.6Mパラメータ、精度と速度のバランス (https://huggingface.co/microsoft/resnet-50)
#   - ResNet-101: 101層、44.5Mパラメータ、高精度向け (https://huggingface.co/microsoft/resnet-101)
# 方式設計:
#   - 関連利用技術:
#     - Hugging Face Transformers: 事前学習済みモデルの読み込みと推論API提供
#     - PyTorch: テンソル演算と深層学習の基盤フレームワーク
#     - PIL (Pillow): 画像ファイルの読み込みと前処理
#     - OpenCV: 画像表示とカメラ入力処理
#   - 入力と出力: 入力: 静止画像(ユーザは「0:画像ファイル,1:カメラ,2:サンプル画像」のメニューで選択.0:画像ファイルの場合はtkinterで複数ファイル選択可能.1の場合はOpenCVでカメラが開き,スペースキーで撮影(複数回可能).2の場合はhttps://github.com/opencv/opencv/raw/master/samples/data/fruits.jpg とhttps://github.com/opencv/opencv/raw/master/samples/data/messi5.jpgとhttps://github.com/opencv/opencv/raw/master/samples/data/aero3.jpgを使用)、出力: OpenCV画面で結果表示、処理結果をテキストで表示
#   - 処理手順: 1.画像入力→2.3つのResNetモデル(18/50/101層)を順次読み込み→3.各モデルで画像特徴抽出と分類→4.予測クラスと確信度を計算→5.比較結果を表示
#   - 前処理、後処理: 前処理:画像を224x224にリサイズ、正規化(ImageNet平均・標準偏差)。後処理:logitsをsoftmaxで確率化、最大確率のクラスを選択
#   - 調整を必要とする設定値: MODELS配列(比較するResNetモデルの選択。デフォルトはResNet-18/50/101の3モデル)
# その他の重要事項: ImageNet-1kの1000クラスのみ分類可能。日本語クラス名は非対応。確信度は学習済みモデルの出力であり、正解率とは一致しない
# 前準備: pip install -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
#         pip install transformers pillow opencv-python

import cv2
import tkinter as tk
from tkinter import filedialog
import urllib.request
import os
import torch
from transformers import AutoImageProcessor, ResNetForImageClassification
from PIL import Image
import numpy as np
import time

# 定数定義
MODELS = [
    ('microsoft/resnet-18', 'ResNet-18'),
    ('microsoft/resnet-50', 'ResNet-50'),
    ('microsoft/resnet-101', 'ResNet-101')
]

# 表示設定
FONT_SCALE = 0.7
FONT_THICKNESS = 2
INFO_HEIGHT = 400
TEXT_COLOR = (255, 255, 255)
HIGHLIGHT_COLOR = (0, 255, 0)
BEST_COLOR = (0, 255, 255)

# デバイス設定(GPU/CPU自動選択)
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'使用デバイス: {device}')

# プログラム開始
print('=== ResNet画像分類モデル比較プログラム ===')
print('3つのResNetモデル(ResNet-18/50/101)で画像分類を実行し、結果を比較します')
print('操作方法: カメラモードではスペースキーで撮影、qキーで終了')
print('')

# モデルの事前読み込み
print('モデルを読み込み中...')
loaded_models = []
for model_name, display_name in MODELS:
    processor = AutoImageProcessor.from_pretrained(model_name)
    model = ResNetForImageClassification.from_pretrained(model_name).to(device)
    model.eval()  # 評価モードに設定
    loaded_models.append((processor, model, display_name))
print('モデルの読み込み完了')
print('')


def image_processing(img):
    """画像分類処理を実行"""
    # OpenCVからPIL形式に変換
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    pil_image = Image.fromarray(img_rgb)

    # 処理中の表示
    height, width = img.shape[:2]
    result_img = cv2.copyMakeBorder(img.copy(), 0, INFO_HEIGHT, 0, 0, cv2.BORDER_CONSTANT, value=(0, 0, 0))
    cv2.putText(result_img, 'Processing...', (10, height + 30), cv2.FONT_HERSHEY_SIMPLEX, FONT_SCALE, TEXT_COLOR, FONT_THICKNESS)
    cv2.imshow('ResNet Classification', result_img)
    cv2.waitKey(1)

    # 各モデルで分類実行
    results = []
    for processor, model, display_name in loaded_models:
        # 推論実行
        inputs = processor(pil_image, return_tensors='pt')
        inputs = {k: v.to(device) for k, v in inputs.items()}

        start_time = time.time()
        with torch.no_grad():
            outputs = model(**inputs)
        inference_time = time.time() - start_time

        # 結果取得
        predicted_idx = outputs.logits.argmax(-1).item()
        confidence = outputs.logits.softmax(dim=-1).max().item()
        predicted_class = model.config.id2label[predicted_idx]
        total_params = sum(p.numel() for p in model.parameters())

        # 結果保存
        result = {
            'model': display_name,
            'class': predicted_class,
            'confidence': confidence,
            'params': total_params,
            'inference_time': inference_time
        }
        results.append(result)

        # コンソール出力
        print(f'{display_name}: {predicted_class} ({confidence:.1%}) - '
              f'{inference_time:.3f}s - {total_params:,} params')

    # 結果を画像に描画
    result_img = cv2.copyMakeBorder(img.copy(), 0, INFO_HEIGHT, 0, 0, cv2.BORDER_CONSTANT, value=(0, 0, 0))
    cv2.putText(result_img, '=== ResNet Classification Results ===', (10, height + 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, TEXT_COLOR, 2)

    # 各モデルの結果表示
    for i, result in enumerate(results):
        y_pos = height + 70 + i * 100
        cv2.putText(result_img, f'{result["model"]}:', (10, y_pos), cv2.FONT_HERSHEY_SIMPLEX, FONT_SCALE, HIGHLIGHT_COLOR, FONT_THICKNESS)
        cv2.putText(result_img, f'Class: {result["class"][:30]}', (10, y_pos + 25), cv2.FONT_HERSHEY_SIMPLEX, 0.6, TEXT_COLOR, 1)
        cv2.putText(result_img, f'Confidence: {result["confidence"]:.1%}', (10, y_pos + 50), cv2.FONT_HERSHEY_SIMPLEX, 0.6, TEXT_COLOR, 1)
        cv2.putText(result_img, f'Time: {result["inference_time"]:.3f}s', (10, y_pos + 75), cv2.FONT_HERSHEY_SIMPLEX, 0.6, TEXT_COLOR, 1)

    # 最高確信度のモデルを特定
    best_result = max(results, key=lambda x: x['confidence'])
    cv2.putText(result_img, f'Highest confidence: {best_result["model"]} ({best_result["confidence"]:.1%})',
                (10, height + 380), cv2.FONT_HERSHEY_SIMPLEX, FONT_SCALE, BEST_COLOR, FONT_THICKNESS)

    return result_img


def show_processed_image(img, window_name):
    if img is None:
        print('画像の読み込みに失敗しました')
        return
    cv2.imshow(window_name, image_processing(img))
    cv2.waitKey(0)


print('0: 画像ファイル')
print('1: カメラ')
print('2: サンプル画像')

choice = input('選択: ')

if choice == '0':
    root = tk.Tk()
    root.withdraw()
    paths = filedialog.askopenfilenames()
    if not paths:
        exit()
    for path in paths:
        show_processed_image(cv2.imread(path), 'ResNet Classification')
elif choice == '1':
    cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
    try:
        while True:
            cap.grab()
            ret, frame = cap.retrieve()
            if not ret:
                break
            cv2.imshow('Camera', frame)
            key = cv2.waitKey(1) & 0xFF
            if key == ord(' '):
                show_processed_image(frame, 'ResNet Classification')
            elif key == ord('q'):
                break
    finally:
        cap.release()
elif choice == '2':
    urls = [
        'https://github.com/opencv/opencv/raw/master/samples/data/fruits.jpg',
        'https://github.com/opencv/opencv/raw/master/samples/data/messi5.jpg',
        'https://github.com/opencv/opencv/raw/master/samples/data/aero3.jpg'
    ]
    downloaded_files = []
    for i, url in enumerate(urls):
        filename = f'sample_{i}.jpg'
        try:
            urllib.request.urlretrieve(url, filename)
            downloaded_files.append(filename)
            show_processed_image(cv2.imread(filename), 'ResNet Classification')
        except Exception as e:
            print(f'画像のダウンロードに失敗しました: {url}')
            print(f'エラー: {e}')
            exit()
    # ダウンロードしたファイルの削除
    for filename in downloaded_files:
        try:
            os.remove(filename)
        except OSError:
            pass

cv2.destroyAllWindows()

概要

ResNet(Residual Network)による画像分類の複数モデル比較である。ResNet-18、ResNet-50、ResNet-101の3つのモデルで同一画像を分類し、予測クラス、確信度、推論時間を比較できる。モデルサイズと処理時間のトレードオフを実測して確認できる。

事前準備

上記「共通事前準備」を参照。

プログラムの実行手順

  1. プログラムを実行する
  2. 選択肢から入力方法を選択する
  3. 各モデルの分類結果と処理時間を確認する
  4. 比較結果を分析する

モデル選択による実験要素

ResNet-18: 11.7Mパラメータ。推論が最も速く、ImageNet-1kのTop-1精度は約69.8%。

ResNet-50: 25.6Mパラメータ。Top-1精度は約76.1%。

ResNet-101: 44.5Mパラメータ。Top-1精度は約77.4%。パラメータ数の増加に対する精度の伸びは小さくなる。

体験・実験のアイデア

使用技術の原論文

ResNet: He, K., et al. "Deep residual learning for image recognition." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2016.

ViT-Baseによる画像分類

Pythonプログラム

# ViT画像分類プログラム
#   Vision Transformerによる画像分類
#   論文: "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale" (ICLR 2021)
#   GitHub: https://github.com/google-research/vision_transformer
#   特徴: 畳み込みを使わずTransformerのみで画像分類を行う
#         画像を16x16のパッチに分割し、パッチ間の関係を自己注意機構で計算する
#   学習済モデル: google/vit-base-patch16-224 (ImageNet-21k事前学習、ImageNet-1k微調整、Top-1精度81.1%)
#   前準備: pip install -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
#           pip install transformers pillow requests matplotlib

import torch
from transformers import ViTImageProcessor, ViTForImageClassification
from PIL import Image
import requests
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
import os

# matplotlibの日本語表示設定(Windows標準のメイリオを使用)
plt.rcParams['font.family'] = 'Meiryo'
plt.rcParams['axes.unicode_minus'] = False

# 定数定義
MODEL_NAME = "google/vit-base-patch16-224"
SAMPLE_IMAGE_URL = "http://images.cocodataset.org/val2017/000000039769.jpg"
TOP_K = 5

print("=== ViT画像分類システム ===")
print("1: サンプル画像で試す")
print("2: ローカル画像ファイルを選択")
choice = input("選択してください (1 or 2): ")

# モデル読み込み
print(f"\n読み込み中: {MODEL_NAME}")
processor = ViTImageProcessor.from_pretrained(MODEL_NAME)
model = ViTForImageClassification.from_pretrained(MODEL_NAME)
model.eval()

# 画像取得
if choice == "1":
    response = requests.get(SAMPLE_IMAGE_URL, stream=True)
    response.raw.decode_content = True
    image = Image.open(response.raw).convert("RGB")
    image_source = "サンプル画像"
    print("サンプル画像を使用")
else:
    root = tk.Tk()
    root.withdraw()
    file_paths = filedialog.askopenfilenames(
        title="画像ファイルを選択してください",
        filetypes=[("画像ファイル", "*.jpg *.jpeg *.png *.bmp *.gif"), ("すべてのファイル", "*.*")]
    )
    if not file_paths:
        print("画像が選択されませんでした。プログラムを終了します。")
        exit()

    image = Image.open(file_paths[0]).convert("RGB")
    image_source = os.path.basename(file_paths[0])
    print(f"選択画像: {image_source}")

# メイン処理
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

probabilities = outputs.logits.softmax(dim=-1)[0]
top_probs, top_indices = probabilities.topk(TOP_K)
predicted_class = model.config.id2label[top_indices[0].item()]

# 結果出力
total_params = sum(p.numel() for p in model.parameters())
print(f"\n=== モデル情報 ===")
print(f"モデル: ViT-Base/16")
print(f"パラメータ数: {total_params:,}")
print(f"入力サイズ: 224x224 pixels")
print(f"パッチ数: {(224 // 16) ** 2}")

print(f"\n=== 予測結果 ===")
print(f"最有力候補: {predicted_class}")
print(f"確信度: {top_probs[0].item():.1%}")

print(f"\n=== トップ{TOP_K}予測 ===")
for i, (idx, prob) in enumerate(zip(top_indices, top_probs)):
    class_name = model.config.id2label[idx.item()]
    print(f"{i+1}. {class_name}: {prob.item():.1%}")

print(f"\n画像サイズ: {image.size}")

plt.figure(figsize=(8, 6))
plt.imshow(image)
plt.axis('off')
plt.title(f"処理対象画像: {image_source}")
plt.tight_layout()
plt.show()

print("分析完了")

概要

Vision Transformer(ViT)による画像分類をWindows環境で実行する。CNNとは異なるアーキテクチャによる画像分類の結果を確認し、上位5クラスの予測とその確信度を比較できる。

事前準備

上記「共通事前準備」を参照。

使用方法

  1. プログラムを実行
  2. 選択肢から入力方法を選択
    • 選択肢1:サンプル画像(猫の画像)で動作確認
    • 選択肢2:ローカル画像ファイルを選択(複数選択可能、最初の画像を使用)

モデル仕様

体験・実験のアイデア

使用技術の原論文

Vision Transformer: Dosovitskiy, A., et al. "An image is worth 16x16 words: Transformers for image recognition at scale." International Conference on Learning Representations (ICLR) 2021.

EVA-02による画像分類

Pythonプログラム

# EVA-02による画像分類プログラム
#   ローカル画像またはサンプル画像の分類とTop-K予測結果表示
#   論文: "EVA-02: A Visual Representation for Neon Genesis" (arXiv:2303.11331, 2023 / Image and Vision Computing, 2024)
#   GitHub: https://github.com/baaivision/EVA/tree/master/EVA-02
#   特徴: EVA-CLIPの特徴量を予測対象とするマスク画像モデリングで事前学習したVision Transformer
#         304MパラメータでImageNet-1k Top-1精度90.0%、入力解像度は448x448
#   学習済モデル: eva02_large_patch14_448.mim_m38m_ft_in22k_in1k
#   前準備: pip install -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
#           pip install timm pillow requests matplotlib

import torch
import timm
from PIL import Image
import requests
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt
from pathlib import Path

# matplotlibの日本語表示設定(Windows標準のメイリオを使用)
plt.rcParams['font.family'] = 'Meiryo'
plt.rcParams['axes.unicode_minus'] = False

# 定数定義
MODEL_NAME = "eva02_large_patch14_448.mim_m38m_ft_in22k_in1k"
TOP_K = 5
SAMPLE_IMAGE_URL = "https://images.cocodataset.org/val2017/000000039769.jpg"
IMAGENET_CLASSES_URL = "https://raw.githubusercontent.com/pytorch/hub/master/imagenet_classes.txt"

print("=== EVA-02画像分類システム ===")
print("1: サンプル画像で試す")
print("2: ローカル画像ファイルを選択")
choice = input("選択してください (1 or 2): ")

print(f"\nモデル読み込み中: {MODEL_NAME}")
print("初回実行時は約1.2GBのモデルがダウンロードされる")

# モデルの読み込み
model = timm.create_model(MODEL_NAME, pretrained=True)
model.eval()

# 画像変換の設定(モデルに対応した前処理を自動生成)
config = timm.data.resolve_model_data_config(model)
transforms = timm.data.create_transform(**config, is_training=False)

# ImageNetクラスラベルの取得
response = requests.get(IMAGENET_CLASSES_URL)
classes = response.text.strip().split('\n')

# 画像の取得
if choice == "1":
    response = requests.get(SAMPLE_IMAGE_URL, stream=True)
    response.raw.decode_content = True
    image = Image.open(response.raw).convert("RGB")
    source = "サンプル画像"
    print("サンプル画像を使用")
else:
    root = tk.Tk()
    root.withdraw()

    paths = filedialog.askopenfilenames(
        title="画像ファイルを選択してください",
        filetypes=[("画像ファイル", "*.jpg *.jpeg *.png *.gif *.bmp")]
    )

    if not paths:
        print("画像が選択されませんでした。プログラムを終了します。")
        exit()

    image = Image.open(paths[0]).convert("RGB")
    source = Path(paths[0]).name
    print(f"選択画像: {source}")

# メイン処理
tensor = transforms(image).unsqueeze(0)

with torch.no_grad():
    output = model(tensor)
    probs = torch.softmax(output, dim=1) * 100
    top_prob, top_idx = torch.topk(probs, k=TOP_K)

# 結果出力
params = sum(p.numel() for p in model.parameters())

print(f"\n=== モデル情報 ===")
print(f"モデル: {MODEL_NAME}")
print(f"パラメータ数: {params:,}")
print(f"入力解像度: {config['input_size']}")

print(f"\n=== 予測結果 (Top {TOP_K}) ===")
for i in range(TOP_K):
    idx = top_idx[0][i].item()
    prob = top_prob[0][i].item()
    class_name = classes[idx]
    print(f"{i+1}. {class_name}: {prob:.2f}%")

print(f"\n画像サイズ: {image.size[0]}x{image.size[1]}ピクセル")

# 画像表示
plt.figure(figsize=(8, 6))
plt.imshow(image)
plt.axis('off')
plt.title(f"処理対象画像: {source}")
plt.tight_layout()
plt.show()

print("分析完了")

概要

EVA-02は北京智源人工智能研究院(BAAI)が公開したVision Transformerである。本プログラムでは、3億400万パラメータのLargeモデルを使用して画像分類を実行する。このモデルは公開データのみで学習されており、ImageNet-1kでTop-1精度90.0%を達成している。入力解像度が448×448と大きいため、CPUのみの環境では1枚あたりの推論に数秒を要する。

事前準備

上記「共通事前準備」を参照。timmが未インストールの場合は以下を実行する:

pip install timm

使用方法

  1. プログラムを実行すると、サンプル画像またはローカル画像ファイルの選択画面が表示される
  2. 選択肢1:サンプル画像(猫の画像)をダウンロードして分析
  3. 選択肢2:ローカル画像ファイルを選択(複数選択可能、最初の画像を使用)
  4. モデル情報と上位5つの予測結果が表示される
  5. 各予測結果には、クラス名と確信度(%)が表示される

モデル選択・実験要素

利用可能なEVA-02モデル

プログラム冒頭のMODEL_NAMEを変更することで、異なるサイズのモデルを比較できる。

画像の変更

SAMPLE_IMAGE_URLを変更することで、任意のオンライン画像を分析できる。

SAMPLE_IMAGE_URL = "https://example.com/your-image.jpg"

体験・実験のアイデア

1. モデルサイズ比較実験

2. 画像種別による認識特性

3. 確信度の分析

4. 解像度の影響

使用技術の原論文

EVA-02: Fang, Y., Sun, Q., Wang, X., Huang, T., Wang, X., & Cao, Y. "EVA-02: A Visual Representation for Neon Genesis." arXiv:2303.11331, 2023(Image and Vision Computing, 2024). TIMM: Wightman, R. "PyTorch Image Models." GitHub repository, 2019.

ConvNeXtによる画像分類

Pythonプログラム

# ConvNeXtによる画像分類プログラム
#   論文: "A ConvNet for the 2020s" (CVPR 2022)
#   GitHub: https://github.com/facebookresearch/ConvNeXt
#   特徴: Transformerの設計要素(大きなカーネル、LayerNorm、GELU等)をCNNに導入した構造
#   学習済モデル: facebook/convnext-tiny-224(ImageNet-1k学習、Top-1精度82.1%、28Mパラメータ)
#   前準備: pip install -U numpy torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu128
#           pip install transformers pillow requests matplotlib

import os
import torch
from transformers import AutoImageProcessor, ConvNextForImageClassification
from PIL import Image
import requests
import tkinter as tk
from tkinter import filedialog
import matplotlib.pyplot as plt

# matplotlibの日本語表示設定(Windows標準のメイリオを使用)
plt.rcParams['font.family'] = 'Meiryo'
plt.rcParams['axes.unicode_minus'] = False

print("=== ConvNeXt画像分類システム ===")
print("1: サンプル画像で試す")
print("2: ローカル画像ファイルを選択")
choice = input("選択してください (1 or 2): ")

# モデル設定
MODEL_NAME = "facebook/convnext-tiny-224"
SAMPLE_IMAGE_URL = "http://images.cocodataset.org/val2017/000000039769.jpg"
TOP_K = 5

print("モデルを読み込み中...")
processor = AutoImageProcessor.from_pretrained(MODEL_NAME)
model = ConvNextForImageClassification.from_pretrained(MODEL_NAME)
model.eval()

# 画像の取得
if choice == "1":
    response = requests.get(SAMPLE_IMAGE_URL, stream=True)
    response.raw.decode_content = True
    image = Image.open(response.raw).convert("RGB")
    image_source = "サンプル画像"
    print("サンプル画像を使用")
else:
    root = tk.Tk()
    root.withdraw()
    file_paths = filedialog.askopenfilenames(
        title="画像ファイルを選択してください",
        filetypes=[("画像ファイル", "*.jpg *.jpeg *.png *.gif *.bmp"), ("すべてのファイル", "*.*")]
    )

    if not file_paths:
        print("画像が選択されませんでした。プログラムを終了します。")
        exit()

    # 最初の選択画像を使用
    image = Image.open(file_paths[0]).convert("RGB")
    image_source = os.path.basename(file_paths[0])
    print(f"選択画像: {image_source}")

# 推論実行
inputs = processor(images=image, return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

# 結果取得
probabilities = outputs.logits.softmax(dim=-1)[0]
top_probs, top_indices = probabilities.topk(TOP_K)

# 結果表示
print(f"\n=== 分類結果 ===")
print(f"予測クラス: {model.config.id2label[top_indices[0].item()]}")
print(f"確信度: {top_probs[0].item():.1%}")

print(f"\n=== トップ{TOP_K}予測 ===")
for i, (idx, prob) in enumerate(zip(top_indices, top_probs)):
    print(f"{i+1}. {model.config.id2label[idx.item()]}: {prob.item():.1%}")

print(f"\nモデル: {MODEL_NAME}")
print(f"パラメータ数: {sum(p.numel() for p in model.parameters()):,}")
print(f"画像サイズ: {image.size}")

# 処理した画像を表示
plt.figure(figsize=(8, 6))
plt.imshow(image)
plt.axis('off')
plt.title(f"処理対象画像: {image_source}")
plt.tight_layout()
plt.show()

print("分析完了")

概要

ConvNeXtは2022年に発表された画像分類モデルである。CNNの構造に、大きなカーネルサイズ、LayerNorm、GELU活性化関数、逆ボトルネック構造といったTransformerの設計要素を段階的に導入し、同規模のSwin Transformerと同等以上の精度を達成した。このプログラムでは、事前学習済みConvNeXtモデルによる分類を実行する。

事前準備

上記「共通事前準備」を参照。

使用方法

  1. プログラムを実行する
  2. 選択肢から入力方法を選択
    • 選択肢1:サンプル画像(猫の画像)で動作確認
    • 選択肢2:ローカル画像ファイルを選択(複数選択可能、最初の画像を使用)
  3. 分類結果が表示される

モデル選択・実験要素

MODEL_NAMEを変更することで、以下のモデルを比較できる。いずれもImageNet-1kで学習された224×224入力のモデルである。

実験アイデア

使用技術の原論文

ConvNeXt: Liu, Z., et al. "A ConvNet for the 2020s." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition (CVPR) 2022.

第6章:最新動向

効率化の進展

応用分野の拡大

参考文献

主要技術の原論文

実装ライブラリ

その他の重要技術