單元 7 · ISP 管線深入

libnvivp、ISP 區塊

NVIDIA ISP(libnvivp)

RAW黑位LSCdemosaicNRCCMgamma輸出

ISP 提供統計(亮度、色彩)給 AE/AWB 演算法自動收斂。

NVIDIA 的調校介面特性

調適心態:NVIDIA 強調自動調校——你的工作是「感測器 init 正確 + 場景合理」,讓 AE/AWB 自行收斂,而非逐參數手動。
看完這單元你應該能說出:
  • NVIDIA ISP(libnvivp)區塊。
  • ISP 統計回饋給 AE/AWB。
  • 「自動調校」心態。
  • 可視性 vs 自動化的取捨。

7.4 深入原理:NVIDIA ISP 管線區塊細看

NVIDIA 的 ISP(由 libnvivp + RTCPU firmware 驅動)是硬體管線,每個區塊吃前一個區塊的輸出:

區塊做什麼調校意義
黑位減除(black level)扣掉無光時的偏壓設錯暗部變色/偏黑
LSC(lens shading)補邊緣光量衰減回顧單元 12
DemosaicBayer → RGBBayer order 錯全錯
NR(denoise)空間+時間降噪回顧單元 13
CCM色彩矩陣校正回顧單元 11
Gamma / tone map亮度曲線對比與動態範圍
Sharpen細節強化回顧單元 14
關鍵:這些區塊由 ISP 統計(亮度直方圖、色彩統計)驅動——AE/AWB 讀統計、算增益、回寫感測器與 ISP。這就是「自動收斂」的閉迴路。

7.5 深入原理:ISP 統計如何驅動 AE/AWB

RAW統計單元(亮度/色彩)AE/AWB 演算法感測器曝光/增益 + ISP gains下一幀

每一幀產出統計,演算法在數幀內把目標亮度收斂到設定值。調校者能控制的,主要是「統計的 ROI/權重」與「感測器範圍」,而非逐參數手動——這是 NVIDIA 與 RPi5 libcamera 最大的哲學差異。

影響:場景故意做「全白牆」或「全黑」會騙統計——AE/AWB 收斂到錯誤值。實務上測試要含中間調物體或設定統計權重,否則畫面忽亮忽暗。

7.6 Worked Example:觀察 AE 收斂

啟動預覽並切換場景
# 用 Argus 預覽(建議有螢幕)
argus_camera --preview 1 --mode 0 --duration 20
# 期間:暗→亮場景切換,觀察
#   - 亮度是否在 ~1s 內穩定(收斂快)
#   - 是否來回振盪(震盪 = 統計/範圍問題)
# 同時抓曝光值變化
watch -n 1 v4l2-ctl -d /dev/v4l-subdev0 -C exposure

正常收斂是「漸進逼近」;若你看到週期性閃爍,通常是 AE 與 AWB 交互或增益範圍卡邊界。

7.7 常見錯誤 / 陷阱

陷阱 ①:誤以為 NVIDIA ISP「不可調」就完全不調——實際上感測器 init(黑位、增益範圍、Bayer)與場景設計才是你的主戰場。
陷阱 ②:用「已處理」輸出(NV12)判斷 ISP 區塊品質——要分區塊分析請用 RAW(單元 8),否則無從判斷是哪一級造成。
陷阱 ③:AE 自動化很強不代表可以「亂場景亂跑」——統計被騙時輸出仍會錯。

7.8 練習

  1. 畫出你平台的 ISP 管線並標出哪幾級是「自動」。
  2. 做一次暗→亮切換,記錄 AE 收斂幀數。
  3. 列出你能控制的參數(透過 tegracam controls 與 Argus)。

7.9 進階:ISP 統計的 ROI 與權重

AE/AWB 不必看整張畫面——NVIDIA 通常允許設定統計區域(ROI)與權重。例如車牌辨識只在意中央區域,就把 ROI 收窄,避免窗外過亮影響曝光。

ROI 設定的影響(示意)
# 全畫面統計:大片天空 → AE 過暗
AE: 全畫面 ──→ 天空亮 → 主體黑
# 中央 ROI:主體為主 → 曝光正確
AE: 中央 ROI ──→ 主體亮 → 天空爆(可接受)
除錯要點:「為什麼明明亮卻很暗」先懷疑統計被大片亮部騙——調整 ROI 往往比硬改曝光更有效。

7.10 快速參考:ISP 分級小抄

想改什麼對應區塊本課單元
暗部/亮度黑位、gamma、tone8 / 14
四角暗LSC12
色彩偏AWB / CCM11
顆粒NR / DPC13
不清晰Sharpen14

