AI-深度学习

模型基础知识

模型基础知识的封面

张量

模型就是输入张量 → 计算 → 输出张量: 输入张量 模型内部(卷积、池化...) 输出张量 [1,3,640,640] ──────→ ┌──────────────────┐ ──────→ [1,6400,1] × 12个 uint8 BGR图像 │ YuNet 网络结构 │ FP32 检测结果 │ (几百万个参数) │ └──────────────────┘ 你的两个模型 YuNet 数量 形状 输入 1 个 [1,3,640,640] uint8 输出 12 个 见下表 输出[0] cls_8 [1,6400,1] 8倍下采样层的类别分数 输出[1] cls_16 [1,1600,1] 16倍下采样层的类别分数 输出[2] cls_32 [1,400,1] 32倍下采样层的类别分数 输出[3] obj_8 [1,6400,1] 8倍层的物体置信度 输出[4] obj_16 [1,1600,1] 16倍层的物体置信度 输出[5] obj_32 [1,400,1] 32倍层的物体置信度 输出[6] bbox_8 [1,6400,4] 8倍层的框回归(ltrb) 输出[7] bbox_16 [1,1600,4] 16倍层的框回归 输出[8] bbox_32 [1,400,4] 32倍层的框回归 输出[9] kps_8 [1,6400,10] 8倍层的5个关键点 输出[10] kps_16 [1,1600,10] 16倍层的5个关键点 输出[11] kps_32 [1,400,10] 32倍层的5个关键点 PIPNet 数量 形状 输入 1 个 [1,3,256,256] uint8 输出 5 个 见下表 输出[0] cls_map [1,98,8,8] 98个关键点的热力图 输出[1] offset_x [1,98,8,8] X亚像素偏移 输出[2] offset_y [1,98,8,8] Y亚像素偏移 输出[3] nb_x [1,980,8,8] 邻居X回归 输出[4] nb_y [1,980,8,8] 邻居Y回归 类比 C++ 函数 模型就像一个函数: // YuNet 相当于: void yunet(const uint8_t input[3][640][640], // 输入张量 float cls_8[6400], // 输出张量 ×12 float cls_16[1600], float cls_32[400], ...);

// PIPNet 相当于: void pipnet(const uint8_t input[3][256][256], // 输入张量 float cls_map[98][8][8], // 输出张量 ×5 float offset_x[98][8][8], ...); 对应到代码

Python 端

outputs = session.run(output_names, {input_name: blob})

↑ 输出张量名字列表 ↑ 输入张量

// 设备端 C++ npu->run(kSlotYunet, yunetInput, yunetResult); // ↑ 输入张量 ↑ 输出张量(12个) 一句话总结 模型 = 一个"多输入多输出的函数"。输入张量是你喂给它的图像,输出张量是它返回的结果。YuNet:1 进 12 出;PIPNet:1 进 5 出。每个张量都有固定的形状和数据类型,搞错任何一个都会导致结果错误。