2025/12/29 10:21:40
网站建设
项目流程
做网站的公司利润,施工企业承揽业务不良行为,全企网建站怎么样,个人房产信息网上查询系统【YOLOv8-Ultralytics】 【目标检测】【v8.3.235版本】 模型专用预测器代码predict.py解析 文章目录【YOLOv8-Ultralytics】 【目标检测】【v8.3.235版本】 模型专用预测器代码predict.py解析前言所需的库和模块DetectionValidator 类整体概览1. DetectionPredictor 类属性说明…【YOLOv8-Ultralytics】 【目标检测】【v8.3.235版本】 模型专用预测器代码predict.py解析文章目录【YOLOv8-Ultralytics】 【目标检测】【v8.3.235版本】 模型专用预测器代码predict.py解析前言所需的库和模块DetectionValidator 类整体概览1. DetectionPredictor 类属性说明表2. DetectionPredictor 类方法说明表预测后处理postprocess目标特征提取get_obj_feats结果列表构造construct_results单图结果构造construct_result完整代码适配YOLO检测的核心特性工程化核心优化扩展与易用性能力关键注意事项总结前言代码路径ultralytics\models\yolo\detect\predict.py这段代码是 Ultralytics YOLO 框架中目标检测模型专用预测器 DetectionPredictor 的核心实现继承自基础预测器 BasePredictor专门适配 YOLO 目标检测的推理全流程。其核心作用是将模型输出的原始预测张量通过「非极大值抑制NMS过滤冗余框→坐标缩放还原至原始图像尺寸→结构化封装为 Results 对象」的流程转换为可直接用于可视化、保存、下游分析的检测结果同时支持可选的目标特征提取能力是 YOLO 检测模型推理阶段的核心组件。【YOLOv8-Ultralytics 系列文章目录】所需的库和模块# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# 从ultralytics引擎预测器模块导入基础预测器基类提供通用推理流程数据加载、预处理、模型推理fromultralytics.engine.predictorimportBasePredictor# 从ultralytics引擎结果模块导入Results类结构化封装推理结果fromultralytics.engine.resultsimportResults# 从ultralytics工具模块导入非极大值抑制NMS、通用操作函数框缩放、格式转换fromultralytics.utilsimportnms,opsDetectionValidator 类整体概览项目详情类名DetectionPredictor父类BasePredictorUltralytics 通用预测器提供模型加载、图像预处理、推理执行等基础能力核心定位YOLO 目标检测模型专用预测器负责检测任务的预测后处理NMS、结果构造、目标特征提取、预测框缩放等核心逻辑核心依赖模块ultralytics.engine.predictor基础预测器、ultralytics.engine.results结果封装、ultralytics.utils.nms非极大值抑制、ultralytics.utils.ops框缩放/格式转换、torch张量操作关键特性1. 支持普通检测/旋转框检测OBB、类别无关NMS2. 可选提取目标特征并绑定到结果对象3. 自动适配批量/单张图像的结果构造4. 预测框自动缩放到原始图像尺寸5. 兼容end2end模型推理流程典型使用流程初始化预测器→加载模型→预处理输入图像→模型推理→NMS后处理→提取目标特征可选→构造Results结果对象→返回可视化/可解析的检测结果1. DetectionPredictor 类属性说明表属性名类型说明argsnamespace预测器配置参数命名空间包含conf、iou、classes、max_det、agnostic_nms等NMS/推理参数modelnn.Module用于推理的YOLO检测模型实例batchlist待处理的批次数据列表包含图像路径、预处理后的图像张量、原始图像等2. DetectionPredictor 类方法说明表方法名功能说明postprocess对模型原始预测执行NMS后处理转换为结构化Results对象核心推理后处理get_obj_feats从模型特征图中提取目标级特征用于下游任务如特征匹配、检索construct_results批量构建Results对象遍历批次内所有样本construct_result为单张图像构建Results对象框坐标缩放、结构化封装预测后处理postprocessdefpostprocess(self,preds,img,orig_imgs,**kwargs): 对模型原始预测执行后处理NMS结果结构化返回结构化Results对象列表 核心逻辑NMS过滤冗余框→格式转换→特征提取可选→构建Results对象→附加特征可选 参数: preds (torch.Tensor): 模型原始预测张量维度[B, N, 41NC]4框坐标1置信度NC类别数 img (torch.Tensor): 预处理后的输入图像张量模型输入格式已缩放/归一化 orig_imgs (torch.Tensor | list): 预处理前的原始图像张量/列表格式RGB/BGR需适配 **kwargs (Any): 额外关键字参数预留扩展 返回: (list[Results]): 结构化推理结果列表每个元素对应单张图像的检测结果含框、类别、置信度等 示例: # predictor DetectionPredictor(overridesdict(modelyolo11n.pt)) # results predictor.predict(path/to/image.jpg) # processed_results predictor.postprocess(preds, img, orig_imgs) # 判断是否需要保存目标特征检测是否存在_feats属性模型推理时提取的特征图save_featsgetattr(self,_feats,None)isnotNone# 执行NMS后处理过滤冗余检测框# - conf: 置信度阈值过滤低置信度框# - iou: NMS的IoU阈值合并重叠框# - classes: 指定仅检测的类别None则检测所有类别# - agnostic_nms: 跨类别NMS单类别/agnostic模式下启用# - max_det: 单图最大检测框数量# - nc: 类别数0表示自动识别非detect任务时用模型类别数# - end2end: 适配端到端模型的输出格式# - rotated: 适配旋转框检测OBB任务# - return_idxssave_feats: 需要提取特征时返回目标索引用于特征映射predsnms.non_max_suppression(preds,self.args.conf,self.args.iou,self.args.classes,self.args.agnostic_nms,max_detself.args.max_det,nc0ifself.args.taskdetectelselen(self.model.names),end2endgetattr(self.model,end2end,False),rotatedself.args.taskobb,return_idxssave_feats,)# 格式转换若原始图像是张量非列表转换为NumPy批次并反转通道BGR→RGB适配OpenCV格式ifnotisinstance(orig_imgs,list):orig_imgsops.convert_torch2numpy_batch(orig_imgs)[...,::-1]# 特征提取需要保存特征时从特征图提取目标级特征ifsave_feats:# 提取目标特征按NMS返回的索引映射obj_featsself.get_obj_feats(self._feats,preds[1])# 分离NMS结果preds[0]为检测框preds[1]为目标索引predspreds[0]# 批量构建结构化Results对象resultsself.construct_results(preds,img,orig_imgs,**kwargs)# 特征附加将提取的目标特征绑定到Results对象ifsave_feats:forr,finzip(results,obj_feats):r.featsfreturnresults项目详情函数名postprocess功能概述对模型原始预测结果执行NMS过滤冗余框适配原始图像尺寸可选提取目标特征最终构造Results结果列表返回值list[Results]每个元素为单张图的检测结果对象包含框、类别、置信度、特征等核心逻辑1. 判断是否提取目标特征2. 执行NMS过滤预测框3. 转换原始图像格式张量→列表4. 提取目标特征可选5. 构造Results结果列表6. 绑定目标特征到结果可选设计亮点1. 按需提取目标特征不影响常规预测流程2. 自动适配原始图像的张量/列表格式3. 兼容多种NMS配置旋转框、类别无关、end2end注意事项1. 提取目标特征时需确保模型推理过程中保存了_feats特征图2. 旋转框检测需设置self.args.taskobb否则NMS逻辑不匹配概念含义对应代码控制逻辑单类别检测任务整个检测任务仅需识别一种目标如只检测“人”、只检测“汽车”。self.args.single_cls True单标签预测每框一类每个检测框仅预测一个类别vs 多标签一个框预测多个类别如“人背包”nms.non_max_suppression的multi_label参数根据配置自动切换 NMS 的类别处理逻辑单类别任务强制开启类别无关 NMS 提升效率多类别任务可手动开启只保留置信度最高的一个以减少重复检测适配不同检测场景的需求。模式逻辑适用场景常规NMSagnosticFalse按类别分组对每个类别单独执行NMS不同类别间的框即使重叠度极高也不会互相过滤多类别目标边界清晰的场景如人、自行车、汽车无重叠避免误过滤不同类别的合法框类别无关NMSagnosticTrue忽略类别信息将所有框合并后执行一次NMS只要框的IoU超过阈值无论类别是否相同只保留置信度最高的框单类别检测、或多类别目标易混淆/重叠的场景如汽车/卡车、猫/狗减少重复检测预测张量形状为 [B, N, 4 1 nc]当 nc0 时NMS 函数内部会自动从预测张量的维度推断类别数nc目标特征提取get_obj_featsdefget_obj_feats(self,feat_maps,idxs): 从模型特征图中提取目标级特征用于下游任务特征匹配、检索、重识别等 核心逻辑统一特征维度→拼接多尺度特征→按NMS索引提取目标特征 参数: feat_maps (list[torch.Tensor]): 模型输出的多尺度特征图列表如8x8、16x16、32x32 idxs (list[torch.Tensor]): 批次内每张图像的目标索引NMS返回映射特征图到检测目标 返回: (list[torch.Tensor]): 批次内每张图像的目标特征列表空列表表示无检测目标 # 延迟导入避免推理时未使用特征提取的情况下加载冗余依赖importtorch# 找到所有特征图中最短的向量长度统一特征维度避免维度不匹配smin(x.shape[1]forxinfeat_maps)# 多尺度特征拼接# 1. permute(0,2,3,1): 特征图维度从[B,C,H,W]→[B,H,W,C]通道维度后置# 2. reshape: 将通道维度拆分为[s, C/s]便于均值降维到统一长度s[B,H,W,C]→[B,H*W,s,C/s]# 3. mean(dim-1): 对拆分后的维度取均值将所有特征向量统一为长度s[B,H*W,s,C/s]→[B,H*W,s]# 4. cat(dim1): 拼接多尺度特征维度[B, 总特征数, s]总特征数即不同的尺度H*W的总数obj_featstorch.cat([x.permute(0,2,3,1).reshape(x.shape[0],-1,s,x.shape[1]//s).mean(dim-1)forxinfeat_maps],dim1)# 按索引提取每张图像的目标特征无目标则返回空列表return[feats[idx]ifidx.shape[0]else[]forfeats,idxinzip(obj_feats,idxs)]项目详情函数名get_obj_feats功能概述从模型输出的特征图中提取目标对应的特征向量统一特征维度后按预测框索引筛选返回值list[torch.Tensor核心逻辑1. 确定特征向量最短长度2. 多尺度特征图维度统一均值降维3. 按索引提取单图目标特征设计亮点1. 自动适配多尺度特征图统一特征维度2. 无目标时优雅返回空列表避免运行时错误3. 均值降维保证特征长度一致便于后续使用注意事项1. 特征图需为模型前向传播时保存的_feats属性且维度需为[batch, channels, h, w]2. 索引idxs需与NMS返回的索引一一对应否则特征提取错误结果列表构造construct_resultsdefconstruct_results(self,preds,img,orig_imgs): 批量构建Results对象遍历批次内所有图像调用construct_result处理单张图像 参数: preds (list[torch.Tensor]): 批次内每张图像的NMS后检测结果张量维度[N,6]N检测框数 img (torch.Tensor): 预处理后的批次图像张量模型输入格式 orig_imgs (list[np.ndarray]): 批次内原始图像列表NumPy格式 返回: (list[Results]): 批次内每张图像的结构化Results对象列表 return[self.construct_result(pred,img,orig_img,img_path)forpred,orig_img,img_pathinzip(preds,orig_imgs,self.batch[0])]项目详情函数名construct_results功能概述遍历批量预测结果逐张图像调用construct_result构造单图Results对象最终返回结果列表返回值list[Results]批量图像的检测结果对象列表核心逻辑按批次维度遍历预测框、原始图像、图像路径逐张构造Results对象设计亮点1. 简洁的列表推导式实现批量结果构造2. 严格按批次顺序匹配避免结果错位3. 复用单图构造逻辑降低代码冗余注意事项1.preds、orig_imgs、self.batch[0]的长度需一致否则会触发维度不匹配错误2.self.batch[0]需为图像路径列表依赖BasePredictor的批量数据加载逻辑单图结果构造construct_resultdefconstruct_result(self,pred,img,orig_img,img_path): 为单张图像构建结构化Results对象核心框坐标缩放结果封装 将模型输入尺寸的框坐标缩放到原始图像尺寸确保坐标与原始图像匹配 参数: pred (torch.Tensor): 单张图像的NMS后检测结果维度[N,6]6xyxyconfcls img (torch.Tensor): 预处理后的图像张量模型输入格式 orig_img (np.ndarray): 原始图像未预处理NumPy格式 img_path (str): 原始图像文件路径用于Results对象溯源 返回: (Results): 结构化Results对象包含 - orig_img: 原始图像 - path: 图像路径 - names: 模型类别名映射 - boxes: 缩放后的检测框xyxyconfcls # 框坐标缩放从模型输入尺寸→原始图像尺寸消除预处理的缩放/填充影响pred[:,:4]ops.scale_boxes(img.shape[2:],pred[:,:4],orig_img.shape)# 构建并返回Results对象封装所有推理结果returnResults(orig_img,pathimg_path,namesself.model.names,boxespred[:,:6])项目详情函数名construct_result功能概述将单图预测框缩放到原始图像尺寸封装为Results对象包含图像、路径、类别名、检测框返回值Results单图检测结果对象包含原始图像、路径、类别名、缩放后的检测框核心逻辑1. 预测框缩放模型输入尺寸→原始图像尺寸2. 封装为Results对象设计亮点1. 自动适配模型输入与原始图像的尺寸差异保证预测框位置精准2. 结果对象封装所有核心信息便于后续可视化/解析注意事项1.pred的前4列必须为xyxy格式否则缩放后框位置错误2.orig_img需为RGB通道否则可视化时颜色异常完整代码# Ultralytics AGPL-3.0 License - https://ultralytics.com/license# 从ultralytics引擎预测器模块导入基础预测器基类提供通用推理流程数据加载、预处理、模型推理fromultralytics.engine.predictorimportBasePredictor# 从ultralytics引擎结果模块导入Results类结构化封装推理结果fromultralytics.engine.resultsimportResults# 从ultralytics工具模块导入非极大值抑制NMS、通用操作函数框缩放、格式转换fromultralytics.utilsimportnms,opsclassDetectionPredictor(BasePredictor): 基于BasePredictor扩展的YOLO目标检测专用预测器类 该预测器针对目标检测任务定制处理YOLO模型推理的专属需求 包括原始预测的NMS后处理、预测结果结构化封装、目标特征提取、框坐标缩放模型输入→原始图像等核心流程 属性: args (namespace): 预测器配置参数命名空间包含conf、iou、classes、max_det、agnostic_nms等NMS/推理参数 model (nn.Module): 用于推理的YOLO检测模型实例 batch (list): 待处理的批次数据列表包含图像路径、预处理后的图像张量、原始图像等 方法: postprocess: 对模型原始预测执行NMS后处理转换为结构化Results对象核心推理后处理 get_obj_feats: 从模型特征图中提取目标级特征用于下游任务如特征匹配、检索 construct_results: 批量构建Results对象遍历批次内所有样本 construct_result: 为单张图像构建Results对象框坐标缩放、结构化封装 示例: # from ultralytics.utils import ASSETS # from ultralytics.models.yolo.detect import DetectionPredictor # args dict(modelyolo11n.pt, sourceASSETS) # predictor DetectionPredictor(overridesargs) # predictor.predict_cli() # 命令行模式推理 # results predictor.predict(path/to/image.jpg) # 编程模式推理 defpostprocess(self,preds,img,orig_imgs,**kwargs): 对模型原始预测执行后处理NMS结果结构化返回结构化Results对象列表 核心逻辑NMS过滤冗余框→格式转换→特征提取可选→构建Results对象→附加特征可选 参数: preds (torch.Tensor): 模型原始预测张量维度[B, N, 41NC]4框坐标1置信度NC类别数 img (torch.Tensor): 预处理后的输入图像张量模型输入格式已缩放/归一化 orig_imgs (torch.Tensor | list): 预处理前的原始图像张量/列表格式RGB/BGR需适配 **kwargs (Any): 额外关键字参数预留扩展 返回: (list[Results]): 结构化推理结果列表每个元素对应单张图像的检测结果含框、类别、置信度等 示例: # predictor DetectionPredictor(overridesdict(modelyolo11n.pt)) # results predictor.predict(path/to/image.jpg) # processed_results predictor.postprocess(preds, img, orig_imgs) # 判断是否需要保存目标特征检测是否存在_feats属性模型推理时提取的特征图save_featsgetattr(self,_feats,None)isnotNone# 执行NMS后处理过滤冗余检测框# - conf: 置信度阈值过滤低置信度框# - iou: NMS的IoU阈值合并重叠框# - classes: 指定仅检测的类别None则检测所有类别# - agnostic_nms: 跨类别NMS单类别/agnostic模式下启用# - max_det: 单图最大检测框数量# - nc: 类别数0表示自动识别非detect任务时用模型类别数# - end2end: 适配端到端模型的输出格式# - rotated: 适配旋转框检测OBB任务# - return_idxssave_feats: 需要提取特征时返回目标索引用于特征映射predsnms.non_max_suppression(preds,self.args.conf,self.args.iou,self.args.classes,self.args.agnostic_nms,max_detself.args.max_det,nc0ifself.args.taskdetectelselen(self.model.names),end2endgetattr(self.model,end2end,False),rotatedself.args.taskobb,return_idxssave_feats,)# 格式转换若原始图像是张量非列表转换为NumPy批次并反转通道BGR→RGB适配OpenCV格式ifnotisinstance(orig_imgs,list):orig_imgsops.convert_torch2numpy_batch(orig_imgs)[...,::-1]# 特征提取需要保存特征时从特征图提取目标级特征ifsave_feats:# 提取目标特征按NMS返回的索引映射obj_featsself.get_obj_feats(self._feats,preds[1])# 分离NMS结果preds[0]为检测框preds[1]为目标索引predspreds[0]# 批量构建结构化Results对象resultsself.construct_results(preds,img,orig_imgs,**kwargs)# 特征附加将提取的目标特征绑定到Results对象ifsave_feats:forr,finzip(results,obj_feats):r.featsfreturnresultsdefget_obj_feats(self,feat_maps,idxs): 从模型特征图中提取目标级特征用于下游任务特征匹配、检索、重识别等 核心逻辑统一特征维度→拼接多尺度特征→按NMS索引提取目标特征 参数: feat_maps (list[torch.Tensor]): 模型输出的多尺度特征图列表如8x8、16x16、32x32 idxs (list[torch.Tensor]): 批次内每张图像的目标索引NMS返回映射特征图到检测目标 返回: (list[torch.Tensor]): 批次内每张图像的目标特征列表空列表表示无检测目标 # 延迟导入避免推理时未使用特征提取的情况下加载冗余依赖importtorch# 找到所有特征图中最短的向量长度统一特征维度避免维度不匹配smin(x.shape[1]forxinfeat_maps)# 多尺度特征拼接# 1. permute(0,2,3,1): 特征图维度从[B,C,H,W]→[B,H,W,C]通道维度后置# 2. reshape: 将通道维度拆分为[s, C/s]便于均值降维到统一长度s[B,H,W,C]→[B,H*W,s,C/s]# 3. mean(dim-1): 对拆分后的维度取均值将所有特征向量统一为长度s[B,H*W,s,C/s]→[B,H*W,s]# 4. cat(dim1): 拼接多尺度特征维度[B, 总特征数, s]总特征数即不同的尺度H*W的总数obj_featstorch.cat([x.permute(0,2,3,1).reshape(x.shape[0],-1,s,x.shape[1]//s).mean(dim-1)forxinfeat_maps],dim1)# 按索引提取每张图像的目标特征无目标则返回空列表return[feats[idx]ifidx.shape[0]else[]forfeats,idxinzip(obj_feats,idxs)]defconstruct_results(self,preds,img,orig_imgs): 批量构建Results对象遍历批次内所有图像调用construct_result处理单张图像 参数: preds (list[torch.Tensor]): 批次内每张图像的NMS后检测结果张量维度[N,6]N检测框数 img (torch.Tensor): 预处理后的批次图像张量模型输入格式 orig_imgs (list[np.ndarray]): 批次内原始图像列表NumPy格式 返回: (list[Results]): 批次内每张图像的结构化Results对象列表 return[self.construct_result(pred,img,orig_img,img_path)forpred,orig_img,img_pathinzip(preds,orig_imgs,self.batch[0])]defconstruct_result(self,pred,img,orig_img,img_path): 为单张图像构建结构化Results对象核心框坐标缩放结果封装 将模型输入尺寸的框坐标缩放到原始图像尺寸确保坐标与原始图像匹配 参数: pred (torch.Tensor): 单张图像的NMS后检测结果维度[N,6]6xyxyconfcls img (torch.Tensor): 预处理后的图像张量模型输入格式 orig_img (np.ndarray): 原始图像未预处理NumPy格式 img_path (str): 原始图像文件路径用于Results对象溯源 返回: (Results): 结构化Results对象包含 - orig_img: 原始图像 - path: 图像路径 - names: 模型类别名映射 - boxes: 缩放后的检测框xyxyconfcls # 框坐标缩放从模型输入尺寸→原始图像尺寸消除预处理的缩放/填充影响pred[:,:4]ops.scale_boxes(img.shape[2:],pred[:,:4],orig_img.shape)# 构建并返回Results对象封装所有推理结果returnResults(orig_img,pathimg_path,namesself.model.names,boxespred[:,:6])适配YOLO检测的核心特性特性实现方式多场景NMS适配postprocess中NMS支持普通检测/旋转框、类别无关、end2end模型、类别过滤目标特征提取get_obj_feats统一多尺度特征维度按预测框索引提取目标特征并绑定到结果预测框精准缩放construct_result调用scale_boxes自动适配模型输入/原始图像尺寸差异结果标准化封装统一使用Results对象封装结果包含图像、路径、类别名、检测框、特征等批量/单图兼容construct_results遍历批量数据复用单图构造逻辑保证批次一致性工程化核心优化优化点实现方式按需特征提取通过save_feats标记控制特征提取流程不影响常规预测性能维度兼容处理无目标时返回空列表避免张量维度错误自动转换原始图像的张量/列表格式代码冗余减少批量结果构造复用单图逻辑NMS参数复用预测器配置降低代码重复通道顺序适配原始图像张量转numpy时执行[...,::-1]保证RGB通道顺序匹配扩展与易用性能力扩展项用途预留kwargs参数postprocess的**kwargs为后续功能扩展如自定义后处理预留接口特征绑定到结果提取的目标特征绑定到Results.feats支持下游任务如特征匹配统一结果对象Results对象提供可视化、保存、解析等通用方法降低下游使用成本关键注意事项模型类型匹配需确保model为检测模型如yolo11n.pt若传入分类/分割模型NMS后处理会因预测格式不匹配报错特征提取启用条件需在模型推理时保存_feats特征图如自定义模型前向传播时赋值self._feats否则get_obj_feats不会执行旋转框检测配置检测旋转框OBB时需设置args.taskobb否则NMS会按普通框处理导致旋转框过滤错误图像通道顺序原始图像需为RGB通道若输入为BGR如OpenCV读取需手动转换否则可视化结果颜色异常批量结果一致性确保preds、orig_imgs、img_path的长度一致避免批量结果构造时出现索引错位置信度阈值调整低置信度阈值如0.001会增加检测框数量可能导致NMS耗时增加需根据场景平衡召回率与速度。总结详细介绍了 Ultralytics 框架中继承自 BaseValidator 的 YOLO 目标检测专用预测器。