用过YOLOV3模型的人都知道,YOLOV3网络有3个输出tensor,他分别是对输入RGB三通道图像的32倍,16倍以及8倍的下采样,YOLOV3支持三种尺寸的图像输入,分别是320x320,416x416以及608x608,我们以416X416为例,输入和输出示意图如下:
Yolo v3 采用 FPN(Feature Pyramid Network,特征金字塔结构,就是多种尺寸的特征图构成金字塔结构) 网络的思路输出多尺度特征,效果很好,对于如上的tensor输出,它的维度顺序是怎样的呢?在百思不得其解的情况下,就需要看代码来解惑了。我们找到darknet的代码后处理实现部分,关键流程在函数forward_yolo_layer中:
我们关注entry_index的实现:
我们知道,根据YOLOV3论文中的说法,以416X416尺寸的输入图像为例,YOLOV3是将其按照 13x13,26x16,52x52分割成小块,如下图的样子,用示意图表示如下,原图尺寸是1200x741.
先用FFMPG将其转换为416X416NV12格式:
ffmpeg -i beauty.jpeg -pix_fmt nv12 -s 416x416 beauty.nv12.yuv
之后,用命令查看:
ffplay -pix_fmt nv12 -f rawvideo -video_size 416x416 ./beauty.nv12.yuv
可以看到,图像scale的目的已经达到了:
开发程序,分别对图像进行32倍,16倍和8倍下采样,画出网格:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <stddef.h>
#include <stdint.h>
#inc