據(jù)后處理實戰(zhàn):自動標(biāo)記身體部位距離異常的幀)
人工智能深度學(xué)習(xí)計算機(jī)視覺科研【免費下載鏈接】DeepLabCutOfficial implementation of DeepLabCut: Markerless pose estimation of user-defined features with deep learning for all animals incl. humans項目地址https://gitcode.com/gh_mirrors/de/DeepLabCut點擊查看免費下載導(dǎo)讀在 DeepLabCut 項目中標(biāo)注質(zhì)量與預(yù)測質(zhì)量直接決定下游分析軌跡、速度、角度等的可靠性。本篇指南圍繞docs/recipes/post.md中的數(shù)據(jù)處理配方展開基于身體部位間歐氏距離的閾值檢測自動標(biāo)記距離異常的幀用于在deeplabcut.check_labels人工檢查之外以腳本化方式篩查標(biāo)注錯誤或預(yù)測異常。讀完本文你將掌握標(biāo)注數(shù)據(jù) MultiIndex 結(jié)構(gòu)的讀寫方法、單動物/多動物/3D 項目下的距離計算適配以及如何將該思路與deeplabcut.filterpredictions、deeplabcut.analyzeskeleton等后處理工具串聯(lián)成完整的數(shù)據(jù)質(zhì)檢流水線。一、為什么需要距離閾值質(zhì)檢check_labels 的局限D(zhuǎn)eepLabCut 提供了deeplabcut.check_labels(config)用于在標(biāo)注階段可視化每一幀的標(biāo)簽位置其實現(xiàn)位于 deeplabcut/generate_training_dataset/trainingsetmanipulation.py它會為labeled-data下每個視頻子目錄中的幀生成疊加標(biāo)注點的圖像默認(rèn)以標(biāo)記人工標(biāo)注位置并支持draw_skeleton、scale、dpi等參數(shù)。但check_labels是人眼審查工具——當(dāng)項目包含數(shù)千幀時逐幀翻圖效率極低且某些錯誤如頭部與尾部被標(biāo)注得距離過大并不顯眼。因此社區(qū)配方給出了一條自動化路線直接在標(biāo)注 DataFrame 上計算兩個身體部位之間的歐氏距離凡距離超過物理閾值如頭-尾長度 100 像素的幀即為可疑幀可將其索引提取出來進(jìn)一步復(fù)核。這一思路同樣適用于推理階段模型預(yù)測輸出的 H5 文件結(jié)構(gòu)與標(biāo)注文件一致因此同一套距離檢測代碼可以復(fù)用于預(yù)測異常篩查。二、先讀懂?dāng)?shù)據(jù)標(biāo)注 H5 的 MultiIndex 列結(jié)構(gòu)配方代碼的第一步是讀取標(biāo)注文件df pd.read_hdf(path_to_your_labeled_data_file)該 H5 文件即labeled-data/視頻名/CollectedData_scorer.h5例如倉庫示例項目 examples/openfield-Pranav-2018-10-30/labeled-data/m4s1/ 下的同名文件。從源碼可確認(rèn)其結(jié)構(gòu)行索引為幀圖像文件名或序號列是 MultiIndex由scorer、bodyparts、coords等層級組成單動物項目列層級為(scorer, bodyparts, coords)coords 通常為x、y多動物項目額外包含individuals層級即(scorer, individuals, bodyparts, coords)。這一點在 deeplabcut/utils/skeleton.py 的SkeletonBuilder中可印證——它通過df.columns.get_level_values(bodyparts)枚舉部位、通過individuals in self.df.columns.names判斷是否多動物項目。df.xs(head, levelbodyparts, axis1)正是利用 MultiIndex 的xs方法沿列軸取出全部屬于head的子列對多動物項目即取出所有個體的head隨后.to_numpy()得到(幀數(shù), 2)或(幀數(shù), n_個體 × 2)的坐標(biāo)矩陣。三、核心配方標(biāo)記身體部位距離異常的幀3.1 完整代碼以下代碼直接取自docs/recipes/post.md并保持原樣import numpy as np import pandas as pd max_dist 100 df pd.read_hdf(path_to_your_labeled_data_file) bpt1 df.xs(head, levelbodyparts, axis1).to_numpy() bpt2 df.xs(tail, levelbodyparts, axis1).to_numpy() # We calculate the vectors from a point to the other # and group them per frame and per animal. try: diff (bpt1 - bpt2).reshape((len(df), -1, 2)) except ValueError: diff (bpt1 - bpt2).reshape((len(df), -1, 3)) dist np.linalg.norm(diff, axis2) mask np.any(dist max_dist, axis1) flagged_frames df.iloc[mask].index3.2 逐行解析步驟作用關(guān)鍵點max_dist 100距離閾值像素需要依據(jù)視頻分辨率與動物體型設(shè)定100 像素是頭-尾最大長度的示例值pd.read_hdf(...)載入標(biāo)注/預(yù)測 H5key 通常為df_with_missingpd.read_hdf會自動讀取df.xs(head, levelbodyparts, axis1)沿列軸按bodyparts層級取head的所有坐標(biāo)列多動物項目會一次性取出所有個體的該部位bpt1 - bpt2逐幀計算兩點間的向量結(jié)果形狀為(幀數(shù), 2)或(幀數(shù), n_個體 × 2).reshape((len(df), -1, 2))將向量分組為每幀每動物的二維坐標(biāo)點-1自動推斷個體數(shù)except ValueError兼容含第三列如 3D 項目z坐標(biāo)的數(shù)據(jù)若坐標(biāo)列數(shù)為 3則按(幀數(shù), -1, 3)重排np.linalg.norm(diff, axis2)對最后一個軸求歐氏范數(shù)得到(幀數(shù), 動物數(shù))的距離矩陣np.any(dist max_dist, axis1)只要某一幀存在任一動物超距即標(biāo)記布爾掩碼df.iloc[mask].index提取被標(biāo)記幀的索引可直接用于后續(xù)定位、復(fù)核或剔除3.3 輸出解讀與落地用法flagged_frames是一個 Index 對象保存所有至少一對部位距離 ≥ 閾值的幀標(biāo)識。常見的后續(xù)處理打印數(shù)量與占比評估整體標(biāo)注質(zhì)量print(len(flagged_frames), frames flagged out of, len(df))結(jié)合圖像復(fù)核將索引與labeled-data中的幀文件名對應(yīng)人工檢查與check_labels輸出互補先自動縮小可疑范圍再對可疑幀集中人工審查。注此處距離為像素單位的平面歐氏距離未考慮相機(jī)透視與景深在 3D 項目中可換用包含z的三維范數(shù)即走except分支閾值應(yīng)重新標(biāo)定。四、從標(biāo)注數(shù)據(jù)推廣到推理輸出數(shù)據(jù)結(jié)構(gòu)的同源性標(biāo)注 H5 與analyze_videos產(chǎn)生的預(yù)測 H5 具有一致的 MultiIndex 列結(jié)構(gòu)因此上述配方只需替換文件路徑即可用于預(yù)測結(jié)果質(zhì)檢。預(yù)測文件在項目中的命名約定為視頻名 scorer .h5其定位邏輯位于 deeplabcut/utils/auxiliaryfunctions.py 的find_analyzed_data按視頻名、scorer、是否_filtered后綴以及跟蹤方法track_method為box/skeleton/ellipse時的bx/sk/el標(biāo)記篩選候選文件再由load_analyzed_data統(tǒng)一讀取auxiliaryfunctions.py。不過預(yù)測數(shù)據(jù)每列的坐標(biāo)層級是(x, y, likelihood)三元組若直接用原配方try分支的-1, 2會失敗并落入except分支按三維點處理——此時范數(shù)會把 likelihood 當(dāng)作第三個坐標(biāo)軸結(jié)果失真。正確的做法是先用df.xs(..., levelcoords, axis1)只取x、y兩列再套用距離計算同時可利用 likelihood 過濾低置信度部位例如將 likelihood 0.5 的坐標(biāo)置為 NaN 后再計算配合np.nanmax處理缺失。五、與骨架Skeleton系統(tǒng)的關(guān)聯(lián)從距離到結(jié)構(gòu)約束兩個部位之間的距離本質(zhì)上是骨架約束的一種表達(dá)。DeepLabCut 將骨架定義存放在項目config.yaml的skeleton字段中部位對列表并配套了完整的定義與消費鏈路交互式定義deeplabcut/utils/skeleton.py中的SkeletonBuilder提供 GUI通過 Lasso 框選把身體部位連成骨頭保存時寫回config.yaml的skeleton鍵skeleton.py自動分析骨骼deeplabcut.analyzeskeleton(config, videos, ...)會遍歷cfg[skeleton]中的每對部位逐幀輸出length骨長、orientation骨方向逆時針角度與likelihood取兩點似然最小值三列保存為*_skeleton.h5實現(xiàn)在 deeplabcut/post_processing/analyze_skeleton.py。其中單動物按(bp1, bp2)命名骨頭、多動物按(個體, bp1, bp2)命名analyze_skeleton.py距離與角度的底層函數(shù)calc_distance_between_points_two_vectors_2d成對歐氏距離與calc_angle_between_vectors_of_points_2d逐點逆時針夾角都位于 analyze_skeleton.py可直接被自定義腳本復(fù)用——例如把頭-尾距離異常擴(kuò)展為骨骼長度超過 3 倍中位數(shù)的動態(tài)閾值判據(jù)。因此本文配方的更高級形態(tài)是先運行deeplabcut.analyzeskeleton得到逐幀骨長序列再對骨長做異常檢測如基于分位數(shù)或 z-score從而擺脫固定像素閾值適應(yīng)不同動物個體與拍攝距離。六、異常幀的修復(fù)鏈路filterpredictions 與樣條插值當(dāng)異常幀來自預(yù)測而非標(biāo)注時除了標(biāo)記與剔除DeepLabCut 還提供后處理平滑工具deeplabcut.filterpredictionsdeeplabcut/post_processing/filtering.py支持三種 filtertypefiltertype原理關(guān)鍵參數(shù)適用場景median默認(rèn)滑動窗口中值濾波基于scipy.signal.medfiltwindowlength須為奇數(shù)默認(rèn) 5一般軌跡去抖arima對每個坐標(biāo)序列擬合 SARIMAX 模型按置信區(qū)間識別并修正異常值p_bound似然低于此值視為缺失默認(rèn) 0.001、ARdegree自回歸階數(shù)默認(rèn) 3、MAdegree滑動平均階數(shù)默認(rèn) 1、alpha顯著性水平默認(rèn) 0.01存在間歇性遮擋/跳點的軌跡spline逐列三次樣條插值填充長度不超過windowlength的缺失段并輕度平滑windowlength作為最大填充 gap 長度短時缺失的補全該函數(shù)從deeplabcut.utils.auxiliaryfunctions.load_analyzed_data讀取已分析數(shù)據(jù)輸出*_filtered.h5可選另存 CSV且會跳過已過濾文件。若把上一節(jié)的距離檢測定位到的異常幀與filterpredictions結(jié)合即可構(gòu)成完整閉環(huán)檢測 → 評估 → 平滑/插值 → 復(fù)檢。七、小結(jié)與進(jìn)一步閱讀本文的核心是可復(fù)用的 DataFrame 級距離檢測配方只需xs 向量差 np.linalg.norm三行核心計算即可在標(biāo)注與預(yù)測兩階段自動標(biāo)記部位間距異常的幀。在此基礎(chǔ)上通過reshape((len(df), -1, 2/3))適配多動物與 3D 項目通過deeplabcut.analyzeskeleton升級為動態(tài)骨架長度監(jiān)測通過deeplabcut.filterpredictions將標(biāo)記幀對應(yīng)的軌跡平滑修復(fù)。相關(guān)代碼與文檔索引配方原文docs/recipes/post.md即本指南主題文檔位于 Cookbook 目錄 docs/recipes/index.md標(biāo)注檢查deeplabcut.check_labelstrainingsetmanipulation.pyCLI 入口見 deeplabcut/cli.py骨骼分析 APIdocs/api/deeplabcut.analyzeskeleton.rst預(yù)測過濾 APIdocs/api/deeplabcut.filterpredictions.rst數(shù)據(jù)分析主流程參考docs/main-workflows/user-guide.md贊分享人工智能深度學(xué)習(xí)計算機(jī)視覺科研【免費下載鏈接】DeepLabCutOfficial implementation of DeepLabCut: Markerless pose estimation of user-defined features with deep learning for all animals incl. humans項目地址https://gitcode.com/gh_mirrors/de/DeepLabCut點擊查看免費下載相關(guān)推薦DeepLabCut 聚類異常幀檢測指南用 napari-DeepLabCut 插件主動學(xué)習(xí)精修標(biāo)注數(shù)據(jù)DeepLabCut 聚類異常幀檢測指南用 napari DeepLabCut 插件主動學(xué)習(xí)精修標(biāo)注數(shù)據(jù) 數(shù)據(jù)質(zhì)量決定模型上限。DeepLabCut 提供了一人工智能深度學(xué)習(xí)計算機(jī)視覺科研MCP Apps vs MCP-UI vs OpenAI Apps SDK三大標(biāo)準(zhǔn)對比如何選對不踩坑MCP Apps vs MCP UI vs OpenAI Apps SDK三大標(biāo)準(zhǔn)對比如何選對不踩坑 MCP Apps 是 MCPModel ContexMCP 服務(wù)前端AI 技能DeepLabCut異常幀檢測自動識別和修正標(biāo)注錯誤的完整指南DeepLabCut作為領(lǐng)先的開源姿態(tài)估計工具其異常幀檢測功能能夠自動識別和修正標(biāo)注錯誤大大提升訓(xùn)練數(shù)據(jù)的質(zhì)量。本文將詳細(xì)介紹如何利用DeepLabCut的人工智能深度學(xué)習(xí)計算機(jī)視覺科研上一篇3步解鎖鳴潮120FPSWaveTools開源工具箱幀率配置指南下一篇終極鳴潮工具箱一鍵解鎖120FPS與抽卡數(shù)據(jù)分析完整指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考