97色伦色在线综合视频,无玛专区,18videosex性欧美黑色,日韩黄色电影免费在线观看,国产精品伦理一区二区三区,在线视频欧美日韩,亚洲欧美在线中文字幕不卡

江蘇省住房和城鄉(xiāng)建設(shè)網(wǎng)站上海市住房與城鄉(xiāng)建設(shè)部網(wǎng)站

鶴壁市浩天電氣有限公司 2026/01/24 11:08:35
江蘇省住房和城鄉(xiāng)建設(shè)網(wǎng)站,上海市住房與城鄉(xiāng)建設(shè)部網(wǎng)站,有經(jīng)驗(yàn)的贛州網(wǎng)站建設(shè),常州建設(shè)工程電子審圖網(wǎng)站【YOLOv8-Ultralytics】 【目標(biāo)檢測(cè)】【v8.3.235版本】 模型專用訓(xùn)練器代碼train.py解析 文章目錄【YOLOv8-Ultralytics】 【目標(biāo)檢測(cè)】【v8.3.235版本】 模型專用訓(xùn)練器代碼train.py解析前言所需的庫(kù)和模塊DetectionTrainer 類整體概覽初始化函數(shù)#xff1a;__init__數(shù)據(jù)集構(gòu)…【YOLOv8-Ultralytics】 【目標(biāo)檢測(cè)】【v8.3.235版本】 模型專用訓(xùn)練器代碼train.py解析文章目錄【YOLOv8-Ultralytics】 【目標(biāo)檢測(cè)】【v8.3.235版本】 模型專用訓(xùn)練器代碼train.py解析前言所需的庫(kù)和模塊DetectionTrainer 類整體概覽初始化函數(shù)__init__數(shù)據(jù)集構(gòu)建build_dataset數(shù)據(jù)加載器構(gòu)建get_dataloader批次預(yù)處理preprocess_batch模型屬性設(shè)置set_model_attributes模型初始化get_model驗(yàn)證器創(chuàng)建get_validator損失格式化label_loss_items進(jìn)度字符串生成progress_string訓(xùn)練樣本可視化plot_training_samples訓(xùn)練標(biāo)簽可視化plot_training_labels完整代碼適配YOLO檢測(cè)的核心特性工程化核心優(yōu)化調(diào)試與可視化能力關(guān)鍵注意事項(xiàng)總結(jié)前言代碼路徑ultralyticsmodelsyolodetect rain.py這段代碼是 Ultralytics YOLO 框架中目標(biāo)檢測(cè)模型專用訓(xùn)練器 DetectionTrainer 的核心實(shí)現(xiàn)繼承自基礎(chǔ)訓(xùn)練器 BaseTrainer專門(mén)適配 YOLO 目標(biāo)檢測(cè)的訓(xùn)練特性如多尺度訓(xùn)練、矩形推理、檢測(cè)損失適配封裝了從「數(shù)據(jù)集構(gòu)建→數(shù)據(jù)加載→預(yù)處理→模型初始化→驗(yàn)證→可視化→自動(dòng)批次計(jì)算」的全流程訓(xùn)練邏輯是 YOLO 檢測(cè)模型訓(xùn)練的核心入口?!綴OLOv8-Ultralytics 系列文章目錄】所需的庫(kù)和模塊# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# 引入未來(lái)版本的類型注解支持提升代碼類型提示和靜態(tài)檢查能力from__future__importannotations# 導(dǎo)入基礎(chǔ)數(shù)學(xué)計(jì)算、隨機(jī)數(shù)生成模塊用于多尺度訓(xùn)練的隨機(jī)縮放importmathimportrandom# 導(dǎo)入淺拷貝避免原配置被修改、類型注解模塊fromcopyimportcopyfromtypingimportAny# 導(dǎo)入數(shù)值計(jì)算、PyTorch核心、PyTorch神經(jīng)網(wǎng)絡(luò)模塊核心依賴importnumpyasnpimporttorchimporttorch.nnasnn# 從ultralytics數(shù)據(jù)模塊導(dǎo)入數(shù)據(jù)加載器構(gòu)建、YOLO專用數(shù)據(jù)集構(gòu)建函數(shù)fromultralytics.dataimportbuild_dataloader,build_yolo_dataset# 從ultralytics引擎模塊導(dǎo)入基礎(chǔ)訓(xùn)練器基類提供通用訓(xùn)練流程fromultralytics.engine.trainerimportBaseTrainer# 從ultralytics模型模塊導(dǎo)入yolo子模塊用于創(chuàng)建檢測(cè)驗(yàn)證器fromultralytics.modelsimportyolo# 從ultralytics神經(jīng)網(wǎng)絡(luò)任務(wù)模塊導(dǎo)入檢測(cè)模型類YOLO檢測(cè)模型核心fromultralytics.nn.tasksimportDetectionModel# 從ultralytics工具模塊導(dǎo)入默認(rèn)配置、日志器、分布式訓(xùn)練進(jìn)程排名fromultralytics.utilsimportDEFAULT_CFG,LOGGER,RANK# 從ultralytics工具補(bǔ)丁模塊導(dǎo)入配置臨時(shí)覆蓋函數(shù)用于auto_batchfromultralytics.utils.patchesimportoverride_configs# 從ultralytics工具繪圖模塊導(dǎo)入訓(xùn)練樣本可視化、標(biāo)簽分布可視化函數(shù)fromultralytics.utils.plottingimportplot_images,plot_labels# 從ultralytics工具PyTorch模塊導(dǎo)入分布式訓(xùn)練同步工具、模型解包函數(shù)去除DDP/DP包裝fromultralytics.utils.torch_utilsimporttorch_distributed_zero_first,unwrap_modelDetectionTrainer 類整體概覽項(xiàng)目詳情類名DetectionTrainer父類BaseTrainerUltralytics 通用訓(xùn)練器提供訓(xùn)練循環(huán)、日志、保存等基礎(chǔ)能力核心定位YOLO 目標(biāo)檢測(cè)模型專用訓(xùn)練器適配檢測(cè)任務(wù)的數(shù)據(jù)集、預(yù)處理、損失、驗(yàn)證邏輯核心依賴模塊ultralytics.data數(shù)據(jù)處理、ultralytics.engine訓(xùn)練引擎、ultralytics.nn網(wǎng)絡(luò)、ultralytics.utils工具典型使用流程初始化→構(gòu)建數(shù)據(jù)集→構(gòu)建數(shù)據(jù)加載器→預(yù)處理批次→初始化模型→訓(xùn)練→驗(yàn)證→可視化關(guān)鍵特性1. 適配YOLO stride對(duì)齊/矩形推理2. 分布式訓(xùn)練兼容3. 多尺度訓(xùn)練4. 全流程可視化5. 自動(dòng)批次計(jì)算初始化函數(shù)initdef__init__(self,cfgDEFAULT_CFG,overrides:dict[str,Any]|NoneNone,_callbacksNone): 初始化DetectionTrainer實(shí)例用于YOLO目標(biāo)檢測(cè)模型訓(xùn)練 核心是繼承BaseTrainer的通用訓(xùn)練邏輯保留檢測(cè)任務(wù)的專屬配置 參數(shù): cfg (dict, 可選): 默認(rèn)訓(xùn)練配置字典包含所有訓(xùn)練參數(shù)如epochs、batch、imgsz等 overrides (dict, 可選): 覆蓋默認(rèn)配置的參數(shù)字典如指定自定義epochs、data路徑 _callbacks (list, 可選): 訓(xùn)練過(guò)程中執(zhí)行的回調(diào)函數(shù)列表如日志打印、模型保存、早停 # 調(diào)用父類BaseTrainer的初始化方法傳入配置、覆蓋參數(shù)、回調(diào)函數(shù)# 父類初始化會(huì)解析配置、設(shè)置設(shè)備GPU/CPU、創(chuàng)建保存目錄、加載數(shù)據(jù)集配置等檢測(cè)任務(wù)無(wú)需額外初始化邏輯僅繼承基礎(chǔ)能力super().__init__(cfg,overrides,_callbacks)項(xiàng)目詳情函數(shù)名__init__功能概述繼承父類通用訓(xùn)練器邏輯初始化檢測(cè)訓(xùn)練器的配置、回調(diào)等核心屬性返回值無(wú)構(gòu)造函數(shù)核心邏輯調(diào)用父類BaseTrainer的初始化方法繼承通用訓(xùn)練能力保留檢測(cè)任務(wù)專屬擴(kuò)展注意事項(xiàng)所有檢測(cè)任務(wù)的專屬配置如stride、rect均通過(guò)overrides傳入而非在此處硬編碼數(shù)據(jù)集構(gòu)建build_datasetdefbuild_dataset(self,img_path:str,mode:strtrain,batch:int|NoneNone): 構(gòu)建YOLO訓(xùn)練/驗(yàn)證數(shù)據(jù)集適配YOLO的輸入要求stride對(duì)齊、矩形推理 參數(shù): img_path (str): 圖像文件夾路徑如數(shù)據(jù)集的train/val目錄 mode (str): 數(shù)據(jù)集模式train訓(xùn)練啟用數(shù)據(jù)增強(qiáng)或val驗(yàn)證禁用增強(qiáng)不同模式啟用不同數(shù)據(jù)增強(qiáng) batch (int, 可選): 批次大小僅用于rect矩形推理模式的尺寸計(jì)算 返回: (Dataset): 配置好的YOLO數(shù)據(jù)集實(shí)例包含數(shù)據(jù)增強(qiáng)、緩存、stride對(duì)齊等邏輯 # 計(jì)算全局stride確保圖像尺寸是stride的整數(shù)倍避免下采樣維度錯(cuò)位# 1. unwrap_model解包模型去除DDP/DP包裝獲取模型最大stride無(wú)模型時(shí)默認(rèn)0# 2. 取stride和32的最大值YOLO默認(rèn)最小stride為32gsmax(int(unwrap_model(self.model).stride.max()ifself.modelelse0),32)# 調(diào)用build_yolo_dataset構(gòu)建數(shù)據(jù)集# - rectmodeval驗(yàn)證模式啟用矩形推理按圖像原比例縮放減少黑邊提升效率# - stridegs確保圖像尺寸對(duì)齊全局stride圖像尺寸是stride整數(shù)倍避免下采樣維度錯(cuò)位returnbuild_yolo_dataset(self.args,img_path,batch,self.data,modemode,rectmodeval,stridegs)項(xiàng)目詳情函數(shù)名build_dataset功能概述構(gòu)建YOLO檢測(cè)專用數(shù)據(jù)集適配stride對(duì)齊、訓(xùn)練/驗(yàn)證差異化配置返回值DatasetYOLO專用數(shù)據(jù)集實(shí)例YOLODataset/YOLOMultiModalDataset核心邏輯1. 計(jì)算全局stride確保尺寸對(duì)齊2. 調(diào)用build_yolo_dataset構(gòu)建數(shù)據(jù)集區(qū)分訓(xùn)練/驗(yàn)證模式設(shè)計(jì)亮點(diǎn)1. 動(dòng)態(tài)適配模型stride無(wú)需手動(dòng)指定2. 訓(xùn)練/驗(yàn)證模式差異化配置增強(qiáng)/rect注意事項(xiàng)訓(xùn)練模式禁用rect避免與shuffle沖突驗(yàn)證模式啟用rect提升效率矩形推理Rectangular Inference核心定義YOLO 目標(biāo)檢測(cè)框架中針對(duì)圖像預(yù)處理的優(yōu)化策略核心是保持圖像原始寬高比進(jìn)行縮放僅對(duì)不足部分填充最小黑邊最終生成 “矩形” 輸入張量而非強(qiáng)制縮放到固定正方形尺寸適配模型 stride 要求的同時(shí)減少圖像變形和無(wú)效計(jì)算。數(shù)據(jù)加載器構(gòu)建get_dataloaderdefget_dataloader(self,dataset_path:str,batch_size:int16,rank:int0,mode:strtrain): 為指定模式train/val構(gòu)建并返回PyTorch DataLoader 適配分布式訓(xùn)練、矩形推理、多線程加載等YOLO訓(xùn)練特性 參數(shù): dataset_path (str): 數(shù)據(jù)集路徑對(duì)應(yīng)img_path batch_size (int): 每個(gè)批次的圖像數(shù)量默認(rèn)16 rank (int): 分布式訓(xùn)練中的進(jìn)程排名rank0為主進(jìn)程 mode (str): 數(shù)據(jù)加載模式train訓(xùn)練或val驗(yàn)證 返回: (DataLoader): 配置好的PyTorch數(shù)據(jù)加載器實(shí)例 # 斷言校驗(yàn)?zāi)J胶戏ㄐ詢H允許train/val避免傳入錯(cuò)誤模式assertmodein{train,val},fMode must be train or val, not{mode}.# 分布式訓(xùn)練兼容僅讓rank0的進(jìn)程初始化數(shù)據(jù)集緩存避免多進(jìn)程重復(fù)生成.cache文件withtorch_distributed_zero_first(rank):# 調(diào)用build_dataset構(gòu)建數(shù)據(jù)集datasetself.build_dataset(dataset_path,mode,batch_size)# 訓(xùn)練模式啟用數(shù)據(jù)打亂提升泛化性驗(yàn)證模式禁用shufflemodetrain# 兼容性處理矩形推理rectTrue與shuffle不兼容強(qiáng)制關(guān)閉shuffle并打印告警ifgetattr(dataset,rect,False)andshuffle:LOGGER.warning(rectTrue is incompatible with DataLoader shuffle, setting shuffleFalse)shuffleFalse# 構(gòu)建并返回?cái)?shù)據(jù)加載器# - workers訓(xùn)練模式用args.workers驗(yàn)證模式翻倍提升驗(yàn)證速度# - drop_last編譯模式訓(xùn)練模式下丟棄最后不完整批次避免維度錯(cuò)誤returnbuild_dataloader(dataset,batchbatch_size,workersself.args.workersifmodetrainelseself.args.workers*2,shuffleshuffle,rankrank,drop_lastself.args.compileandmodetrain,)項(xiàng)目詳情函數(shù)名get_dataloader功能概述構(gòu)建PyTorch DataLoader適配分布式訓(xùn)練、rect/shuffle兼容性、多線程加載返回值DataLoaderPyTorch數(shù)據(jù)加載器InfiniteDataLoader核心邏輯1. 分布式兼容初始化數(shù)據(jù)集2. 處理rect與shuffle沖突3. 構(gòu)建加載器并設(shè)置workers設(shè)計(jì)亮點(diǎn)1. 分布式緩存初始化2. 自動(dòng)處理rect/shuffle兼容性3. 動(dòng)態(tài)workers配置注意事項(xiàng)分布式訓(xùn)練時(shí)rank由框架自動(dòng)傳入無(wú)需手動(dòng)指定rect矩形訓(xùn)練 / 推理是 YOLO 為提升效率設(shè)計(jì)的優(yōu)化策略核心目標(biāo)是減少圖像縮放后的黑邊降低無(wú)效像素計(jì)算默認(rèn)正方形縮放常規(guī)模式下所有圖像會(huì)被強(qiáng)制縮放到 imgsz×imgsz 的正方形如 640×640即使原始圖像是 16:9如 1920×1080縮放后會(huì)填充大量黑邊矩形推理縮放rectTrue 時(shí)會(huì)先統(tǒng)計(jì)數(shù)據(jù)集所有圖像的寬高比將寬高比接近的圖像分組同組圖像縮放到「相同的矩形尺寸」而非正方形比如 16:9 的圖像統(tǒng)一縮放到 640×360完全無(wú)黑邊。訓(xùn)練階段的 shuffleTrue 是「隨機(jī)打亂所有圖像的順序」這會(huì)直接破壞 rect 模式的 “按寬高比分組” 邏輯。批次預(yù)處理preprocess_batchdefpreprocess_batch(self,batch:dict)-dict: 對(duì)單批次數(shù)據(jù)做預(yù)處理設(shè)備遷移、歸一化、多尺度縮放 是YOLO訓(xùn)練前的核心數(shù)據(jù)處理步驟確保輸入符合模型要求 參數(shù): batch (dict): 批次數(shù)據(jù)字典包含img圖像張量、cls類別、bboxes框坐標(biāo)、im_file圖像路徑等 返回: (dict): 預(yù)處理后的批次數(shù)據(jù)字典 # 遍歷批次字典將所有張量移至指定設(shè)備GPU/CPU# - CUDA設(shè)備啟用non_blockingTrue非阻塞傳輸提升數(shù)據(jù)加載速度f(wàn)ork,vinbatch.items():ifisinstance(v,torch.Tensor):batch[k]v.to(self.device,non_blockingself.device.typecuda)# 圖像歸一化轉(zhuǎn)浮點(diǎn)型并除以255將像素值從[0,255]縮放到[0,1]符合模型輸入要求batch[img]batch[img].float()/255# 多尺度訓(xùn)練啟用時(shí)隨機(jī)縮放圖像尺寸提升模型對(duì)不同尺度目標(biāo)的檢測(cè)能力ifself.args.multi_scale:imgsbatch[img]# 隨機(jī)計(jì)算目標(biāo)尺寸sz# - 范圍imgsz的50% ~ 150%# - 對(duì)齊stride確保sz是stride的整數(shù)倍避免下采樣維度錯(cuò)位sz(random.randrange(int(self.args.imgsz*0.5),int(self.args.imgsz*1.5self.stride))//self.stride*self.stride)# 計(jì)算縮放因子目標(biāo)尺寸 / 圖像最大維度寬/高sfsz/max(imgs.shape[2:])# scale factorifsf!1:# 計(jì)算新尺寸ns對(duì)齊stride確??s放后尺寸是stride整數(shù)倍ns[math.ceil(x*sf/self.stride)*self.strideforxinimgs.shape[2:]]# 雙線性插值縮放圖像YOLO默認(rèn)插值方式兼顧速度和精度imgsnn.functional.interpolate(imgs,sizens,modebilinear,align_cornersFalse)# 更新批次中的圖像張量batch[img]imgsreturnbatch項(xiàng)目詳情函數(shù)名preprocess_batch功能概述批次數(shù)據(jù)的設(shè)備遷移、歸一化、多尺度縮放適配YOLO輸入要求返回值dict預(yù)處理后的批次字典核心邏輯1. 張量設(shè)備遷移2. 圖像歸一化3. 多尺度訓(xùn)練時(shí)隨機(jī)縮放圖像設(shè)計(jì)亮點(diǎn)1. 多尺度隨機(jī)縮放提升模型泛化性2. 所有尺寸操作均對(duì)齊stride避免維度錯(cuò)誤注意事項(xiàng)多尺度訓(xùn)練僅在self.args.multi_scaleTrue時(shí)生效模型屬性設(shè)置set_model_attributesdefset_model_attributes(self): 基于數(shù)據(jù)集信息配置模型核心屬性讓模型感知訓(xùn)練數(shù)據(jù)的類別信息 注釋掉的代碼是預(yù)留的超參數(shù)縮放邏輯按檢測(cè)層數(shù)量/類別數(shù)/圖像尺寸調(diào)整損失權(quán)重 # Nl de_parallel(self.model).model[-1].nl # number of detection layers (to scale hyps)# self.args.box * 3 / nl # scale to layers# self.args.cls * self.data[nc] / 80 * 3 / nl # scale to classes and layers# self.args.cls * (self.args.imgsz / 640) ** 2 * 3 / nl # scale to image size and layers# 綁定類別數(shù)到模型讓模型知道需要檢測(cè)的類別總數(shù)如COCO的80類self.model.ncself.data[nc]# 綁定類別名到模型便于后續(xù)可視化/驗(yàn)證時(shí)映射類別ID到名稱如0→personself.model.namesself.data[names]# 綁定訓(xùn)練超參數(shù)到模型讓模型感知訓(xùn)練配置如imgsz、batch、multi_scale等self.model.argsself.args# 預(yù)留類別權(quán)重計(jì)算邏輯解決類別不平衡問(wèn)題如小類別樣本少則權(quán)重高# TODO: self.model.class_weights labels_to_class_weights(dataset.labels, nc).to(device) * nc項(xiàng)目詳情函數(shù)名set_model_attributes功能概述將數(shù)據(jù)集信息綁定到模型讓模型感知訓(xùn)練數(shù)據(jù)的類別/超參數(shù)信息返回值無(wú)核心邏輯綁定類別數(shù)、類別名、超參數(shù)到模型預(yù)留類別權(quán)重邏輯設(shè)計(jì)亮點(diǎn)模型動(dòng)態(tài)適配數(shù)據(jù)集無(wú)需手動(dòng)修改模型配置文件注意事項(xiàng)類別權(quán)重邏輯未實(shí)現(xiàn)需手動(dòng)補(bǔ)充以解決小類別樣本少的問(wèn)題模型初始化get_modeldefget_model(self,cfg:str|NoneNone,weights:str|NoneNone,verbose:boolTrue): 創(chuàng)建并返回YOLO檢測(cè)模型實(shí)例支持加載預(yù)訓(xùn)練權(quán)重 參數(shù): cfg (str, 可選): 模型配置文件路徑如yolo11n.yaml定義網(wǎng)絡(luò)結(jié)構(gòu) weights (str, 可選): 預(yù)訓(xùn)練權(quán)重文件路徑如yolo11n.pt加載預(yù)訓(xùn)練參數(shù) verbose (bool): 是否打印模型初始化日志僅非分布式進(jìn)程打印避免重復(fù)輸出 返回: (DetectionModel): 初始化完成的YOLO檢測(cè)模型實(shí)例 # 初始化DetectionModelYOLO檢測(cè)模型核心類# - ncself.data[nc]數(shù)據(jù)集類別數(shù)覆蓋配置文件默認(rèn)值# - chself.data[channels]圖像通道數(shù)默認(rèn)3RGB# - verboseverbose and RANK -1僅非分布式進(jìn)程RANK-1打印日志modelDetectionModel(cfg,ncself.data[nc],chself.data[channels],verboseverboseandRANK-1)# 加載預(yù)訓(xùn)練權(quán)重若指定支持.pt權(quán)重文件實(shí)現(xiàn)遷移學(xué)習(xí)ifweights:model.load(weights)returnmodel項(xiàng)目詳情函數(shù)名get_model功能概述創(chuàng)建YOLO檢測(cè)模型實(shí)例支持加載預(yù)訓(xùn)練權(quán)重返回值DetectionModelYOLO檢測(cè)模型實(shí)例核心邏輯初始化DetectionModel加載預(yù)訓(xùn)練權(quán)重若指定設(shè)計(jì)亮點(diǎn)動(dòng)態(tài)適配數(shù)據(jù)集類別數(shù)無(wú)需修改配置文件注意事項(xiàng)權(quán)重文件需與模型結(jié)構(gòu)匹配如yolo11n.pt對(duì)應(yīng)yolo11n.yaml驗(yàn)證器創(chuàng)建get_validatordefget_validator(self): 創(chuàng)建并返回YOLO檢測(cè)模型的驗(yàn)證器DetectionValidator 驗(yàn)證器負(fù)責(zé)計(jì)算驗(yàn)證集損失、評(píng)估m(xù)AP0.5、保存驗(yàn)證結(jié)果等 返回: (DetectionValidator): 配置好的驗(yàn)證器實(shí)例 # 定義損失組件名稱用于后續(xù)損失可視化/日志打印self.loss_namesbox_loss,cls_loss,dfl_loss# 創(chuàng)建并返回驗(yàn)證器# - test_loader驗(yàn)證集數(shù)據(jù)加載器# - save_dir驗(yàn)證結(jié)果保存目錄如runs/detect/train/val# - argscopy(self.args)傳入訓(xùn)練參數(shù)副本避免原參數(shù)被驗(yàn)證器修改# - _callbacksself.callbacks傳入訓(xùn)練回調(diào)函數(shù)如日志打印、結(jié)果保存returnyolo.detect.DetectionValidator(self.test_loader,save_dirself.save_dir,argscopy(self.args),_callbacksself.callbacks)項(xiàng)目詳情函數(shù)名get_validator功能概述創(chuàng)建檢測(cè)模型驗(yàn)證器負(fù)責(zé)計(jì)算驗(yàn)證損失、評(píng)估m(xù)AP、保存驗(yàn)證結(jié)果返回值DetectionValidatorYOLO檢測(cè)驗(yàn)證器實(shí)例核心邏輯定義損失名稱初始化驗(yàn)證器并傳入驗(yàn)證集數(shù)據(jù)加載器、保存目錄、參數(shù)、回調(diào)設(shè)計(jì)亮點(diǎn)驗(yàn)證器與訓(xùn)練器共享配置和回調(diào)保證邏輯一致性注意事項(xiàng)驗(yàn)證器會(huì)自動(dòng)計(jì)算mAP0.5、mAP0.5:0.95等指標(biāo)結(jié)果保存至save_dir/val損失格式化label_loss_itemsdeflabel_loss_items(self,loss_items:list[float]|NoneNone,prefix:strtrain): 將損失值封裝為帶標(biāo)簽的字典便于日志打印/可視化 分類任務(wù)無(wú)需此方法但檢測(cè)/分割任務(wù)必須損失組件多需區(qū)分不同損失 參數(shù): loss_items (list[float], 可選): 損失值列表順序box_loss, cls_loss, dfl_loss prefix (str): 損失名稱前綴如train表示訓(xùn)練損失val表示驗(yàn)證損失 返回: (dict | list): - 若傳入loss_items返回{前綴/損失名: 損失值}的字典如{train/box_loss: 0.05} - 若未傳入返回?fù)p失名稱列表如[train/box_loss, train/cls_loss, train/dfl_loss] # 構(gòu)建帶前綴的損失名稱列表區(qū)分訓(xùn)練/驗(yàn)證損失keys[f{prefix}/{x}forxinself.loss_names]# 傳入損失值時(shí)格式化并返回字典ifloss_itemsisnotNone:# 轉(zhuǎn)換張量為浮點(diǎn)數(shù)并保留5位小數(shù)便于閱讀避免科學(xué)計(jì)數(shù)法loss_items[round(float(x),5)forxinloss_items]# 綁定損失名稱和值返回字典returndict(zip(keys,loss_items))# 未傳入損失值時(shí)僅返回名稱列表用于初始化日志表頭else:returnkeys項(xiàng)目詳情函數(shù)名label_loss_items功能概述將損失值封裝為帶前綴的字典便于日志打印和可視化返回值dict / list有l(wèi)oss_items時(shí)返回{前綴/損失名:值}否則返回名稱列表核心邏輯構(gòu)建帶前綴的損失名稱格式化損失值并綁定名稱設(shè)計(jì)亮點(diǎn)兼容訓(xùn)練/驗(yàn)證損失格式化支持日志表頭初始化無(wú)loss_items時(shí)返回名稱注意事項(xiàng)損失值順序必須與self.loss_names一致box→cls→dfl進(jìn)度字符串生成progress_stringdefprogress_string(self): 生成格式化的訓(xùn)練進(jìn)度標(biāo)題字符串用于日志打印 示例輸出 Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 返回: (str): 格式化的進(jìn)度標(biāo)題字符串 return( %11s*(4len(self.loss_names)))%(# 每個(gè)字段占11個(gè)字符寬度對(duì)齊打印Epoch,# 訓(xùn)練輪數(shù)如1/100GPU_mem,# GPU顯存占用如1.2G*self.loss_names,# 損失組件box_loss/cls_loss/dfl_lossInstances,# 批次中的目標(biāo)實(shí)例數(shù)如128Size,# 圖像尺寸如640x640)項(xiàng)目詳情函數(shù)名progress_string功能概述生成格式化的訓(xùn)練進(jìn)度標(biāo)題字符串用于日志打印返回值str格式化的進(jìn)度標(biāo)題如Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size核心邏輯按固定寬度拼接Epoch、GPU_mem、損失項(xiàng)、Instances、Size等標(biāo)題設(shè)計(jì)亮點(diǎn)動(dòng)態(tài)適配損失項(xiàng)數(shù)量無(wú)需硬編碼標(biāo)題注意事項(xiàng)字符串寬度固定為11保證日志打印對(duì)齊訓(xùn)練樣本可視化plot_training_samplesdefplot_training_samples(self,batch:dict[str,Any],ni:int)-None: 可視化訓(xùn)練樣本及標(biāo)注并保存為圖片便于檢查標(biāo)注質(zhì)量、數(shù)據(jù)增強(qiáng)效果 保存路徑save_dir/train_batch{ni}.jpgni為迭代次數(shù) 參數(shù): batch (dict[str, Any]): 批次數(shù)據(jù)字典包含img、cls、bboxes、im_file等 ni (int): 迭代次數(shù)用于命名圖片文件區(qū)分不同批次 plot_images(labelsbatch,# 批次標(biāo)注信息cls、bboxes等pathsbatch[im_file],# 圖像文件路徑用于標(biāo)注圖片名稱fnameself.save_dir/ftrain_batch{ni}.jpg,# 保存路徑on_plotself.on_plot,# 繪圖回調(diào)函數(shù)自定義繪圖邏輯如添加水印)項(xiàng)目詳情函數(shù)名plot_training_samples功能概述可視化訓(xùn)練樣本及標(biāo)注保存為圖片便于檢查標(biāo)注質(zhì)量和數(shù)據(jù)增強(qiáng)效果返回值無(wú)核心邏輯調(diào)用plot_images繪制批次樣本保存至訓(xùn)練保存目錄設(shè)計(jì)亮點(diǎn)直觀展示訓(xùn)練數(shù)據(jù)快速定位標(biāo)注錯(cuò)誤如框標(biāo)注偏移、類別錯(cuò)誤注意事項(xiàng)圖片默認(rèn)保存至save_dir最多顯示16張樣本避免圖片過(guò)大訓(xùn)練標(biāo)簽可視化plot_training_labelsdefplot_training_labels(self): 繪制訓(xùn)練數(shù)據(jù)的標(biāo)簽分布 1. 類別分布直方圖統(tǒng)計(jì)每個(gè)類別的樣本數(shù)分析類別平衡 2. 邊界框尺寸/比例分布分析數(shù)據(jù)尺度特征如小目標(biāo)占比 保存路徑save_dir/labels.jpg # 拼接所有訓(xùn)練樣本的邊界框維度N×4N為所有框數(shù)量4為xyxy坐標(biāo)boxesnp.concatenate([lb[bboxes]forlbinself.train_loader.dataset.labels],0)# 拼接所有訓(xùn)練樣本的類別維度N×1clsnp.concatenate([lb[cls]forlbinself.train_loader.dataset.labels],0)# 調(diào)用plot_labels繪制標(biāo)簽分布# - cls.squeeze()去除類別維度的冗余維度N×1→N# - namesself.data[names]類別名映射ID→名稱# - save_dirself.save_dir保存路徑plot_labels(boxes,cls.squeeze(),namesself.data[names],save_dirself.save_dir,on_plotself.on_plot)項(xiàng)目詳情函數(shù)名plot_training_labels功能概述繪制訓(xùn)練數(shù)據(jù)的標(biāo)簽分布類別直方圖框尺寸/比例分布返回值無(wú)核心邏輯拼接所有樣本的框和類別調(diào)用plot_labels繪制分布設(shè)計(jì)亮點(diǎn)一鍵分析數(shù)據(jù)分布快速發(fā)現(xiàn)類別不平衡、小目標(biāo)占比過(guò)高等問(wèn)題注意事項(xiàng)需確保數(shù)據(jù)集標(biāo)簽加載完成train_loader.dataset.labels非空defauto_batch(self): 基于模型顯存占用自動(dòng)計(jì)算最優(yōu)批次大小避免顯存溢出OOM 核心邏輯統(tǒng)計(jì)訓(xùn)練數(shù)據(jù)中最大目標(biāo)數(shù)結(jié)合模型顯存消耗計(jì)算最優(yōu)batch 返回: (int): 最優(yōu)批次大小 # 臨時(shí)覆蓋配置禁用緩存避免緩存占用額外顯存影響batch計(jì)算withoverride_configs(self.args,overrides{cache:False})asself.args:# 構(gòu)建訓(xùn)練數(shù)據(jù)集批次16用于統(tǒng)計(jì)最大目標(biāo)數(shù)train_datasetself.build_dataset(self.data[train],modetrain,batch16)# 計(jì)算最大目標(biāo)數(shù)單樣本最大目標(biāo)數(shù) ×4馬賽克增強(qiáng)會(huì)合并4張圖目標(biāo)數(shù)翻倍max_num_objmax(len(label[cls])forlabelintrain_dataset.labels)*4# 刪除數(shù)據(jù)集實(shí)例釋放顯存避免影響后續(xù)訓(xùn)練deltrain_dataset# 調(diào)用父類auto_batch方法傳入最大目標(biāo)數(shù)計(jì)算最優(yōu)批次基于顯存占用returnsuper().auto_batch(max_num_obj)馬賽克增強(qiáng)Mosaic Augmentation的核心是將 4 張獨(dú)立的訓(xùn)練圖像拼接為 1 張圖像因此拼接后的圖像會(huì)包含這 4 張圖的所有目標(biāo)標(biāo)注目標(biāo)數(shù)通常是單張?jiān)紙D像的 2~4 倍。“×4” 是對(duì)最壞情況的保守估計(jì)4 張圖都包含最大數(shù)量目標(biāo)。完整代碼# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# 引入未來(lái)版本的類型注解支持提升代碼類型提示和靜態(tài)檢查能力from__future__importannotations# 導(dǎo)入基礎(chǔ)數(shù)學(xué)計(jì)算、隨機(jī)數(shù)生成模塊用于多尺度訓(xùn)練的隨機(jī)縮放importmathimportrandom# 導(dǎo)入淺拷貝避免原配置被修改、類型注解模塊fromcopyimportcopyfromtypingimportAny# 導(dǎo)入數(shù)值計(jì)算、PyTorch核心、PyTorch神經(jīng)網(wǎng)絡(luò)模塊核心依賴importnumpyasnpimporttorchimporttorch.nnasnn# 從ultralytics數(shù)據(jù)模塊導(dǎo)入數(shù)據(jù)加載器構(gòu)建、YOLO專用數(shù)據(jù)集構(gòu)建函數(shù)fromultralytics.dataimportbuild_dataloader,build_yolo_dataset# 從ultralytics引擎模塊導(dǎo)入基礎(chǔ)訓(xùn)練器基類提供通用訓(xùn)練流程fromultralytics.engine.trainerimportBaseTrainer# 從ultralytics模型模塊導(dǎo)入yolo子模塊用于創(chuàng)建檢測(cè)驗(yàn)證器fromultralytics.modelsimportyolo# 從ultralytics神經(jīng)網(wǎng)絡(luò)任務(wù)模塊導(dǎo)入檢測(cè)模型類YOLO檢測(cè)模型核心fromultralytics.nn.tasksimportDetectionModel# 從ultralytics工具模塊導(dǎo)入默認(rèn)配置、日志器、分布式訓(xùn)練進(jìn)程排名fromultralytics.utilsimportDEFAULT_CFG,LOGGER,RANK# 從ultralytics工具補(bǔ)丁模塊導(dǎo)入配置臨時(shí)覆蓋函數(shù)用于auto_batchfromultralytics.utils.patchesimportoverride_configs# 從ultralytics工具繪圖模塊導(dǎo)入訓(xùn)練樣本可視化、標(biāo)簽分布可視化函數(shù)fromultralytics.utils.plottingimportplot_images,plot_labels# 從ultralytics工具PyTorch模塊導(dǎo)入分布式訓(xùn)練同步工具、模型解包函數(shù)去除DDP/DP包裝fromultralytics.utils.torch_utilsimporttorch_distributed_zero_first,unwrap_modelclassDetectionTrainer(BaseTrainer): 基于BaseTrainer擴(kuò)展的YOLO目標(biāo)檢測(cè)專用訓(xùn)練器類 該訓(xùn)練器針對(duì)目標(biāo)檢測(cè)任務(wù)定制處理YOLO模型訓(xùn)練的專屬需求 包括數(shù)據(jù)集構(gòu)建、數(shù)據(jù)加載、預(yù)處理、模型配置等核心流程 屬性: model (DetectionModel): 正在訓(xùn)練的YOLO檢測(cè)模型實(shí)例 data (dict): 數(shù)據(jù)集信息字典包含類別名names、類別數(shù)nc、圖像通道數(shù)channels等 loss_names (tuple): 訓(xùn)練損失組件名稱box_loss:框回歸損失, cls_loss:類別損失, dfl_loss:分布焦點(diǎn)損失 方法: build_dataset: 構(gòu)建訓(xùn)練/驗(yàn)證階段的YOLO數(shù)據(jù)集適配stride、矩形推理 get_dataloader: 為指定模式train/val構(gòu)建數(shù)據(jù)加載器兼容分布式訓(xùn)練 preprocess_batch: 對(duì)批次圖像做設(shè)備遷移、歸一化、多尺度縮放預(yù)處理 set_model_attributes: 基于數(shù)據(jù)集信息配置模型核心屬性類別數(shù)、類別名等 get_model: 創(chuàng)建并返回YOLO檢測(cè)模型實(shí)例支持加載預(yù)訓(xùn)練權(quán)重 get_validator: 返回模型驗(yàn)證器用于計(jì)算驗(yàn)證損失、評(píng)估m(xù)AP label_loss_items: 將損失值封裝為帶標(biāo)簽的字典便于日志打印/可視化 progress_string: 生成格式化的訓(xùn)練進(jìn)度標(biāo)題字符串日志打印用 plot_training_samples: 可視化訓(xùn)練樣本及標(biāo)注檢查標(biāo)注質(zhì)量 plot_training_labels: 繪制訓(xùn)練數(shù)據(jù)的標(biāo)簽分布類別框尺寸分布 auto_batch: 基于模型顯存占用自動(dòng)計(jì)算最優(yōu)批次大小避免OOM 示例: # from ultralytics.models.yolo.detect import DetectionTrainer # args dict(modelyolo11n.pt, datacoco8.yaml, epochs3) # trainer DetectionTrainer(overridesargs) # trainer.train() def__init__(self,cfgDEFAULT_CFG,overrides:dict[str,Any]|NoneNone,_callbacksNone): 初始化DetectionTrainer實(shí)例用于YOLO目標(biāo)檢測(cè)模型訓(xùn)練 核心是繼承BaseTrainer的通用訓(xùn)練邏輯保留檢測(cè)任務(wù)的專屬配置 參數(shù): cfg (dict, 可選): 默認(rèn)訓(xùn)練配置字典包含所有訓(xùn)練參數(shù)如epochs、batch、imgsz等 overrides (dict, 可選): 覆蓋默認(rèn)配置的參數(shù)字典如指定自定義epochs、data路徑 _callbacks (list, 可選): 訓(xùn)練過(guò)程中執(zhí)行的回調(diào)函數(shù)列表如日志打印、模型保存、早停 # 調(diào)用父類BaseTrainer的初始化方法傳入配置、覆蓋參數(shù)、回調(diào)函數(shù)# 父類初始化會(huì)解析配置、設(shè)置設(shè)備GPU/CPU、創(chuàng)建保存目錄、加載數(shù)據(jù)集配置等檢測(cè)任務(wù)無(wú)需額外初始化邏輯僅繼承基礎(chǔ)能力super().__init__(cfg,overrides,_callbacks)defbuild_dataset(self,img_path:str,mode:strtrain,batch:int|NoneNone): 構(gòu)建YOLO訓(xùn)練/驗(yàn)證數(shù)據(jù)集適配YOLO的輸入要求stride對(duì)齊、矩形推理 參數(shù): img_path (str): 圖像文件夾路徑如數(shù)據(jù)集的train/val目錄 mode (str): 數(shù)據(jù)集模式train訓(xùn)練啟用數(shù)據(jù)增強(qiáng)或val驗(yàn)證禁用增強(qiáng)不同模式啟用不同數(shù)據(jù)增強(qiáng) batch (int, 可選): 批次大小僅用于rect矩形推理模式的尺寸計(jì)算 返回: (Dataset): 配置好的YOLO數(shù)據(jù)集實(shí)例包含數(shù)據(jù)增強(qiáng)、緩存、stride對(duì)齊等邏輯 # 計(jì)算全局stride確保圖像尺寸是stride的整數(shù)倍避免下采樣維度錯(cuò)位# 1. unwrap_model解包模型去除DDP/DP包裝獲取模型最大stride無(wú)模型時(shí)默認(rèn)0# 2. 取stride和32的最大值YOLO默認(rèn)最小stride為32gsmax(int(unwrap_model(self.model).stride.max()ifself.modelelse0),32)# 調(diào)用build_yolo_dataset構(gòu)建數(shù)據(jù)集# - rectmodeval驗(yàn)證模式啟用矩形推理按圖像原比例縮放減少黑邊提升效率# - stridegs確保圖像尺寸對(duì)齊全局stride圖像尺寸是stride整數(shù)倍避免下采樣維度錯(cuò)位returnbuild_yolo_dataset(self.args,img_path,batch,self.data,modemode,rectmodeval,stridegs)defget_dataloader(self,dataset_path:str,batch_size:int16,rank:int0,mode:strtrain): 為指定模式train/val構(gòu)建并返回PyTorch DataLoader 適配分布式訓(xùn)練、矩形推理、多線程加載等YOLO訓(xùn)練特性 參數(shù): dataset_path (str): 數(shù)據(jù)集路徑對(duì)應(yīng)img_path batch_size (int): 每個(gè)批次的圖像數(shù)量默認(rèn)16 rank (int): 分布式訓(xùn)練中的進(jìn)程排名rank0為主進(jìn)程 mode (str): 數(shù)據(jù)加載模式train訓(xùn)練或val驗(yàn)證 返回: (DataLoader): 配置好的PyTorch數(shù)據(jù)加載器實(shí)例 # 斷言校驗(yàn)?zāi)J胶戏ㄐ詢H允許train/val避免傳入錯(cuò)誤模式assertmodein{train,val},fMode must be train or val, not{mode}.# 分布式訓(xùn)練兼容僅讓rank0的進(jìn)程初始化數(shù)據(jù)集緩存避免多進(jìn)程重復(fù)生成.cache文件withtorch_distributed_zero_first(rank):# 調(diào)用build_dataset構(gòu)建數(shù)據(jù)集datasetself.build_dataset(dataset_path,mode,batch_size)# 訓(xùn)練模式啟用數(shù)據(jù)打亂提升泛化性驗(yàn)證模式禁用shufflemodetrain# 兼容性處理矩形推理rectTrue與shuffle不兼容強(qiáng)制關(guān)閉shuffle并打印告警ifgetattr(dataset,rect,False)andshuffle:LOGGER.warning(rectTrue is incompatible with DataLoader shuffle, setting shuffleFalse)shuffleFalse# 構(gòu)建并返回?cái)?shù)據(jù)加載器# - workers訓(xùn)練模式用args.workers驗(yàn)證模式翻倍提升驗(yàn)證速度# - drop_last編譯模式訓(xùn)練模式下丟棄最后不完整批次避免維度錯(cuò)誤returnbuild_dataloader(dataset,batchbatch_size,workersself.args.workersifmodetrainelseself.args.workers*2,shuffleshuffle,rankrank,drop_lastself.args.compileandmodetrain,)defpreprocess_batch(self,batch:dict)-dict: 對(duì)單批次數(shù)據(jù)做預(yù)處理設(shè)備遷移、歸一化、多尺度縮放 是YOLO訓(xùn)練前的核心數(shù)據(jù)處理步驟確保輸入符合模型要求 參數(shù): batch (dict): 批次數(shù)據(jù)字典包含img圖像張量、cls類別、bboxes框坐標(biāo)、im_file圖像路徑等 返回: (dict): 預(yù)處理后的批次數(shù)據(jù)字典 # 遍歷批次字典將所有張量移至指定設(shè)備GPU/CPU# - CUDA設(shè)備啟用non_blockingTrue非阻塞傳輸提升數(shù)據(jù)加載速度f(wàn)ork,vinbatch.items():ifisinstance(v,torch.Tensor):batch[k]v.to(self.device,non_blockingself.device.typecuda)# 圖像歸一化轉(zhuǎn)浮點(diǎn)型并除以255將像素值從[0,255]縮放到[0,1]符合模型輸入要求batch[img]batch[img].float()/255# 多尺度訓(xùn)練啟用時(shí)隨機(jī)縮放圖像尺寸提升模型對(duì)不同尺度目標(biāo)的檢測(cè)能力ifself.args.multi_scale:imgsbatch[img]# 隨機(jī)計(jì)算目標(biāo)尺寸sz# - 范圍imgsz的50% ~ 150%# - 對(duì)齊stride確保sz是stride的整數(shù)倍避免下采樣維度錯(cuò)位sz(random.randrange(int(self.args.imgsz*0.5),int(self.args.imgsz*1.5self.stride))//self.stride*self.stride)# 計(jì)算縮放因子目標(biāo)尺寸 / 圖像最大維度寬/高sfsz/max(imgs.shape[2:])# scale factorifsf!1:# 計(jì)算新尺寸ns對(duì)齊stride確??s放后尺寸是stride整數(shù)倍ns[math.ceil(x*sf/self.stride)*self.strideforxinimgs.shape[2:]]# 雙線性插值縮放圖像YOLO默認(rèn)插值方式兼顧速度和精度imgsnn.functional.interpolate(imgs,sizens,modebilinear,align_cornersFalse)# 更新批次中的圖像張量batch[img]imgsreturnbatchdefset_model_attributes(self): 基于數(shù)據(jù)集信息配置模型核心屬性讓模型感知訓(xùn)練數(shù)據(jù)的類別信息 注釋掉的代碼是預(yù)留的超參數(shù)縮放邏輯按檢測(cè)層數(shù)量/類別數(shù)/圖像尺寸調(diào)整損失權(quán)重 # Nl de_parallel(self.model).model[-1].nl # number of detection layers (to scale hyps)# self.args.box * 3 / nl # scale to layers# self.args.cls * self.data[nc] / 80 * 3 / nl # scale to classes and layers# self.args.cls * (self.args.imgsz / 640) ** 2 * 3 / nl # scale to image size and layers# 綁定類別數(shù)到模型讓模型知道需要檢測(cè)的類別總數(shù)如COCO的80類self.model.ncself.data[nc]# 綁定類別名到模型便于后續(xù)可視化/驗(yàn)證時(shí)映射類別ID到名稱如0→personself.model.namesself.data[names]# 綁定訓(xùn)練超參數(shù)到模型讓模型感知訓(xùn)練配置如imgsz、batch、multi_scale等self.model.argsself.args# 預(yù)留類別權(quán)重計(jì)算邏輯解決類別不平衡問(wèn)題如小類別樣本少則權(quán)重高# TODO: self.model.class_weights labels_to_class_weights(dataset.labels, nc).to(device) * ncdefget_model(self,cfg:str|NoneNone,weights:str|NoneNone,verbose:boolTrue): 創(chuàng)建并返回YOLO檢測(cè)模型實(shí)例支持加載預(yù)訓(xùn)練權(quán)重 參數(shù): cfg (str, 可選): 模型配置文件路徑如yolo11n.yaml定義網(wǎng)絡(luò)結(jié)構(gòu) weights (str, 可選): 預(yù)訓(xùn)練權(quán)重文件路徑如yolo11n.pt加載預(yù)訓(xùn)練參數(shù) verbose (bool): 是否打印模型初始化日志僅非分布式進(jìn)程打印避免重復(fù)輸出 返回: (DetectionModel): 初始化完成的YOLO檢測(cè)模型實(shí)例 # 初始化DetectionModelYOLO檢測(cè)模型核心類# - ncself.data[nc]數(shù)據(jù)集類別數(shù)覆蓋配置文件默認(rèn)值# - chself.data[channels]圖像通道數(shù)默認(rèn)3RGB# - verboseverbose and RANK -1僅非分布式進(jìn)程RANK-1打印日志modelDetectionModel(cfg,ncself.data[nc],chself.data[channels],verboseverboseandRANK-1)# 加載預(yù)訓(xùn)練權(quán)重若指定支持.pt權(quán)重文件實(shí)現(xiàn)遷移學(xué)習(xí)ifweights:model.load(weights)returnmodeldefget_validator(self): 創(chuàng)建并返回YOLO檢測(cè)模型的驗(yàn)證器DetectionValidator 驗(yàn)證器負(fù)責(zé)計(jì)算驗(yàn)證集損失、評(píng)估m(xù)AP0.5、保存驗(yàn)證結(jié)果等 返回: (DetectionValidator): 配置好的驗(yàn)證器實(shí)例 # 定義損失組件名稱用于后續(xù)損失可視化/日志打印self.loss_namesbox_loss,cls_loss,dfl_loss# 創(chuàng)建并返回驗(yàn)證器# - test_loader驗(yàn)證集數(shù)據(jù)加載器# - save_dir驗(yàn)證結(jié)果保存目錄如runs/detect/train/val# - argscopy(self.args)傳入訓(xùn)練參數(shù)副本避免原參數(shù)被驗(yàn)證器修改# - _callbacksself.callbacks傳入訓(xùn)練回調(diào)函數(shù)如日志打印、結(jié)果保存returnyolo.detect.DetectionValidator(self.test_loader,save_dirself.save_dir,argscopy(self.args),_callbacksself.callbacks)deflabel_loss_items(self,loss_items:list[float]|NoneNone,prefix:strtrain): 將損失值封裝為帶標(biāo)簽的字典便于日志打印/可視化 分類任務(wù)無(wú)需此方法但檢測(cè)/分割任務(wù)必須損失組件多需區(qū)分不同損失 參數(shù): loss_items (list[float], 可選): 損失值列表順序box_loss, cls_loss, dfl_loss prefix (str): 損失名稱前綴如train表示訓(xùn)練損失val表示驗(yàn)證損失 返回: (dict | list): - 若傳入loss_items返回{前綴/損失名: 損失值}的字典如{train/box_loss: 0.05} - 若未傳入返回?fù)p失名稱列表如[train/box_loss, train/cls_loss, train/dfl_loss] # 構(gòu)建帶前綴的損失名稱列表區(qū)分訓(xùn)練/驗(yàn)證損失keys[f{prefix}/{x}forxinself.loss_names]# 傳入損失值時(shí)格式化并返回字典ifloss_itemsisnotNone:# 轉(zhuǎn)換張量為浮點(diǎn)數(shù)并保留5位小數(shù)便于閱讀避免科學(xué)計(jì)數(shù)法loss_items[round(float(x),5)forxinloss_items]# 綁定損失名稱和值返回字典returndict(zip(keys,loss_items))# 未傳入損失值時(shí)僅返回名稱列表用于初始化日志表頭else:returnkeysdefprogress_string(self): 生成格式化的訓(xùn)練進(jìn)度標(biāo)題字符串用于日志打印 示例輸出 Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size 返回: (str): 格式化的進(jìn)度標(biāo)題字符串 return( %11s*(4len(self.loss_names)))%(# 每個(gè)字段占11個(gè)字符寬度對(duì)齊打印Epoch,# 訓(xùn)練輪數(shù)如1/100GPU_mem,# GPU顯存占用如1.2G*self.loss_names,# 損失組件box_loss/cls_loss/dfl_lossInstances,# 批次中的目標(biāo)實(shí)例數(shù)如128Size,# 圖像尺寸如640x640)defplot_training_samples(self,batch:dict[str,Any],ni:int)-None: 可視化訓(xùn)練樣本及標(biāo)注并保存為圖片便于檢查標(biāo)注質(zhì)量、數(shù)據(jù)增強(qiáng)效果 保存路徑save_dir/train_batch{ni}.jpgni為迭代次數(shù) 參數(shù): batch (dict[str, Any]): 批次數(shù)據(jù)字典包含img、cls、bboxes、im_file等 ni (int): 迭代次數(shù)用于命名圖片文件區(qū)分不同批次 plot_images(labelsbatch,# 批次標(biāo)注信息cls、bboxes等pathsbatch[im_file],# 圖像文件路徑用于標(biāo)注圖片名稱fnameself.save_dir/ftrain_batch{ni}.jpg,# 保存路徑on_plotself.on_plot,# 繪圖回調(diào)函數(shù)自定義繪圖邏輯如添加水印)defplot_training_labels(self): 繪制訓(xùn)練數(shù)據(jù)的標(biāo)簽分布 1. 類別分布直方圖統(tǒng)計(jì)每個(gè)類別的樣本數(shù)分析類別平衡 2. 邊界框尺寸/比例分布分析數(shù)據(jù)尺度特征如小目標(biāo)占比 保存路徑save_dir/labels.jpg # 拼接所有訓(xùn)練樣本的邊界框維度N×4N為所有框數(shù)量4為xyxy坐標(biāo)boxesnp.concatenate([lb[bboxes]forlbinself.train_loader.dataset.labels],0)# 拼接所有訓(xùn)練樣本的類別維度N×1clsnp.concatenate([lb[cls]forlbinself.train_loader.dataset.labels],0)# 調(diào)用plot_labels繪制標(biāo)簽分布# - cls.squeeze()去除類別維度的冗余維度N×1→N# - namesself.data[names]類別名映射ID→名稱# - save_dirself.save_dir保存路徑plot_labels(boxes,cls.squeeze(),namesself.data[names],save_dirself.save_dir,on_plotself.on_plot)defauto_batch(self): 基于模型顯存占用自動(dòng)計(jì)算最優(yōu)批次大小避免顯存溢出OOM 核心邏輯統(tǒng)計(jì)訓(xùn)練數(shù)據(jù)中最大目標(biāo)數(shù)結(jié)合模型顯存消耗計(jì)算最優(yōu)batch 返回: (int): 最優(yōu)批次大小 # 臨時(shí)覆蓋配置禁用緩存避免緩存占用額外顯存影響batch計(jì)算withoverride_configs(self.args,overrides{cache:False})asself.args:# 構(gòu)建訓(xùn)練數(shù)據(jù)集批次16用于統(tǒng)計(jì)最大目標(biāo)數(shù)train_datasetself.build_dataset(self.data[train],modetrain,batch16)# 計(jì)算最大目標(biāo)數(shù)單樣本最大目標(biāo)數(shù) ×4馬賽克增強(qiáng)會(huì)合并4張圖目標(biāo)數(shù)翻倍max_num_objmax(len(label[cls])forlabelintrain_dataset.labels)*4# 刪除數(shù)據(jù)集實(shí)例釋放顯存避免影響后續(xù)訓(xùn)練deltrain_dataset# 調(diào)用父類auto_batch方法傳入最大目標(biāo)數(shù)計(jì)算最優(yōu)批次基于顯存占用returnsuper().auto_batch(max_num_obj)適配YOLO檢測(cè)的核心特性特性實(shí)現(xiàn)方式Stride對(duì)齊所有圖像尺寸強(qiáng)制為模型stride整數(shù)倍build_dataset矩形推理驗(yàn)證模式啟用rectTrue訓(xùn)練模式禁用build_dataset多尺度訓(xùn)練隨機(jī)縮放圖像尺寸50%~150%且對(duì)齊stridepreprocess_batch檢測(cè)損失適配定義box/cls/dfl三類損失格式化后便于跟蹤label_loss_items工程化核心優(yōu)化優(yōu)化點(diǎn)實(shí)現(xiàn)方式分布式訓(xùn)練兼容torch_distributed_zero_first初始化緩存、僅主進(jìn)程打印日志顯存優(yōu)化auto_batch自動(dòng)計(jì)算批次、臨時(shí)禁用緩存、主動(dòng)釋放數(shù)據(jù)集顯存兼容性處理檢測(cè)rect與shuffle沖突自動(dòng)關(guān)閉shuffle并告警動(dòng)態(tài)配置模型適配數(shù)據(jù)集類別數(shù)、stride無(wú)需手動(dòng)修改配置文件調(diào)試與可視化能力可視化項(xiàng)用途訓(xùn)練樣本可視化檢查標(biāo)注質(zhì)量、數(shù)據(jù)增強(qiáng)效果train_batch{ni}.jpg標(biāo)簽分布可視化分析類別平衡、目標(biāo)尺寸分布labels.jpg損失格式化跟蹤訓(xùn)練/驗(yàn)證損失變化定位過(guò)擬合/欠擬合關(guān)鍵注意事項(xiàng)rect與shuffle沖突驗(yàn)證模式啟用rect后shuffle會(huì)被強(qiáng)制關(guān)閉無(wú)需手動(dòng)設(shè)置多尺度訓(xùn)練顯存多尺度訓(xùn)練會(huì)導(dǎo)致顯存波動(dòng)建議使用auto_batch自動(dòng)計(jì)算批次分布式訓(xùn)練多GPU訓(xùn)練時(shí)rank由框架自動(dòng)傳入無(wú)需手動(dòng)指定類別不平衡需手動(dòng)補(bǔ)充set_model_attributes中的類別權(quán)重邏輯提升小類別檢測(cè)效果??偨Y(jié)詳細(xì)接受了 Ultralytics 框架中繼承自 BaseTrainer 的 YOLO 目標(biāo)檢測(cè)專用訓(xùn)練器。
版權(quán)聲明: 本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系我們進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

