YOLOv2之源码详解

本文主要是为了解决遥感卫星图像的目标检测中输入图像大小的问题,此前对YOLO仅处于能用的阶段,原理大差不差的知道,细节问题还有很多不是很了解。由此,转战代码:

m.blog.csdn.net/flztiii/article/details/74274997 

1、先看训练部分,命令是:./darknet detector train cfg/voc.data cfg/yolo-voc.cfg darknet19_448.conv.23

首先./darknet是程序的名称,主函数应该在darknet.c源文件中,解读(注意:是我自己的注释):

YOLOv2之源码详解_第1张图片

加入输入的少于一个参数,会输出整个用法的提醒,如下:


argv[0]即第一个参数是./darknet,是程序的名称;
argv[1]即第二个参数是detector:

主函数main就是对于参数argv[1]的一个判断,根据argv[1]的内容来启动不同的程序。让我们继续跟着训练命令走argv[1] =detector时,调用的函数是run_detector(同时把argn和argv传递过去了),解读detector.c中的run_detector函数(注意:我想应该C++编译的单位是函数,这整个项目编译之后会有一个run_detector函数,但是此刻有该算法的声明:extern void run_detector(int argc, char **argv);//C函数前加extern表示该函数已经在其他文件中定义。):

YOLOv2之源码详解_第2张图片




会根据参数argv[2](去选择接下来要去执行什么函数,而上面命令是train)这里的test_detector,train_detector这些函数在detector.c中都有定义,并且从名字上我们就可以看出这些函数是干什么的。这里我们依旧跟随之前的训练命令,argv[2] = train,这里让我们来看一下train_detector函数:
参数解释:


YOLOv2之源码详解_第3张图片

train_detector函数(按照所有代码的顺序,由于部分函数是一个函数调用了另一个函数,这边不细细解释,直接是生成的变量是什么,具体各个函数的解释见完整代码中的注释:github.com/EchoIR/YOLOv2_interpretation ):

YOLOv2之源码详解_第4张图片

YOLOv2之源码详解_第5张图片
YOLOv2之源码详解_第6张图片
YOLOv2之源码详解_第7张图片

巴拉巴拉,这边感觉一点一点贴上来还是讲不清楚,还是说重点吧,具体代码去本人的github看注释:github.com/EchoIR/YOLOv2_interpretation

重点一:上面有网络如何进行多尺度训练的,在每次进行多尺度的时候,网络的大小就会改变(网络输入大小,后面层因为网络输入大小的改变也进行相应的改变),但是最后训练出来的模型的权重跟输入图像的大小没啥关系。可以更改。(但是最好是之前训练过的一种尺寸吧)

重点二:数据在训练之前是以什么形式存在的,见上面pthread_join的解释

重点三:图片如何进行resize的:

YOLOv2之源码详解_第8张图片
YOLOv2之源码详解_第9张图片

这边可以看出,图片还是类似用了下采样的方法的~~所以此处用在特别大的图中,小目标一般就会丢掉了~~哭

2、再看测试部分,命令是:./darknet detector test cfg/coco.data cfg/yolo.cfg yolo.weights data/dog.jpg

看测试图像是如何处理的:

YOLOv2之源码详解_第10张图片

至此,YOLO的源码算是差不多看完了,对于图片的处理就是这些了。由此可见,网络的初始大小只决定测试的时候,把测试图片缩放到什么样子的大小。去试试,果然,训练好模型,之后在yolo-voc.cfg中把输入大小更改成1000,甚至是800别的尺寸,模型还是可以跑起来的(回想起来所以之前官网上面说过288的与512的模型都是一样的)。后面可以想想如何改这边的代码,使得可以crop图片进行检测。后面再看一下SSD的源码。

你可能感兴趣的:(YOLOv2之源码详解)