Kyno's Blog🐱‍🏍

Kyno's Blog🐱‍🏍

个人博客

DenseBox代码解析

距离上次更新博客又很久了。前段时间照着github上的代码复现了下DenseBox,有所收获记录一下。

DenseBox代码整体结构

densebox/__init__.py解析

densebox文件夹下,__init__文件的内容为:

from .DenseBoxDataset import DenseBoxDataset  
from .DenseBox import DenseBox  
__all__ = ['DenseBoxDataset', 'DenseBox']  

这段代码的作用是使得densebox文件夹变为一个模块,换一个角度来说,就是提升了包的导入权限,只要在__all__中声明的内容,可以直接在上一层目录中导入,如train.py文件的开头:

from densebox import DenseBoxDataset  
from densebox import DenseBox  

如果使用from densebox import *,则会把注册在__all__列表中的子模块和子包导入到当前作用域中来。

densebox/DenseBox.py解析

DenseBox.py用于构建网络结构,首先定义模型结构class DenseBox(torch.nn.Module),然后实现__init__函数和forward函数。

densebox/DenseBoxDataset.py解析

DenseBoxDataset.py用于处理读入数据,首先定义自定义数据集class DenseBoxDataset(Dataset),然后主要实现__init__函数、__getitem__函数和__len__函数。

train.py解析

train.py即模型的训练过程,包含采样策略。常规训练流程:加载数据集 -> 设置train_loader -> 网络初始化 -> 设置损失函数 -> 设置优化策略 -> 调整网络为训练模式 -> 训练循环。以下列举重点进行分析:

test.py解析

test.py即模型测试过程:
初始化网络并加载到GPU->网络切换到测试模式->读取测试图片并做相应变换->数据输入网络得到输出->解析输出并可视化(目前未实现统计评估的功能)。以下列举重点并分析:

总结

这次复现的本质是从头到尾细致地读了一遍代码。收获最大的地方是对数据采样这个方面,有了细致的了解。
网络和代码目前可以改进的地方很多:

  1. 不支持多尺度,可以结合FPN做改进
  2. 数据加载耗时长,可以考虑多个batch_size的数据批量加载到内存
  3. 测试时的dataloader未完成
  4. evaluate功能未实现
  5. 细节处可以改进
    DenseBox代码复现告一段落,之后有时间可能会优化代码。接下来更多着重在mmdetection toolbox上,它的整个框架结构更加成熟,并且也更加高效,值得深入研究。