疑難排解
每個條目都以「症狀 → 原因 → 解決方案」的形式呈現。症狀標題是確切的錯誤訊息——請在本頁中搜尋(Ctrl-F),以找到您看到的訊息。每個條目都經過驗證,以確保與目前的原始碼一致,或在 DevKit 上進行重現。
如果您不確定從何開始,請跳至 當您遇到問題時:診斷。。
安裝與環境設定
1. pyneat is not importable. Either Neat is not installed, or the venv is not activated.
pyneat 虛擬環境未啟用,或者您正在執行的環境中未安裝 wheel 套件。
在執行任何 Python 程式碼之前,請先啟動 DevKit 環境:
source ~/pyneat/bin/activate
2. GST 外掛程式載入失敗:undefined symbol: _ZN16simaaidispatcher14DispatcherBase14submitPrepared...
Neat 執行階段共用函式庫不在動態載入器路徑中,因此 GStreamer 外掛程式無法在載入時解析執行階段符號。
在啟動前,請將執行階段目錄置於 LD_LIBRARY_PATH。
export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu/neat/runtime:$LD_LIBRARY_PATH
3. 缺少模型封存檔 — sima-cli modelzoo 尚未執行。
您程式碼中參考的 .tar.gz 模型封存檔(或 SIMA_YOLO_TAR / SIMA_RESNET50_TAR / SIMA_MODEL_TAR)在磁碟上不存在。
請從 Model Zoo 下載。
sima-cli modelzoo get yolo_v8s # or resnet_50, etc.
建立
4. 無法找到 find_package(SimaNeat CONFIG) 封包。
CMake 無法找到 SimaNeatConfig.cmake(已安裝於 lib/cmake/SimaNeat/)。在原生 DevKit 安裝中,它位於預設的系統路徑中;但在 SDK 交叉編譯中,sysroot 並未位於 CMAKE_PREFIX_PATH 中。
匯出 SYSROOT,並讓您的 CMakeLists 將其新增到前置路徑中(您好,這是 Neat 範本。 這樣做):
if(DEFINED ENV{SYSROOT} AND NOT "$ENV{SYSROOT}" STREQUAL "")
list(APPEND CMAKE_PREFIX_PATH "$ENV{SYSROOT}/usr/lib/aarch64-linux-gnu")
endif()
find_package(SimaNeat REQUIRED CONFIG)
載入模型並進行設定。
5. failed to read image: <path>
OpenCV(cv2.imread / cv::imread)傳回 null 值——表示檔案不存在、無法讀取,或不是可解碼的影像。
在建構輸入張量之前,請驗證路徑,並確認該檔案是否為有效的 JPEG/PNG 格式。
6. reason=topk must be > 0(來自 boxdecode)
偵測模型的 ModelOptions.top_k 參數設定為 0;框檢測階段需要一個正數上限。
設定一個正數 top_k(教學影片中使用 100):
opt.top_k = 100
(訊息來自 EV74 封包解碼外掛程式。)
7. preproc_upsample_not_supported
原始影像的尺寸小於模型的輸入解析度,因此預處理步驟必須進行升頻採樣,但較舊的 EV74 預處理韌體無法執行此操作(它僅支援降頻採樣)。
請提供一張與模型輸入大小相等或更大的原始影像(例如,對於 YOLOv8,至少為 640×640),或者將 neat-ev74-firmware 更新為包含升頻採樣核心的建置版本。
(此訊息來自 EV74 預處理外掛程式/韌體。)
8. 低 score_threshold → 後處理延遲峰值
檢測閾值越低,通過閾值篩選的候選框數量就越多,而且非最大值抑制 (NMS) 的計算成本會隨著存留的框的數量大致呈平方級數增長。
僅將閾值降低到足以捕捉到弱檢測值的程度,並使用 top_k 來限制最壞的情況。請參閱 讀取偵測框。
執行推論。
9. misconfig.media_caps … Internal data stream error … reason not-negotiated (-4)
對於原始影像輸入,預處理階段並未啟用,或者輸入類型未聲明,因此無法在應用程式來源 (appsrc) 和第一階段之間進行協商。
在 ModelOptions 中宣告影像輸入和預處理設定:
opt.preprocess.kind = pyneat.InputKind.Image
opt.preprocess.preset = pyneat.NormalizePreset.COCO_YOLO
10. No channel available (all candidate channel opens failed)
EV74 派遣器嘗試排程一個內核,但已載入的韌體並未實作該內核——通常是因為 neat-runtime 和 neat-ev74-firmware 不是相同的版本(內部雜湊值不符),例如部分更新。
一起安裝匹配的 neat-* 套件(哈希值相同);確認在執行階段和韌體中顯示的哈希值是否相同。請參閱 相容性 → 版本相符的集合。
(此訊息來自 EV74 派遣器。)
11. frame=N rtsp_timeout
RTSP 拉取逾時——URL 錯誤或串流未傳輸影格。
驗證 RTSP URL 是否可連線且正在積極地進行串流;檢查傳輸方式(TCP 或 UDP)。請參閱 播放 RTSP 串流。。
12. CameraInput strict zero-copy requires external-buffer-mode
CameraInputOptions::allow_cpu_fallback 預設為 false,因此 Neat 需要端到端 SiMaAI/裝置零拷貝支援。或者 libcamerasrc 沒有宣告通用的 external-buffer-mode 屬性,或者已安裝的記憶體函式庫無法將其設定匯出為 DMA-BUFs。
在安裝相容的相機和記憶體套件時,請務必維持嚴格的零複製。如果您必須在沒有 DMA-BUF 匯出的情況下使用相機堆疊,請明確選擇相容性橋接:
simaai::neat::CameraInputOptions camera;
camera.allow_cpu_fallback = true;
自適應模式仍然將下游的 CVU/MLA 階段的資料傳輸到 SiMaAI 記憶體。只有在上游相機緩衝區尚未被 EV74 使用時,才會在相機橋接器處進行複製。
13. misconfig.media_caps … libcamerasrc … not-negotiated (-4)
您所要求的相機設定與相機堆疊能夠產生的模式不符,或者板載疊加層/驅動程式未正確地設定相機。
驗證外部影像是否具有相同的格式、解析度和幀率。 Neat:
devkit$gst-launch-1.0 -e libcamerasrc ! \ 'video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1' ! \ identity eos-after=30 ! fakesink如果上述方法無效,請先檢查覆蓋層、纜線、感測器驅動程式或相機模式。使用 Modalix DevKit MIPI 相機介面指南 來確認 .dtbo 和 libcamera 的驗證路徑。如果驗證通過,請將其與您的 CameraInputOptions 進行比較。
14. 相機拍攝的畫面呈現出綠色、紫色或過於強烈的色調。
目前的畫面是以錯誤的像素格式或色彩轉換方式進行解讀。最常見的錯誤是將 NV12 格式的相機畫面視為 RGB/BGR 格式的位元組。如果相同的色調在 Neat 之前就已經出現,那麼問題很可能出在相機 ISP 的調整或 libcamera 管線。
請確保相機鏡頭蓋和模型預處理格式保持一致:
- 請求推薦模型的路徑,格式為
camera.format = "NV12"。 - 設定
preprocess.color_convert.input_format = PreprocessColorFormat::NV12。 - 在正式發布版本中,請避免使用 CPU 進行
videoconvert/videoscale; - 執行一個簡短的
gst-launch-1.0 libcamerasrc ... ! videoconvert ! jpegenc僅進行簡單測試,以確認是否已存在著色效果。 Neat.
15. MIPI 攝影機教學中的 frame=N output_timeout。
在教學課程的逾時設定結束之前,沒有任何輸出樣本傳送到應用程式。在「相機到模型」的圖中,這可能表示相機沒有傳輸畫面、Caps 協商失敗、模型路徑仍在啟動中,或者下游階段(例如 BoxDecode)沒有產生輸出。
首先驗證僅使用相機的路徑。然後重新執行教學,並設定較長的逾時時間,以及啟用後端輸出:
devkit$python3 share/sima-neat/tutorials/023_run_mipi_camera_model/run_mipi_camera_model.py \ --model /path/to/model.tar.gz --frames 2 --decode none \ --pull-timeout-ms 15000 --print-backend生產流程應包含 libcamerasrc、neatcamerabridge(當啟用回退機制時)、neatprocesscvu、neatprocessmla 和 appsink。對於 BoxDecode 路由,還請確認 --decode 標記和閾值與模型封存檔相符。
16. 圖的處理速度慢,或者即時影格會遺失。
這個圖的處理速度跟不上。常見的原因包括:拉取迴圈無法跟上速度、輸出樣本保留時間過長、在熱門路徑中進行逐幀記錄、佇列策略與來源不符,或即時串流沒有明確的丟棄/新鮮度策略。
使用一個可重複使用的 Run,然後明確說明執行階段原則:
- 對於需要即時處理且資料時效性至關重要的即時輸入,請使用
RunPreset::Realtime/pyneat.RunPreset.Realtime。 - 對於需要處理每個輸入檔案的批次或檔案處理,請使用
RunPreset::Reliable/pyneat.RunPreset.Reliable。 - 當應用程式不應因佇列已滿而停止運作時,請使用
try_push(...)。 - 將
on_input_drop設定為依據stream_id、frame_id、port_name以及原因來計算丟棄的次數。 - 持續拉取。如果輸出佇列已滿,可能會影響整個圖的效能。
- 在推送更多內容之前,先釋放或複製輸出,以防應用程式可能保留由執行階段支援的緩衝區。
對於多串流圖,請保留 stream_id 和 frame_id,並檢查每個串流的輸出計數。彙總的 FPS 可能會掩蓋掉一個資源不足的串流。請參閱 執行圖形分析 → 調整輸送量,並確保結果真實可靠。
17. unknown input/output name、no unambiguous default input 或 no unambiguous default output
這個圖有命名的端點,而且應用程式推送或拉取了錯誤的名稱,或者在具有多個可能端點的圖上使用了未命名的 push(...) / pull(...)。
在推送或拉取程式碼之前,請檢查程式碼中的命名是否正確:
run = graph.build()
print("inputs:", run.input_names())
print("outputs:", run.output_names())
然後使用確切的端點名稱:
run.push("image", [tensor])
sample = run.pull("detections", timeout_ms=2000)
Graph("name") 是一個診斷標籤。它不會建立端點。端點來自 nodes.input("name") 和 nodes.output("name")。
18. 在逾時之前,pull(...) 不會產生任何輸出。
沒有任何範例在逾時前產生所需的輸出。該圖可能仍在執行中,輸出名稱可能不正確,輸入可能受到回壓,圖可能已關閉,或者可能發生執行階段錯誤。
將逾時、關閉和錯誤事件分開處理。在 C++ 中,請使用結構化拉取超載:
simaai::neat::Sample sample;
simaai::neat::PullError error;
switch (run.pull("detections", /*timeout_ms=*/1000, sample, &error)) {
case simaai::neat::PullStatus::Ok:
break;
case simaai::neat::PullStatus::Timeout:
// Keep waiting, push more input, or report timeout.
break;
case simaai::neat::PullStatus::Closed:
// End of stream.
break;
case simaai::neat::PullStatus::Error:
std::cerr << error.code << ": " << error.message << "\n";
break;
}
此外,請檢查 run.last_error()、端點名稱、輸入資料類型/佈局/格式,以及您的應用程式是否持續從每個輸出分支提取資料。