抓取與位姿估計(jì):從數(shù)據(jù)增強(qiáng)到PnP調(diào)優(yōu)全指南)
簡(jiǎn)介工業(yè)機(jī)器人視覺(jué)定位的關(guān)鍵在于高效識(shí)別目標(biāo)并準(zhǔn)確估計(jì)其位姿。圍繞這一主題這份PDF資源以YOLOv11為重點(diǎn)系統(tǒng)講解高精度目標(biāo)抓取與位姿估計(jì)的模型調(diào)優(yōu)方法兼顧理論原理與工程實(shí)踐適合機(jī)器人視覺(jué)工程師、自動(dòng)化設(shè)備開(kāi)發(fā)者以及高校相關(guān)專業(yè)學(xué)生閱讀。文檔共36頁(yè)打包為1個(gè)PDF文件大小2.01MB內(nèi)容編排完整支持目錄跳轉(zhuǎn)與章節(jié)快速定位從目錄結(jié)構(gòu)看依次涵蓋工業(yè)視覺(jué)定位概述、YOLOv11模型架構(gòu)與運(yùn)行機(jī)制、訓(xùn)練數(shù)據(jù)收集與增強(qiáng)、網(wǎng)絡(luò)結(jié)構(gòu)優(yōu)化、損失函數(shù)調(diào)整、訓(xùn)練策略、位姿估計(jì)的2D/3D方法、評(píng)估指標(biāo)與驗(yàn)證流程以及汽車制造、電子裝配、物流倉(cāng)儲(chǔ)等行業(yè)應(yīng)用案例知識(shí)體系較完整。目前已有92人學(xué)習(xí)該文檔閱讀后既能掌握YOLOv11在工業(yè)場(chǎng)景的部署思路也能獲得網(wǎng)絡(luò)結(jié)構(gòu)、損失函數(shù)、超參數(shù)等層面的調(diào)優(yōu)策略對(duì)提升目標(biāo)檢測(cè)精度與抓取位姿準(zhǔn)確率有直接幫助。1. 工業(yè)機(jī)器人視覺(jué)定位YOLOv11能否扛起抓取與位姿估計(jì)的重?fù)?dān)產(chǎn)線上的機(jī)械臂一旦“抓空”背后往往不是電機(jī)問(wèn)題而是視覺(jué)定位模型把目標(biāo)位置報(bào)偏了幾個(gè)像素。今天拆的資源——工業(yè)機(jī)器人視覺(jué)定位YOLOv11高精度目標(biāo)抓取與位姿估計(jì)模型調(diào)優(yōu)就是一套從產(chǎn)線實(shí)拍數(shù)據(jù)、訓(xùn)練手法到位姿求解的完整閉環(huán)手冊(cè)。和通用目標(biāo)檢測(cè)不同工業(yè)抓取要求的是毫米級(jí)定位精度和像素級(jí)目標(biāo)邊界YOLOv11在單階段檢測(cè)里兼顧了速度與精度但如果你不做針對(duì)性的數(shù)據(jù)增強(qiáng)和網(wǎng)絡(luò)微調(diào)直接跑默認(rèn)權(quán)重基本只能當(dāng)需求演示。這篇筆記面向機(jī)械臂集成、視覺(jué)工程師和做上下料系統(tǒng)的朋友把數(shù)據(jù)清洗、訓(xùn)練調(diào)參和PnP落位的過(guò)程連起來(lái)講透。2. 高精度抓取的數(shù)據(jù)底座從現(xiàn)場(chǎng)實(shí)拍到三維點(diǎn)云的增強(qiáng)細(xì)節(jié)目標(biāo)檢測(cè)模型吃得干凈抓取才談得上穩(wěn)。很多工程師在訓(xùn)練YOLOv11時(shí)習(xí)慣直接套用COCO預(yù)訓(xùn)練權(quán)重然后拿產(chǎn)線拍下來(lái)的圖去推理結(jié)果要么漏檢要么框的位置飄。原因很簡(jiǎn)單工業(yè)視覺(jué)定位是專項(xiàng)任務(wù)目標(biāo)物體的姿態(tài)、反光特性和背景跟你訓(xùn)練集分布對(duì)不上。這份文檔在數(shù)據(jù)處理部分花了不少篇幅核心就一句話——讓模型在“這張圖是產(chǎn)線拍的”前提下學(xué)會(huì)找目標(biāo)。2.1 數(shù)據(jù)來(lái)源的取舍實(shí)拍、仿真與公開(kāi)數(shù)據(jù)集怎么配比數(shù)據(jù)來(lái)源決定了模型的上限。文檔里列出了三條路我按實(shí)際落地優(yōu)先級(jí)重新排一下。第一種是真實(shí)產(chǎn)線數(shù)據(jù)用固定在機(jī)械臂末端或工位側(cè)方的工業(yè)相機(jī)拍攝注意覆蓋不同光照條件、不同擺放角度這段數(shù)據(jù)最寶貴哪怕只有幾百?gòu)埗贾档梅磸?fù)用。第二種是仿真數(shù)據(jù)用Blender、3ds Max建立三維模型后渲染出各種視角、背景和光照的合成圖能快速補(bǔ)足角度分布但要注意仿真圖與實(shí)拍圖的domain gap混合訓(xùn)練時(shí)比例要控制好。第三種是公開(kāi)數(shù)據(jù)集比如COCO和Pascal VOC它們用來(lái)做預(yù)訓(xùn)練或者補(bǔ)充背景干擾物類別不是主力。配比通常是實(shí)拍70%、仿真20%、公開(kāi)10%如果實(shí)拍數(shù)據(jù)量不夠可以先在公開(kāi)數(shù)據(jù)上預(yù)訓(xùn)練再用產(chǎn)線數(shù)據(jù)微調(diào)這是最穩(wěn)的路線。數(shù)據(jù)收集設(shè)備上常見(jiàn)配置是工業(yè)相機(jī)加定焦鏡頭。例如Basler工業(yè)相機(jī)分辨率按檢測(cè)目標(biāo)大小來(lái)選抓取電子元件這類小目標(biāo)建議五百萬(wàn)像素以上幀率至少15fps才能跟上機(jī)械臂節(jié)拍。如果涉及高精度位姿估計(jì)最好配合Intel RealSense這類深度相機(jī)彩色圖和深度圖同時(shí)采集后續(xù)PnP求解時(shí)能直接利用深度信息。2.2 標(biāo)注類型決定抓取上限邊界框、關(guān)鍵點(diǎn)與位姿標(biāo)注標(biāo)注是工業(yè)視覺(jué)項(xiàng)目最容易被低估的環(huán)節(jié)。很多人以為YOLO只需要邊界框標(biāo)注但在機(jī)器人抓取場(chǎng)景下邊界框只能告訴你目標(biāo)在圖像上的粗略位置無(wú)法提供抓取方向。文檔里把標(biāo)注分成三個(gè)層次邊界框、關(guān)鍵點(diǎn)、位姿。邊界框是基礎(chǔ)用來(lái)訓(xùn)練檢測(cè)頭。關(guān)鍵點(diǎn)標(biāo)注則是在目標(biāo)上標(biāo)記角點(diǎn)或中心點(diǎn)能配合檢測(cè)框做姿態(tài)初估。位姿標(biāo)注則要結(jié)合深度圖和三維模型直接給六自由度的真值標(biāo)注成本高但模型學(xué)得最徹底。標(biāo)注工具方面LabelImg支持Pascal VOC和YOLO格式輸出項(xiàng)目早期夠用。如果做關(guān)鍵點(diǎn)標(biāo)注建議換Labelme或者專門的三維標(biāo)注工具M(jìn)eshLab、CloudCompare。我一般會(huì)在標(biāo)注流程里加一道自動(dòng)檢查把標(biāo)注框繪制回原圖確認(rèn)框邊與目標(biāo)輪廓貼合。工業(yè)產(chǎn)線上經(jīng)常有反光、遮擋人工標(biāo)注時(shí)容易把反光區(qū)域也框進(jìn)去到了訓(xùn)練階段就成了噪聲。文檔里提到的多人交叉審核是必要的我實(shí)踐下來(lái)至少要有10%的圖做二次校驗(yàn)。2.3 數(shù)據(jù)清洗與增強(qiáng)過(guò)濾模糊底圖、哈希去重與三維旋轉(zhuǎn)仿真清洗階段不要舍不得刪圖。產(chǎn)線采集的原圖里傳送帶震動(dòng)導(dǎo)致的模糊圖、過(guò)曝圖、重復(fù)幀都是負(fù)資產(chǎn)。檢測(cè)模糊圖可以用拉普拉斯方差低于閾值直接濾掉。重復(fù)圖則通過(guò)計(jì)算哈希值去重這個(gè)思路在數(shù)據(jù)量上萬(wàn)后特別有效能顯著縮短訓(xùn)練時(shí)間。import os import cv2 import hashlib import numpy as np def is_blurry(image_path, threshold100.0): # 拉普拉斯方差值越低說(shuō)明圖像越模糊 image cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) laplacian_var cv2.Laplacian(image, cv2.CV_64F).var() return laplacian_var threshold def get_image_hash(image_path): # 將圖像縮放到固定尺寸后計(jì)算SHA256用于去重 image cv2.imread(image_path) resized cv2.resize(image, (256, 256)) return hashlib.sha256(resized.tobytes()).hexdigest() # 清洗流程示例 for root, _, files in os.walk(industrial_raw): for file in files: if not file.lower().endswith((.png, .jpg, .jpeg)): continue img_path os.path.join(root, file) if is_blurry(img_path, threshold80): os.remove(img_path) # 閾值可調(diào)產(chǎn)線震動(dòng)場(chǎng)景建議放寬到60這段邏輯里要注意兩個(gè)參數(shù)。threshold控制模糊判定嚴(yán)格程度產(chǎn)線環(huán)境如果光照暗拉普拉斯方差整體會(huì)偏低80到100之間需要先統(tǒng)計(jì)一批樣本的分布再定。哈希去重用256×256的縮放已經(jīng)足夠穩(wěn)定縮得太小會(huì)丟失細(xì)節(jié)導(dǎo)致不同圖撞哈??s得太大又會(huì)讓計(jì)算變慢。清洗之后數(shù)據(jù)增強(qiáng)就派上用場(chǎng)了。def augment_image(image, angle0, flip_code0, alpha1.5, beta30): # 旋轉(zhuǎn)增強(qiáng) h, w image.shape[:2] center (w // 2, h // 2) matrix cv2.getRotationMatrix2D(center, angle, 1.0) rotated cv2.warpAffine(image, matrix, (w, h)) # 翻轉(zhuǎn)增強(qiáng)flip_code為1是水平翻轉(zhuǎn)0是垂直翻轉(zhuǎn) flipped cv2.flip(rotated, flip_code) # 亮度對(duì)比度調(diào)整alpha是增益beta是偏置 enhanced cv2.convertScaleAbs(flipped, alphaalpha, betabeta) return enhanced旋轉(zhuǎn)和亮度變換能覆蓋機(jī)械臂取料時(shí)最常見(jiàn)的角度變化和反光差異。角度建議隨機(jī)取-30度到30度工業(yè)抓取很少需要模型識(shí)別倒置目標(biāo)轉(zhuǎn)太大反而引入錯(cuò)誤約束。alpha在1.2到1.8之間模擬逆光或高亮beta在-20到30之間模擬陰影遮擋。這里還要提一句三維增強(qiáng)如果你有Point Cloud數(shù)據(jù)可以直接對(duì)點(diǎn)云做繞Z軸的旋轉(zhuǎn)生成不同擺放位姿下的樣本這一招對(duì)后續(xù)位姿估計(jì)特別有用能少標(biāo)幾百?gòu)垐D。3. YOLOv11模型調(diào)優(yōu)骨干網(wǎng)絡(luò)、檢測(cè)頭與Loss的三個(gè)核心改動(dòng)很多人的誤區(qū)是把YOLOv11當(dāng)黑匣子只調(diào)訓(xùn)練輪數(shù)和批大小。實(shí)際上工業(yè)抓取場(chǎng)景基本不會(huì)用默認(rèn)配置直接上因?yàn)槟J(rèn)Anchor是按COCO的物體尺寸分布的而你的電子元件、螺栓、閥體可能集中在很小或很大的尺寸區(qū)間。文檔里提到的優(yōu)化方向我按優(yōu)先級(jí)整理成三個(gè)改動(dòng)骨干網(wǎng)絡(luò)補(bǔ)注意力、檢測(cè)頭重算錨框、損失函數(shù)換成更貼合邊框回歸的版本。3.1 骨干網(wǎng)絡(luò)加注意力從CSPDarknet出發(fā)的輕量化改造YOLOv11的骨干網(wǎng)絡(luò)沿用了類CSPDarknet結(jié)構(gòu)通過(guò)跨階段部分連接減少計(jì)算量。但它在提取小目標(biāo)特征時(shí)通道注意力不足容易把細(xì)微紋理淹沒(méi)在深層特征里。改進(jìn)思路是引入注意力機(jī)制或者融合輕量級(jí)模塊。我之前在零件抓取項(xiàng)目里用過(guò)在骨干輸出端接入CBAM模塊的做法只增加少量參數(shù)量mAP能提升1到2個(gè)點(diǎn)。import torch import torch.nn as nn class CBAMBlock(nn.Module): def __init__(self, channels, reduction16): super().__init__() self.channel_attention nn.Sequential( nn.AdaptiveAvgPool2d(1), nn.Conv2d(channels, channels // reduction, kernel_size1), nn.ReLU(inplaceTrue), nn.Conv2d(channels // reduction, channels, kernel_size1), nn.Sigmoid() ) self.spatial_attention nn.Sequential( nn.Conv2d(2, 1, kernel_size7, padding3), nn.Sigmoid() ) def forward(self, x): # 通道注意力讓網(wǎng)絡(luò)更關(guān)注包含目標(biāo)的特征通道 ca self.channel_attention(x) * x # 空間注意力讓網(wǎng)絡(luò)更關(guān)注目標(biāo)所在的空間位置 avg_pool torch.mean(ca, dim1, keepdimTrue) max_pool torch.max(ca, dim1, keepdimTrue).values sa self.spatial_attention(torch.cat([avg_pool, max_pool], dim1)) * ca return sa這段CBAM代碼可以直接插入到骨干網(wǎng)絡(luò)的最后一個(gè)Stage后面。reduction參數(shù)控制通道壓縮16是常見(jiàn)值如果你的顯存緊張可以改成8。注意插入位置很關(guān)鍵放在較淺的層會(huì)影響底層紋理放在最深一層效果最明顯。工業(yè)場(chǎng)景多用小目標(biāo)檢測(cè)我會(huì)額外加一個(gè)針對(duì)小目標(biāo)的檢測(cè)頭在16×16的特征圖上再采樣一次雖然推理速度稍慢但漏檢率下降明顯。3.2 檢測(cè)頭與錨框用K-means重算Anchor并調(diào)整輸出尺度檢測(cè)頭的調(diào)整集中在錨框和輸出張量。YOLOv11默認(rèn)錨框尺寸是針對(duì)開(kāi)源數(shù)據(jù)集設(shè)計(jì)的用在工業(yè)零件上經(jīng)常出現(xiàn)邊界框定位偏差。正確的做法是拿自己的訓(xùn)練集用K-means重新聚類出Anchor尺寸。錨框數(shù)量通常選3到5組每個(gè)尺度一組。我在自己的螺紋零件數(shù)據(jù)集上試過(guò)默認(rèn)Anchor的最大框?qū)?yīng)128像素以上而我目標(biāo)集中在24到64像素重算后直接讓mAP0.5漲了3個(gè)百分點(diǎn)。import numpy as np from sklearn.cluster import KMeans def compute_anchors(boxes, num_clusters3): # boxes是歸一化后的寬高數(shù)組shape為[N, 2] boxes np.array(boxes) kmeans KMeans(n_clustersnum_clusters, random_state42, n_init10) kmeans.fit(boxes) anchors kmeans.cluster_centers_ # 按面積排序便于分配到不同尺度的檢測(cè)頭上 anchors anchors[np.argsort(anchors[:, 0] * anchors[:, 1])] return anchors # 假設(shè)從數(shù)據(jù)集中讀取標(biāo)注boxbox_w為寬box_h為高 # anchors compute_anchors(list(zip(box_w, box_h)), num_clusters3)聚類出來(lái)的Anchor按面積從小到大排列小的給大特征圖大的給小特征圖。n_init10很重要K-means對(duì)初始中心點(diǎn)敏感多跑幾次取最優(yōu)能避免錨框分布跑偏。我見(jiàn)過(guò)有人直接拷別人項(xiàng)目里的Anchor值這是最容易翻車的點(diǎn)——不同產(chǎn)線、不同目標(biāo)Anchor差異非常大。3.3 損失函數(shù)與訓(xùn)練策略邊界框回歸優(yōu)先于分類YOLOv11的損失函數(shù)包含邊界框回歸、分類和置信度三部分。工業(yè)抓取場(chǎng)景下框不準(zhǔn)比類分錯(cuò)更致命。所以我會(huì)把邊界框回歸的權(quán)重提高同時(shí)在損失函數(shù)上做替換。默認(rèn)的CIoU在處理長(zhǎng)條形零件時(shí)收斂慢換用SIoU或者WIoU能更好地處理角度和尺度差異。SIoU引入了方向性懲罰對(duì)水平或垂直擺放的零件尤其友好。如果你是做小目標(biāo)可以考慮Focal Loss來(lái)處理正負(fù)樣本極度不平衡的問(wèn)題把背景框壓下去讓網(wǎng)絡(luò)聚焦在真正的零件上。訓(xùn)練策略上批量大小建議8到16之間工業(yè)采集數(shù)據(jù)量通常在幾千張量級(jí)批量太大容易過(guò)擬合。學(xué)習(xí)率用余弦退火初始學(xué)習(xí)率在1e-4到3e-4之間預(yù)熱步數(shù)設(shè)3到5個(gè)epoch。正則化方面Weight Decay設(shè)為5e-4另外數(shù)據(jù)增強(qiáng)里的Mosaic和MixUp在最后一兩百個(gè)epoch不要關(guān)掉但強(qiáng)度可以適當(dāng)降低否則模型一直在適應(yīng)變換后的圖對(duì)真實(shí)產(chǎn)線的直圖反而泛化不足。4. 模型訓(xùn)練與部署中的常見(jiàn)問(wèn)題排查三類高頻翻車現(xiàn)場(chǎng)訓(xùn)練調(diào)優(yōu)這part非常玄學(xué)表面上看起來(lái)loss在降mAP也不難看但一到現(xiàn)場(chǎng)就出問(wèn)題。這里把我在類似項(xiàng)目里踩過(guò)、文檔里也強(qiáng)調(diào)過(guò)的坑集中列一列每一類都是實(shí)打?qū)嵉难獪I教訓(xùn)。4.1 標(biāo)注錯(cuò)位框線貼不準(zhǔn)目標(biāo)邊緣現(xiàn)象訓(xùn)練后的模型在推理時(shí)給出的邊界框總是比真實(shí)目標(biāo)大一圈或者偏到一側(cè)看起來(lái)像是檢測(cè)頭回歸不收斂。驗(yàn)證集上mAP挺高但誤差集中在邊界附近直接導(dǎo)致機(jī)器人的抓取點(diǎn)偏移。原因標(biāo)注時(shí)框線沒(méi)有嚴(yán)格按照目標(biāo)的可見(jiàn)邊緣拉齊尤其是圓弧形零件和反光零件人工標(biāo)注時(shí)容易把光暈或陰影區(qū)域算進(jìn)去。解決建立標(biāo)注復(fù)盤機(jī)制。我現(xiàn)在的習(xí)慣是訓(xùn)練前先抽查20%的標(biāo)注圖把框畫回圖上逐張看遇到邊界模糊的參考前一張圖和后一張圖的目標(biāo)位置來(lái)輔助判斷。如果標(biāo)注人員有外包建議對(duì)每個(gè)批次先培訓(xùn)再開(kāi)工標(biāo)注規(guī)范里明確寫清楚“框必須收緊到目標(biāo)最外沿不留白邊不包含背景”。4.2 訓(xùn)練loss不下降數(shù)據(jù)與超參數(shù)雙重背鍋現(xiàn)象訓(xùn)練到第20輪總loss還在2以上來(lái)回震蕩驗(yàn)證集上的召回率幾乎為零。模型像是在隨機(jī)輸出。原因一個(gè)是標(biāo)簽類別的id與配置文件不一致自定義數(shù)據(jù)集最容易在路上改錯(cuò)類別編號(hào)。另一個(gè)是學(xué)習(xí)率太大導(dǎo)致梯度來(lái)回彈跳收斂不到局部最優(yōu)點(diǎn)。還有一個(gè)隱蔽原因是錨框設(shè)置不合理如果設(shè)置值與實(shí)際目標(biāo)尺寸差得太多回歸頭很難收斂。解決先檢查數(shù)據(jù)配置跑一個(gè)單batch的overfit測(cè)試——只用一張訓(xùn)練圖反復(fù)喂給模型看loss能不能降到接近0。如果單圖都降不下來(lái)說(shuō)明網(wǎng)絡(luò)結(jié)構(gòu)或數(shù)據(jù)加載有問(wèn)題好好檢查標(biāo)簽格式和類別映射。如果單圖能收斂把學(xué)習(xí)率降到之前的三分之一到五分之一然后把Anchor重新聚類一次再開(kāi)完整訓(xùn)練。4.3 精度達(dá)標(biāo)但機(jī)器人抓取失敗手眼標(biāo)定的鍋現(xiàn)象視覺(jué)系統(tǒng)返回的目標(biāo)中心點(diǎn)在圖像上看起來(lái)完美機(jī)器人運(yùn)動(dòng)到該點(diǎn)后總是偏出幾十毫米有時(shí)候還撞到夾具。這不是YOLOv11檢測(cè)的問(wèn)題而是手眼標(biāo)定的誤差被放大了。原因工業(yè)視覺(jué)定位是“像素坐標(biāo)→相機(jī)坐標(biāo)系→機(jī)器人基坐標(biāo)系”的鏈路任何一環(huán)標(biāo)定有誤差最終都會(huì)體現(xiàn)在機(jī)械臂末端的位置偏差上。尤其是Eye-to-Hand或Eye-in-Hand的變換矩陣沒(méi)有在機(jī)器人零點(diǎn)變化后重新校準(zhǔn)或者相機(jī)鏡頭畸變參數(shù)沒(méi)有加載。解決先固化標(biāo)定板拍攝環(huán)境用棋盤格標(biāo)定相機(jī)內(nèi)參記錄畸變系數(shù)。然后做手眼標(biāo)定獲取變換矩陣如果條件允許可以用九點(diǎn)標(biāo)定法在視野內(nèi)取均勻分布的采樣點(diǎn)擬合出像素到機(jī)器人坐標(biāo)的單應(yīng)矩陣。這個(gè)矩陣每半年或每次產(chǎn)線調(diào)整后必須重新跑一遍否則后悔藥都來(lái)不及吃。4.4 設(shè)備升級(jí)后模型性能下降輸入尺寸與歸一化被改動(dòng)了現(xiàn)象同一份權(quán)重在測(cè)試電腦上跑mAP有0.92部署到工控機(jī)上掉到0.85檢查GPU驅(qū)動(dòng)沒(méi)問(wèn)題也不是推理引擎的問(wèn)題。原因多半是工控機(jī)上OpenCV或推理SDK的版本不同把圖片讀取后的通道順序搞反了或者resize的插值方式從雙線性變成了最近鄰。解決在推理代碼入口寫一個(gè)通道BGR轉(zhuǎn)RGB的強(qiáng)制斷言同時(shí)固定用cv2.resize的INTER_LINEAR參數(shù)不要依賴庫(kù)函數(shù)默認(rèn)值。再在圖像送入網(wǎng)絡(luò)前打印均值和方差和訓(xùn)練時(shí)的一致才放行。5. 位姿估計(jì)驗(yàn)證從2D框到六自由度PnP求解的落地技巧檢測(cè)模型給出2D框后工業(yè)抓取真正需要的是目標(biāo)在機(jī)器人坐標(biāo)系下的位置和姿態(tài)這一步通常走PnP方案從目標(biāo)三維模型上取一組特征點(diǎn)在圖像上找到這些點(diǎn)對(duì)應(yīng)的2D投影用cv2.solvePnP求解旋轉(zhuǎn)向量和平移向量。import cv2 import numpy as np # 3D模型上的特征點(diǎn)單位mm以目標(biāo)中心為原點(diǎn) object_points np.array([ [0, 0, 0], [10, 0, 0], [0, 10, 0], [5, 5, 2] ], dtypenp.float32) # 對(duì)應(yīng)在圖像上檢測(cè)到的2D像素坐標(biāo)由YOLOv11檢測(cè)框角點(diǎn)檢測(cè)給出 image_points np.array([ [324.5, 210.1], [340.2, 215.8], [320.1, 228.0], [336.7, 222.4] ], dtypenp.float32) # 相機(jī)內(nèi)參矩陣fx, fy為焦距cx, cy為主點(diǎn)坐標(biāo) K np.array([[800.0, 0, 640.0], [0, 800.0, 360.0], [0, 0, 1]], dtypenp.float64) success, rvec, tvec cv2.solvePnP(object_points, image_points, K, dist_coeffsNone)object_points的選取要避免共面至少四個(gè)點(diǎn)里有三個(gè)不能在一個(gè)平面上否則解出的姿態(tài)會(huì)退化。特征點(diǎn)對(duì)應(yīng)關(guān)系我用檢測(cè)到的關(guān)鍵點(diǎn)來(lái)匹配比如零件圖紙上的定位銷孔和邊角。文檔里的位姿評(píng)估指標(biāo)建議重點(diǎn)關(guān)注位置誤差和姿態(tài)誤差位置誤差就是計(jì)算得到的平移向量與真值的三維距離姿態(tài)誤差則用旋轉(zhuǎn)矩陣之間的差值來(lái)衡量?,F(xiàn)場(chǎng)驗(yàn)證時(shí)最簡(jiǎn)單有效的辦法是把物體放在固定位置記錄PnP輸出的tvec平移機(jī)械臂過(guò)去看是否對(duì)準(zhǔn)多測(cè)三個(gè)角落位置以排除視野邊緣畸變的影響。在那以后我每次上線抓取項(xiàng)目都不只看模型mAP而是先在夾具上固定一個(gè)標(biāo)準(zhǔn)工件跑完檢測(cè)和位姿估計(jì)后用機(jī)器人探針去測(cè)實(shí)際重復(fù)定位精度確認(rèn)X/Y/Z三個(gè)方向的偏差都在公差之內(nèi)才放心交給產(chǎn)線。模型權(quán)重、標(biāo)定參數(shù)和相機(jī)畸變表這些文件我會(huì)單獨(dú)存一份帶版本號(hào)方便回滾。這份文檔給了不少可以直接抄作業(yè)的思路但真正能不能落地還得靠你在自己的產(chǎn)線上多測(cè)幾次希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取