このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
学習データからのアンカー ボックスの推定
アンカー ボックスは、Faster R-CNN や YOLO v2 などの深層学習オブジェクト検出器に重要なパラメーターです。アンカー ボックスの形状、スケール、および数は、検出器の効率性と正確性に影響します。
詳細については、アンカー ボックスによるオブジェクトの検出を参照してください。
学習データの読み込み
295 イメージと関連するボックス ラベルが含まれる車両データセットを読み込みます。
data = load('vehicleTrainingData.mat');
vehicleDataset = data.vehicleTrainingData;
ローカルの車両データ フォルダーへの絶対パスを追加します。
dataDir = fullfile(toolboxdir('vision'),'visiondata'); vehicleDataset.imageFilename = fullfile(dataDir,vehicleDataset.imageFilename);
データセットの概要を表示します。
summary(vehicleDataset)
Variables: imageFilename: 295×1 cell array of character vectors vehicle: 295×1 cell
グラウンド トゥルース ボックス分布の可視化
ラベル付きボックスを可視化し、データセットに存在するオブジェクト サイズの範囲を理解しやすくします。
すべてのグラウンド トゥルース ボックスを 1 つの配列に統合します。
allBoxes = vertcat(vehicleDataset.vehicle{:});
ボックスの縦横比に対してボックス領域をプロットします。
aspectRatio = allBoxes(:,3) ./ allBoxes(:,4); area = prod(allBoxes(:,3:4),2); figure scatter(area,aspectRatio) xlabel("Box Area") ylabel("Aspect Ratio (width/height)"); title("Box Area vs. Aspect Ratio")
プロットには、サイズと形状が類似したオブジェクトのグループがいくつか示されますが、グループは分散しているため、手動でアンカー ボックスを選択するのは困難です。アンカー ボックスを推定する優れた方法は、意味のある計量を使用して類似するボックスをグループ化できるクラスタリング アルゴリズムを使用することです。
アンカー ボックスの推定
関数 estimateAnchorBoxes
を使用して、学習データからアンカー ボックスを推定します。この関数は、Intersection over Union (IoU) 距離計量を使用します。
ボックス サイズの増加に伴い誤差が増大するユークリッド距離計量とは異なり、IoU に基づいた距離計量はボックスのサイズに対して不変です [1]。また、IoU 距離計量を使用すると、縦横比とサイズが類似するボックスがまとめてクラスタリングされるため、アンカー ボックスの推定がデータに適合します。
車両データセット内のグラウンド トゥルース ボックスを使用して、boxLabelDatastore
を作成します。オブジェクト検出器に学習させるための前処理手順にイメージのサイズ変更が含まれている場合、アンカー ボックスを推定する前に、 transform
と bboxresize
を使用して boxLabelDatastore
内の境界ボックスのサイズを変更します。
trainingData = boxLabelDatastore(vehicleDataset(:,2:end));
アンカーの数を選択し、関数 estimateAnchorBoxes
を使用してアンカー ボックスを推定します。
numAnchors = 5;
[anchorBoxes,meanIoU] = estimateAnchorBoxes(trainingData,numAnchors);
anchorBoxes
anchorBoxes = 5×2
21 27
87 116
67 92
43 61
86 105
アンカーの数を選択することは、経験的解析を使用し、十分に注意して選択しなければならない別の学習ハイパーパラメーターです。推定されたアンカー ボックスを判断する 1 つの品質の尺度は、各クラスターにおけるボックスの平均 IoU です。関数 estimateAnchorBoxes
は、IoU 距離計量をもつ k-means クラスタリング アルゴリズムを使用し、方程式 1 -
bboxOverlapRatio
(allBoxes,boxInCluster)
によってオーバーラップを計算します。
meanIoU
meanIoU = 0.8411
平均 IoU が 0.5 を超えている場合、アンカー ボックスと学習データ内のボックスは適切にオーバーラップしています。アンカーの数を増やすと、平均 IoU 測定値が向上する場合があります。ただし、オブジェクト検出器内のアンカー ボックスが増えると計算コストが増加して過適合につながり、検出器の性能が低下する可能性もあります。
値の範囲をスイープし、アンカー ボックスの数に対する平均 IoU をプロットして、アンカーの数と平均 IoU 間のトレードオフを測定します。
maxNumAnchors = 15; meanIoU = zeros([maxNumAnchors,1]); anchorBoxes = cell(maxNumAnchors, 1); for k = 1:maxNumAnchors % Estimate anchors and mean IoU. [anchorBoxes{k},meanIoU(k)] = estimateAnchorBoxes(trainingData,k); end figure plot(1:maxNumAnchors,meanIoU,'-o') ylabel("Mean IoU") xlabel("Number of Anchors") title("Number of Anchors vs. Mean IoU")
アンカー ボックスを 2 個使用すると、平均 IoU 値は 0.65 より大きくなります。7 個を超えるアンカー ボックスを使用した場合でも、平均 IoU 値がわずかに改善されるだけです。これらの結果を踏まえ、次の手順では 2 ~ 6 の値を使用して複数のオブジェクト検出器に学習させて評価します。この経験的解析は、検出速度や精度など、アプリケーションの性能要件を満たすために必要なアンカー ボックスの数の決定に役立ちます。
参照
[1] Redmon, Joseph, and Ali Farhadi. “YOLO9000: Better, Faster, Stronger.” In 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 6517–25. Honolulu, HI: IEEE, 2017. https://doi.org/10.1109/CVPR.2017.690.