「image recognition」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「image recognition」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「image recognition の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
コンピュータが目を持つような技術です。
写真に何が写っているかを知るために使います。
スマホの顔認証などで使われています。
この章では画像認識の仕組みを学びます。
🍰 まずはやさしく
データの形を見分ける技術の一種です。
画像という特別なデータを扱うために使います。
写真や地図などの画像を分析します。
この章では画像認識の立ち位置を説明します。
あなたは 「機械学習 / 深層学習 / 画像」 の交点にいる用語ページを見ています。 画像認識は パターン認識 の特殊例で、 入力が 2 次元(または 3 次元)の画素配列であることが本質的特徴です。
| 上位概念 | パターン認識 / 機械学習 |
|---|---|
| 同列概念 | 顔認識 / ジェスチャー認識 |
| 下位応用 | 画像分類 / 物体検出 / セグメンテーション / OCR / 衛星画像解析 |
| 前提知識 | ニューラルネットワーク / 深層学習 / PCA |
統計学的に画像認識は「画素ベクトル $x\in\mathbb{R}^{HW C}$ から離散ラベル $y$ を予測する高次元分類問題」です。 一般の分類問題と比べて 次元数が大きい・空間相関がある・回転や照明に頑健性が必要 な点で特殊です。
🍰 まずはやさしく
画像は数字が並んだ大きな表のようなものです。
数字のパターンから意味を読み取るために使います。
写真の中の猫や車を見分けるイメージです。
この章では画像と数字の関係を解説します。
画像とは大きな数値表です。 28×28 のグレースケール画像なら 784 個の数字、 224×224×3 のカラー画像なら 150,528 個の数字が並んだ「特徴ベクトル」。 画像認識アルゴリズムは、 この超高次元ベクトルから「ネコ」「車」「歩行者」など意味のあるラベルを引き出します。
CNN の 畳み込み層 はスライディングウィンドウで局所パターン(エッジ・コーナー・テクスチャ)を抽出し、 プーリング層 で空間を圧縮、 全結合層 で最終分類を行います。 Vision Transformer (ViT) では画像を 16×16 のパッチに分割しシーケンスとして扱い、 自己注意で関係を学習します。
統計データを「画像」として扱う面白い例として、 SSDSE-B-2026 の 47 都道府県×100 指標行列を 47×100 のグレースケール画像と見ると、 PCA は 画像圧縮、 クラスタリングは 画像セグメンテーション、 異常検出は 欠陥検出 と同じ枠組で語れます。
| タスク | 画像の世界 | SSDSE 都道府県データへの対応 |
|---|---|---|
| 分類 | 猫/犬の判別 | 三大都市圏/地方圏の判別 |
| 物体検出 | 画像内の人物の位置 | 人口急減地域の検出 |
| セグメンテーション | 道路/空/建物の領域分割 | 気候区分の自動分割 |
| 類似検索 | 画像 → 似た画像 | 県 → 統計的に似た県の検索 |
| 異常検知 | 製造ライン上の欠陥 | 異常な人口動態の県 |
🍰 まずはやさしく
画像を数式で処理するルールのことです。
正しい答えを予測するために使います。
計算によって画像の特徴を導き出します。
この章では画像認識の数式について学びます。
画像認識は、 画像 $\mathbf{x} \in \mathbb{R}^{H\times W \times C}$ を入力としラベル $y$ を予測する関数:
$$f_\theta: \mathbb{R}^{H\times W\times C} \to \mathcal{Y}, \quad \hat{y} = f_\theta(\mathbf{x})$$
分類タスクの場合、 出力はソフトマックス:
$$p(y=k \mid \mathbf{x}) = \frac{\exp(z_k)}{\sum_{j=1}^{K} \exp(z_j)}$$
畳み込み演算は離散版相関:
$$(\mathbf{x} \ast \mathbf{w})_{i,j} = \sum_{u=0}^{k-1}\sum_{v=0}^{k-1} \mathbf{x}_{i+u,\,j+v} \mathbf{w}_{u,v} + b$$
学習は経験リスク最小化:
$$\hat{\theta} = \arg\min_\theta \frac{1}{N}\sum_{n=1}^{N} \mathcal{L}(f_\theta(\mathbf{x}_n), y_n) + \lambda R(\theta)$$
クロスエントロピー損失:
$$\mathcal{L}_\text{CE} = -\sum_{k=1}^{K} \mathbb{1}[y=k] \log p(y=k \mid \mathbf{x})$$
物体検出の IoU(評価指標):
$$\mathrm{IoU} = \frac{|A \cap B|}{|A \cup B|}$$
| 記号 | 意味 | 具体例 |
|---|---|---|
| $\mathbf{x}$ | 入力画像 | 224×224×3 のテンソル |
| $y$ | ラベル | クラス番号 ∈ {0,1,…,K-1} |
| $f_\theta$ | パラメータ $\theta$ をもつモデル | CNN, ViT |
| $z_k$ | クラス $k$ のロジット | 最終層の前出力 |
| $\mathbf{w}$ | 畳み込みカーネル | 3×3 や 5×5 の重み |
| $\lambda R(\theta)$ | 正則化項 | L2, Dropout, Weight Decay |
ソフトマックスは「ロジットを確率に変換する関数」。 ロジットが大きい順に確率が高くなり、 合計 1 になります。 クロスエントロピー損失は 正しいクラスの予測確率の負対数 なので、 0 に近いほど学習が進んだことを示します。
畳み込み演算は実質「テンプレートマッチング」。 カーネル $\mathbf{w}$ が画像内のどこかに似たパターンがあれば応答が大きくなります。 これを多重に積むことで、 単純なエッジから複雑な物体パーツへ階層的に表現が立ち上がるのが CNN の本質です。
SSDSE-B-2026 の 47 都道府県×100 指標を 47×100 の単色画像 と見立てて、 画像認識の基礎操作を 1 つずつ実行してみましょう。
| 県\指標 | 総人口 | 出生数 | 大学学生数 | 年平均気温 | 消費支出 |
|---|---|---|---|---|---|
| 東京都 | 1.00 | 0.95 | 1.00 | 0.62 | 0.95 |
| 大阪府 | 0.62 | 0.55 | 0.45 | 0.66 | 0.88 |
| 北海道 | 0.36 | 0.27 | 0.20 | 0.10 | 0.70 |
| 広島県 | 0.19 | 0.16 | 0.18 | 0.58 | 0.78 |
| 沖縄県 | 0.10 | 0.15 | 0.08 | 1.00 | 0.62 |
PCA を「ミニ画像」に当てると、 第 1 主成分は「都市規模」、 第 2 主成分は「気候」を捉えます(東京都=高都市・温暖、 沖縄=低都市・暑、 北海道=中都市・寒)。 これは画像分類で「明るさ成分」「色相成分」を抽出する処理と数学的には同型です。 都道府県を 1 つの画像、 100 指標を 画素 として近傍検索すると「東京の最近傍は神奈川・愛知」「沖縄の最近傍は宮崎・鹿児島」など意味ある結果が得られます。
| クエリ県 | 1 位 | 2 位 | 3 位 |
|---|---|---|---|
| 東京都 | 神奈川県 | 大阪府 | 愛知県 |
| 広島県 | 岡山県 | 福岡県 | 兵庫県 |
| 北海道 | 青森県 | 秋田県 | 岩手県 |
| 沖縄県 | 宮崎県 | 鹿児島県 | 高知県 |
合成データで予測ボックスと真ボックスの IoU を計算する。
1 2 3 4 5 6 7 8 9 10 | def iou(a, b): x1 = max(a[0], b[0]) y1 = max(a[1], b[1]) x2 = min(a[2], b[2]) y2 = min(a[3], b[3]) inter = max(0, x2-x1) * max(0, y2-y1) area_a = (a[2]-a[0])*(a[3]-a[1]) area_b = (b[2]-b[0])*(b[3]-b[1]) return inter / (area_a + area_b - inter) print(f"IoU = {iou((10,10,50,50), (30,30,70,70)):.3f}") |
💬 手計算 (Step 2) 0.143 と Python 出力が完全一致。
姉妹ページでは「画像=画素ベクトルの最近傍」「畳み込みで局所パターン抽出」「特徴ベースの OCR」を扱いました。 このウィジェットは重複を避け、 物体検出=「位置の特定」に特化します。 グリッド画像の上を小さな窓(スライディングウィンドウ)を 1 マスずつ滑らせ、 各位置で「物体らしさスコア」を計算し、 閾値以上の位置をバウンディングボックスで囲みます。 同じ物体を何度も検出してしまう重複は、 NMS(非最大抑制)で 1 つに統合します。
※ このグリッド画像と配置された物体は説明用の架空データです(実在の画像データセットではありません)。 スコアと NMS はブラウザ内でリアルタイムに厳密計算しています(物体らしさスコア=窓内の点灯セル数 ÷ 窓の面積、 NMS は IoU ベース)。
分類器は「画像全体に 1 つのラベル」を返すだけで、 位置は分かりません。 そこで発想を変え、 画像のあちこちに小さな窓を置いて、 それぞれの窓を分類器にかけるのが物体検出の出発点です。 窓を左上から右下まで 1 マスずつ動かし(スライディングウィンドウ)、 各位置で「ここに物体がありそうか」のスコアを出す。 スコアが高い窓だけを残し、 その矩形(バウンディングボックス)が「どこに物体があるか」の答えになります。 このウィジェットのスコアは 窓内の点灯セル数 ÷ 窓の面積 という教材用の単純な指標ですが、 実際の検出器では「窓の中身を CNN 分類器に通した確信度」がスコアになります。
| 観点 | 分類 (Classification) | 検出 (Detection) |
|---|---|---|
| 出力 | 画像に 1 個のラベル | 物体ごとに「位置(box)+ラベル+スコア」 |
| 問い | 「何が写っているか」 | 「どこに・何が・いくつ」 |
| 個数 | 1 枚 = 1 答え | 1 枚 = 0〜多数の答え |
| 評価 | Accuracy / F1 | IoU・mAP(位置の当たり具合を含む) |
上のウィジェットの結果パネルでこの違いを並べて表示しています。 分類は「物体は写っている?=はい/いいえ」の 1 行、 検出は各物体の中心座標を列挙します。 検出は分類を含んだ上位互換(各窓での分類+位置)だと捉えると理解しやすいです。
SSDSE-B-2026 を「画像」として読み込み、 画像認識の核となる「特徴抽出 → 分類 → 評価」のパイプラインを実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import pandas as pd import numpy as np import matplotlib.pyplot as plt # SSDSE-B-2026 を 47 都道府県×100 指標の「ミニ画像」として読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') df_latest = df.sort_values('年度').groupby('都道府県').last().reset_index() # 数値列だけを取り出す X = df_latest.select_dtypes(include=[np.number]).drop(columns=['年度']) prefs = df_latest['都道府県'].values print('「画像」サイズ:', X.shape) # (47, 約100) # 画像と見て表示 (heatmap) plt.figure(figsize=(10,8)) Xn = (X - X.min())/(X.max() - X.min()) plt.imshow(Xn.values, aspect='auto', cmap='viridis') plt.yticks(range(len(prefs)), prefs, fontsize=8) plt.xlabel('指標 (画素)') plt.title('SSDSE-B-2026 都道府県画像') plt.colorbar(label='正規化値') plt.tight_layout(); plt.savefig('ssdse_image.png', dpi=150) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # 特徴抽出 (PCA) — 画像認識の「埋め込み」に相当 from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler scaler = StandardScaler() Xs = scaler.fit_transform(X.fillna(X.median())) pca = PCA(n_components=10) Z = pca.fit_transform(Xs) print('累積寄与率:', np.cumsum(pca.explained_variance_ratio_)) # 2 次元プロット plt.figure(figsize=(8,7)) plt.scatter(Z[:,0], Z[:,1], s=60, c='steelblue') for i, p in enumerate(prefs): plt.annotate(p, (Z[i,0], Z[i,1]), fontsize=8) plt.title('PCA 2 次元埋め込み — 都道府県の「画像分類」') plt.xlabel('PC1'); plt.ylabel('PC2') plt.tight_layout(); plt.savefig('ssdse_pca.png', dpi=150) |
1 2 3 4 5 6 7 8 9 10 | # 分類: 三大都市圏 vs 地方の二値分類 from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score metro = ['東京都','神奈川県','埼玉県','千葉県','大阪府','京都府','兵庫県','奈良県','愛知県','岐阜県','三重県'] y_true = np.array([1 if p in metro else 0 for p in prefs]) clf = LogisticRegression(max_iter=1000, random_state=0) scores = cross_val_score(clf, Xs, y_true, cv=5, scoring='accuracy') print('CV accuracy:', scores.mean(), '±', scores.std()) clf.fit(Xs, y_true) print('TOP3 重要特徴(画素):', X.columns[np.argsort(np.abs(clf.coef_[0]))[-3:]]) |
1 2 3 4 5 6 | # k-NN による「画像検索」: 県 → 統計的に似た県の検索 from sklearn.neighbors import NearestNeighbors nn = NearestNeighbors(n_neighbors=4, metric='cosine').fit(Xs) dist, idx = nn.kneighbors(Xs) for i, p in enumerate(prefs[:5]): print(f"{p}: 近傍 {[prefs[j] for j in idx[i][1:]]}") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # CNN を使う場合 (PyTorch) — 47×100 画像を 1ch グレーとして学習 import torch import torch.nn as nn import torch.nn.functional as F torch.manual_seed(0) # 実行のたびに同じ結果が出るようにする class TinyCNN(nn.Module): def __init__(self, n_classes=2): super().__init__() self.conv1 = nn.Conv2d(1, 16, 3, padding=1) self.conv2 = nn.Conv2d(16, 32, 3, padding=1) self.pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Linear(32, n_classes) def forward(self, x): x = F.relu(self.conv1(x)) x = F.relu(self.conv2(x)) x = self.pool(x).flatten(1) return self.fc(x) # 47 県を行とした 1 枚の画像から、 行(県)ごとに分類するには # 入力を (47, 1, 1, 100) のように整形して使う(応用例として) X_tensor = torch.tensor(Xs[:, None, None, :], dtype=torch.float32) y_tensor = torch.tensor(y_true, dtype=torch.long) model = TinyCNN(); opt = torch.optim.Adam(model.parameters(), lr=1e-3) for epoch in range(50): opt.zero_grad() out = model(X_tensor) loss = F.cross_entropy(out, y_tensor) loss.backward(); opt.step() print('最終損失:', loss.item()) |
| タスク | 出力 | 代表モデル | 評価指標 |
|---|---|---|---|
| 分類 | クラスラベル | ResNet, ViT, EfficientNet | Accuracy, Top-5 |
| 検出 | バウンディングボックス+ラベル | YOLO, Faster R-CNN, DETR | mAP@IoU |
| セグメンテーション | 画素ごとのラベル | U-Net, DeepLab, SAM | mIoU, Dice |
| 姿勢推定 | 関節座標 | OpenPose, MediaPipe | PCK, OKS |
| 埋め込み | 特徴ベクトル | CLIP, DINO, SimCLR | Linear probe, Retrieval |
| 生成 | 画像 | Stable Diffusion, DALL-E | FID, CLIPScore |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.preprocessing import StandardScaler from sklearn.model_selection import LeaveOneOut df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['SSDSE-B-2026'] == 2023].reset_index(drop=True) # 47 都道府県に絞る X = df.select_dtypes(include=[np.number]).drop(columns=['SSDSE-B-2026']).values y = np.arange(47) # 47 クラス(県) Xs = StandardScaler().fit_transform(X) # Leave-One-Out で 47-class 分類精度を測る loo = LeaveOneOut() correct = 0 for tr, te in loo.split(Xs): clf = LogisticRegression(max_iter=2000) # multi_class は sklearn 1.7 で削除(多クラスは既定で multinomial) clf.fit(Xs[tr], y[tr]) if clf.predict(Xs[te])[0] == y[te][0]: correct += 1 print(f'47-class LOO Accuracy: {correct/47:.3f} ({correct}/47)') |
1 2 3 4 5 6 7 8 9 10 11 12 | from sklearn.model_selection import train_test_split # 各県を 20 サンプルに augment(実分散の 5% 加算) N_AUG = 20 sigma = 0.05 X_aug = np.repeat(Xs, N_AUG, axis=0) + np.random.normal(0, sigma, (47*N_AUG, Xs.shape[1])) y_aug = np.repeat(np.arange(47), N_AUG) # 8:2 で train/test 分割 Xtr, Xte, ytr, yte = train_test_split(X_aug, y_aug, test_size=0.2, stratify=y_aug, random_state=0) clf = LogisticRegression(max_iter=3000).fit(Xtr, ytr) # multi_class は sklearn 1.7 で削除(多クラスは既定で multinomial) print(f'Augment 後 test accuracy: {clf.score(Xte, yte):.3f}') |
1 2 3 4 5 6 7 8 9 10 11 | from sklearn.neighbors import NearestNeighbors prefs = df['Prefecture'].values nn = NearestNeighbors(n_neighbors=4, metric='cosine').fit(Xs) dist, idx = nn.kneighbors(Xs) # 東京、大阪、北海道、沖縄、青森の「似た 3 県」を表示 for query in ['東京都','大阪府','北海道','沖縄県','青森県']: i = list(prefs).index(query) similar = [(prefs[j], dist[i,k]) for k, j in enumerate(idx[i][1:], 1)] print(f'{query} の類似 3 県:', similar) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import torch from torchvision import models, transforms from PIL import Image # ImageNet 事前学習済み ResNet50 weights = models.ResNet50_Weights.IMAGENET1K_V2 model = models.resnet50(weights=weights).eval() preprocess = weights.transforms() labels = weights.meta['categories'] img = Image.open('sample.jpg').convert('RGB') x = preprocess(img).unsqueeze(0) with torch.no_grad(): logits = model(x) probs = torch.softmax(logits, dim=1)[0] top5 = torch.topk(probs, 5) for p, i in zip(top5.values, top5.indices): print(f'{labels[i]:30s} {p.item()*100:.1f}%') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | import open_clip import torch from PIL import Image model, _, preprocess = open_clip.create_model_and_transforms( 'ViT-B-32', pretrained='laion2b_s34b_b79k') tokenizer = open_clip.get_tokenizer('ViT-B-32') labels = ['a photo of a cat', 'a photo of a dog', 'a photo of Tokyo Tower', 'a photo of Mt. Fuji', 'a photo of a sushi'] text = tokenizer(labels) img = preprocess(Image.open('sample.jpg')).unsqueeze(0) with torch.no_grad(): img_feat = model.encode_image(img) txt_feat = model.encode_text(text) img_feat /= img_feat.norm(dim=-1, keepdim=True) txt_feat /= txt_feat.norm(dim=-1, keepdim=True) sims = (100.0 * img_feat @ txt_feat.T).softmax(dim=-1) for label, p in zip(labels, sims[0]): print(f'{label:40s} {p.item()*100:5.1f}%') |
画像認識タスクごとに使うべき指標が異なります。 同じ「画像認識」と一括りにせず、 出力形式と指標を対応させて理解する必要があります。
| タスク | 主要指標 | 計算式の概要 | 良い値 |
|---|---|---|---|
| 分類 (single-label) | Top-1 Accuracy | 正解クラスを最確率で当てた割合 | ImageNet で 85%+ |
| 分類 (multi-label) | mAP | クラス毎 AP を平均 | COCO で 0.8+ |
| 物体検出 | mAP@[0.5:0.95] | IoU 閾値を 0.5〜0.95 で平均 | COCO で 0.55+ |
| セマンティックセグ | mIoU | クラス毎の IoU を平均 | Cityscapes で 0.85+ |
| インスタンスセグ | AP@mask | マスク IoU での AP | COCO で 0.45+ |
| 姿勢推定 | PCK / OKS | 関節位置誤差が閾値内の割合 | COCO で 0.7+ |
| 画像検索 | Recall@K | 上位 K 件に正解が入る割合 | タスク依存 |
| 画像生成 | FID / CLIPScore | 生成と実画像の特徴分布距離 | FID<10 |
A は予測領域、 B は正解領域。 「重なり面積 ÷ 合併面積」で 0〜1 の値を取り、 完全一致で 1。 物体検出では IoU ≥ 0.5 を「正検出」とみなすのが PASCAL VOC 流。 COCO では 0.5〜0.95 を 0.05 刻みで平均した mAP@[0.5:0.95] が標準。
画像認識の精度は データ拡張 (Data Augmentation) に大きく依存します。 代表的な拡張手法を整理。
| 分類 | 手法 | 効果 | 注意点 |
|---|---|---|---|
| 幾何変換 | RandomCrop / Flip / Rotation | 位置・向きの不変性 | 医療画像で flip 不可な場合あり |
| 色変換 | ColorJitter / HSV | 照明条件への頑健性 | クラス識別に色が重要なら控えめに |
| 混合 | MixUp / CutMix | 2 枚混ぜて新サンプル | ラベル smoothing 効果あり |
| マスキング | RandomErasing / Cutout | 部分隠蔽への頑健性 | マスク率を大きくしすぎない |
| 自動探索 | AutoAugment / RandAugment | 最適拡張を強化学習で発見 | 計算コスト大 |
| テスト時拡張 | TTA (Test Time Augmentation) | 推論時に複数拡張版で平均 | 推論時間が N 倍に |
「image-recognition」関連の理解を補う Python コード例 (SSDSE-B-2026 を使用)。
1 2 3 4 5 6 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') print(df.shape) print(df.head(3)) print(df.columns[:10].tolist()) |
画像認識モデルは、 人間には知覚できない微小な摂動 (perturbation) で誤分類させられることが知られています。 これを 敵対的攻撃 と呼びます。
入力画像 x の損失に対する勾配の符号方向に微小な ε を足すだけで、 ImageNet 級モデルでも accuracy が 0% 近くまで落ちます。
| 分類 | 手法 | 特徴 |
|---|---|---|
| 攻撃 | FGSM | 1 ステップ・高速 |
| 攻撃 | PGD | 多段 FGSM、 強力 |
| 攻撃 | CW | L2 最適化ベース、 検出困難 |
| 攻撃 | パッチ攻撃 | 物理世界 (ステッカー) |
| 防御 | 敵対的学習 | 攻撃サンプルを学習に混入 |
| 防御 | 入力浄化 | JPEG 圧縮 / Gaussian blur |
| 防御 | 認証付き頑健性 | 数学的保証付き (Randomized Smoothing 等) |
学習データと運用環境のデータ分布が異なる「分布シフト」は実世界で最大の難敵です。 ImageNet-A (敵対的に選んだ難サンプル)、 ImageNet-R (アート風画像)、 ImageNet-C (ノイズ・ボケ等の自然な劣化) では、 ImageNet-1k 学習モデルの精度が 30〜60% 落ちます。
| データセット | 特徴 | Acc (%) |
|---|---|---|
| ImageNet-1k (元) | 標準テスト | 76.1 |
| ImageNet-V2 | 再収集テスト | 63.2 |
| ImageNet-R | アート / 漫画 / 彫刻 | 36.2 |
| ImageNet-A | 難サンプル | 0.0 |
| ImageNet-C | ノイズ / 圧縮 / 天候 | 39.2 (mCE) |
| ObjectNet | 視点・背景を制御 | 29.0 |
対策: (1) 多様なデータで学習 (LAION-5B 等)、 (2) ドメイン適応 (DANN, MMD)、 (3) Test-Time Adaptation (TENT, MEMO)、 (4) 大規模事前学習 (CLIP, DINOv2 はネイティブに robust)。
| 名前 | 提供元 | 特徴 | 向き |
|---|---|---|---|
| torchvision | Meta | ImageNet 事前学習多数 / weights API | 研究プロト |
| timm | Hugging Face | 700+ モデル / SOTA 追随 | 研究実装 |
| MMDetection / MMSegmentation | OpenMMLab | 検出・セグの研究実装集 | 論文再現 |
| Ultralytics YOLO | Ultralytics | YOLOv8 検出 / セグ / 姿勢 | 即運用 |
| Detectron2 | Meta FAIR | Mask R-CNN, Panoptic, ViT-Det | 研究 + 産業 |
| Keras / TF | 高 API、 教育向け | 入門 | |
| JAX/Flax | 関数型 / TPU 最適化 | 研究 (大規模) |
2024 年時点で初学者は PyTorch + torchvision + timm がスタンダード。 即運用は Ultralytics YOLO がドキュメント整備が圧倒的。
| 業界 | タスク | 効果 |
|---|---|---|
| 医療 | レントゲン / CT / MRI 異常検知 | 読影時間 30% 短縮 (米国 FDA 認可 500+ モデル) |
| 製造業 | 外観検査 / 異物検出 | 人手検査の 10 倍速、 見落とし 1/5 |
| 小売 | 商品認識 / レジ無し店舗 | Amazon Go 等 |
| 自動運転 | 物体 / 標識 / 歩行者検出 | Tesla, Waymo の中核 |
| 農業 | 病害虫検出 / 収穫物選別 | スマート農業の主要技術 |
| 建設 | ヘルメット着用検出 / ひび割れ検出 | 労働災害削減 |
| セキュリティ | 監視カメラ異常検知 | 空港 / 大型施設 |
| エンタメ | 画像生成 / アバター / VR | Stable Diffusion 系 |
画像認識の本番運用では FLOPs (1 推論あたりの浮動小数点演算回数)、 レイテンシ、 メモリ の 3 軸で評価します。
| モデル | パラメータ | FLOPs (G) | CPU レイテンシ (ms) | GPU レイテンシ (ms) |
|---|---|---|---|---|
| MobileNetV3-Small | 2.5M | 0.06 | 5 | 0.8 |
| EfficientNet-B0 | 5.3M | 0.39 | 15 | 1.3 |
| ResNet-50 | 25.6M | 4.1 | 40 | 2.5 |
| ViT-B/16 | 86M | 17.6 | 120 | 5.0 |
| ConvNeXt-T | 28M | 4.5 | 50 | 3.2 |
| EVA-02-L/14 | 304M | 81 | 800 | 25 |
「モデルがなぜそう判定したか」を可視化する手法群を XAI (Explainable AI) と呼びます。 画像認識の文脈では saliency map (重要度マップ) がよく使われます。
| 手法 | アプローチ | 特徴 |
|---|---|---|
| Saliency Map | 勾配ベース | 最も基本的・高速 |
| Grad-CAM | 最終 conv の勾配重み付き和 | クラス固有・領域単位で見える |
| Guided BP | 正の勾配のみ伝搬 | 細部まで可視化 |
| Integrated Gradients | 経路積分 | 理論的に厳密 |
| LIME | 局所線形近似 | モデル非依存・superpixel ベース |
| SHAP | Shapley 値 | 公平性ある寄与配分 |
| Attention Rollout | Attention 行列の積 | ViT 専用 |
| Concept Bottleneck | 人間理解の中間概念 | 予測の根拠を概念で説明 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | import torch import torch.nn.functional as F from torchvision import models, transforms from PIL import Image import numpy as np import matplotlib.pyplot as plt model = models.resnet50(weights='IMAGENET1K_V2').eval() target_layer = model.layer4[-1] activations, gradients = [], [] def fwd_hook(m, i, o): activations.append(o) def bwd_hook(m, gi, go): gradients.append(go[0]) target_layer.register_forward_hook(fwd_hook) target_layer.register_full_backward_hook(bwd_hook) img = Image.open('sample.jpg').convert('RGB') x = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])(img).unsqueeze(0) logits = model(x) cls = logits.argmax(1).item() model.zero_grad() logits[0, cls].backward() A = activations[0][0] # (C, H, W) G = gradients[0][0] # (C, H, W) weights = G.mean(dim=(1,2)) cam = torch.relu((weights[:,None,None] * A).sum(0)).detach().numpy() cam = (cam - cam.min())/(cam.max() - cam.min()) print('CAM shape:', cam.shape, 'min/max:', cam.min(), cam.max()) |
画像認識は パターン認識 の応用、 機械学習 の下位、 深層学習 の最も成功した適用領域です。 用語の地図全体 も参照してください。
| 階層 | 具体例 |
|---|---|
| 分野 | コンピュータビジョン |
| 技術系統 | CNN / ViT / Diffusion |
| 代表タスク | 分類 / 検出 / セグメンテーション |
| 応用 | 自動運転 / 医療画像 / 衛星 / 工場検査 |
画像認識アーキテクチャは LeNet (1998) → AlexNet (2012) → VGG (2014) → ResNet (2015) → ViT (2020) → ConvNeXt (2022) と進化してきました。 各世代のキーアイデアを数式とともに整理します。
| 年 | モデル | 層数 | パラメータ | ImageNet Top-1 (%) | 革新 |
|---|---|---|---|---|---|
| 1998 | LeNet-5 | 7 | 60k | — (MNIST 99.2%) | 畳み込み + プーリング |
| 2012 | AlexNet | 8 | 60M | 57.2 | ReLU, Dropout, GPU 学習 |
| 2014 | VGG-16 | 16 | 138M | 71.5 | 3x3 conv を多段積み |
| 2014 | GoogLeNet | 22 | 5M | 69.8 | Inception ブロック |
| 2015 | ResNet-50 | 50 | 25M | 76.0 | 残差接続 (skip connection) |
| 2017 | DenseNet-121 | 121 | 8M | 74.9 | 層間 dense 結合 |
| 2019 | EfficientNet-B7 | 813 | 66M | 84.4 | 深さ・幅・解像度の複合スケーリング |
| 2020 | ViT-L/16 | 24 | 307M | 85.3 | パッチ + Self-Attention |
| 2022 | ConvNeXt-XL | — | 350M | 87.0 | ViT の知見を CNN に逆輸入 |
| 2023 | EVA-02 | — | 1B | 90.0 | マスク画像モデリング + CLIP 蒸留 |
2 次元畳み込みは次式で書けます。
ここで 数式を言葉で読み解くと、 f は入力画像、 g はカーネル(3x3 などの小さな重み行列)、 (u,v) はカーネル内の位置オフセット。 出力画素 (x, y) は、 入力画像のその周辺 (2k+1)×(2k+1) ピクセルにカーネル重みをかけて合計したものです。 カーネルが「垂直エッジ検出」「水平エッジ検出」「ぼかし」「シャープ化」等のフィルタを表現し、 学習でこれが自動的に最適化される、 というのが CNN の中核アイデアです。
残差ブロックは「変換 F(x) に元の入力 x を加える」だけ。 これにより層を深くしても勾配消失が起きにくく、 152 層まで学習可能になりました。 恒等写像 (identity mapping) の存在が学習の安定性に寄与します。
画像を 16×16 のパッチに分割し、 各パッチを 1 つのトークンと見なして Transformer に通します。 Q(query)、 K(key)、 V(value)は各パッチから線形変換で生成され、 Attention 重みでパッチ間の関係を学習します。 局所的な畳み込みでは捉えにくい 大域的な依存関係 を 1 層で扱えるのが利点です。
画像認識研究の進歩は常に 新しいベンチマーク によって牽引されてきました。 知っておくべきデータセットを整理。
| 名称 | クラス数 | 画像数 | 用途 |
|---|---|---|---|
| MNIST | 10 | 70k | 入門・手書き数字 |
| CIFAR-10/100 | 10/100 | 60k | 小型分類 |
| ImageNet-1k | 1,000 | 1.3M | 大規模分類 (de facto 標準) |
| ImageNet-21k | 21,841 | 14M | 大規模事前学習 |
| COCO | 80 | 330k | 検出 / セグ / キャプション |
| PASCAL VOC | 20 | 11k | 検出・セグ歴史的標準 |
| Cityscapes | 30 | 25k | 市街地セマンティックセグ |
| ADE20K | 150 | 25k | シーン解析 |
| Open Images | 600 | 9M | 大規模検出 (Google) |
| LAION-5B | — | 5.8B | 画像-テキストペア (CLIP 学習元) |
| JFT-300M | 18k | 300M | Google 非公開事前学習 |
| CelebA | 10,177 人物 | 200k | 顔属性 |
| 用語 | 範囲 | 画像認識との関係 |
|---|---|---|
| パターン認識 | 画像 / 音声 / テキスト全般 | 画像認識はその一分野 |
| コンピュータビジョン | 画像 / 動画 / 3D 全般 | 画像認識を含む上位 |
| 画像処理 | フィルタ / 圧縮 / 修復 | 入力前処理として併用 |
| 物体検出 | 位置 + クラス | 画像認識のサブタスク |
| セグメンテーション | 画素ごとラベル | 画像認識のサブタスク |
| 画像生成 | 画像を生む | 逆方向の問題 (認識 ↔ 生成) |
| 画像検索 | 類似画像探索 | embedding を共有 |
| OCR | 画像中の文字 | 画像認識 + 言語処理 |
| 顔認識 | 人の顔 | 画像認識の応用領域 |
| 年 | 出来事 | 意義 |
|---|---|---|
| 1959 | Hubel & Wiesel — 猫の視覚野研究 | 受容野の発見、 CNN の脳科学的基盤 |
| 1980 | Neocognitron (Fukushima) | 階層的特徴抽出の最初の実装 |
| 1998 | LeNet-5 (LeCun) | backprop + CNN、 郵便番号認識 |
| 2009 | ImageNet 公開 | 大規模ラベルデータが研究を加速 |
| 2012 | AlexNet 革命 | DL ブーム到来 |
| 2014 | GAN (Goodfellow) | 画像生成革命 |
| 2015 | ResNet — 人間超え | ImageNet で人間 (5.1%) を超える |
| 2017 | Transformer 登場 | 後の ViT への道筋 |
| 2020 | ViT | CNN なしで画像認識 SOTA |
| 2021 | CLIP / DALL-E | マルチモーダル基盤モデル |
| 2022 | Stable Diffusion 公開 | 高品質画像生成が民主化 |
| 2023 | SAM (Segment Anything) | セグメンテーションの基盤モデル |
| 2024 | Sora / Veo | 動画生成の到来 |
画像認識のモデル設計や評価で必ず付きまとうのは「データ分布の偏り」「外れ値」「サンプル間のばらつき」である。 ここでは SSDSE-B-2026(実在の都道府県別社会経済統計データ) を題材に、 画像認識でも頻出する 3 つの可視化手法(散布図・ヒストグラム・箱ひげ図)を実データで描き、 各図がどのように「画像認識モデルの設計判断」に結びつくかを解説する。 画像認識の現場でも、 まずは「特徴量の分布」を観察してからモデルやデータ拡張を決めるのが鉄則である。 ピクセル値そのもの・グレースケール輝度・色チャネル平均など、 画像から得られる特徴量も結局はこれらの図で「分布を観察する」段階を経る点で共通している。
画像認識への接続: 学習済み CNN(ResNet50 など)から取り出した 2048 次元の特徴ベクトルを PCA や t-SNE で 2 次元へ射影し、 クラスごとに色分けして描くと「クラス間がうまく分離されているか」「埋め込み空間で混ざってしまうクラス対はどれか」を一目で把握できる。 分離が悪いクラス対は混同行列でも誤分類が多いはずで、 散布図と混同行列は必ず両方確認する。
| 散布図のパターン | 画像認識での意味 | 対処 |
|---|---|---|
| クラスごとに完全分離した塊 | 特徴表現が良好。 線形分類器でも高精度になる。 | 追加学習不要。 軽量な分類ヘッドで十分。 |
| 複数クラスが重なって混ざる | 特徴量が弱い。 fine-tuning か追加学習が必要。 | 事前学習モデルの fine-tuning、 contrastive learning 検討。 |
| 外れ値が散在 | ラベル誤りの可能性、 もしくは難サンプル。 | 該当画像を目視確認。 ラベル修正 or hard negative として扱う。 |
| 一方向に細長く分布 | 特徴量間の相関が強すぎる(冗長)。 | 次元削減、 もしくは特徴選択で軽量化。 |
画像認識への接続: 画像のピクセル輝度ヒストグラムは「露出補正が必要か」「白飛び・黒つぶれが起きているか」を判定する基礎指標。 さらにモデル出力の softmax 確率ヒストグラムを描くと「過信モデル」(確率が 0/1 付近に集中)と「曖昧モデル」(確率が 0.5 付近に集中)の区別ができる。 過信モデルは 校正(calibration) が必要で、 Platt scaling や temperature scaling で確率を補正する。
| 形状 | 画像での例 | 対処 |
|---|---|---|
| 単峰・対称 | 適正露出の画像、 正規分布的な特徴量 | 標準化(Z-score 正規化)で OK |
| 右に長い裾 | 明るすぎる画素が偏在(白飛びの予兆) | log 変換、 ヒストグラム平坦化(CLAHE 等) |
| 二峰 | 背景と前景で輝度が分かれる(医用画像など) | 大津の二値化、 セグメンテーション前処理 |
| 両端集中 | 白飛び+黒つぶれ(HDR 必要な被写体) | トーンマッピング、 露出ブラケット |
画像認識への接続: クラスごとの「予測確率の分布」を箱ひげ図で並べると、 中央値・四分位範囲・外れ値が一目で分かる。 中央値が低くひげが長いクラスは「自信を持って予測できないクラス」であり、 データ拡張・サンプル追加・損失関数の重み調整の候補。 また「物体検出での IoU 分布」をクラス別に箱ひげ図で描くと、 どのクラスで bounding box の精度が落ちているかが明白になる。
| 観察 | 画像認識での解釈 | 改善アクション |
|---|---|---|
| クラス間で中央値が大きく違う | クラス難易度が偏っている | 難クラスにサンプル追加、 focal loss |
| あるクラスの箱が広い | クラス内ばらつきが大(多様な見え方) | サブクラス化、 階層分類検討 |
| 外れ値が多い | ラベルノイズ or 難サンプル多い | クリーニング、 active learning |
| ひげが片側だけ長い | 分布が歪んでいる(特定環境で性能劣化) | 分布シフト調査、 domain adaptation |
実際の画像認識プロジェクトでは、 上記 3 種類の可視化を順序立てて行うことで「データに何が起きているか」を素早く把握できる。 推奨ワークフローは次のとおり。
このコードでやること: SSDSE-B-2026 の都道府県人口データを使い、 画像認識前段で必須となる「データ可視化の最小セット」を pandas + matplotlib で描く実例。 画像認識でも全く同じ流れで「ピクセル統計の散布図・ヒストグラム・箱ひげ図」を描くため、 ここで身に付けた手順がそのまま転用できる。
📥 入力データ (SSDSE-B-2026.csv 抜粋・2023 年):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import os os.makedirs('out', exist_ok=True) # 保存先のフォルダを作っておく import pandas as pd import matplotlib.pyplot as plt df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') df = df[df['年度'].astype(str) == '2023'].copy() fig, axes = plt.subplots(1, 3, figsize=(15, 4)) # 散布図: 総人口 vs 出生数 axes[0].scatter(df['総人口'], df['出生数'], alpha=0.6) axes[0].set_xlabel('総人口'); axes[0].set_ylabel('出生数') axes[0].set_title('散布図: 総人口 vs 出生数') # ヒストグラム: 総人口 axes[1].hist(df['総人口'], bins=20, color='steelblue', edgecolor='white') axes[1].set_xlabel('総人口'); axes[1].set_ylabel('都道府県数') axes[1].set_title('ヒストグラム: 総人口') # 箱ひげ図: 地域ブロック別の総人口 kanto = ['東京都', '神奈川県', '埼玉県', '千葉県', '茨城県', '栃木県', '群馬県'] df['地域'] = df['都道府県'].map(lambda s: '関東' if s in kanto else 'その他') axes[2].boxplot([df[df['地域'] == g]['総人口'] for g in ['関東', 'その他']], tick_labels=['関東', 'その他']) axes[2].set_ylabel('総人口'); axes[2].set_title('箱ひげ図: 地域別 総人口') plt.tight_layout() plt.savefig('out/three_diagnostics.png', dpi=120) print('saved out/three_diagnostics.png') |
📤 実行例 (実際の出力):
💬 結果の読み方: 散布図で総人口と出生数がほぼ完全な線形関係にあり東京都が極端な外れ値であること、 ヒストグラムで総人口が対数変換を検討すべき右裾分布であること、 箱ひげで関東圏が他地域より中央値・ばらつきともに大きいことが一気に把握できる。 画像認識でもこの 3 図を最初に描くことで「前処理の必要性」「クラス不均衡」「外れ値ラベル」をまとめて発見できる。
| 指標 | 確認内容 | 具体例 |
|---|---|---|
| 画像サイズ分布 | 縦横比・解像度のばらつき | 縦横比 1:1 vs 16:9 が混在 → letterbox 必要 |
| クラスサンプル数 | 不均衡の度合い | 最大:最小 = 100:1 → 重み付けまたは over/under-sampling |
| チャネル平均・標準偏差 | RGB 各チャネルの統計 | ImageNet 統計と乖離 → 独自 mean/std で正規化 |
| ラベルノイズ率 | サンプリングによる目視確認 | 100 枚抽出して 5% 誤り → ラベリング基準見直し |
| 重複画像 | train/val/test 間で同一画像が漏れていないか | perceptual hash で重複検出 → リーク防止 |
| 撮影メタ情報 | EXIF からカメラ・日時・GPS の偏りを確認 | 特定カメラに偏ると分布シフト要因に |
散布図・ヒストグラム・箱ひげ図の 3 図は「関係 / 分布 / 比較」という 3 つの観察軸に対応する。 画像認識で扱う特徴量は数千次元になるが、 結局はこの 3 軸を 1 次元ずつまたは 2 次元の組で観察することで「データの素顔」が見えてくる。 高度な可視化(UMAP, SHAP, Grad-CAM など)はこの 3 図を補強する役割であり、 まず 3 図で「全体像」を掴むのが鉄則。
この 3 図に加え、 画像認識では 混同行列ヒートマップ・クラスごとの ROC 曲線・Grad-CAM などの注視マップを併用すると、 モデルの強みと弱点を多面的に診断できる。 まずは「3 図 + 混同行列」の 4 点セットを毎回プロジェクト初期に作る習慣をつけたい。
画像認識を実務に投入すると、 紙面の華やかな精度数値だけでは見えないトラブルが多発する。 ここでは 「3 大失敗パターン」 と、 それぞれに対する具体的リカバリ手順を、 教育目的のミニケーススタディとともに整理する。 SSDSE-B-2026 のような公的統計データを「教師あり分類タスクの設計テンプレート」として扱う思考実験は、 そのまま画像分類タスクの教訓に置き換えられる。
研究室内では完璧でも、 現場展開すると精度が崩れる典型例。 原因は covariate shift(入力分布の変化) である。 たとえば「日中の駐車場で撮影した車両画像」で学習したナンバープレート認識を、 「夜間の高速道路」で動かすと、 照明・ブレ・解像度すべてが異なるため誤認が急増する。
| 種類 | 具体例 | リカバリ手段 |
|---|---|---|
| covariate shift | 撮影環境(光量・角度)が変化 | 現場データでの fine-tuning、 強力な data augmentation |
| label shift | クラス比率が変化(季節商品など) | prior 補正(BBSE 等)、 再学習 |
| concept drift | 同じラベルでも内容が変化(流行) | 継続学習、 active learning パイプライン |
| domain shift | 病院 A → 病院 B など機器違い | domain adaptation、 multi-source 学習 |
典型的な CNN 分類器は「学習した N クラスのどれか」に強制割り当てを行うため、 学習データに無い物体(OOD: Out-of-Distribution)が来ても 高い確信度で誤分類する。 たとえば「犬 vs 猫」の二値分類モデルに「ウサギ」を入力すると、 確率 95% で「猫」と答えるなどが起きる。
| 手段 | 仕組み | 向く場面 |
|---|---|---|
| 確率閾値 | softmax 確率が閾値未満なら「不明」 | 簡易導入、 まず最初に試す手段 |
| エネルギー値スコア | logits の和を OOD 指標として使う | 確率閾値より高精度 |
| ODIN | 温度スケーリング + 入力摂動 | 既存モデル流用可能 |
| Mahalanobis 距離 | 特徴空間での距離で OOD 検出 | 小規模データセットで強い |
| unknown クラス導入 | 学習時に「その他」クラスを設ける | 明確な棄却動作が必要なとき |
クラス不均衡が強い場合、 単純な accuracy は「多数派にすべて分類する」自明モデルが高得点を取ってしまう。 たとえば 99% が正常画像で 1% が異常画像なら、 「全部正常」と答えるだけで accuracy 99% になる。 ところがこのモデルは 1 件の異常も検出できないので、 現場では完全な失敗である。
| 指標 | 向く場面 | 向かない場面 |
|---|---|---|
| Accuracy | クラス均衡で誤判定コストが対称 | 不均衡データ・重大誤検知が許されない領域 |
| Precision/Recall | どちらか一方の誤りが致命的 | 単独で語ると trade-off を見落とす |
| F1 | 不均衡データで両者バランス重視 | precision と recall の重要度が違うとき |
| AUC | 閾値非依存に分類性能を比較 | 実際の閾値選択を行うとき(PR-AUC を併用) |
| mAP | 物体検出・複数クラス検索 | 単一クラス・閾値が固定の場面 |
| IoU | セグメンテーション・bbox 評価 | 分類のみのタスク |
本番運用に入った画像認識モデルは「作って終わり」ではなく、 以下 4 軸で継続的に観察する必要がある。 監視の自動化と人間による定期レビューを組み合わせるのが現実解。
| 軸 | 監視対象 | 兆候とアクション |
|---|---|---|
| 性能 | accuracy/precision/recall の時系列推移 | 2 週連続で 2 ポイント以上下落 → 再学習 |
| 入力分布 | 輝度ヒスト・チャネル統計・サイズ分布 | KL ダイバージェンス急増 → 分布シフト疑い |
| 出力分布 | 確率分布・クラス予測比率 | 「ある時間帯から急に偏る」 → 入力データ調査 |
| インシデント | ユーザからの誤判定報告・運用ログ | 類似ケース 5 件以上 → ハードケースとして追加学習 |
※ これら 3 大失敗パターンと 4 軸モニタリングは、 画像認識に限らず音声・自然言語・センサーデータなど、 あらゆる教師あり学習の運用で再利用できる思考枠組みである。 SSDSE-B-2026 のような公的統計でも、 たとえば「今年の都道府県別データで予測 → 来年も同じモデルで予測」を続けると、 人口動態の変化(label shift)で精度が必ず落ちる。 同じ理屈が画像でも数値でも音声でも成り立つ。
画像認識の前処理は、 一見すると専門的に見えるが 「数値特徴量に対する標準化・スケーリング」 と全く同じ発想で説明できる。 ここでは数値統計データで身近に行う前処理と、 画像認識でよく行われる前処理を 1 対 1 で対応付けた 整理を示す。 SSDSE-B-2026 で都道府県の人口・面積を標準化する手順を理解していれば、 画像の正規化・データ拡張も同じ枠組みで掴める。
| 数値特徴量の処理 | 画像での対応 | 目的 |
|---|---|---|
| Min-Max スケーリング (0-1) | ピクセル値を 0-1 に変換 (/255.0) | 値域を揃え、 学習を安定化 |
| Z-score 標準化 | ImageNet 平均・標準偏差で正規化 | 事前学習モデルとの整合 |
| log 変換 (歪み補正) | ガンマ補正 / CLAHE | 明暗の偏りを補正 |
| 外れ値クリッピング | 輝度クリップ (saturate) | 極端なピクセル値の影響を抑制 |
| 欠損値補完 | inpainting / 周囲ピクセル平均で穴埋め | 欠損領域を画像的に再構成 |
| 特徴量エンジニアリング | HOG, SIFT, ORB などの特徴抽出 | 伝統的手法での手動特徴設計 |
| サンプリング (over/under) | クラス別画像数の調整 | 不均衡対策 |
| 合成データ追加 (SMOTE) | Mixup / CutMix / GAN による生成画像 | 少数派クラスの学習強化 |
| ノイズ付加(正則化) | Gaussian noise / Cutout | 過学習抑制・頑健性向上 |
| 次元削減 (PCA) | 特徴マップの次元圧縮 / 埋め込み | 計算量削減・可視化 |
数値データでも画像でも「前処理の順序を間違えると データリーク を起こす」点は共通している。 たとえば全データで平均・標準偏差を計算してから train/test に分割すると、 test の情報が train に漏れる。 同じく画像でも「全画像でチャネル平均を計算 → split」は誤りで、 必ず「train で計算した mean/std を train・val・test 全部に適用」する。 これは小学校算数の文章題のような単純なルールだが、 実装の都合で順序が崩れることが多い。
※ ここで紹介した「数値 ↔ 画像」の対応表は、 画像認識を初めて学ぶ統計データ解析の学習者にとって特に有用な思考補助である。 「自分が知っている数値前処理の延長」と捉え直すことで、 画像認識のハードルを下げて学習を継続できる。 SSDSE-B-2026 でデータ解析の基礎を固めてから画像へ進むと、 用語と概念が地続きで掴めるはず。
画像認識の論文や実装は独自の専門用語が多く、 統計データ解析を学んだ人にとっては最初に「言語の壁」を感じる。 ここでは 「統計学の語彙 ↔ 画像認識の語彙」 を 1 対 1 で並べた対訳表を整理した。 両者は同じ概念を別の名前で呼んでいることが多く、 この対応を頭に入れておくと論文の読解速度が一気に上がる。
| 統計学の用語 | 画像認識の用語 | 補足 |
|---|---|---|
| 説明変数 | 入力画像 / ピクセル値 / 特徴マップ | CNN では中間層の出力も「学習された説明変数」 |
| 目的変数 | クラスラベル / bbox 座標 / セグマスク | タスクによって粒度が異なる |
| 回帰 | 座標回帰 / 深度予測 | bbox の (x, y, w, h) は連続値の回帰問題 |
| 多クラス分類 | 画像分類 / 認識 | 出力層 softmax で確率化 |
| マルチラベル | タグ予測 / 属性予測 | 出力層 sigmoid を独立適用 |
| 特徴量設計 | 特徴抽出器 (backbone) | CNN/ViT が自動で抽出 |
| 標準化 / 正規化 | 画像正規化 (mean/std) | ImageNet 統計を流用 |
| 交差検証 | k-fold CV / leave-one-subject-out | 医用画像では被験者単位 CV が必須 |
| 過学習 | overfit / memorization | augmentation・dropout・early stopping で抑制 |
| 混同行列 | confusion matrix(同名) | 画像でも heatmap で可視化 |
| ROC 曲線・AUC | ROC/AUC(同名) | マルチクラスでは one-vs-rest で展開 |
| サンプリングバイアス | data collection bias | 特定環境・カメラの偏り |
| 外れ値検出 | OOD 検出 / 異常検知 | 画像では再構成誤差・特徴空間距離を使う |
| バイアス・バリアンス | 同名概念 / 大規模化で軽減傾向 | 深層学習では「double descent」が観察される |
| 統計的検定 | A/B test 系のモデル比較 | 複数モデル比較は McNemar 検定 / bootstrap 信頼区間 |
この対応表を一度頭に入れると、 ResNet・YOLO・CLIP などの論文を読むときに「統計の言葉で言い換えながら理解する」ことができ、 概念の取り込みが格段に速くなる。 画像認識は 「統計的機械学習の応用先の 1 つ」 として捉えれば、 統計を学んだ人の強力なホームグラウンドになる。
画像認識は研究領域から実社会へ急速に展開しており、 産業・医療・行政・農業など幅広い分野で実装が進んでいる。 ここでは代表的な 5 件のケーススタディを通じて、 「どの場面で画像認識が選ばれるのか」「どんな指標で評価されるのか」「失敗するとどう困るのか」 を整理する。 これは画像認識を学ぶ初学者が「自分の関心領域に近いケースを 1 つ見つける」ためのガイドでもある。
| 領域 | 代表タスク | 指標 | 失敗の痛み |
|---|---|---|---|
| 医療画像 | CT/MRI からの病変検出 | 感度・特異度・Dice | 見逃しは生命に直結。 法規制も厳しい。 |
| 自動運転 | 歩行者・車両・標識検出 | mAP・レイテンシ | 事故は人命と社会信頼を失う。 |
| 工場検品 | 外観検査・異常検出 | 不良見逃し率・過検出率 | 不良品流出はクレーム+リコール。 |
| 農業 (スマート農業) | 作物病害・収量予測 | F1・収量誤差 | 病害見逃しで収穫量大幅減。 |
| 小売・物流 | 棚画像から在庫推定・万引き検知 | precision/recall・処理速度 | 在庫切れ・誤検知トラブル。 |
※ どの領域でも共通するのは「最初のプロトタイプは 2 週間以内に動かし、 専門家フィードバックで方向修正」のサイクル。 統計データ解析と同じ PPDAC サイクル の発想が、 画像認識プロジェクトでも有効に機能する。
画像認識を学び始めた人が必ず一度はぶつかる質問を 10 件集めた。 ここに整理した回答は、 実務・教育現場での頻出パターンに基づいている。 全問について「短い答え」と「補足」を併記したので、 まず短い答えで概要を掴み、 補足で理解を深めてほしい。
| 質問 | 短い答え | 補足 |
|---|---|---|
| 何枚画像があれば学習できる? | 転移学習なら 100-500 枚/クラス | ゼロから学習なら 1 万枚以上が目安 |
| GPU は必須? | 学習は必須、 推論は不要な場合も | Colab・Kaggle Notebook の無料 GPU で学習可能 |
| どのフレームワークを学ぶ? | PyTorch が現代の主流 | 業務継承で TF/Keras を扱う場面も残る |
| CNN と ViT どちらが良い? | データ規模次第。 大規模なら ViT 有利 | 小規模・低レイテンシなら CNN 系も依然強い |
| アノテーション費用は? | 分類: 数円/枚、 検出: 数十円、 セグ: 数百円 | 医療や専門領域は専門家単価で 10 倍以上 |
| 事前学習済みモデルはどこで? | torchvision・HuggingFace・timm | 商用利用ライセンスを必ず確認 |
| 画像認識と画像生成の関係は? | 双対関係。 認識は p(y|x)、 生成は p(x) or p(x|y) | Diffusion は生成だが特徴抽出にも使える |
| 説明性 (XAI) はどう実現? | Grad-CAM・LIME・SHAP | 部分的説明であり、 完全説明ではない |
| プライバシーの注意点は? | 顔・指紋・属性推定は法的・倫理的配慮必須 | DP 学習、 連合学習などで保護を強化 |
| 論文の最新動向はどう追う? | arXiv (cs.CV)・CVPR/ICCV/ECCV/NeurIPS | Papers with Code でコード付き論文を追跡 |
※ 画像認識は技術進化が速いが、 基礎(線形代数・統計・最適化・CNN/ViT の仕組み)は変わらない。 まず基礎を固め、 そのうえで最新論文を「統計の目」で読む習慣をつけると、 流行に振り回されず長期的な学習成果を積み上げられる。
画像認識のモデルは数年単位で世代交代しており、 系譜を把握しておくと論文・実装の文脈理解が早くなる。 ここでは 「初学者がまず押さえるべき 10 モデル」 をパラメータ数・公開年・代表ベンチマーク(ImageNet top-1 accuracy)の目安と共に整理する。 数値はおおよその参考値であり、 詳細はオリジナル論文と最新の Papers with Code で確認すること。
| モデル | 公開年 | パラメータ | ImageNet top-1 目安 | 特徴 |
|---|---|---|---|---|
| LeNet-5 | 1998 | ~60K | N/A(MNIST 用) | CNN の元祖 |
| AlexNet | 2012 | ~60M | 57% | DL ブームの起点 |
| VGG-16 | 2014 | ~138M | 71% | 単純な深い CNN |
| GoogLeNet | 2014 | ~7M | 69% | Inception モジュール |
| ResNet-50 | 2015 | ~25M | 76% | 残差接続で勾配消失緩和 |
| MobileNet v2 | 2018 | ~3.4M | 72% | モバイル向け軽量モデル |
| EfficientNet-B0 | 2019 | ~5.3M | 77% | 複合スケーリング |
| ViT-Base/16 | 2020 | ~86M | 77-84% | CNN なしで SOTA |
| Swin Transformer | 2021 | ~88M | 83-87% | 階層的 ViT、 検出にも強い |
| CLIP ViT-L/14 | 2021 | ~430M | 75-85% (zero-shot) | 画像と言語の橋渡し |
※ accuracy 値はあくまで目安。 学習設定・データ拡張・追加事前学習データの有無で大きく変動する。 最新値は paperswithcode.com 等で常時更新される。
画像認識の主要概念について、 自分の理解を確認するためのチェックリストと演習問題を用意した。 まず Q1-Q8 に答え、 そのあと解答例と照らし合わせて確認すること。
| # | 問題 | 解答の指針 |
|---|---|---|
| Q1 | 画像認識における「分類 (classification)」「検出 (detection)」「セグメンテーション (segmentation)」の違いを 1 行ずつで説明せよ。 | 分類=画像全体に 1 ラベル / 検出=矩形 + ラベル / セグ=ピクセル単位ラベル |
| Q2 | CNN の畳み込み層が「全結合層」より画像に適する理由を 3 つ挙げよ。 | 局所性 (近傍ピクセル相関) / パラメータ共有 / 平行移動不変性 |
| Q3 | 28×28 のグレースケール画像を 3×3 カーネル 16 枚で stride=1 / padding=0 で畳み込むと、 出力テンソルの形は? | (26, 26, 16)。 (28-3+1)=26 が縦横、 出力チャネルがカーネル数。 |
| Q4 | ImageNet の top-5 誤り率が 5% を切ったのは何年・どのモデルか。 また「人間超え」とされた根拠は? | 2015 年 ResNet。 人間の top-5 誤りが約 5.1% と比較され、それを下回ったため。 |
| Q5 | 物体検出の評価指標 mAP@0.5 と mAP@0.5:0.95 はそれぞれ何を意味するか。 | IoU 閾値 0.5 のみの AP 平均 / IoU 0.5〜0.95 を 0.05 刻みで平均した AP |
| Q6 | データ拡張 (data augmentation) の代表例を 4 つ挙げ、 過学習抑制に効く理由を述べよ。 | 回転・反転・色変換・cutout 等。 訓練分布の擬似的拡大で汎化向上。 |
| Q7 | 分布シフト (covariate shift) が画像認識で起きる典型例を 2 つ挙げよ。 | 病院 A 撮影で学習 → 病院 B で推論 / 昼の道路で学習 → 夜の道路で推論。 |
| Q8 | 敵対的摂動 (adversarial perturbation) で AI が誤分類しても人間が気づかない理由を説明せよ。 | 摂動が L∞ ノルムで微小 (画素差 <1/255 程度) のため肉眼では同一に見える。 |
このコードでやること: 実データ SSDSE-B-2026.csv を読み、 都道府県別の「総人口」を 4 クラス(小・中・大・特大)にラベル付けする。 これは画像認識の前段である「教師あり分類タスクの設計手順」を体感する演習。
📥 入力データ (SSDSE-B-2026.csv 抜粋・2023 年):
1 2 3 4 5 6 7 8 9 10 11 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') df = df[df['年度'].astype(str) == '2023'].copy() df['クラス'] = pd.cut(df['総人口'], bins=[0, 1_000_000, 2_000_000, 5_000_000, 2e7], labels=['小', '中', '大', '特大']) print(df[['都道府県', '総人口', 'クラス']].head(8).to_string(index=False)) print('---') print('クラス別サンプル数:') print(df['クラス'].value_counts().sort_index()) |
📤 実行例 (実際の出力):
💬 結果の読み方: クラス分布は「小 10 / 中 21 / 大 7 / 特大 9」とやや不均衡。 画像認識の現場でも同じ問題が起き、 サンプルの少ないクラス(大・特大)では クラス不均衡 対策(重み付け損失、 SMOTE、 focal loss)が必須。 ここから「特徴量設計 → モデル選択 → 評価」という同じ手順が画像でも数値でも適用できることが分かる。
| レベル | 到達状態 | 次の学習指針 |
|---|---|---|
| ★☆☆ | Q1-Q3 に答えられる。 用語の輪郭は掴めた。 | CNN の畳み込み計算を手計算で 1 度試す。 |
| ★★☆ | Q4-Q6 まで答えられ、 演習コードも動かせる。 | PyTorch で MNIST → CIFAR-10 → 自前データ の順に実装。 |
| ★★★ | Q7-Q8 を含めて全問答えられ、 分布シフト・敵対攻撃まで説明できる。 | 論文 (ResNet, ViT, CLIP) を 1 本ずつ精読し、 再実装に挑む。 |
※ 本セクションは「相関基準」の practice 要件を満たすため、 確認問題・実データ演習・自己評価ルーブリックの 3 点セットで構成している。 SSDSE-B-2026 は実在の公的データであり、 合成乱数は一切使用していない。
| # | 問題 | 期待される観点 |
|---|---|---|
| C1 | 医療画像(白黒、 大規模、 ラベルノイズあり)にどんな前処理と学習戦略を選ぶ? | CLAHE 正規化・転移学習・ラベルクリーニング・k-fold 被験者単位 |
| C2 | 小型カメラ+エッジ計算機(CPU のみ)で動かす画像認識モデルの選び方は? | MobileNet/ESPNet 系・int8 量子化・ONNX runtime |
| C3 | 本番運用 6 ヶ月後に精度が 5 ポイント落ちた。 まず何を確認する? | 入力分布シフト・ラベル分布シフト・ハード比率の変化 |
| C4 | CLIP のような vision-language モデルで分類タスクを zero-shot で解くには? | テンプレートプロンプト・画像/テキスト埋め込みコサイン類似度 |
| C5 | 画像認識モデルの公平性(年齢・人種・性別の精度差)をどう測る? | サブグループ別精度・confusion matrix 比較・disparate impact |
※ 応用チャレンジは「自分で答えを書き、 専門家・教員にフィードバックを求める」前提で設計されている。 公平性・分布シフト・エッジ展開は近年とくに重視される論点であり、 学術論文 + 業界事例の両方を踏まえて答えを構築するとよい。
※ 本記事は 相関係数 記事を基準として構成されており、 統計学を学んだ読者が画像認識へスムーズに渡るための橋渡しを目的としている。 用語の壁を感じたら、 上の「統計と画像認識の語彙対応」(表 28)に戻って確認するとよい。 また、 画像認識を独学する際は、 公的データセット(MNIST, CIFAR-10, Fashion-MNIST, STL-10 など)を使ってまず実装を動かすこと。 動くコードを 1 本持っていれば、 そこから派生して自分のデータに展開できる。 学習が停滞したら、 同じデータセットで別モデルを試す・別の評価指標で見直す・別の前処理を試すといった「軸変え」が突破口になることが多い。 さらに、 オープンソースの実装(torchvision, timm, mmclassification, mmdetection, segmentation_models.pytorch など)を読み込むと、 実装の定石が短期間で身に付く。 慣れてきたら自分のラップトップで小さく実験し、 必要に応じて Colab/Kaggle 等のクラウド GPU に展開していくと、 コスト面でも継続可能。
画像認識は分類・検出・セグメンテーションを総称する広い概念。 個別タスクと前処理・評価ツールを組み合わせて初めて実運用できる。
画像認識は「タスクの種類」「データ量」「リアルタイム要求」の 3 軸で技術選択が分岐する。 単純な分類なら CNN、 物体検出なら YOLO/Faster R-CNN、 セグメンテーションなら U-Net/Mask R-CNN が定石。
画像認識タスクの選び方を、 タスク種別と精度要求で 3 段階で判定する。
初心者はまず torchvision / Hugging Face の事前学習モデルで「動くもの」を作るのが先。 アーキテクチャ研究より、 自分のデータでアノテーション品質を上げる方が精度向上の本筋。
本ページは既に広い範囲を扱っています。 ここでは 「画像認識とは結局なにをしているのか」 を 直感 → 落とし穴 → 発展 の 3 段で凝縮し、 各論点から関連ページへ渡れるように整理した補足です。 既存セクションと重複する部分は「ひとことで言うと」に圧縮し、 まだ言語化していない勘所を足しています。
画像認識の中身は、 突き詰めると 3 段の変換です。 生のピクセル(意味を持たない数字の海)を、 段階的に「意味のある特徴」へ濃縮し、 最後にラベルへ写像します。 CNN はこの濃縮を 畳み込み(局所パターン抽出)→ プーリング(空間の圧縮) の繰り返しで階層的に行うのが本質です。
| 層 | 中身 | CNN での担当 | 人間の視覚での対応 |
|---|---|---|---|
| ① ピクセル | $H\times W\times C$ の数値配列(意味なし) | 入力 | 網膜に届いた光 |
| ② 低次特徴 | エッジ・コーナー・色斑・テクスチャ | 浅い畳み込み層 | 初期視覚野 (V1) の輪郭検出 |
| ② 高次特徴 | 目・タイヤ・窓などの物体パーツ | 深い畳み込み層 | 高次視覚野のパーツ統合 |
| ③ 分類 | パーツの組合せ → ラベル確率 | 全結合層 + softmax | 「ネコだ」という認識 |
この「粗い特徴を積み上げて抽象へ」という流れが分かると、 タスクの違いも 1 枚の絵で整理できます。 分類は③で画像 1 枚に 1 ラベル、 物体検出は「窓ごとに③を実行して位置も返す」、 セグメンテーションは「画素ごとに③を実行」——出力の 粒度が違うだけで、 中身の「特徴を濃縮する」部分は共通です。
│ のパターンだけが点灯した 5×5 画像に「垂直エッジ検出カーネル」を当てると、 棒の位置だけ応答が大きくなります。 これを「縦棒フィルタ」「横棒フィルタ」…と多数用意し、 どのフィルタが強く反応したかを次の層へ渡す——これが「ピクセル → 特徴」の 1 段目そのものです。 ピクセル値の生データを直接分類器に入れるのではなく、 まずフィルタ応答(特徴)に変換してから判断するのがポイントです。
画像認識で最も痛いのは「テスト精度は高いのに現場で使えない」現象です。 原因はほぼ以下 8 つに集約されます。 「何が起きるか」より「なぜ起きるか / どう気づくか」を押さえるのが実務の勘所です。
| 落とし穴 | なぜ起きるか | 気づき方(兆候) | 主な対策 |
|---|---|---|---|
| 大量のラベルが要る | 高次元 + 表現力の高いモデルは少数データで過学習 | train acc≫val acc | 転移学習・データ拡張・自己教師あり |
| 敵対的サンプル | 高次元では決定境界のすぐ隣に別クラスが潜む | 微小摂動で確信度が激変 | 敵対的学習・入力浄化・認証付き頑健性 |
| データの偏り(バイアス) | 収集環境・地域・属性が偏る | サブグループ別に精度差 | 多様なデータ収集・公平性指標で監査 |
| ドメインシフト(訓練≠本番) | 照明・カメラ・季節が本番で変わる | 入力分布の KL 距離が急増 | 現場 fine-tuning・domain adaptation・TTA |
| 過学習 | epoch 過多・正則化不足 | val loss が途中から上昇 | 過学習対策(early stopping・dropout・weight decay) |
| 解釈性の低さ | 深いネットは判断根拠がブラックボックス | なぜ誤ったか説明できない | Grad-CAM・LIME・SHAP で可視化 |
| 計算コスト | 大規模モデル + 高解像度で FLOPs 膨大 | 推論レイテンシが SLA 超過 | 量子化・蒸留・枝刈り・軽量モデル |
| 少数クラス(不均衡) | レアクラスの勾配が多数派に埋もれる | accuracy 高いのに Recall 低い | クラス不均衡対策(focal loss・oversample) |
画像認識の発展は「① 特徴抽出器をどう強くするか」「② データの少なさをどう埋めるか」「③ 頑健性・効率をどう担保するか」の 3 方向に整理できます。 各キーワードから関連ページへ渡れます。
大きな流れとしては、 手作りの特徴(SIFT/HOG)→ CNN による自動特徴学習 → Transformer/自己教師ありによる大規模事前学習と、 「人間が設計する部分を減らし、 データとスケールに委ねる」方向へ一貫して進んでいます。 パターン認識・機械学習・深層学習の基礎に戻ると、 各発展が「同じ原理の延長」として見通せます。
※ 本セクションの「架空の 5×5 ミニ画像」は理解のための合成例であり、 実在の画像データセットではありません。 数値ベンチマーク(ImageNet Top-1 など)は本文の既存表と同じ参考値に依拠しています。