7.11 看完本單元該記住的三件事

NVIDIA ISP 是「自動閉迴路」:統計 → 演算法 → 回寫。
你的工作是感測器 init 正確 + 場景/統計合理,讓自動化收斂。
分區塊分析問題請回到 RAW,別拿最終輸出猜。

7.12 Worked Example:把「壞畫面」歸因到 ISP 等級

由症狀反推 ISP 級
1. 暗部浮灰/偏色 → 黑位級(回 RAW 檢查)
2. 四角暗/偏 → LSC 級(單元 12)
3. 色偏 → AWB/CCM 級(單元 11)
4. 顆粒 → NR/增益級(單元 13)
5. 不銳利/光暈 → Sharpen 級(單元 14)
6. 亮暗爆 → tone/HDR 級(單元 14)
7. 全錯/花屏 → 格式/管線級(單元 5/8)
方法:先看 RAW 排除感測器/格式問題,再依症狀往上追 ISP 級——從「最低層、最可驗證」的開始查。

7.13 看完本單元該記住的三件事

ISP 管線是「統計閉迴路」,自動化是主軸。
你的控制點:感測器 init、mode、統計/場景。
分級歸因:RAW → 黑位 → LSC → 色彩 → NR → 美化。

延伸閱讀

7.9 進階真實情境 Worked Example:自訂 ISP Pipeline 處理多感測器輸入

場景:你需要用 NVIDIA ISP 同時處理 OV9281(灰階 RAW)和 OV5640(彩色 RAW),最終輸出兩路 NV12 流。

用 libargus 建立雙 pipeline
# 初始化 Argus
import argus
# Sensor 0: OV9281 → ISP pipeline 0 → NV12 output 0
# Sensor 1: OV5640 → ISP pipeline 1 → NV12 output 1
session = argus.createSession()
pipeline0 = argus.createPipeline(session, sensor=0, outputFormat='NV12')
pipeline1 = argus.createPipeline(session, sensor=1, outputFormat='NV12')
# 關鍵:兩個 pipeline 共用同一個 session,但 ISP instance 各自獨立
# 注意:Orin Nano ISP bandwidth 有限,兩路同時高解析度可能降速

設計決策:OV9281 走灰階 pipeline(跳過 CCM/AWB),OV5640 走全 ISP pipeline。分開處理可節省 ISP 資源,且各感測器的調校參數互不干擾。

7.10 深入原理擴充:NVDEC vs NVINF 在影像處理中的角色

Orin Nano 有兩種硬體加速器常被混淆:

加速器功能在 ISP pipeline 中的角色
NVDEC硬體影片解碼(H.264/H.265/AV1)解碼壓縮影片後送 ISP 處理(例如:從 NAS 讀影片做分析)
NVINF(NVINfer)張量推論引擎不直接處理影像像素,但可在 ISP 後做 AI 推論
NVJPEG硬體 JPEG 編解碼JPEG 擷取/壓縮(不經過 ISP pipeline)
大家以為沒問題但其實是陷阱:「用 NVDEC 解碼影片後直接送 ISP」——NVDEC 輸出是 NV12(已解碼),不需要再做 ISP demosaic。若你誤以為需要 ISP 處理 NVDEC 輸出,會多跑一趟不必要 pipeline 且可能導致色彩失真(重複 demosaic)。

7.11 診斷式疑難排解表

症狀可能原因解決方案
ISP pipeline 出圖但色彩偏暗LSC/AWB/CCM 參數未載入(使用預設值)用 NVIDIA tuning tool 載入校正檔;確認 ISP pipeline 的 setControls 已呼叫
多路 ISP pipeline 同時跑時其中一路掉幀ISP bandwidth 超限(Orin Nano 有上限)降低單路解析度或幀率;或讓其中一路 bypass ISP
ISP 出圖有殘影(ghosting)temporal NR(時域降噪)設定過強降低 TNR 強度;或關閉 TNR 測試是否為 TNR 導致
Argus pipeline 回傳 "ISP processing error"ISP firmware crash(可能因為 invalid register setting)reset RTCPU(echo 1 > /sys/kernel/debug/rtpu/reset);重新開機
ISP 出圖尺寸與設定不符scaler/crop 設定錯誤(DTB 或 Argus 參數)media-ctl -p 確認 scaler 的輸入/輸出尺寸

