文章目录[隐藏]
1.test_detector的调用路径:
这里重点介绍load_alphabet函数:
程序退出时,会清理这些图片分配的资源:
根据代码,这里是从data/labels/目录装载png图片,图片有8*95=760
这些图片都是ASCII码,比如我们打开编号为65和97的PNG图片,看以下内容,分别是A和a.
怀疑最后绘框上面的Label字母就是来源于这里,这样就不依赖于系统字库了,我们确认一下,用反证法。
如果我们将所有b的图片替换成a的图片,那么bicycle应该能变成aicycle的,我们测试一下:
我们重新运行推理测试,发现果然如此,b变成了a.
所以,labels/下有ASCII码32-127的8种尺寸的图片,是显示标签用的。
澄清一个问题,继续下一个问题
运行后:
dog.jpg,宽高分别为768,576,这是原图的尺寸。
但是我们的网络描述文件,网络的输入应该是416*416的,该如何处理呢?
打印几个关键变量:
喂给网络的JPG图像,首先要经过resize_image操作,转换为网络吃的416*416大小,load_image调用栈中会调用STBI库,库里面还会进行JPG-RGB的转换。
网络推理用的图像分辨率是416*416,但是输入原图和输出框却是在768*576大小,那么框和坐标是如何转化的呢?
./darknet detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights data/dog.jpg -i 0 -thresh 0.25s -out result.json
具体调用发生在下图中的correct_yolo_boxes函数。
加入图中的打印LOG,我们看一下调试输出:
数据处理流水线:
这里的224*224写错了,YOLOV3网络不支持这种尺寸的输入,而应该是320*320。
推理前处理
前处理后,原图被转换为sized对象中存储的数据类型,我们打引它的维度信息和数据:
打印出来,看到确实是按照网络对图像尺寸的要求,数据变为416*416*3的数据。
但是数据貌似是归一化[0,1]范围的浮点,而非RGB像素信息,我们把数据也打印出来:
并且我们加入了范围检测,检测最小值和最大值的存在,运行后,最大值为1,最小值为0,没有负值.
归一化的细节发生在那里呢?还需要再寻找。
继续寻找归一化的前奏,对输入图像的最早处理是发生在下面这段代码:
打印:
所以,你看到,图像装载的时候就已经归一化为小数了。归一化是在哪里发生的呢?我们追踪一下load _image的实现,可以很明显看到最后一步除了255。
Darknet 对于缩放的实现,使用了最临近插值的算法,算法原理可以参考博客
darknet每个框针对每类对象的概率怎么算的?
下面这段代码来自于darknet代码,通过它可以看的出来,计算方法是这个框有物体的置信度乘以每类的概率,为这个框中有某类目标的最后概率,这有点像是条件概率。
结束!
版权声明:本文为CSDN博主「papaofdoudou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tugouxp/article/details/120941276
暂无评论