基于对代码的详细分析,YOLOv8分割模型的后处理阶段主要包括以下几个关键步骤:

1. 输出解析与解码

  • 多尺度输出处理: 代码遍历模型的13个输出分支,每个分支对应不同的检测尺度

  • 量化处理: 根据模型是否量化,分别调用process_u8(量化INT8)或process_fp32(浮点)函数

  • 网格坐标计算: 基于特征图的网格尺寸(grid_h, grid_w)和步长(stride),将网络输出转换为真实坐标

  • 分布焦点损失(DFL)解码: 对边界框回归部分使用分布焦点损失进行解码,获得精确的位置信息

  • 类别概率提取: 从输出中提取物体置信度和类别概率

2. 边界框与分割掩码生成

  • 边界框定位: 将网络输出转换为实际的边界框坐标(x, y, w, h)

  • 分割原型(proto)提取: 从专门的输出分支获取分割原型特征

  • 分割参数提取: 提取每个检测框对应的分割参数,用于后续的掩码重建

3. 非极大值抑制(NMS)

  • 置信度过滤: 首先过滤掉低于阈值(默认0.25)的检测结果

  • 排序: 按照置信度从高到低对检测框进行排序

  • NMS处理: 按类别进行非极大值抑制,去除重叠度过高的边界框(默认IoU阈值0.45)

  • 索引更新: 更新保留下来的检测框索引

4. 分割掩码重建

  • 矩阵乘法: 将分割参数与原型特征进行矩阵乘法运算,生成分割掩码

  • 尺寸调整: 使用OpenCV或其他硬件加速方法(如RGA)将掩码调整到输入图像尺寸

  • 掩码裁剪: 根据边界框位置裁剪和合并各个目标的分割掩码

  • 空间变换: 将掩码映射回原始图像的空间坐标系

5. 坐标系转换

  • 去信封(box_reverse): 将经过信封填充(letterbox)处理后的坐标转换回原始图像坐标系

  • 比例缩放: 根据预处理时的缩放比例和填充参数,恢复真实的像素坐标

6. 结果封装

  • 结果存储: 将检测框、类别ID、置信度和分割掩码存储到object_detect_result_list结构中

  • 内存管理: 合理分配和释放中间计算所需的内存

关键特性

  • 量化感知: 支持INT8量化模型,具有相应的量化/反量化处理

  • 性能优化: 提供CPU和NPU两种矩阵乘法实现选项

  • 硬件加速: 在RKNPU2版本中集成了RGA硬件加速的图像缩放功能

  • 多类别支持: 支持COCO数据集的80个类别检测与分割

rknn官方导出版本

YOLOv8 Segmentation 模型的13个输出详解                                                                                                  
                                                                                                                                         
 根据Python代码注释和C++后处理代码,原始模型有13个输出:                                                                                 
                                                                                                                                         
 ### 1. 检测框信息 (4个输出)                                                                                                             
                                                                                                                                         
 - 输出0, 4, 8: 分别对应三个不同尺度的检测框回归信息                                                                                     
     - 这些输出包含边界框的相对坐标信息(使用DFL分布焦点损失编码)                                                                       
     - 每个输出包含4组DFL编码的边界框回归值                                                                                              
                                                                                                                                         
 ### 2. 类别分数信息 (4个输出)                                                                                                           
                                                                                                                                         
 - 输出1, 5, 9: 分别对应三个不同尺度的类别预测分数                                                                                       
     - 包含80个类别的分类概率分数                                                                                                        
     - 用于确定检测对象的类别                                                                                                            
                                                                                                                                         
 ### 3. 置信度总和信息 (3个输出)                                                                                                         
                                                                                                                                         
 - 输出2, 6, 10: 分别对应三个不同尺度的置信度总和                                                                                        
     - 这是优化后的新增输出,用于加速阈值筛选                                                                                            
     - 在后处理阶段,可通过检查这个总和快速过滤低置信度区域                                                                              
     - 避免不必要的复杂计算                                                                                                              
                                                                                                                                         
 ### 4. 分割信息 (3个输出)                                                                                                               
                                                                                                                                         
 - 输出3, 7, 11: 分别对应三个不同尺度的分割参数                                                                                          
     - 包含用于重建分割掩码的参数                                                                                                        
     - 与原型特征相乘以生成最终的分割掩码                                                                                                
                                                                                                                                         
 ### 5. 原型信息 (1个输出)                                                                                                               
                                                                                                                                         
 - 输出12: 原型分割特征                                                                                                                  
     - 这是一个独立的输出,包含32通道的原型特征图 (32×160×160)                                                                           
     - 用于与分割参数相乘生成最终的分割掩码                                                                                              
                                                                                                                                         
 模型优化说明                                                                                                                            
                                                                                                                                         
 根据您提到的改动:                                                                                                                      
                                                                                                                                         
 1. 移除后处理结构: 原始模型内部的后处理(如DFL解码)被移到模型外部,这样可以:                                                          
     - 提高量化精度(后处理对量化敏感)                                                                                                  
     - 支持更灵活的推理配置                                                                                                              
 2. DFL移至外部: 分布焦点损失的解码过程从模型内部移到了C++后处理代码中,在compute_dfl函数中实现                                          
 3. 新增置信度总和: 添加了输出2、6、10作为置信度总和,用于快速过滤,提高后处理效率                                                       
 4. 量化友好性: 这些改动使模型更适合量化部署,特别是在NPU上运行时                                                                        
                                                                                                                                         
 所以准确地说,该模型有13个输出,分别对应上述5类信息,其中前12个输出按尺度分组(每组4个),最后1个是独立的原型特征输出。这些输出在C++后  
 处理代码中被相应地处理以生成最终的检测和分割结果。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