7.12 進階挑戰題

  1. 用 Argus API 建立一個「雙 pipeline」範例:OV9281 走 bypass(不經 ISP),OV5640 走完整 ISP。比較兩路的輸出差異(延遲、格式、品質)。
  2. 設計一個 ISP bandwidth 測試:逐路提高解析度/幀率,記錄何時開始掉幀,畫出 ISP 的「效能邊界圖」。
  3. 若你需要用 NVDEC 解碼 H.264 影片後做 AI 推論,畫出完整的資料流:NVDEC → ISP → NVINF,標出每步的格式轉換。

7.13 專案級端到端 Worked Example:ISP 分級診斷專案

場景:影像品質問題常常「人人有看法、沒人有證據」。專案目標:建立一套ISP 分級診斷系統,任何「畫面怪」都能用固定流程歸因到「感測器 / 黑位 / LSC / 色彩 / NR / 美化」某一級,並輸出診斷報告。

診斷流程
# Step 1 · 取 RAW 排除感測器 / 格式問題(回顧單元 8)
argus_camera --mode 0 --raw-file diag.raw --duration 1
python3 - <<'EOF'
import numpy as np
raw = np.fromfile('diag.raw', dtype=np.uint16).reshape(800, 1280)
print('黑位', raw.min(), '峰值', raw.max(), '均值', round(raw.mean(),1))
# 黑位異常 → 感測器 / 黑位級;峰值爆 → 曝光級;全花 → 格式級
EOF
# Step 2 · 依症狀向上分級(回顧 7.12 反向表)
#   角落暗 → LSC(單元 12)
#   色偏   → AWB / CCM(單元 11)
#   顆粒   → NR / 增益(單元 13)
#   不銳利 → Sharpen(單元 14)
# Step 3 · 每級用標準樣本驗證(灰卡 / 色卡 / 解析度板)
# Step 4 · 輸出診斷報告:症狀 → 證據 → 歸因 → 建議

專案輸出:診斷 SOP 文件 + 標準樣本集(灰卡 / 色卡 / 解析度板 / 黑框)+ 診斷腳本。團隊從此不再「憑感覺修影像」。

7.14 量測/驗證 SOP:ISP 健康度驗證

  1. RAW 基線:取 RAW 檢查黑位、峰值、均值(排除感測器 / 格式問題)。
  2. 黑位級:全遮鏡頭,黑位應接近 datasheet 標稱。
  3. LSC 級:拍均勻灰卡,中央 vs 角落比應接近 1(單元 12)。
  4. 色彩級:拍色卡,ΔE 應在目標內(單元 11)。
  5. NR 級:灰卡 RAW 量 σ,確認在預算內(單元 13)。
  6. 美化級:解析度板確認無過度光暈(單元 14)。
驗收指標:每級都有「量化數值 + 標準樣本」佐證,任何改動可回歸比較。

7.15 平台間對照:ISP 管線

面向Orin NanoRPi5Orange PiThor
ISP 提供者NVIDIA ISP(libnvivp)libcamera(開源)感測器內建Blackwell ISP
管線深度完整(BLC→LSC→demosaic→NR→CCM→gamma)完整陽春完整 + AI 加速
統計回饋AE/AWB 自動閉迴路可讀可改有限自動 + Holoscan
參數可視性低(封閉)高(tuning file)
診斷方法看結果 + 統計行為看數值看結果看結果 + 統計
重點:「分級診斷」的框架四平台通用——先 RAW 排除底層,再依症狀往上歸因;差別只在「哪幾級你碰得到」。RPi5 全碰得到,Orin / Thor 只碰得到感測器 / 管線 / 驗證三側(回顧 9.9)。

7.16 互動式檢核清單:ISP 驗收

7.26 Register 位元級完整工作流:ISP Pipeline 驗證——sensor ISP vs NVIDIA ISP

步驟Commandsensor ISP 路徑NVIDIA ISP 路徑
1. 確認模式argus_camera --mode <N>mode 1(YUV 輸出)mode 0(RAW 輸出)
2. 輸出格式v4l2-ctl --list-formats-extNV16 / YUV422SRGGB10 RAW
3. 直方圖argus_camera --stats感測器 ISP 內部直方圖NVIDIA ISP 直方圖
4. 3A 輸出argus_camera --3a-output感測器 ISP 自動調整NVIDIA ISP 自動調整
5. 延遲比較time argus …較低(無 ISP 延遲)較高(ISP 管線延遲)
Sensor ISP vs NVIDIA ISP 出圖比較腳本
#!/bin/bash
# isp_compare.sh — 比較兩種 ISP 路徑

