1 画像に対する離散2D (Two-Dimensional) 畳み込みとは何ですか?また、カーネル、フィルタ、相互相関(cross-correlation)とはどのような関係がありますか?
画像に対する離散2D畳み込みは、重みの行列(カーネル)を入力画像上でスライドさせる線形かつ空間的なフィルタリング処理です。空間上の各位置において、カーネルの重みと重なり合う局所的な画像領域(受容野)との要素ごとの積を計算し、それらを合算して(多くの場合バイアス項を加算)、出力特徴マップ(feature map)の単一ピクセル値を生成します。
古典的な数学や信号処理における厳密な畳み込みでは、スライディング内積を計算する前にカーネルを水平および垂直方向に反転(180度回転)させます:$(I * K)(i, j) = \sum_m \sum_n I(i - m, j - n) K(m, n)$。これに対し、相互相関(cross-correlation)はカーネルを反転させずにスライディング内積を直接計算します:$(I \star K)(i, j) = \sum_m \sum_n I(i + m, j + n) K(m, n)$。
PyTorchやTensorFlowなどのディープラーニングフレームワークにおいて、「畳み込み(convolution)」という名前で実装されている処理は、実際には相互相関です。カーネルの重みは誤差逆伝播法(backpropagation)によって直接最適化される学習可能なパラメータであるため、ネットワークは適切な向きの重みをそのまま学習します。したがって、学習時および推論時のいずれにおいても、数学的なカーネルの反転処理を行う計算上の必然性はありません。
import numpy as np
from scipy.signal import convolve2d, correlate2d
image = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=float)
# Asymmetric directional kernel
kernel = np.array([[1, 0],
[0, -1]], dtype=float)
# Convolve flips kernel by 180 degrees: kernel[::-1, ::-1]
conv_res = convolve2d(image, kernel, mode='valid')
corr_res = correlate2d(image, kernel, mode='valid')
print("Convolve output:\n", conv_res)
print("Correlate output:\n", corr_res)
AI コーチを使ってこの質問に答えてみる
2 ビジョンパイプラインにおいて、RGB(赤・緑・青)、HSV(色相・彩度・明度)、Lab、YCbCr、またはグレースケール表現はそれぞれどのような場合に使用しますか?
タスクに必要な手掛かりを保ち、モデルの訓練時の前処理に合う表現を選びます。
RGB(赤・緑・青)は学習モデルで一般的です。OpenCVの多くのAPIはBGR(青・緑・赤)を使うため、フレームワークが順序を強制すると考えず、チャンネルの並びを確認します。
HSV/HSL(色相・彩度と明度を分ける表現)は、色を閾値で抽出する際に便利な場合があります。ただし、彩度がゼロに近いと色相は不安定で、照明やホワイトバランスの変化に対して一般に不変ではありません。
CIE Labは明度と反対色の座標を分離し、指定された観察条件と基準白色の下で、おおむね知覚的に均等になります。ユークリッド距離によるDelta E 1976も、知覚的な色差の近似尺度にすぎません。
YCbCrはルーマY′と色差チャンネルを分離し、多くの画像・動画形式で色差サブサンプリングを可能にします。係数、値域、伝達関数は規格によって異なります。
グレースケールは色が不要な場合に有用です。同じ精度なら生のチャンネルデータを3チャンネルから1チャンネルへ減らせますが、モデル全体の計算量が3分の2減るとは限りません。色にラベルを識別する情報がある場合は色を保持し、スケーリングと変換の規約を確認します。
import cv2
import numpy as np
# Sample image: saturated red under normal and shaded lighting
img_bgr = np.zeros((100, 100, 3), dtype=np.uint8)
img_bgr[:, :50] = [0, 0, 255] # Bright Red in BGR
img_bgr[:, 50:] = [0, 0, 120] # Shaded/Dark Red in BGR
# Convert to HSV (OpenCV H: 0-179, S: 0-255, V: 0-255)
img_hsv = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2HSV)
# Red Hue wraps around 0/180; track red with single Hue range [0, 10] & high saturation
lower_red = np.array([0, 100, 50])
upper_red = np.array([10, 255, 255])
mask_hsv = cv2.inRange(img_hsv, lower_red, upper_red)
print("HSV segmented pixels:", np.count_nonzero(mask_hsv), "out of", mask_hsv.size)
AI コーチを使ってこの質問に答えてみる
3 コンピュータビジョンシステムにおいて、チャンネルごとの画像正規化、画像単位の正規化、および一貫したピクセルスケーリングが重要である理由は何ですか?
訓練済みモデルが想定するピクセル値の範囲、チャンネル順序、正規化を、訓練時と推論時で一貫して使います。
8ビット画像では、255で割ると値が [0, 1] になりますが、これはスケールの変更であり、ゼロ中心化ではありません。[-1, 1] への変換は値域の中心をゼロにしますが、データの平均も必ずゼロになるわけではありません。画像には他のビット深度の整数値や、物理単位を表す浮動小数点値もあります。スケーリングしない大きな値は最適化の条件を悪くすることがありますが、必ず勾配爆発を起こすわけではありません。
データセットのチャンネル標準化は、訓練セットの統計、または事前学習モデルが指定する定数を用い、`(x-mu_c)/sigma_c` で行います。平均ゼロ・分散1になるのは、その統計を推定した分布であり、すべての新しい画像やデータセットではありません。
画像単位のzスコア正規化では、その画像の平均と標準偏差を使い、分散がほぼゼロの場合への対策を設けます。最小値・最大値によるスケーリングは別の操作です。InstanceNormは通常、各サンプル・各チャンネルを空間方向に正規化するニューラルネットワークの層であり、画像単位の前処理全般の同義語ではありません。
画像単位の正規化は明るさやコントラストの変動を減らす場合がありますが、有用な絶対強度の情報も失う可能性があるため、対象タスクで検証します。
import torch
import torchvision.transforms as T
from PIL import Image
import numpy as np
# Create a mock uint8 RGB image
raw_img = Image.fromarray(np.random.randint(0, 256, (224, 224, 3), dtype=np.uint8))
# Standard transform pipeline:
# 1. ToTensor scales uint8 [0, 255] -> float32 [0.0, 1.0] and permutes HWC -> CHW
# 2. Normalize standardizes per-channel using dataset mean and std
preprocess = T.Compose([
T.ToTensor(),
T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])
tensor_img = preprocess(raw_img)
print("Tensor shape:", tensor_img.shape)
print("Tensor dtype:", tensor_img.dtype)
print("Channel 0 min/max:", round(tensor_img[0].min().item(), 2), round(tensor_img[0].max().item(), 2))
AI コーチを使ってこの質問に答えてみる
4 幾何学的データ拡張および測光学的(フォトメトリック)データ拡張はどのように不変性を促進しますか。また、あるデータ拡張がラベルを保持しているかどうかはどのように判断しますか。
幾何学的データ拡張(回転、平行移動、拡大縮小、反転など)はピクセルの空間座標マッピングを変更しますが、測光学的データ拡張(明度、コントラスト、色相のジッター、ぼかしなど)は空間座標を変更せずにピクセル値の強度や色チャンネルを変更します。分類タスクにおいて、両手法はモデルに現実的な変動を与えることで、姿勢、視点、または照明条件の変化に対しても予測が安定するような不変な表現の学習を促進します。空間予測タスク(物体検出やセグメンテーション)では、同変性(equivariance)を維持するために、幾何学的変換に合わせて正解(ground-truth)のバウンディングボックスやマスクにも同一の変換を適用する必要があります。ある拡張がラベルを保持しているかどうかの判断には、対象ドメインの意味論と物理的な事前知識を評価することが求められます。変換後の画像が、その意味的同一性を損なうことなく元の対象クラスの妥当なインスタンスであり続ける場合、その変換はラベル保持的(label-preserving)であると言えます。例えば、水平方向の反転は一般的な物体(車や動物など)の同一性を保持しますが、OCR(Optical Character Recognition:光学文字認識)や数字分類では同一性を損なったり文字を無効化したりします。同様に、360度の自由な回転は基準となる向きが存在しない組織病理画像や衛星画像では有効ですが、上下逆さまの物体が現実世界の物理的制約に反する自動運転環境では不自然となります。
import albumentations as A
# Natural scene classification / object detection: horizontal flip is valid
natural_scene_transform = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category_ids']))
# OCR / Digit classification: horizontal flip corrupts semantics
ocr_transform = A.Compose([
A.Affine(scale=(0.9, 1.1), rotate=(-10, 10), p=0.5),
A.ColorJitter(brightness=0.2, contrast=0.2, p=0.5),
])
AI コーチを使ってこの質問に答えてみる
5 最近傍補間、バイリニア補間、バイキュービック補間、および面積平均補間とは何ですか?また、画像のリサイズによってエイリアシングやぼやけがどのように生じるかを説明してください。
補間手法は、新たな離散グリッド上へ再サンプリングする際に、連続座標における画素の輝度値を推定します: - **最近傍補間(Nearest-Neighbor):** 最も近い離散画素の輝度値を割り当てます。計算量は $O(1)$ であり、元の値をそのまま保持しますが、アップサンプリング時にはブロック状のアーティファクトが生じ、ダウンサンプリング時には顕著なジャギーが発生します。 - **バイリニア補間(Bilinear Interpolation):** 両軸に沿った線形補間を用いて、$2 \times 2$(近傍4点)の画素の距離に応じた重み付け平均を計算し、適度な平滑化を伴う滑らかな遷移を生成します。 - **バイキュービック補間(Bicubic Interpolation):** 3次多項式カーネルを用いて $4 \times 4$(近傍16点)の領域をサンプリングします。局所的な輝度勾配を捉えるため、バイリニア補間よりもシャープなエッジと滑らかな曲線が得られますが、急峻な遷移部分でオーバーシュートやリンギングといったアーティファクトが発生することがあります。 - **面積平均補間(Area / Box Interpolation):** 変換先画素を元画像画素へ投影した際の重複面積の割合を計算し、下層にある元画像の輝度値を平均化します。モアレを発生させずにダウンサンプリングする際に特に有効です。 **エイリアシングとぼやけの発生原理:** - **エイリアシング**は、十分なローパスフィルタ処理を行わずにダウンサンプリングした結果、高周波成分が新たなサンプリングレートのナイキスト周波数($f_s / 2$)を超えた場合に発生します。高周波が低周波帯域へと折り返され(フォールディング)、本来存在しないパターンやモアレ、ジャギーを引き起こします。 - **ぼやけ**は、補間カーネルがローパスの平滑化フィルタとして機能し、保持すべき高周波成分を減衰させた場合(例:バイリニア補間による平滑化)、またはダウンサンプリング中に高周波の詳細情報が平均化されて失われた場合に発生します。
import cv2
# Severe downsampling: area downsampling prevents aliasing
img = cv2.imread('high_res_pattern.jpg')
downscaled_area = cv2.resize(img, (400, 300), interpolation=cv2.INTER_AREA)
downscaled_nn = cv2.resize(img, (400, 300), interpolation=cv2.INTER_NEAREST) # heavy aliasing/moiré
# Upscaling: bicubic preserves edge sharpness
upscaled_cubic = cv2.resize(downscaled_area, (400, 400), interpolation=cv2.INTER_CUBIC)
upscaled_linear = cv2.resize(downscaled_area, (400, 400), interpolation=cv2.INTER_LINEAR)
AI コーチを使ってこの質問に答えてみる
6 現実環境における視覚的な破綻モード(failure mode)としてビジョンシステムが評価されるべきものには何があり、それらは入力データの分布をどのように変化させますか?
現実世界における視覚的な破綻モードは、いくつかの大まかなカテゴリに分類されます。環境条件(低照度、逆光や強い反射光、雨、雪、霧)、センサおよび光学的な影響(モーションブラー、焦点ボケ、高ISOセンサノイズ、ローリングシャッター歪み)、圧縮や伝送による劣化(JPEGブロックノイズ、動画ビットレート制限、ダウンサンプリング)、意味的/空間的な変化(部分的な遮蔽、フレームアウトによる途切れ、学習分布外の物体姿勢)などです。これらの破綻モードは、入力分布を通常の学習ドメインから複数のレベルで逸脱(シフト)させます。ピクセルレベルでは、輝度や色度のヒストグラムを変化させ、局所的なコントラストを破壊し、信号対雑音比(SNR)を低下させ、人工的な高周波ノイズやブラーカーネルをもたらします。構造および意味レベルでは、エッジの勾配を減衰させ、重要な視覚的特徴を覆い隠し、輪郭を歪ませ、判定に不可欠な領域を隠してしまいます。クリーンなデータで学習されたモデルがこれらのシフトした入力に遭遇すると、低レベルの畳み込みやAttentionによる特徴抽出が適切に機能しなくなり、検出漏れ、ノイズパターンに対する誤検出(偽陽性)、過信による誤認が生じます。
Category | Physical Mechanism | Input Shift & Feature Impact
-----------------------------------------------------------------------------------------
Low Light / Noise | Low photon flux, high sensor gain | Drops SNR, suppresses gradient edges, fires spurious texture filters
Motion / Defocus Blur | Scene/camera motion, out-of-focus| Attenuates high spatial frequencies, smears object boundaries
Adverse Weather/Glare | Fog/rain scattering, lens flare | Compresses dynamic range, lowers contrast, masks semantic regions
Occlusion / Cutoff | Physical foreground obstructions | Masks critical keypoints/parts, breaks holistic spatial priors
Compression Artifacts | Block DCT quantization, subsampling| Introduces 8x8 grid boundaries, removes fine textural details
AI コーチを使ってこの質問に答えてみる
これらの回答を声に出して練習する準備はできていますか?
声で回答し、技術の深さ、構成、英語でのコミュニケーションについてフィードバックを受け取れます。
7 HOG(Histogram of Oriented Gradients)などの古典的な記述子は画像の構造をどのように表現しますか。また、学習されたCNN(Convolutional Neural Network)特徴量と比較してどのような限界がありますか?
HOG(Histogram of Oriented Gradients)は、輝度勾配の方向の分布を通じて物体の局所的な形状や外観を捉えるために設計された、古典的な人手設計(ハンドクラフト)の特徴記述子です。
HOGの計算パイプラインは以下の通りです。
(1) 勾配の強度と方向を求めるため、1次微分フィルタ(例: [-1, 0, 1])などを用いて画像の水平方向および垂直方向の勾配を計算します。
(2) 画像を「セル」と呼ばれる小さな局所領域(8x8ピクセルなど)に分割し、勾配の強度で重み付けした勾配方向の1次元ヒストグラムを集計します。
(3) 隣接するセルを重複を許してより大きな「ブロック」(2x2セルなど)にまとめ、ブロック特徴量ベクトルを正規化(L2ノルムやL1-sqrtなどを使用)することで、局所的な照明、コントラスト、陰影の変動に対する耐性を獲得します。
(4) 正規化されたブロックベクトルを連結して最終的な1次元特徴量表現を生成します。歴史的には歩行者検知や物体検知のために線形SVM(Support Vector Machine)と組み合わせて使用されてきました。
学習ベースのCNN(Convolutional Neural Network、畳み込みニューラルネットワーク)特徴量と比較して、HOGには大きな限界があります。第一に、HOG特徴量は固定の人手設計であり、タスク固有の階層的表現(テクスチャ、物体のパーツ、意味的概念など)を学習する能力を持たず、低レベルな局所エッジ方向の統計量しか捉えられません。第二に、幾何学的変化に対する不変性が極めて限定的です。ブロック正規化によって単調な輝度変化やセル内の微小な空間的移動には対処できますが、3次元の面外回転、顕著なスケール変化、非剛体な姿勢の変化、複雑な背景クラッターに対しては脆弱です。これに対し、CNNは目的関数に向けてエンドツーエンドで最適化された多層の非線形な抽象表現を学習できます。
Input Image Patch (e.g., 64x128)
│
▼
[ 1. Compute Gradients ] ──> Gx, Gy -> Mag = sqrt(Gx^2 + Gy^2), Angle = atan2(Gy, Gx)
│
▼
[ 2. Cell Histograms ] ──> 8x8 pixel cells accumulate 9-bin orientation histograms (0°-180°)
│
▼
[ 3. Block Normalization] ──> Overlapping 2x2 cell blocks normalized (e.g., v / sqrt(||v||_2^2 + eps^2))
│
▼
[ 4. Feature Vector ] ──> Concatenate block vectors -> Feed to Linear SVM / Classifier
AI コーチを使ってこの質問に答えてみる