自助個(gè)人網(wǎng)站注冊(cè)wordpress 首頁(yè)位置

自助個(gè)人網(wǎng)站注冊(cè),wordpress 首頁(yè)位置,深圳公司排名100強(qiáng),做網(wǎng)站設(shè)計(jì)所遇到的問(wèn)題Python圖像處理完全指南#xff1a;Pillow庫(kù)從零到精通的8個(gè)實(shí)戰(zhàn)技巧 【免費(fèi)下載鏈接】Pillo

2026/01/21 18:35:01

佛山市公司網(wǎng)站建設(shè)哪家好佛山網(wǎng)站建設(shè)電話

佛山市公司網(wǎng)站建設(shè)哪家好,佛山網(wǎng)站建設(shè)電話,廣告設(shè)計(jì)是干嘛的,網(wǎng)絡(luò)營(yíng)銷案例有哪些一、問(wèn)題背景與抽象建模 在通信網(wǎng)絡(luò)、任務(wù)調(diào)度、依賴編排等工程場(chǎng)景中,經(jīng)常會(huì)遇到如下問(wèn)題: 網(wǎng)絡(luò)由若干節(jié)點(diǎn)構(gòu)成 節(jié)點(diǎn)之間

2026/01/21 20:10:01

杭州市蕭山區(qū)建設(shè)局網(wǎng)站微信怎么生成小程序

杭州市蕭山區(qū)建設(shè)局網(wǎng)站,微信怎么生成小程序,阿里網(wǎng)站導(dǎo)航怎么做的,企業(yè)門(mén)戶網(wǎng)站功能描述OSS CAD Suite終極安裝配置指南#xff1a;快速搭建數(shù)字邏輯設(shè)計(jì)環(huán)境 【免費(fèi)下載鏈接】oss-cad-

2026/01/23 09:12:01