echo "=== Sensor ISP(mode 1, YUV)==="
time argus_camera --camera-id 0 --mode 1 \
  --exposure-value 0.016 --gain-value 4.0 \
  --capture-auto 1 --duration 1 --file-type raw \
  --output-dir /tmp/sensor_isp
ls -l /tmp/sensor_isp/*.raw

echo ""
echo "=== NVIDIA ISP(mode 0, RAW + ISP pipeline)==="
time argus_camera --camera-id 0 --mode 0 \
  --exposure-value 0.016 --gain-value 4.0 \
  --capture-auto 1 --duration 1 --file-type raw \
  --output-dir /tmp/nvidia_isp
ls -l /tmp/nvidia_isp/*.raw

echo ""
echo "=== 檔案大小比較 ==="
S=$(stat -f%z /tmp/sensor_isp/*.raw)
N=$(stat -f%z /tmp/nvidia_isp/*.raw)
echo "Sensor ISP: $S bytes"
echo "NVIDIA ISP: $N bytes"
echo "(Sensor ISP 輸出 YUV 較小;NVIDIA ISP 輸出 RAW 較大)"

echo ""
echo "=== 亮度比較 ==="
python3 -c "
import numpy as np
s = np.fromfile('/tmp/sensor_isp/*.raw', dtype=np.uint8).mean()
n = np.fromfile('/tmp/nvidia_isp/*.raw', dtype=np.uint16).mean()
print(f'Sensor ISP mean={s:.1f} (8-bit YUV)')
print(f'NVIDIA ISP mean={n:.1f} (16-bit RAW)')
"

7.27 多層疑難排解決策樹

決策樹 A:Argus 開 session 失敗
1. "Session create failed"?
   ├─ 有其他 argus 在跑?
   │   ├─ 是 → kill 舊程序
   │   └─ 否 → ISP bandwidth 超限
   │          → 降 mode 或減少同時開路數
   ├─ 輸出路徑不存在?
   │   └─ mkdir -p 輸出路徑
   └─ ISP patch 版本?
       └─ 更新 libnvscf.so(重新安裝 jetson-multipackage)
決策樹 B:ISP 路徑選擇混淆
1. 想要 RAW 數據?
   ├─ 是 → 用 mode 0(sensor RAW 輸出)
   │       → NVIDIA ISP 在 argus pipeline 內做
   │       → 需要 libnvivp tuning
   └─ 否 ┐
2. 想要已處理的 YUV?
   ├─ 是 → 用 mode 1(sensor ISP YUV 輸出)
   │       → NVIDIA ISP 不再處理
   └─ 否 ┐
3. 想要最大控制權?
   ├─ 是 → mode 0 + custom tuning file
   └─ 否 → mode 1(sensor ISP 內建處理最省事)

7.28 量測驗證完整 SOP

  1. Mode 確認v4l2-ctl -d /dev/video0 --list-formats-ext → 記錄 SRGGB10(mode 0)與 YUV(mode 1)。
  2. sensor ISP 出圖argus_camera --mode 1 --capture-auto 1 --duration 1 -o /tmp/sensor_isp
  3. NVIDIA ISP 出圖argus_camera --mode 0 --capture-auto 1 --duration 1 -o /tmp/nvidia_isp
  4. 大小比較:sensor ISP(YUV)< NVIDIA ISP(RAW)。
  5. 亮度比較:sensor ISP mean ≈ 120(8-bit),NVIDIA ISP mean ≈ 400-600(16-bit)。
  6. 延遲量測:每種各取 100 幀,記錄平均擷取時間。
  7. 選擇原則:需要原始 RAW → mode 0;需要省事 YUV → mode 1;需要最大控制 → mode 0 + tuning。
判讀標準:兩種路徑均能出圖 + 大小/亮度合理 + 延遲量測完成 = ISP 管線概念清晰。

7.29 四平台终极對照

面向Orin NanoRPi5Orange PiThor推薦
ISP 管線NVIDIA ISP(複雜)libcamera 簡化管線感測器內建NVIDIA + Holoscan學習 → Orin
可用調校模組tegracam 精細控制tuning file (JSON)基本 brightness更強 ISP + AI量產 → Orin/Thor
GPU 加速後處理✅(TensorRT)有限有限✅(更強 GPU)AI 推論 → Orin
感測器 ISP 輸出✅ mode 1✅ libcamera✅ 無 ISP✅ mode 1省事 → mode 1
NVIDIA ISP 輸出✅ mode 0✅ mode 0控制 → mode 0
tegracam tuning✅ 精細JSON tuning file✅ + Holoscan各有格式
ISP 延遲最低低延遲 → RPi5

7.30 完整 Bring-up 專案 Checklist