yolov3源码结构

darknet. py

def get_test_input()   #对测试图片进行预处理(图片的大小,GBR通道改成RGB通道)
def parse_cfg(cfgfile)  #对cfg配置文件进行处理-->输入yolov3.cfg配置文件,返回列表对象,其中每一个元素为一个字典类型对应于一个要建立的神经网络模块(层)
class EmptyLayer(nn.Module):
class DetectionLayer(nn.Module):  #yolo 检测层的具体实现(重点), 在特征图上使用锚点预测目标区域和类别, 功能函数在predict_transform中,采用迁移学习训练自己的网络时需要更改这个函数

def create_modules(blocks):  #利用parse_cfg(cfgfile)返回的字典内容,创建网络层级

#CNN
class Darknet(nn.Module):
     def __init__(self, cfgfile):
    	   super(Darknet, self).__init__()
           self.blocks = parse_cfg(cfgfile) #调用parse_cfg函数
           self.net_info, self.module_list = create_modules(self.blocks)  #调用create_modules函数

     def forward(self, x, CUDA)  #前向传播
     def load_weights(self, weightfile):  #导入预训练的网络权重参数yolov3-spp.weights

util. py

def bbox_iou(box1, box2)  #返回预测框与真实框的IoU  value=交/并
def predict_transform(prediction, inp_dim, anchors, num_classes, CUDA = True)  
"""
    在特征图上进行多尺度预测, 在GRID每个位置都有三个不同尺度的锚点.predict_transform()利用一个scale得到的feature map预测得到的每个anchor的属性(x,y,w,h,s,s_cls1,s_cls2...),其中x,y,w,h
    是在网络输入图片坐标系下的值,s是方框含有目标的置信度得分,s_cls1,s_cls_2等是方框所含目标对应每类的概率。输入的feature map(prediction变量) 
    维度为(batch_size, num_anchors*bbox_attrs, grid_size, grid_size),类似于一个batch彩色图片BxCxHxW存储方式。参数见predict_transform()里面的变量。
    并且将结果的维度变换成(batch_size, grid_size*grid_size*num_anchors, 5+类别数量)的tensor,同时得到每个方框在网络输入图片(416x416)坐标系下的(x,y,w,h)以及方框含有目标的得分以及每个类的得分。
"""

def write_results(prediction, confidence, num_classes, nms_conf = 0.4)  #上一步预测结果是每个单元都预测三个锚点框,在这里对上一步进行处理,删去小于阈值的框再进行NMS非极大值抑制,得到最终预测的结果。

def letterbox_image(img, inp_dim)
 """
    lteerbox_image()将图片按照纵横比进行缩放,将空白部分用(128,128,128)填充,调整图像尺寸
    具体而言,此时某个边正好可以等于目标长度,另一边小于等于目标长度
    将缩放后的数据拷贝到画布中心,返回完成缩放
  """
  def prep_image(img, inp_dim):#prep_image用来将numpy数组转换成PyTorch需要的的输入格式。即(3,416,416)
  def load_classes(namesfile): #load_classes会返回一个字典——将每个类别的索引映射到其名称的字符串

猜你喜欢

转载自blog.csdn.net/moyu916/article/details/88817783