NVIDIA tuning 流程
日期: ____ 場景: ____ 改動: 參數 A → B 原因: ____ 結果: ____(量化) 回歸: ____ ✓/✗ 附圖: ____
日期/場景/改動/原因/結果(量化)/回歸 ✓✗/附圖
銳化(unsharp mask 類)強化高頻邊緣,但也放大高頻雜訊;過度銳化會產生光暈(halo)——高對比邊緣旁的白色/黑色光邊。判斷標準:看高對比物(黑字白底)邊緣是否有光邊。
# 三個量測指標 # 1. 解析度:拍解析度測試卡,看能解到哪一線對 # 2. 雜訊:灰卡 RAW 的 σ(回顧單元 13) # 3. 光暈:高對比邊緣的 overshoot 寬度 # 口訣:銳化升到「光暈出現前」為止
| 方案 | 適用 | 代價 |
|---|---|---|
| 多幀/多曝光 HDR | 靜態高動態場景 | 運動會鬼影、需要合併時間 |
| 單幀 + tone mapping | 動態場景 | 動態範圍受限,靠曲線壓縮 |
| 感測器原生 HDR(如行交錯) | 感測器支援時 | 需感測器支援 |
1. 亮部爆掉、暗部全黑? ├─ 是 → 量動態範圍需求 │ ├─ ≤3 EV → 調 tone mapping / 曲線 │ └─ >3 EV → 多幀 HDR(靜態)或接受取捨(動態) └─ 否 ┐ 2. 暗部ok但亮部爆? ├─ 是 → 降曝光 / 開高光保護(tone) └─ 否 ┐ 3. 亮部ok但暗部黑? ├─ 是 → 開陰影提升 / 補光 └─ 否 → ✅ 平衡
調校順序不是隨意的,每一級都依賴前一級正確:
| 級 | 為什麼在前面 |
|---|---|
| 黑位 | 錯的黑位會污染所有亮度判斷 |
| LSC | 不均勻的亮度會誤導 AWB/曝光統計 |
| AWB/CCM | 色彩基準要先於「美化」 |
| NR/Sharpen | 「美化」最後做,且互相牽制 |
| 回歸 | 確認前面沒被後面弄壞 |
| 症狀 | 該動哪一級 |
|---|---|
| 暗部偏黑/浮灰 | 黑位(8) |
| 四角暗 | LSC(12) |
| 色彩偏 | AWB/CCM(11) |
| 顆粒 | NR / 增益(13) |
| 不銳利 | Sharpen |
| 亮暗爆掉 | HDR / tone(本單元) |
# 拍含亮窗+暗室內的高對比場景
python3 - <<'EOF'
import numpy as np
# img: NV12 轉的亮度平面(或 RAW)
h, w = img.shape
dark = img[..., 200].mean() # 暗部均值
brt = img[..., 20].mean() # 亮部(窗)均值
print('亮部', round(brt,1), '暗部', round(dark,1),
'差', round(brt-dark,1))
# 暗部太低 → 陰影提升;亮部爆 → 高光保護
EOF場景:OV9281 搭配 120° 廣角鏡頭,需要完成從「出圖」到「量產級影像品質」的完整調校。
# Phase 1: 基礎設定(Day 1) # 1.1 黑位校正(BLC):全遮鏡頭 argus_camera --mode 0 --raw-file black.raw --duration 1 # 計算黑位平均值 → 設定 BLC offset # 1.2 LSC 校正:拍白牆 argus_camera --mode 0 --raw-file white.raw --duration 1 # 產生 LSC 校正表 # Phase 2: 色彩校正(Day 2) # 2.1 AWB 校正:拍 X-Rite ColorChecker argus_camera --mode 0 --raw-file colorchecker.raw --duration 1 # 計算 AWB gain + CCM # 2.2 Gamma 校正:確保中間調自然 # 調整 gamma curve(通常 2.2) # Phase 3: 雜訊/清晰度(Day 3) # 3.1 NR 調校:低光/高光各拍一組 # 找到 NR level 的最佳平衡點 # 3.2 Sharpen 調校:拍 ISO 12233 解析度板 # 調整 sharpen level 避免 over/under sharpen # Phase 4: 回歸測試(Day 4) # 4.1 多場景測試:室內/室外/低光/高對比 # 4.2 量化指標:SNR、色彩偏差、動態範圍 # 4.3 記錄最終參數表
設計決策:調校順序很重要:BLC → LSC → AWB/CCM → Gamma → NR → Sharpen。每一步都依賴前一步的結果——例如 CCM 需要正確的 AWB gain 作為 input。
動態範圍(Dynamic Range)= 最亮可分辨亮度 / 最暗可分辨亮度。感測器的 DR 受限於:
| 限制因素 | 說明 | 突破方法 |
|---|---|---|
| Full Well Capacity | pixel 能容納的最大電子數 | 用 HDR 模式(多曝光合成) |
| Read Noise | 讀取時的電子雜訊 | 降低 analog gain(但犧牲感光度) |
| Quantization | ADC 位元深(10-bit → 60dB 理論 DR) | 用 12-bit 或 14-bit ADC |
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 調校後影像比未調校更差 | 調校順序錯誤(例如先做 Sharpen 再做 NR) | 嚴格遵循 BLC→LSC→AWB→Gamma→NR→Sharpen 順序 |
| 動態範圍不足(亮部過曝或暗部死黑) | HDR 未啟用 或 sensor DR 夠用但 ISP 未處理 | 確認 sensor 支援 HDR 模式;用 Argus 開啟 HDR |
| Sharpen 過度導致「光暈」(halo) | sharpen level 過高 或 sharpen radius 過大 | 降低 sharpen level;減小 radius(只 sharpen 邊緣) |
| Gamma 校正後中間調偏暗 | Gamma 值過大(例如 2.5 而非 2.2) | 調整 gamma 到 2.0-2.2 範圍;用中灰卡驗證 |
| 調校參數在不同場景間無法通用 | 光源差異太大(日光 vs 日光燈) | 為每種光源建立獨立的調校 profile;或用 auto 模式 + 微調 |
場景:OV9281 + 廣角鏡頭要從「能出圖」調到「量產級品質」(呼應 14.13 的 4 天流程)。專案目標:把這 4 天流程版本化、可重現、可回歸,成為團隊的調校 SOP 專案。
# Day 1 · 基礎設定:黑位 + LSC(回顧單元 8 / 12) argus_camera --mode 0 --raw-file black.raw --duration 1 # 全遮 → BLC argus_camera --mode 0 --raw-file white.raw --duration 1 # 白牆 → LSC # Day 2 · 色彩:AWB + CCM(回顧單元 11) argus_camera --mode 0 --raw-file cc.raw --duration 1 # 色卡 → gains + CCM # Day 3 · 美化:NR + Sharpen(回顧單元 13 / 14) # NR level 階梯 + 解析度板 sharpen 階梯 # Day 4 · 回歸:多場景 + 量化指標 # 室內 / 室外 / 低光 / 高對比,量 SNR / ΔE / MTF # 每次改動填 tuning log(回顧 14.7 範本) # 版本管理:每個參數檔用 git 管,附場景照
專案輸出:版本化的參數檔 + 每階段的量化驗證 + 完整 tuning log。可重現 = 換板子 / 換人做也能得到相同結果。
| 面向 | Orin Nano | RPi5 | Orange Pi | Thor |
|---|---|---|---|---|
| 調校工具 | NVIDIA ISP Tuning Tool | libcamera tuning file | 手動 register | NVIDIA + Holoscan |
| 參數格式 | .bin / GUI | JSON(可文字編輯) | register 表 | .bin |
| HDR | ✅ 多幀 + tone | ✅ | ⚠️ | ✅✅ + AI |
| Sharpen | ✅ 內建 | ✅ | ⚠️ | ✅ |
| 工作流順序 | BLC → LSC → AWB/CCM → … → 回歸,全平台相同 | |||
| 步驟 | Command | 驗證目標 | 預期結果 |
|---|---|---|---|
| 1. 短曝出圖 | argus --exposure-value 0.002 | 高光保留 | 高光區域有細節 |
| 2. 中曝出圖 | argus --exposure-value 0.016 | 中間調 | 正常曝光 |
| 3. 長曝出圖 | argus --exposure-value 0.128 | 暗部提升 | 暗部有細節 |
| 4. 合成 | Python fusion | HDR 結果 | 全範圍有細節 |
| 5. 動態範圍 | log2(max/min) | DR 值 | > 60 dB |
#!/usr/bin/env python3 # hdr_verify.py — HDR 3-frame 合成驗證 import numpy as np, matplotlib.pyplot as plt # 載入三幀(假設已拍攝) short = np.fromfile("hdr_short.raw", dtype=np.uint16).reshape(800, 1280).astype(float) medium = np.fromfile("hdr_medium.raw", dtype=np.uint16).reshape(800, 1280).astype(float) long = np.fromfile("hdr_long.raw", dtype=np.uint16).reshape(800, 1280).astype(float) # 曝光比 ratio_ml = 0.128 / 0.016 # medium → long = 8x ratio_sm = 0.016 / 0.002 # short → medium = 8x # 簡單合成:取每幀最不飽和的區域 max_val = 1023 saturation = 0.9 * max_val # 暗部用長曝、中間調用中曝、高光用短曝 hdr = np.zeros_like(medium) dark_mask = medium < saturation * 0.3 bright_mask = short > saturation * 0.1 mid_mask = ~dark_mask & ~bright_mask hdr[dark_mask] = long[dark_mask] / ratio_ml hdr[mid_mask] = medium[mid_mask] hdr[bright_mask] = short[bright_mask] * ratio_sm # 量測動態範圍 dr_linear = np.log2(hdr.max() / hdr[hdr > 0].min()) dr_db = 20 * np.log10(hdr.max() / hdr[hdr > 0].min()) print(f"HDR max: {hdr.max():.1f}") print(f"HDR min: {hdr[hdr > 0].min():.1f}") print(f"Dynamic Range: {dr_linear:.1f} stops ({dr_db:.1f} dB)") # 比較三幀 vs HDR fig, axes = plt.subplots(1, 4, figsize=(16, 4)) for ax, img, title in zip(axes, [short, medium, long, hdr], ['Short (2ms)', 'Medium (16ms)', 'Long (128ms)', 'HDR Composite']): ax.imshow(img, cmap='gray', vmin=0, vmax=1023) ax.set_title(title); ax.axis('off') plt.tight_layout(); plt.savefig('hdr_comparison.png') print("Saved: hdr_comparison.png") # Verdict print(f"\nVERDICT: {'PASS (DR > 60dB)' if dr_db > 60 else 'CHECK: DR < 60dB'}")
1. MTF50 < 標準的 70%? ├─ 是 ┐ │ 2. 鏡頭解像力不足? │ ├─ 換鏡頭測試 → 改善 = 鏡頭問題 │ └─ 不改善 = 感測器 / ISP 問題 │ → 提升 ISP 銳利化參數 │ → 或調校 demosaic 過濾器 └─ 否 → 清晰度合格
1. HDR 合成後物體邊緣有殘影? ├─ 是 → 幀間有運動 → 需要 motion-aligned HDR │ 或提高合成速度(用硬件加速) └─ 否 → 靜態場景,簡單合成即可
| 面向 | Orin Nano | RPi5 | Orange Pi | Thor | 推薦 |
|---|---|---|---|---|---|
| MTF 量測 | ISO 12233 全平台共用 | 平台無關 | |||
| HDR 方式 | 多幀合成 / DOL-HDR | HDR 模式 | 有限 | 多幀 + AI 融合 | 各有方案 |
| 動態範圍 | ~60 dB | ~50 dB | ~40 dB | >70 dB | 高 DR → Thor |
| 調校工作流 | tegracam pipeline | libcamera tuning | 基本參數 | tegracam + Holoscan | 各有慣例 |
| 清晰度控制 | ISP 銳利化 + NR | libcamera sharp | 有限 | ISP + AI 超解析度 | 高清晰 → Thor |
| HDR 重影處理 | motion detection | 有限 | ❌ | AI motion align | 動態 → Thor |
| 調校參數量 | 數百 | 數十 | 數個 | 數百 + AI | 各有複雜度 |