文章目录[隐藏]
![]()

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
![]()



暂无评论