NVIDIA tuning 流程
日期: ____ 場景: ____ 改動: 參數 A → B 原因: ____ 結果: ____(量化) 回歸: ____ ✓/✗ 附圖: ____
日期/場景/改動/原因/結果(量化)/回歸 ✓✗/附圖
銳化通常是 unsharp mask:原圖 + k×(原圖 − 模糊圖)。過度銳化會在邊緣產生 overshoot/halo(白邊),並放大雜訊。衡量鏡頭+感測器解析能力的是 MTF(對比度 vs 空間頻率)。
k=0 → 無銳化(原始,可能偏軟) k=0.5 → 輕銳化(細節改善,halo 小) k=1.0 → 中銳化(明顯,halo 開始可見) k=2.0 → 過銳化(halo 明顯 + 雜訊放大) 判別法:放大 100% 看字體/邊緣,有白邊 = halo
輸入 RAW(0–1023)→ 輸出 8-bit(0–255)
線性 mapping:out = in/4 → 高光爆、暗部死黑
tone mapping:用 S 曲線(log 或自訂):
in=0-100 → 壓暗部細節(提升可見性)
in=100-800 → 接近線性(主體區)
in=800-1023→ 壓高光(保留雲層層次)
# 檢查重點:暗部不死黑、高光不爆、中段對比自然1. 太糊(細節少)? ├─ 對焦 → 銳化調整(勿過度) ├─ RAW 就糊 → 換鏡頭/光圈(非調校可救) └─ NR 太強 → 降 NR(unit-13) 2. 太硬(halo/假邊)? └─ 降銳化 k 值 3. 高光爆/暗部死黑? ├─ 動態範圍需求 > 單幀 → tone mapping / HDR ├─ 曝光錯 → unit-10 └─ gamma 沒套 → 回 unit-07
場景:Thor T5000 用於食品瑕疵偵測。OV9281 拍攝流水線上的食品,目標:偵測 0.5mm 以下的裂痕。需要清晰度高、色彩精準、無雜訊假影。
# Step 1:感測器 init(unit-06) # OV9281 @ 1280×800 RAW10, 60 fps # Step 2:黑位校正 # 拍黑框(鏡頭蓋),量測 black level = 64 # 設定 OB offset = 64 # Step 3:LSC 校正 # 拍灰卡,產生 LSC 網格 # 驗證:四角亮度差 < 3% # Step 4:AWB + CCM # 灰卡校正 AWB gains → R=G=B # 色卡校正 CCM → ΔE < 3 # Step 5:AE 基準 # 設定 AE target = 50%(中間亮度) # 驗證:灰卡 histogram 峰值在 45-55% # Step 6:NR ↔ Sharpen 取捨 # 食品裂痕是「高頻細節」→ NR 不能太強 # spatial NR = low, temporal NR = medium # sharpen k = 0.5(輕銳化,避免 halo) # Step 7:回歸測試 # 室內日光、日光燈、混合光源各測 100 張 # 瑕疵偵測率 > 99% → 通過 # 設計決策: # 1. 瑕疵偵測需要「清晰度」而非「美感」→ NR 偏保守、sharpen 偏激進 # 2. 食品色差是判斷依據 → AWB/CCM 必須精準(ΔE < 3) # 3. 流水線光源固定 → AE 目標固定、AWB 收斂快
清晰度不只是「看起來銳利」。衡量鏡頭+感測器解析能力的客觀指標是 MTF(Modulation Transfer Function):在不同空間頻率(lp/mm)下的對比度保留率。MTF50(對比度降到 50% 的頻率)是常用的清晰度指標。
| 症狀 | 可能原因 | 解決方案 |
|---|---|---|
| 過度銳化產生邊緣白邊(halo) | sharpen k 值過高 | 降低 k 值至 0.3–0.5;用 100% 放大檢視邊緣 |
| 食物色差判斷不準 | CCM 未校正 / AWB 收斂不完全 | 用色卡重新校正 CCM;固定光源下驗證 ΔE |
| 流水線高速移動時影像模糊 | 曝光時間過長導致 motion blur | 縮短曝光、提高補光、提高 analog gain |
| tuning log 不完整導致無法重現 | 未記錄每次改動的參數與場景 | 使用 unit-14.7 的 tuning log 範本,每次改動都記錄 |
| 多場景回歸失敗 | 調校只在單一場景最佳化 | 擴大回歸測試集:室內、日光、混合、低光各測 100 張 |
場景:工業檢測專案(食品瑕疵偵測)要從零完成整套調校並交付量產。整合 unit-01~16 的所有技能。
M1 感測器 init + bring-up(unit-06) ├─ OV9281 1280×800 RAW10 @ 60 fps └─ 通過:dmesg probe + 取流 M2 資料基礎(unit-08) ├─ RAW 解包工具鏈 └─ 通過:黑位/Bayer 驗證 M3 校正順序(unit-07/11/12) ├─ 黑位 → LSC → AWB/CCM → 曝光基準 └─ 通過:ΔE<3、四角亮度差<5% M4 動態(unit-10) ├─ AE 收斂 + anti-flicker └─ 通過:無 banding、收斂 < 15 幀 M5 美化(unit-13/14) ├─ DPC → NR → Sharpen 取捨 └─ 通過:SNR≥30dB、無 halo、裂痕可辨 M6 回歸(unit-14/15/16) ├─ 室內/日光/混合光源各 100 張 ├─ 瑕疵偵測率 > 99% └─ 通過:回歸全過 M7 交付 └─ 通過:tuning log + 參數 + SOP 進 repo 每階段門檻都要量化(SNR、ΔE、偵測率、亮度差 %)。
Step 1 感測器 init(unit-06 SOP) Step 2 黑位(unit-08 SOP) Step 3 LSC(unit-12 SOP) Step 4 AWB/CCM(unit-11 SOP) Step 5 曝光基準(unit-10 SOP) Step 6 AE 動態 + anti-flicker Step 7 DPC/NR/Sharpen Step 8 回歸 + tuning log 每步記錄(unit-14.7 範本): 日期/場景/改動/原因/結果(量化)/回歸 ✓✗/附圖 原則: 一次只改一個參數 統一場景比較 用 RAW 或關 NR 路徑量測
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 調校工作流 | NVIDIA 自動化為主 + 微調 | libcamera tuning 檔 | register 直改 | NVIDIA 自動化為主 |
| Sharpen | ✅ 內部 | ✅ 可調 | ⚠️ 感測器內建 | ✅ 內部 |
| HDR | ✅✅ 多幀 + tone mapping | ✅ 基礎 | ⚠️ | ✅ 多幀 |
| MTF/清晰度工具 | 第三方(ISO12233) | 第三方 | 第三方 | 第三方 |
| 回歸測試支援 | ✅ Holoscan 管線化 | ⚠️ 腳本 | ⚠️ 腳本 | ✅ 腳本 |
本單元涉及的關鍵 register,以及「讀→改→寫→驗證」的完整位元級操作序列:
| Register | 位址 | 功能 | Bit Field 說明 |
|---|---|---|---|
SHARPEN_CTRL | 0x00140500 | 銳化控制 | bit[0]=enable, bit[5:3]=amount, bit[7:6]=kernel size |
DR_COMP_CTRL | 0x00140504 | 動態範圍壓縮控制 | bit[0]=enable, bit[3:1]=DR strength, bit[4]=tone mapping |
# Step 1: 讀取目前值 $ devmem2 0x00140500 w # 記錄 current_value # Step 2: 計算新值(設定 bit[0]=1) $ new_value=$((current_value | 0x0001)) # Step 3: 寫入 $ devmem2 0x00140500 w $new_value # Step 4: 驗證 $ devmem2 0x00140500 w # 確認 bit[0] = 1,其餘 bit 不變 # Step 5: 進階 — bitmask 操作 $ read_val=$(devmem2 0x00140500 w | grep "Read" | awk '{print $NF}') $ mask=0x0001 $ expected=0x0001 $ [ $(($read_val & $mask)) -eq $expected ] && echo "PASS" || echo "FAIL: bit[0] not set"
1. 畫面偏軟(soft)? ├─ 銳化未啟用 → SHARPEN_CTRL bit[0] = 1 └─ 銳化太弱 → 逐步增加 amount,觀察 halo 2. 銳化過度(halo/ ringing)? └─ amount 太高或 kernel 太大 → 降低 amount、用小 kernel
1. 高光 blown out? ├─ 曝光太長 → 減少 exposure └─ DR range 不足 → 啟用 DR_COMP_CTRL + tone mapping 2. 暗部 detail 丢失? └─ ISP gamma/LUT 設定不對 → 調 gamma 曲線暗部斜率
調校工作完整流程 SOP:
| 步驟 | 動作 | 指令/方法 | 預期輸出 |
|---|---|---|---|
| Step 1 | 先做好基礎 | BLC→BPC→LSC→CCM→AWB 全部校正完 | 基礎準確才能調 |
| Step 2 | 設定曝光基準 | 手動 AE,讓 histogram 峰值在 60–70% | 動態範圍最大化 |
| Step 3 | 調清晰度 | 拍 resolution chart,調 sharpen amount | MTF50 達到 lens 極限 |
| Step 4 | 調 NR | 暗場測 SNR,平衡 NR 強度 | SNR > 36 dB, MTF 下降 < 10% |
| Step 5 | 調動態範圍 | 高對比場景,調 DR compression | 高光不爆、暗部有 detail |
| Step 6 | 綜合驗證 | 多場景拍攝(室內/室外/暗場) | 全面一致 |
| Step 7 | 效能驗證 | 確認 ISP 處理不超過 frame interval | < 33ms @30fps |
| 面向 | Thor T5000 | RPi5 | Orange Pi | Orin Nano |
|---|---|---|---|---|
| 調校工具 | ISP Visualizer + 圖表分析 | `raspistill` + 手動調 | OpenCV 軟體調整 | ISP Visualizer |
| 清晰度控制 | Sharpen + Edge enhance | 軟體 sharpen | N/A | Sharpen + Edge enhance |
| 動態範圍技術 | HDR Stagger + Tone mapping | Single exposure | N/A | HDR + Tone mapping |
| 自動調校能力 | ✅ | ❌ | ❌ | ✅ |
| 調校參數數量 | 100+ tuning parameters | ~20 parameters | 0 | 60+ parameters |
| 從 uncalibrated 到 acceptable | 2–4 hr | 30 min | N/A | 2–3 hr |
針對「清晰度、動態範圍與調校工作流」主題的完整 bring-up 步驟清單: