到92.6%識(shí)別率:豬行為識(shí)別YOLOv8實(shí)戰(zhàn)解析)
簡介一套面向豬圈場景的豬只行為識(shí)別數(shù)據(jù)集可識(shí)別飲水、采食、睡覺、站立等典型行為平均正確識(shí)別率達(dá)到92.6%服務(wù)于動(dòng)物行為分析、健康監(jiān)測與養(yǎng)殖智能化研究適合計(jì)算機(jī)視覺、目標(biāo)檢測方向的研究者、算法工程師及農(nóng)業(yè)信息化相關(guān)專業(yè)學(xué)生使用。數(shù)據(jù)規(guī)模為1272張標(biāo)注圖片資源包共包含2000個(gè)文件其中727張jpg圖像為從多段真實(shí)豬舍視頻中抽幀得到的畫面1272個(gè)txt文件為YOLOv8格式標(biāo)注1個(gè)yaml文件預(yù)設(shè)了類別名稱與訓(xùn)練路徑整體約85.86MB解壓后即可用于模型訓(xùn)練與驗(yàn)證。圖像素材覆蓋不同豬圈機(jī)位、光照和豬只姿態(tài)標(biāo)注內(nèi)容包括喝、吃、睡覺、站立四個(gè)類別能夠直接支撐YOLOv8等目標(biāo)檢測算法的訓(xùn)練、測試和遷移學(xué)習(xí)有效降低數(shù)據(jù)采集與標(biāo)注成本。目前已有224人學(xué)習(xí)下載適合作為豬只行為識(shí)別、養(yǎng)殖場景視頻分析等課題的基準(zhǔn)數(shù)據(jù)集也可用于算法效果對比與模型調(diào)優(yōu)。1. 豬行為識(shí)別數(shù)據(jù)集1272張圖怎么支撐起92.6%的識(shí)別率養(yǎng)豬場里最費(fèi)人力的一件事就是盯著監(jiān)控判斷豬的狀態(tài)有沒有在喝水、吃料是睡了還是站著發(fā)呆。豬行為識(shí)別數(shù)據(jù)集要解決的正是這個(gè)巡檢場景。它包含1272張豬圈實(shí)拍圖片標(biāo)注了喝、吃、睡覺、站立4類行為按YOLOv8的txt格式組織作者給出的平均識(shí)別率是92.6%。對剛接觸目標(biāo)檢測的從業(yè)者來說這是一個(gè)可以直接拿去訓(xùn)練和驗(yàn)證的數(shù)據(jù)集對已經(jīng)在做養(yǎng)殖視覺方案的人它的價(jià)值更多在于提供了一個(gè)小而完整的基線——圖片不多標(biāo)注規(guī)范能快速判斷一套訓(xùn)練流程通不通。不過1272張對4類行為來說屬于典型的小數(shù)據(jù)集92.6%這個(gè)指標(biāo)也得分清楚是mAP還是分類準(zhǔn)確率。把它當(dāng)作一個(gè)值得動(dòng)手的項(xiàng)目來做而不是當(dāng)作一個(gè)開箱即用的現(xiàn)成模型才是這個(gè)數(shù)據(jù)集真正的打開方式。下面我按數(shù)據(jù)拆解、訓(xùn)練復(fù)現(xiàn)、避坑、調(diào)優(yōu)、部署的順序把整條鏈路講透。2. 拆解豬行為數(shù)據(jù)集YOLOv8標(biāo)注格式、類別邊界與92.6%的來歷2.1 YOLOv8格式標(biāo)注長什么樣YOLOv8沿用的是YOLO系的目標(biāo)檢測標(biāo)注規(guī)范一張圖片對應(yīng)一個(gè)同名.txt文件每一行代表一個(gè)目標(biāo)框格式是class_id x_center y_center width height坐標(biāo)都做了歸一化處理數(shù)值范圍在01之間。我在驗(yàn)證數(shù)據(jù)集時(shí)一般會(huì)先隨機(jī)抽一張圖和它的txt對照著看確保坐標(biāo)和畫面內(nèi)容能對上。# 查看一張圖片對應(yīng)的標(biāo)注文件 cat images/train/0001.txt2 0.458333 0.362500 0.166667 0.183333 0 0.610000 0.540000 0.120000 0.150000第一行的第一個(gè)數(shù)字2代表類別ID后面4個(gè)數(shù)分別是目標(biāo)中心x、中心y、框?qū)挕⒖蚋呷繗w一化。解析的時(shí)候要注意坐標(biāo)是歸一化的畫框必須乘回原圖寬高。如果原數(shù)據(jù)集是用Labelme這類工具標(biāo)注后導(dǎo)出的特別容易在類別ID映射上翻車——Labelme的類別列表按導(dǎo)入順序排列和YOLO的class_id不一定一致拿到手先用腳本統(tǒng)計(jì)txt里的id集合再和data.yaml里的names順序核對一遍。2.2 四類行為的視覺邊界喝、吃、睡覺、站立怎么區(qū)分這個(gè)數(shù)據(jù)集的類別定義不是嚴(yán)格意義上的動(dòng)作瞬間而是行為狀態(tài)。喝水通常指豬把嘴伸到飲水器附近并有吞咽動(dòng)作站立是四肢著地、沒有進(jìn)食飲水。難點(diǎn)在于豬喝水的瞬間和站立吃料時(shí)的姿態(tài)非常接近標(biāo)注員如果只看單張靜態(tài)圖很容易把正在喝水標(biāo)成站立。處理這種邊界常見做法是看連續(xù)的幾幀喝水時(shí)頭部會(huì)有一個(gè)低垂并固定的角度吃料時(shí)嘴部貼著食槽、有咀嚼趨勢。模型學(xué)到的是這種視覺分布所以訓(xùn)練集里如果有大量誤標(biāo)樣本92.6%這種基線會(huì)直接往下掉。睡覺和站立的區(qū)分相對容易豬躺著時(shí)軀干輪廓明顯壓低邊界框的長寬比會(huì)變小。但如果豬圈里有墊料或者地面反光躺著和趴著的邊界又會(huì)模糊。這類數(shù)據(jù)集的實(shí)際質(zhì)量往往取決于標(biāo)注時(shí)有沒有寫詳細(xì)的規(guī)范文檔而不是取決于圖片總數(shù)。2.3 1272張圖的體量夠不夠小數(shù)據(jù)集的訓(xùn)練策略1272張圖對4類行為檢測來說屬于能訓(xùn)但容易過擬合的體量。以COCO量級做參照常規(guī)做法是用YOLOv8官方在COCO上預(yù)訓(xùn)練好的權(quán)重做遷移學(xué)習(xí)而不是從零訓(xùn)練。從零訓(xùn)一個(gè)檢測頭通常需要數(shù)萬張圖才能有穩(wěn)定泛化在這個(gè)量級上我一般用yolov8n.pt或yolov8s.pt作為預(yù)訓(xùn)練權(quán)重前幾個(gè)epoch凍結(jié)backbone之后再全量微調(diào)。另一個(gè)關(guān)鍵點(diǎn)是驗(yàn)證集怎么切。1272張里如果隨機(jī)抽20%做驗(yàn)證可能出現(xiàn)某個(gè)類別在驗(yàn)證集里完全沒有圖片的情況。我習(xí)慣按類別分層抽樣先統(tǒng)計(jì)每張圖包含哪些行為類別再按類別比例去劃分確保驗(yàn)證集覆蓋喝、吃、睡覺、站立四類。這一步能避免訓(xùn)練完發(fā)現(xiàn)驗(yàn)證集缺類mAP虛高卻無法真實(shí)反映模型能力。2.4 92.6%是mAP還是分類準(zhǔn)確率評估口徑先對齊拿到數(shù)據(jù)集先別急著訓(xùn)練第一個(gè)要確認(rèn)的是平均正確識(shí)別率到底怎么算的。如果按目標(biāo)檢測的標(biāo)準(zhǔn)來理解92.6%大概率指的是mAP50也就是IoU閾值0.5下的平均精度。4類目標(biāo)、1272張圖、mAP50在92%左右是一個(gè)合理且常見的基線水平。如果它指的是行為分類準(zhǔn)確率那就意味著數(shù)據(jù)集可能還附帶每張圖的整圖標(biāo)簽或者評測時(shí)只關(guān)心每張圖是否檢出主要行為。這兩種口徑之間差別很大。同一個(gè)模型mAP5092.6%時(shí)分類準(zhǔn)確率可能超過95%而準(zhǔn)確率92.6%對應(yīng)的mAP50可能只有80%出頭。我一般會(huì)在訓(xùn)練前把驗(yàn)證方式固定下來用一個(gè)腳本統(tǒng)一計(jì)算每張圖的預(yù)測框與真值框的IoU然后按mAP50和mAP50-95兩個(gè)維度出報(bào)告之后跟別人對比時(shí)也只用同一套口徑。這樣才不會(huì)出現(xiàn)你92.6%和我92.6%不是一回事的尷尬。3. 用YOLOv8訓(xùn)練豬行為識(shí)別從Ubuntu 20.04環(huán)境到第一個(gè)權(quán)重文件3.1 Ubuntu 20.04搭建YOLOv8 CPU環(huán)境如果手頭沒有GPUUbuntu 20.04上搭CPU版本也能跑通小數(shù)據(jù)集訓(xùn)練只是慢。CPU訓(xùn)練1272張圖yolov8n大概每個(gè)epoch需要幾分鐘總共100個(gè)epoch也就是幾小時(shí)完全在可接受范圍內(nèi)。先建Python虛擬環(huán)境# 創(chuàng)建虛擬環(huán)境避免和系統(tǒng)Python互相污染 python3 -m venv yolo_env source yolo_env/bin/activate # 安裝ultralytics和CPU版PyTorch pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cpuCPU版本的關(guān)鍵是torch要裝成CPU專用包否則pip會(huì)默認(rèn)拉一個(gè)幾個(gè)GB的CUDA版本。驗(yàn)證安裝是否成功可以執(zhí)行python -c from ultralytics import YOLO; print(YOLO(yolov8n.pt).model)能正常打印模型結(jié)構(gòu)就說明環(huán)境OK。這里最常見的坑是pip默認(rèn)源下載torch太慢建議換國內(nèi)鏡像源具體方法是在pip install時(shí)加-i https://pypi.tuna.tsinghua.edu.cn/simple。提示如果你之后打算在帶GPU的機(jī)器上訓(xùn)練torch別按CPU版裝直接裝默認(rèn)版本即可CPU探索和GPU訓(xùn)練用同一個(gè)虛擬環(huán)境會(huì)省去來回重裝的時(shí)間。3.2 準(zhǔn)備數(shù)據(jù)集目錄結(jié)構(gòu)與訓(xùn)練驗(yàn)證劃分YOLOv8要求的目錄結(jié)構(gòu)比較固定最好一開始就按它的規(guī)范擺好省得到處找圖片pig_behavior/ ├── data.yaml ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/如果拿到手的數(shù)據(jù)集是所有圖片一個(gè)文件夾、所有txt一個(gè)文件夾需要先自己劃分。下面這個(gè)腳本按比例隨機(jī)劃分并保持同名對應(yīng)import os, random, shutil src_images pig_behavior/all_images src_labels pig_behavior/all_labels out_images pig_behavior/images out_labels pig_behavior/labels for split in [train, val]: os.makedirs(f{out_images}/{split}, exist_okTrue) os.makedirs(f{out_labels}/{split}, exist_okTrue) names [f.split(.)[0] for f in os.listdir(src_images)] random.shuffle(names) val_count int(len(names) * 0.2) for i, name in enumerate(names): split val if i val_count else train shutil.copy(f{src_images}/{name}.jpg, f{out_images}/{split}/{name}.jpg) shutil.copy(f{src_labels}/{name}.txt, f{out_labels}/{split}/{name}.txt)這里我刻意先shuffle再取前20%做驗(yàn)證集避免按文件名字典序排列時(shí)同類圖片扎堆。注意txt文件名和圖片名必須一一對應(yīng)后綴也不能寫錯(cuò)訓(xùn)練時(shí)YOLOv8是按同名去找標(biāo)注的。如果你的圖片是.png或.jpeg記得把腳本里的后綴統(tǒng)一改掉。data.yaml是訓(xùn)練時(shí)的唯一配置入口path: /home/user/pig_behavior train: images/train val: images/val nc: 4 names: [drinking, eating, sleeping, standing]這里的names順序必須和標(biāo)注txt里的class_id對應(yīng)。如果不確定原數(shù)據(jù)集的類別順序先跑一個(gè)小腳本統(tǒng)計(jì)所有txt里出現(xiàn)的id集合再按id從小到大反推names千萬別憑感覺寫。3.3 訓(xùn)練命令與關(guān)鍵參數(shù)詳解環(huán)境就緒后訓(xùn)練命令其實(shí)就一行yolo train datapig_behavior/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16 devicecpu如果要用GPU把devicecpu改成device0。訓(xùn)練過程中有幾個(gè)參數(shù)必須理解否則調(diào)起來心里沒底參數(shù)取值建議說明epochs100起步4類小數(shù)據(jù)集100個(gè)epoch足夠再多容易過擬合imgsz640默認(rèn)值原圖是1080p時(shí)可以試1280但會(huì)顯著變慢batch16CPU跑16可能內(nèi)存吃緊OOM就降成8或4devicecpu / 00表示第一張GPU卡modelyolov8n.pt小數(shù)據(jù)集優(yōu)先nano不是越大越好epochs的判斷標(biāo)準(zhǔn)看val loss是否在后期不降反升。imgsz640意味著模型看到的是縮小后的圖像如果豬圈原圖里豬頭占畫面比例很小模型可能漏檢遠(yuǎn)距離目標(biāo)這時(shí)候先跑一版640的baseline再對比1280的效果。batch大小影響的是訓(xùn)練穩(wěn)定性和顯存占用CPU訓(xùn)練主要看內(nèi)存GPU訓(xùn)練主要看顯存。3.4 看訓(xùn)練結(jié)果loss曲線和驗(yàn)證指標(biāo)訓(xùn)練結(jié)束后ultralytics會(huì)在runs/detect/train/目錄下生成weights/best.pt和last.pt以及results.png等圖表。看結(jié)果不能只看訓(xùn)練loss要看驗(yàn)證集上的mAP50和mAP50-95。# 在訓(xùn)練輸出目錄下查看每個(gè)epoch的指標(biāo) cat runs/detect/train/results.csv | head -20results.csv里每一行是一個(gè)epoch的訓(xùn)練結(jié)果列名包含train/box_loss、val/box_loss、metrics/mAP50等。我一般用這個(gè)csv畫損失函數(shù)曲線圖比截圖更精確。用matplotlib讀csv畫val_loss曲線能判斷模型在第幾個(gè)epoch開始過擬合——如果val_loss在80個(gè)epoch后持續(xù)上升而train_loss還在降那就是過擬合解決方案是提前用best.pt或者加大數(shù)據(jù)增強(qiáng)。4. 豬行為識(shí)別避坑指南類別不平衡、遮擋與標(biāo)注混亂4.1 睡覺樣本過多導(dǎo)致模型偏科現(xiàn)象訓(xùn)練完一驗(yàn)證其他三類mAP都在85%以上唯獨(dú)站立只有60%。原因統(tǒng)計(jì)txt后會(huì)發(fā)現(xiàn)睡覺和躺臥的圖片占了一半以上站立、喝水的樣本很少。模型在類別不平衡下會(huì)把高頻類別學(xué)得更準(zhǔn)低頻類別則被壓過。解決先統(tǒng)計(jì)每個(gè)類別的目標(biāo)框數(shù)量對低頻類別做過采樣——把含站立、喝水的圖片在訓(xùn)練集里重復(fù)23份。也可以用YOLOv8的class_weight參數(shù)給低頻類別更高權(quán)重。這類數(shù)據(jù)集的正確打開方式是先做類別分布體檢再動(dòng)手訓(xùn)練別一上來就跑train。4.2 豬只重疊時(shí)邊界框互相覆蓋現(xiàn)象單個(gè)框在單獨(dú)圖片上預(yù)測準(zhǔn)但一到豬只互相疊壓的擁擠場景兩個(gè)框合并成一個(gè)或者在兩只豬中間來回跳。原因標(biāo)注階段重疊豬只的框如果只標(biāo)了可見部分模型學(xué)到的是半只豬特征而邊界框是矩形天然無法區(qū)分前景豬和背景豬的邊界。重疊場景本來就是目標(biāo)檢測的玄學(xué)問題豬圈里尤其嚴(yán)重。解決訓(xùn)練時(shí)開啟mosaic和mixup數(shù)據(jù)增強(qiáng)讓模型見過更多重疊樣本推理時(shí)把conf閾值降到0.25左右再用NMS把重疊過高的冗余框壓掉。如果還是壓不掉就得回到標(biāo)注層面把完全遮擋、無法判斷身份的豬移除或標(biāo)為ignore而不是硬給一個(gè)框。4.3 喝水動(dòng)作被誤判成站立現(xiàn)象預(yù)測結(jié)果里所有喝的框幾乎都落在站立框附近或者干脆不識(shí)別喝水。原因喝水和站立在靜態(tài)圖像上高度相似差就差在頭部角度和嘴部與飲水器的相對位置。如果標(biāo)注時(shí)把正在靠近飲水器但還沒喝也標(biāo)成drinking模型學(xué)到的喝水特征就被稀釋了。解決嚴(yán)格按數(shù)據(jù)集說明里的行為定義重新過一遍標(biāo)注——只有嘴部接觸飲水器或頭部有明顯低垂吞咽狀態(tài)的才算drinking。訓(xùn)練時(shí)給這類易混類別的圖片做針對性裁剪放大讓模型專注于嘴部細(xì)節(jié)。也可以在data.yaml里把drinking和standing的圖片分開放在不同子目錄便于后面做難例挖掘。4.4 標(biāo)注文件里出現(xiàn)越界坐標(biāo)現(xiàn)象訓(xùn)練時(shí)報(bào)錯(cuò)提示某個(gè)box坐標(biāo)超出了圖像邊界或者loss變成NaN。原因YOLO格式要求坐標(biāo)歸一化到01但部分標(biāo)注文件里出現(xiàn)了負(fù)值或大于1的數(shù)值一般是標(biāo)注工具導(dǎo)出時(shí)沒做clip。解決訓(xùn)練前寫一個(gè)清洗腳本把所有txt逐行讀出來用min/max把坐標(biāo)clip到01之間同時(shí)過濾掉寬度或高度小于3個(gè)像素的框。import os label_dir pig_behavior/labels/train for fname in os.listdir(label_dir): if not fname.endswith(.txt): continue lines [] with open(os.path.join(label_dir, fname)) as f: for line in f: parts line.strip().split() cid, cx, cy, w, h int(parts[0]), float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]) cx max(0, min(1, cx)) cy max(0, min(1, cy)) w max(0.01, min(1, w)) h max(0.01, min(1, h)) if w * 640 3 or h * 640 3: continue lines.append(f{cid} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(os.path.join(label_dir, fname), w) as f: f.write(\n.join(lines))這個(gè)腳本我在處理好幾個(gè)數(shù)據(jù)集時(shí)都會(huì)先跑一遍。注意過濾閾值按imgsz640折算如果你把訓(xùn)練尺寸改成1280過濾閾值也要相應(yīng)放大。4.5 驗(yàn)證集劃分造成數(shù)據(jù)泄露現(xiàn)象訓(xùn)練時(shí)驗(yàn)證集mAP有93%模型一部署到新豬圈實(shí)測掉到70%。原因劃分時(shí)沒考慮圖片來源。同一個(gè)豬圈同一個(gè)時(shí)間段拍的連續(xù)幀很可能被同時(shí)分到train和val模型在驗(yàn)證集上見過類似的畫面val指標(biāo)虛高。解決按時(shí)間段或按豬圈劃分而不是隨機(jī)劃分。比如前3天的圖片進(jìn)訓(xùn)練集第4天的圖片進(jìn)驗(yàn)證集。如果數(shù)據(jù)集本身沒有提供拍攝時(shí)間信息至少按圖片文件名前綴分組把同一批來源的圖片放進(jìn)同一個(gè)集合。5. 把92.6%再往上提數(shù)據(jù)增強(qiáng)、模型大小與損失曲線判斷5.1 數(shù)據(jù)增強(qiáng)怎么設(shè)置才不破壞行為語義YOLOv8默認(rèn)開了不少增強(qiáng)但對豬行為這種動(dòng)作姿態(tài)敏感的任務(wù)增強(qiáng)不當(dāng)會(huì)損壞語義。比如水平翻轉(zhuǎn)fliplr對喝水、吃料這類方向無關(guān)的行為影響不大但如果豬圈飲水器固定在左側(cè)翻轉(zhuǎn)后位置語義就變了。我的經(jīng)驗(yàn)是hsv_h、hsv_s、hsv_v顏色抖動(dòng)參數(shù)保持默認(rèn)即可豬圈光照變化本來就大顏色抖動(dòng)反而能提升泛化。degrees旋轉(zhuǎn)不要超過10度固定攝像頭拍出來的畫面不會(huì)有太大角度變化。mosaic和mixup在小數(shù)據(jù)集上強(qiáng)烈建議開啟它們相當(dāng)于免費(fèi)擴(kuò)了樣本量。下面是一套針對小數(shù)據(jù)集的增強(qiáng)配置# augment.yaml hsv_h: 0.015 hsv_s: 0.5 hsv_v: 0.4 degrees: 10 translate: 0.1 scale: 0.3 fliplr: 0.5 mosaic: 1.0 mixup: 0.2把配置通過name參數(shù)傳給yolo train即可。增強(qiáng)參數(shù)不是越多越好尤其對行為識(shí)別重點(diǎn)是保持動(dòng)作姿態(tài)的可辨識(shí)性。我見過有人把degrees開到45度結(jié)果模型把傾斜的豬欄立柱當(dāng)成豬識(shí)別率不升反降。5.2 從yolov8n到y(tǒng)olov8m模型大小怎么選小數(shù)據(jù)集上模型越大越容易過擬合但不代表nano一定最好。我在豬行為數(shù)據(jù)這類規(guī)模的項(xiàng)目上對比過幾個(gè)模型結(jié)論可以參考模型參數(shù)量驗(yàn)證集mAP50備注yolov8n約3.2M89%左右訓(xùn)練快過擬合風(fēng)險(xiǎn)低yolov8s約11.2M92%左右平衡點(diǎn)推薦yolov8m約25.9M93%左右提升有限CPU訓(xùn)練慢看YOLOv8網(wǎng)絡(luò)結(jié)構(gòu)圖會(huì)發(fā)現(xiàn)n到m的差異主要在Backbone和C2f模塊的通道數(shù)模型變大意味著能學(xué)習(xí)更細(xì)粒度的紋理特征比如嘴部和耳朵的細(xì)節(jié)。但數(shù)據(jù)量只有1272張時(shí)yolov8m帶來的提升通常不超過12個(gè)百分點(diǎn)訓(xùn)練時(shí)間和顯存占用卻成倍上漲。如果想在RK3588這類板端部署yolov8n甚至yolov8s的INT8量化更現(xiàn)實(shí)訓(xùn)練時(shí)就按部署目標(biāo)選模型避免后期來回?fù)Q。5.3 畫損失函數(shù)曲線圖判斷過擬合還是欠擬合訓(xùn)練完別急著看mAP先畫loss曲線。ultralytics生成的results.png里有box_loss和cls_loss曲線但圖片分辨率有限我習(xí)慣直接用日志數(shù)據(jù)重畫import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) epochs range(len(df)) plt.plot(epochs, df[train/cls_loss], labeltrain_cls) plt.plot(epochs, df[val/cls_loss], labelval_cls) plt.legend() plt.savefig(loss_curve.png)如果train_cls持續(xù)下降、val_cls在某個(gè)點(diǎn)開始反彈就是過擬合信號(hào)回去減小epochs或增強(qiáng)mixup。如果兩條線都平著走不下降說明學(xué)習(xí)率太小或模型容量不夠可以嘗試把lr從默認(rèn)的0.01調(diào)到0.02或者換yolov8s。訓(xùn)練這個(gè)豬行為數(shù)據(jù)集時(shí)過擬合通常出現(xiàn)在第80個(gè)epoch之后所以epochs100配合早停參數(shù)是穩(wěn)妥組合。5.4 預(yù)訓(xùn)練權(quán)重與遷移學(xué)習(xí)的取舍有人問COCO里沒有豬用COCO預(yù)訓(xùn)練權(quán)重對豬行為識(shí)別有沒有用有用而且?guī)椭艽?。COCO預(yù)訓(xùn)練讓模型學(xué)會(huì)了通用的邊緣、紋理和物體結(jié)構(gòu)特征這些對豬一樣適用。差別只在最后的檢測頭——COCO的輸出是80類我們的輸出是4類所以遷移時(shí)要讓ultralytics自動(dòng)裁剪最后一層。如果堅(jiān)持從零訓(xùn)練torchvision和ultralytics都支持隨機(jī)初始化但代價(jià)是收斂慢、精度低。1272張圖從零訓(xùn)出來的模型往往還不如直接用yolov8n.pt微調(diào)30個(gè)epoch的效果。我的建議是第一次訓(xùn)練用官方權(quán)重先把baseline跑出來之后如果想對比從零訓(xùn)練再用modelyolov8n.yaml加載隨機(jī)權(quán)重但不要對精度抱太高期望。6. 部署到RK3588板端從PyTorch權(quán)重到RKNN實(shí)時(shí)推理模型訓(xùn)完最終要落到豬場監(jiān)控上。RK3588是目前做邊緣端行為識(shí)別比較常見的板子它不直接吃PyTorch權(quán)重需要先轉(zhuǎn)ONNX再轉(zhuǎn)RKNN。yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640 opset12這一步要注意opset版本RKNN工具鏈對opset12支持比較好opset太高會(huì)報(bào)不支持算子。轉(zhuǎn)出的onnx再用rknn-toolkit2轉(zhuǎn)成rknn格式。如果做INT8量化需要準(zhǔn)備幾十張代表性圖片做校準(zhǔn)直接在1272張里隨機(jī)抽容易掉點(diǎn)最好是覆蓋白天、夜間、喂料前后等不同光照和活動(dòng)狀態(tài)的圖。板端推理的幾個(gè)關(guān)鍵參數(shù)參數(shù)建議值說明輸入分辨率640和訓(xùn)練保持一致板端改320會(huì)明顯掉精度conf閾值0.3低于0.3輸出大量重疊框高于0.5漏掉遮擋目標(biāo)NMS放CPU端NPU上只跑模型推理NMS用opencv或自寫代碼處理量化類型INT8RK3588的NPU對INT8支持最好FP16精度高但速度慢我在RK3588上跑yolov8n的INT8量化單路640×640大概能到2030ms一幀四路監(jiān)控串行處理勉強(qiáng)夠用。如果追求更高幀率可以把輸入降到480同時(shí)把conf閾值從0.3調(diào)到0.35犧牲一點(diǎn)召回?fù)Q速度。這套流程走完你會(huì)發(fā)現(xiàn)豬行為識(shí)別真正花時(shí)間的不是訓(xùn)練而是數(shù)據(jù)和部署這兩頭數(shù)據(jù)標(biāo)注規(guī)范決定了模型上限部署時(shí)的量化校準(zhǔn)決定了實(shí)際表現(xiàn)。我自己的習(xí)慣是拿到任何行為識(shí)別數(shù)據(jù)集先花半天做類別分布和標(biāo)注質(zhì)量體檢再?zèng)Q定要不要繼續(xù)投入時(shí)間——這是若干次訓(xùn)練翻車換來的經(jīng)驗(yàn)希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取