WebP レートコントロール & Trellis最適化:Q値の歩幅 / 量子化マトリクス / 早期停止
WebP の Q値決定と再探索 は無調整だと時間を浪費し、品質差分が小さいステップを繰り返します。本稿は Adaptive Q と併用できる 高速・安定なレートコントロール を提示します。
要点
- 大まか二分探索 + 歩幅縮小
- Trellis は“改善余地”がある時だけ
- PSNR増分 ×2回閾値で早期停止
1. コスト分解
再探索コスト = encode時間 * 試行回数。歩幅制御で 収束までの試行回数 を、Trellis条件分岐で 1試行あたり時間 を削減します。
2. 歩幅制御アルゴリズム
// 二分探索+歩幅縮小 (擬似コード)
let qLow = 30, qHigh = 90;
let lastGain = 99;
while (qHigh - qLow > 2) {
const mid = Math.round((qLow + qHigh)/2);
const r = encodeAndMetric(mid); // { psnr, bytes }
const target = wantBytes();
if (r.bytes > target) qHigh = mid; else qLow = mid;
const gain = prev ? r.psnr - prev.psnr : 1;
if (gain < 0.10 && lastGain < 0.12) break; // early-stop
lastGain = gain;
prev = r;
}
3. Trellis適用判定
// Trellis 適用判定: 増分が一定未満ならスキップ
function shouldTrellis(pass, lastGain){
if (pass === 0) return false;
return lastGain > 0.12; // 画質改善余地が大きい時だけ
}
4. 早期停止ロジック
// PSNR増分ベース早期停止
const GAINS = [];
function pushGain(g){
GAINS.push(g);
if (GAINS.length > 4) GAINS.shift();
const recent = GAINS.slice(-3);
return recent.every(x=>x < 0.10); // 連続で低増分
}
5. CI統合
# CI: ラダー生成と比較 (関連記事: /articles/ci-image-optimization-pipeline)
node scripts/ladder.js --image ui.png --out head.json --format webp
node scripts/ladder.js --image ui.png --out base.json --ref origin/main --format webp
node scripts/metrics-compare.js base.json head.json --psnr-threshold 0.25 --ssim-threshold 0.004
6. FAQ
- 低Q帯(≤40)は? → テキスト滲みが顕著、サブサンプリング対策と併用。
- 高Q帯の上限? → LQ→HQ差分が
<0.1dB
ならCIで警告し探索打ち切り。
7. まとめ
歩幅・Trellis・早期停止の3要素で“最小試行”のレートコントロールを実現し、従来手動探索より平均30–45%の時間短縮が見込めます。