檢測實(shí)戰(zhàn):電梯內(nèi)人車識別YOLO數(shù)據(jù)集解析)
簡介面向訓(xùn)練電梯場景目標(biāo)檢測模型的算法工程師與深度學(xué)習(xí)學(xué)習(xí)者該數(shù)據(jù)集聚焦電梯內(nèi)人車識別任務(wù)包含97張圖片的YOLO格式標(biāo)注類別設(shè)計(jì)為person、motorcycle、bicycle三類可直接用于YOLOv5、YOLOv6、YOLOv7、YOLOv8、YOLOv9、YOLOv10以及Faster R-CNN、SSD等常見檢測框架的訓(xùn)練與評估。壓縮包共2000個(gè)文件以1999個(gè)txt標(biāo)簽文件為主體配合1個(gè)yaml類別配置文件整體大小約193.33MBtxt文件記錄歸一化邊界框坐標(biāo)yaml文件指定類別名稱與索引解壓后即可進(jìn)行數(shù)據(jù)集劃分、類別校驗(yàn)和模型訓(xùn)練也便于按YOLO系列版本快速切換實(shí)驗(yàn)。已有201人學(xué)習(xí)瀏覽。對缺少封閉場景行人、摩托車、自行車樣本的檢測項(xiàng)目而言這些真實(shí)電梯視角數(shù)據(jù)能幫助快速補(bǔ)齊訓(xùn)練短板驗(yàn)證模型在狹窄監(jiān)控環(huán)境下的泛化表現(xiàn)資源包結(jié)構(gòu)簡潔、標(biāo)注格式統(tǒng)一是一份適合入門到進(jìn)階使用的標(biāo)注數(shù)據(jù)集。1. 電梯內(nèi)人車識別數(shù)據(jù)集97張圖的小樣本目標(biāo)檢測值不值得下我在電梯監(jiān)控項(xiàng)目里經(jīng)常被問到同一個(gè)問題手頭只有不到一百張標(biāo)注圖能做目標(biāo)檢測嗎這份數(shù)據(jù)集就是用來回答這個(gè)問題的。它是一份YOLO格式的電梯內(nèi)人車識別數(shù)據(jù)集圖片只有97張覆蓋person、motorcycle、bicycle三個(gè)類別配套txt標(biāo)簽和指定類別信息的yaml文件能直接喂給YOLOv5到Y(jié)OLOv10全系列訓(xùn)練。很多人一聽小數(shù)據(jù)集就搖頭但電梯場景最大的特點(diǎn)是機(jī)位固定、景別單一、光照變化可控97張圖只要標(biāo)注質(zhì)量過關(guān)足夠把整個(gè)流程跑通并得到一個(gè)能用的檢測器。適合剛接觸目標(biāo)檢測的初學(xué)者驗(yàn)證流程也適合做畢設(shè)、demo或者算法橫向?qū)Ρ取?. 數(shù)據(jù)集結(jié)構(gòu)拆解txt標(biāo)注、命名規(guī)律與類別映射先別急著開訓(xùn)練。拿到這份資源的第一步是把文件結(jié)構(gòu)摸清楚。項(xiàng)目正文里列出的文件全是txt結(jié)尾命名風(fēng)格高度統(tǒng)一長這樣person_in_elevator_3_dat_07-22-2022_time_19-39-09_png.rf.64f6e22d966854811ff2d0273822e03c.txt osmd_Camera12_osmd_20220626195116_3079981_jpg.rf.99d98d4567a082ce7db6cf73b33eac8d.txt這種命名格式在Roboflow導(dǎo)出、再被二次打包的數(shù)據(jù)集里極其常見。第一眼看像亂碼其實(shí)里面藏著三組信息第一段是場景語義標(biāo)簽person_in_elevator或osmd_Camera12第二段是采集日期和時(shí)間07-22-2022、19-39-09第三段是原始圖片文件名加一段哈希后綴。把這段拆明白了后面做樣本篩選和壞數(shù)據(jù)排查會(huì)省很大力氣。我見過不少新手直接拿txt丟進(jìn)訓(xùn)練目錄然后一臉懵地發(fā)現(xiàn)loss飄到NaN多數(shù)根源就在文件對不上號。2.1 從txt文件名還原對應(yīng)圖片txt只是標(biāo)注訓(xùn)練還需要圖片。我一般會(huì)先寫一段腳本把txt對應(yīng)的圖片文件名還原出來確認(rèn)圖片和標(biāo)注是成對存在的。命名規(guī)則是txt去掉.txt后綴后先按.rf.切分取前半部分再把中間的_png替換成.png就得到原始圖片名。import os def reconstruct_image_name(txt_path): 根據(jù)YOLO標(biāo)注文件名還原對應(yīng)圖片文件名 base os.path.basename(txt_path).replace(.txt, ) if .rf. in base: base base.split(.rf.)[0] img_name base.replace(_png, .png) return img_name txt_file person_in_elevator_3_dat_07-22-2022_time_19-39-09_png.rf.64f6e22d966854811ff2d0273822e03c.txt print(reconstruct_image_name(txt_file)) # 輸出: person_in_elevator_3_dat_07-22-2022_time_19-39-09.png邏輯說明.rf.后面的哈希是Roboflow為每個(gè)標(biāo)注文件生成的唯一標(biāo)識跟圖片內(nèi)容沒有關(guān)系原始文件名里用_png表示圖片擴(kuò)展名這里統(tǒng)一替換成.png。參數(shù)說明如果實(shí)際圖片是jpg結(jié)尾把.png換成.jpg即可。但要注意osmd_Camera12那組命名里沒有_png而是直接以_jpg結(jié)尾程序里需要多做一步判斷def reconstruct_image_name_v2(txt_path): base os.path.basename(txt_path).replace(.txt, ) if .rf. in base: base base.split(.rf.)[0] if base.endswith(_jpg): return base.replace(_jpg, .jpg) return base.replace(_png, .png)早期版本的數(shù)據(jù)集打包風(fēng)格并不完全統(tǒng)一同一個(gè)壓縮包里出現(xiàn)兩種命名也不稀奇。所以還原文件名這個(gè)步驟絕對不能省建議寫完后對全部txt跑一遍把沒有對應(yīng)圖片的txt直接列出來。還原之后再把txt目錄和圖片目錄做一次集合差集找出只有標(biāo)注沒有圖片、或只有圖片沒有標(biāo)注的孤立文件。小數(shù)據(jù)集最怕這種不配對情況訓(xùn)練時(shí)YOLO會(huì)靜默跳過無標(biāo)注圖片最終實(shí)際訓(xùn)練樣本比97更少而且你還很難察覺。2.2 YOLO格式標(biāo)注一行五個(gè)數(shù)字的含義任取一個(gè)txt打開內(nèi)容基本長這樣0 0.673828 0.491484 0.226563 0.335938 1 0.303125 0.431250 0.203125 0.362500每一行是一個(gè)目標(biāo)框第一個(gè)數(shù)字是類別ID0對應(yīng)yaml里第0個(gè)類別后面四個(gè)數(shù)字依次是x_center、y_center、width、height全部做了歸一化值域在0到1之間。需要結(jié)合圖片像素寬高反算回真實(shí)坐標(biāo)。這也是YOLO系列沿用的txt標(biāo)注約定YOLOv5到Y(jié)OLOv10通用。def parse_yolo_txt(txt_path, img_w, img_h): 讀取YOLO txt標(biāo)注返回像素坐標(biāo)形式的目標(biāo)框 boxes [] with open(txt_path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) x_c, y_c, w_n, h_n map(float, parts[1:]) x1 int((x_c - w_n / 2) * img_w) y1 int((y_c - h_n / 2) * img_h) x2 int((x_c w_n / 2) * img_w) y2 int((y_c h_n / 2) * img_h) boxes.append((cls_id, x1, y1, x2, y2)) return boxes邏輯說明歸一化坐標(biāo)乘以圖片寬高后得到目標(biāo)框中心點(diǎn)和寬高再進(jìn)一步換算成左上角和右下角像素坐標(biāo)方便畫框或轉(zhuǎn)成VOC格式。參數(shù)說明img_w和img_h必須是標(biāo)注時(shí)用的原始圖片尺寸。訓(xùn)練時(shí)YOLO會(huì)先把圖片resize到imgsz默認(rèn)640但txt里存的坐標(biāo)始終是相對原始寬高的比例反算像素框不能拿resize后的尺寸??礃?biāo)注時(shí)我還習(xí)慣順手檢查坐標(biāo)是否越界。x_c加w_n/2超過1或x_c減w_n/2小于0都說明標(biāo)注框超出圖像邊界這種樣本會(huì)導(dǎo)致anchor匹配異常最好單獨(dú)篩出來人工修。另外統(tǒng)計(jì)一下單張圖的標(biāo)注框數(shù)量也很有用電梯里人車混行時(shí)一個(gè)畫面五六個(gè)目標(biāo)很正常如果某張圖只有一兩個(gè)框但肉眼能看出更多目標(biāo)就是標(biāo)注遺漏。2.3 yaml配置與類別字段數(shù)據(jù)集配套的yaml是訓(xùn)練入口YOLO訓(xùn)練前先讀它來確定類別數(shù)。這份數(shù)據(jù)集的配置核心就三行names: 0: person 1: motorcycle 2: bicycle nc: 3names的順序必須和txt標(biāo)注里的class_id嚴(yán)格對應(yīng)0對應(yīng)person1對應(yīng)motorcycle2對應(yīng)bicycle不能只改名字不改順序。nc是類別總數(shù)YOLO模型head輸出維度依賴它寫錯(cuò)輕則訓(xùn)練報(bào)錯(cuò)重則推理時(shí)類別錯(cuò)亂。注意這份資源的yaml里沒有path、train、val字段是精簡版配置拿到手要按自己的目錄補(bǔ)全這部分在下一章給出完整寫法。如果訓(xùn)練時(shí)報(bào)錯(cuò)找不到data.yaml大概率就是路徑字段缺失或者相對路徑基準(zhǔn)不對。2.4 從VOC格式轉(zhuǎn)成YOLO一個(gè)常用轉(zhuǎn)換腳本雖然這份資源自帶YOLO格式但手頭往往還有一批VOC格式的xml標(biāo)注想合并訓(xùn)練。xml里存的是絕對像素坐標(biāo)xmin、ymin、xmax、ymaxtxt里存的是歸一化的中心點(diǎn)坐標(biāo)兩者互轉(zhuǎn)的核心是寬高歸一化。import xml.etree.ElementTree as ET def voc_xml_to_yolo_txt(xml_path, out_txt_path, class_map): VOC xml標(biāo)注轉(zhuǎn)YOLO txt標(biāo)注 tree ET.parse(xml_path) root tree.getroot() img_w int(root.find(size/width).text) img_h int(root.find(size/height).text) with open(out_txt_path, w) as f: for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in class_map: continue cls_id class_map[cls_name] box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_c (xmin xmax) / 2 / img_w y_c (ymin ymax) / 2 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h f.write(f{cls_id} {x_c:.6f} {y_c:.6f} {w:.6f} {h:.6f}\n)邏輯說明中心點(diǎn)坐標(biāo)取xmin加xmax的平均值再除以圖片寬度寬高用像素差值除以圖片尺寸寫出的五列順序和YOLO約定完全一致。參數(shù)說明class_map是類名到ID的映射字典比如{person: 0, motorcycle: 1, bicycle: 2}。轉(zhuǎn)換前先確認(rèn)xml里的類名和yaml里的names拼寫一致否則類別會(huì)靜默映射到錯(cuò)誤ID。我踩過拼寫坑xml里寫的是Person首字母大寫映射字典里卻是小寫那一類的目標(biāo)全部學(xué)不出來連續(xù)查了兩天才定位到問題。3. YOLOv8實(shí)戰(zhàn)訓(xùn)練從數(shù)據(jù)劃分到mAP驗(yàn)證格式確認(rèn)沒問題接下來就是實(shí)際訓(xùn)練。我用YOLOv8演示ultralytics的接口在這幾個(gè)版本里最簡潔命令和參數(shù)也基本兼容YOLOv5以及v9、v10。小數(shù)據(jù)集訓(xùn)練有個(gè)總原則先把流程跑通再談?wù){(diào)優(yōu)。第一次用默認(rèn)參數(shù)快速驗(yàn)證數(shù)據(jù)沒毛病第二次再加大訓(xùn)練輪數(shù)和增強(qiáng)策略。3.1 目錄結(jié)構(gòu)與train/val劃分YOLO系列的目錄約定是images和labels兩個(gè)平行目錄各自再分train和val。97張圖不算多但為了驗(yàn)證泛化能力不能全部拿去訓(xùn)練。我一般按8:2劃分保留19張左右的驗(yàn)證圖。mkdir -p dataset/elevator/{images/{train,val},labels/{train,val}} cp person_in_elevator_*.jpg dataset/elevator/images/train/ cp person_in_elevator_*.txt dataset/elevator/labels/train/ # 驗(yàn)證集同理按比例抽出一部分文件實(shí)際處理時(shí)我是用腳本按文件名前綴分組shuffle的避免同一時(shí)間戳連拍的圖片全部落進(jìn)訓(xùn)練集或驗(yàn)證集。電梯場景里時(shí)間連續(xù)的視頻幀非常相似如果驗(yàn)證集和訓(xùn)練集來自同一段連拍mAP會(huì)虛高換到真實(shí)視頻里就露餡。寫劃分腳本時(shí)我習(xí)慣順手做兩件事。一是統(tǒng)計(jì)每個(gè)類別的目標(biāo)框數(shù)量二是統(tǒng)計(jì)每張圖的標(biāo)注框數(shù)量。這兩項(xiàng)數(shù)據(jù)能提前暴露類別不平衡和標(biāo)注遺漏。如果motorcycle只有十幾張圖有標(biāo)注那這一類的表現(xiàn)會(huì)明顯差于person。個(gè)人經(jīng)驗(yàn)是遇到這種分布寧可把val里motorcycle占比提高一點(diǎn)也不要讓它只出現(xiàn)在測試集里。3.2 編寫完整的data.yaml訓(xùn)練前需要把精簡的類別配置擴(kuò)展成完整data.yamlpath: /data/elevator train: images/train val: images/val nc: 3 names: 0: person 1: motorcycle 2: bicyclepath我用絕對路徑避免相對路徑在多個(gè)環(huán)境復(fù)用時(shí)找不到數(shù)據(jù)。train和val是相對于path的目錄名YOLO會(huì)自動(dòng)拼接完整路徑。names的順序必須和txt標(biāo)注的class_id嚴(yán)格一致這三個(gè)字段是訓(xùn)練配置里最核心的部分改一個(gè)字符都要重新檢查上下對得上。如果你的電腦內(nèi)存足夠把batch從默認(rèn)值調(diào)高能明顯加快訓(xùn)練。我在這臺機(jī)器上用過batch16、imgsz640顯存占用大概6GByolov8n這個(gè)輕量模型跑起來沒有壓力。如果顯卡只有4GB顯存把batch降到8或者4優(yōu)先保證不爆顯存不要為了速度硬上大batch。3.3 訓(xùn)練命令與關(guān)鍵參數(shù)yolo detect train \ datadataset/elevator/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ patience20 \ seed42 \ projectruns/elevator \ nameexp_person_vehicle邏輯說明yolo detect train是ultralytics統(tǒng)一訓(xùn)練入口。model參數(shù)寫yolov8n.pt會(huì)自動(dòng)下載預(yù)訓(xùn)練權(quán)重并遷移學(xué)習(xí)這對小數(shù)據(jù)集至關(guān)重要從零開始訓(xùn)練97張圖幾乎不可能收斂。epochs100對這類簡單場景夠用patience20表示連續(xù)20輪驗(yàn)證指標(biāo)不提升就提前停止。參數(shù)說明imgsz640是訓(xùn)練尺度如果電梯畫面里的目標(biāo)是近景大目標(biāo)可以試640以上一般不超過1280否則小數(shù)據(jù)集容易過擬合seed固定成42不然每次訓(xùn)練結(jié)果都不一樣復(fù)現(xiàn)實(shí)驗(yàn)時(shí)會(huì)很痛苦。跑完訓(xùn)練后runs/elevator/exp_person_vehicle下會(huì)生成weights/best.pt和weights/last.pt。best.pt是驗(yàn)證集上表現(xiàn)最好的權(quán)重后文推理一律用best.pt。有個(gè)細(xì)節(jié)值得注意小數(shù)據(jù)集上best和last差異可能很大因?yàn)轵?yàn)證集只有幾十張圖某幾輪恰好擬合得好指標(biāo)就沖上去best并不一定代表泛化最好但作為工程交付默認(rèn)選它沒毛病。訓(xùn)練過程的中間產(chǎn)物里results.png和confusion_matrix.png這兩個(gè)文件值得重點(diǎn)看。results.png包含loss曲線和mAP曲線如果loss曲線尾部還在明顯下降說明epochs給少了confusion_matrix.png能看到具體是哪些類別互相串。小數(shù)據(jù)集里混淆矩陣的格子稀疏要對著真實(shí)框數(shù)來解讀絕對值不要被個(gè)別off-diagonal格子嚇到。3.4 評估指標(biāo)怎么看訓(xùn)練結(jié)束后YOLO會(huì)在驗(yàn)證集上自動(dòng)跑一輪輸出mAP50、mAP50-95、precision、recall。對這個(gè)數(shù)據(jù)集我更關(guān)注每個(gè)類別的recall也就是「真實(shí)目標(biāo)里找回來多少」。yolo detect val \ datadataset/elevator/data.yaml \ modelruns/elevator/exp_person_vehicle/weights/best.pt輸出結(jié)果類似下面Class Images Instances Box(P.5) R.5 mAP50 mAP50-95 all 19 34 0.92 0.85 0.89 0.61 person 19 22 0.95 0.91 0.94 0.68 motorcycle 6 8 0.88 0.75 0.82 0.55 bicycle 6 4 0.90 0.75 0.79 0.50注意Instances這一列motorcycle和bicycle的實(shí)例數(shù)明顯少于person類別不平衡很直觀。如果某類recall偏低不要急著加大epochs先看驗(yàn)證集里漏檢的都長什么樣是遮擋嚴(yán)重、目標(biāo)太小還是和person重疊導(dǎo)致NMS把框并掉了。我曾經(jīng)在這個(gè)數(shù)據(jù)集上遇到motorcycle漏檢最后發(fā)現(xiàn)是電梯里有人扶著摩托車人和車重疊面積超過一半模型只能看到一個(gè)框這類問題瓶頸在標(biāo)注和推理策略不在訓(xùn)練輪數(shù)。4. 避坑指南小樣本訓(xùn)練的高頻翻車與排查小樣本目標(biāo)檢測的坑一大半在數(shù)據(jù)一小半在配置模型本身反而是最省心的部分。這一章把我實(shí)際跑這套數(shù)據(jù)集踩過的坑按「現(xiàn)象、原因、解決」順序?qū)懬宄奖銓μ柸胱?.1 訓(xùn)練loss很低但mAP始終上不去現(xiàn)象訓(xùn)練loss從第30輪開始基本不怎么降了但驗(yàn)證集mAP只有0.3上下明顯不正常。原因最常見是圖片和標(biāo)注文件沒配對。txt文件名帶.rf.哈希圖片文件名不帶如果直接把txt對應(yīng)到同目錄下的jpg會(huì)發(fā)現(xiàn)大量txt找不到同名圖片。YOLO訓(xùn)練遇到無標(biāo)注圖片會(huì)跳過實(shí)際參與訓(xùn)練的圖片數(shù)量遠(yuǎn)小于97模型學(xué)不到足夠的正樣本。解決訓(xùn)練前把images和labels兩個(gè)目錄的文件名做集合差集檢查。我寫了個(gè)十幾行的腳本兩個(gè)set求差集把多余的txt或圖片打出來逐個(gè)看。另外檢查txt是否有空文件空標(biāo)注會(huì)被當(dāng)成純背景圖加入訓(xùn)練小數(shù)據(jù)集里一張空標(biāo)注的影響都會(huì)被放大。跑完數(shù)據(jù)體檢再訓(xùn)練基本就能排除這個(gè)問題。4.2 驗(yàn)證集mAP忽高忽低重訓(xùn)結(jié)果不穩(wěn)定現(xiàn)象同樣的代碼、同樣的參數(shù)兩次訓(xùn)練mAP50在0.7和0.5之間波動(dòng)不知道信哪個(gè)。原因樣本太少訓(xùn)練/驗(yàn)證劃分的隨機(jī)性主導(dǎo)了結(jié)果。某次劃分把摩托車樣本多分給驗(yàn)證集指標(biāo)就高反之就低。另一個(gè)原因是隨機(jī)種子沒固定錨框初始化和batch采樣順序都會(huì)影響最終收斂位置。解決顯式固定seed我習(xí)慣固定42并使用固定劃分好的train/val目錄不要每次隨機(jī)切。更進(jìn)一步可以做5折交叉驗(yàn)證把數(shù)據(jù)平均分成5份輪流訓(xùn)練和驗(yàn)證最后一堆mAP取均值。97張圖跑5折單輪時(shí)間也不長得到的指標(biāo)才勉強(qiáng)算可靠。這個(gè)結(jié)論放在畢業(yè)論文里也站得住腳審稿人看到單次實(shí)驗(yàn)結(jié)果的方差時(shí)經(jīng)常質(zhì)疑結(jié)論。4.3 person和motorcycle、bicycle互相串檢現(xiàn)象驗(yàn)證集里person被框成motorcycle推著自行車的人同時(shí)輸出兩個(gè)類別框。原因電梯里人車混行人和車經(jīng)常大面積重疊目標(biāo)框中心和尺寸高度接近。加上motorcycle、bicycle實(shí)例少模型對兩類邊界區(qū)分不足重疊區(qū)域的分類置信度自然漂移。解決先調(diào)推理參數(shù)而不是加訓(xùn)練輪數(shù)。把conf閾值從0.25提到0.35把NMS的IoU閾值從默認(rèn)0.5調(diào)到0.45能壓掉一批低置信度串檢框。如果還不夠針對小樣本類別做copy-paste增強(qiáng)把摩托車目標(biāo)摳出來復(fù)制到同一張圖其他位置人工增加正樣本數(shù)。這招對同類小樣本問題我屢試不爽但要注意粘貼位置避開電梯按鈕、樓層顯示器這些干擾區(qū)域。4.4 txt類別ID與yaml類別順序?qū)Σ簧犀F(xiàn)象訓(xùn)練日志顯示三個(gè)類別都正常推理時(shí)person框在結(jié)果里顯示成motorcycle。原因txt里的class_id是0、1、2而yaml里names寫成了[person, bicycle, motorcycle]bicycle和motorcycle位置互換了。模型學(xué)的是ID與視覺特征的映射ID本身沒有語義names只是顯示給人看的所以訓(xùn)練時(shí)不報(bào)任何錯(cuò)直到預(yù)測階段才發(fā)現(xiàn)類別錯(cuò)亂。解決寫一個(gè)校驗(yàn)?zāi)_本隨機(jī)挑幾張圖把txt里每個(gè)ID的目標(biāo)框畫出來并打印原始圖人工核一遍順序。我轉(zhuǎn)任何數(shù)據(jù)集都會(huì)強(qiáng)制走一遍這個(gè)流程五分鐘就能避免一個(gè)訓(xùn)練周期白跑。順帶檢查xml轉(zhuǎn)txt的class_map是否和yaml完全一致大寫、空格、下劃線差異都會(huì)導(dǎo)致同樣的錯(cuò)位。4.5 增強(qiáng)過強(qiáng)導(dǎo)致驗(yàn)證集mAP異常低現(xiàn)象訓(xùn)練集loss正常下降但驗(yàn)證集mAP一直很低置信度框大量亂串。原因yolov8默認(rèn)增強(qiáng)對97張圖來說偏猛旋轉(zhuǎn)和透視會(huì)把固定視角場景里的目標(biāo)幾何形態(tài)帶偏模型學(xué)到的特征和真實(shí)電梯畫面不匹配。解決把hsv_h、degrees、translate這些增強(qiáng)參數(shù)調(diào)小甚至關(guān)掉先跑baseline再逐步加回來。這個(gè)排查順序我踩過不止一次先懷疑增強(qiáng)比懷疑模型結(jié)構(gòu)要高效得多。等確認(rèn)增強(qiáng)策略沒問題再回頭檢查數(shù)據(jù)和標(biāo)注方向就清晰了。5. 進(jìn)階技巧視頻推理、模型導(dǎo)出與遷移復(fù)用模型訓(xùn)練完真正用起來才是目的。電梯場景的實(shí)際應(yīng)用是接攝像頭流不是跑單張圖。ultralytics對視頻推理支持得很直接yolo predict \ modelruns/elevator/exp_person_vehicle/weights/best.pt \ sourceelevator_camera.mp4 \ conf0.35 \ saveTrueconf0.35是我在這類場景里的常用值電梯里人車目標(biāo)尺度和遮擋差異大默認(rèn)0.25會(huì)出太多低置信度框saveTrue會(huì)把帶框的視頻保存到runs/predict目錄。如果想在業(yè)務(wù)系統(tǒng)里調(diào)用更建議導(dǎo)出ONNX再按需轉(zhuǎn)TensorRTyolo export modelruns/elevator/exp_person_vehicle/weights/best.pt formatonnx opset12 imgsz640導(dǎo)出后配合onnxruntime做推理業(yè)務(wù)側(cè)就不依賴PyTorch環(huán)境了部署到邊緣盒子上內(nèi)存占用能降不少。這個(gè)數(shù)據(jù)集量級小yolov8n導(dǎo)出的ONNX只有十幾MB適合嵌入式場景。另一個(gè)容易被忽略的價(jià)值是遷移復(fù)用。電梯內(nèi)人車識別這個(gè)小模型的權(quán)重可以作為相似固定視角場景的預(yù)訓(xùn)練起點(diǎn)。比如你后續(xù)要識別樓道、地下車庫的人車目標(biāo)用best.pt作為預(yù)訓(xùn)練權(quán)重往往比直接用COCO權(quán)重收斂更快因?yàn)榈讓犹卣鞣植几咏@類俯視、近距離、光照穩(wěn)定的小場景。我從那以后每次做完固定視角的小數(shù)據(jù)集都會(huì)把最終權(quán)重、data.yaml和數(shù)據(jù)劃分腳本一起歸檔文件名里寫好類別順序和訓(xùn)練參數(shù)避免幾個(gè)月后連自己都認(rèn)不清當(dāng)時(shí)用的配置。如果你正在做電梯或類似固定視角小場景的人車識別這份97圖的資源用來跑通全流程、驗(yàn)證算法規(guī)劃足夠省事希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取