文件最后提交记录最后更新时间
9 天前
8 天前
23 天前
23 天前
8 天前
23 天前
7 天前
README

Yolo

产品支持情况

产品 是否支持
Ascend 950PR/Ascend 950DT
Atlas A3 训练系列产品/Atlas A3 推理系列产品
Atlas A2 训练系列产品/Atlas A2 推理系列产品
Atlas 200I/500 A2 推理产品 ×
Atlas 推理系列产品 ×
Atlas 训练系列产品 ×

功能说明

  • 算子功能:对YOLOv2/v3目标检测网络的检测特征图进行数据重组和激活处理,将原始卷积输出转换为检测框坐标、目标置信度和类别概率三个输出,供后续Yolov3DetectionOutput算子使用。

  • 计算公式:

输入x的shape为(N, boxes*(coords+1+classes), H, W),通道维度C按(elem, box)排列,即先排列所有锚框的x坐标,再排列所有锚框的y坐标,依此类推。

坐标处理:

  • x, y坐标做sigmoid激活
  • w, h坐标直接搬移(move),输出时w和h位置交换,输出排列为(x, y, h, w)

sigmoid(x)=11+exp(−x)sigmoid(x) = \frac{1}{1 + exp(-x)}

目标置信度和类别概率根据yolo_mode处理,yolo_mode由yolo_version、softmax和background三个属性决定:

  • YOLO_MODE_1(V3,或V2且softmax=false且background=false):obj=sigmoid, classes=sigmoid
  • YOLO_MODE_2(V2且softmax=true且background=false):obj=sigmoid, classes=softmax
  • YOLO_MODE_3(V2且softmax=false且background=true):obj=move, classes=sigmoid
  • YOLO_MODE_4(V2且softmax=true且background=true):obj和classes一起做softmax

参数说明

参数名 输入/输出/属性 描述 数据类型 数据格式
x 输入 卷积层输出特征图,shape为(N, boxes*(coords+1+classes), H, W),通道维度C=boxes*(coords+1+classes),按(elem, box)排列。支持NCHW数据排布。 float16、float32 ND
coord_data 输出 检测框坐标,shape为(N, boxes*coords, CeilX(H*W*2+32,32)/2),通道排列为(x, y, h, w)。输出最后一维使用ceilx内存对齐,有效数据为前H*W个元素。 float16、float32 ND
obj_prob 输出 目标置信度,shape为(N, CeilX(boxes*H*W*2+32,32)/2)。输出最后一维使用ceilx内存对齐,有效数据为前boxes*H*W个元素。 float16、float32 ND
classes_prob 输出 类别概率,shape为(N, classes, CeilX(boxes*H*W*2+32,32)/2)。输出最后一维使用ceilx内存对齐,有效数据为前boxes*H*W个元素。 float16、float32 ND
boxes 属性 锚框数量,取值大于0,默认值为3(YOLOv2默认5)。 Int -
coords 属性 坐标参数数,固定为4,对应x, y, w, h,默认值为4。 Int -
classes 属性 预测类别数,取值范围[1, 1024],默认值为80。 Int -
yolo_version 属性 YOLO版本,取值为"V2"或"V3",默认值为"V3"。 String -
softmax 属性 是否对类别概率做softmax,仅yolo_version为"V2"时有效,默认值为false。 Bool -
background 属性 obj和classes操作类型控制,仅yolo_version为"V2"时有效,默认值为false。 Bool -
softmaxtree 属性 固定为false,未使用,默认值为false。 Bool -

约束说明

  • 输入x必须为4维NCHW格式,shape为(N, boxes*(coords+1+classes), H, W)。
  • 通道维度C必须满足C = boxes*(coords+1+classes),否则结果未定义。
  • coords固定为4,对应x, y, w, h四个坐标值。
  • boxes必须大于0。
  • classes取值范围为[1, 1024]。
  • H和W必须大于0,即H*W > 0,不支持空空间维度。
  • yolo_version仅支持"V2"或"V3"。
  • 输入x必须为连续tensor。
  • float16输入时中间计算提升到float32精度。
  • 输出coord_data的通道排列为(x, y, h, w),注意w和h位置与输入相比发生交换。
  • softmax和background属性仅当yolo_version为"V2"时有效。
  • 输出shape的最后一维使用ceilx内存对齐,与canndev的1.0 infershape一致:
    • coord_data最后一维:CeilX(HW2+32, 32)/2,有效数据为前H*W个元素,padding区域补零。
    • obj_prob最后一维:CeilX(boxesHW2+32, 32)/2,有效数据为前boxesH*W个元素,padding区域补零。
    • classes_prob最后一维:CeilX(boxesHW2+32, 32)/2,有效数据为前boxesH*W个元素,padding区域补零。
    • CeilX(size, align) = (size + align - 1) / align * align,其中size为元素数乘以2(float16占2字节),align为32(32字节对齐)。
  • 算子为确定性实现:sigmoid使用标准公式1/(1+exp(-x)),softmax使用max-subtraction数值稳定的3-pass实现(每线程独立顺序累加,无跨线程归约),相同输入多次运行结果完全一致。
  • float16输入时中间计算提升到float32精度,最终结果转回float16。float16 subnormal值([2^-24, 2^-14))通过手动构造位模式保留,绕过硬件FTZ(Flush-To-Zero)模式。
  • 算子采用多核多线程并行:基于GetBlockIdx/GetBlockNum的全局核索引,每核512线程,Grid-Stride循环分配工作量。

调用说明

调用方式 调用样例 说明
图模式调用 test_geir_yolo 通过算子IR构图方式调用Yolo算子,参见算子调用完成算子编译和验证。