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会返回一个字典——将每个类别的索引映射到其名称的字符串