DCN V1代码阅读笔记

1. 前言

笔者前几天阅读了MASA 的可变形卷积算法,并写了一篇算法笔记:MASA DCN(可变形卷积) 算法笔记 ,然后里面也说了会放出一个代码解读出来,所以今天的推文就是来干这件事的,希望看完这篇文章你可对DCN的细节可以更加了解。本次解析的代码来自:https://github.com/ChunhuanLin/deform_conv_pytorch

2. 代码整体介绍

打开这个工程,我们发现只有 3 3 3个文件,整个结构非常简单:

代码结构
实际上我们关注前面 2 2 2个文件deform_conv.pydemo.py就可以了,至于test_against_mxnet.ipynb只是测试了以下mxnet自带的可变形卷积op和这个库里面实现的可变形卷积op对同一个输入进行处理,输出结果是否一致,从jupyter的结果来看是完全一致的,也证明作者这个DeformConv2D是正确实现了,接下来我们就从源码角度来看一下可变形卷积究竟是如何实现的。

另外需要注意的是这个Pytorch代码版本是0.4.1,如果需要使用1.0以上的可能需要稍微改改某些API,但改动应该很少的,毕竟这个代码加起来也就2,300行。。

3. 可变形卷积示意图

为了更好的理解代码,我们先形象的回忆一下可变形卷积。

下面的Figure2展示了可变形卷积的示意图:

Deformable Convolution的示意图

可以看到可变形卷积的结构可以分为上下两个部分,上面那部分是基于输入的特征图生成offset,而下面那部分是基于特征图和offset通过可变形卷积获得输出特征图。

假设输入的特征图宽高分别为 w w w h h h,下面那部分的卷积核尺寸是 k h k_h kh k w k_w kw,那么上面那部分卷积层的卷积核数量应该是 2 × k h × k w 2\times k_h\times k_w 2×kh×kw,其中 2 2 2代表 x x x y y y两个方向的offset。

并且,这里输出特征图的维度和输入特征图的维度一样,那么offset的维度就是 [ b a t c h , 2 × k h × k w , h , w ] [batch, 2\times k_h\times k_w, h, w] [batch,2×kh×kw,h,w],假设下面那部分设置了group参数(代码实现中默认为 4 4 4),那么第一部分的卷积核数量就是 2 × k h × k w × g r o u p 2\times k_h \times k_w \times group 2×kh×kw×group,即每一个group共用一套offset。下面的可变形卷积可以看作先基于上面那部分生成的offset做了一个插值操作,然后再执行普通的卷积。

4. 解析demo.py

demo.py是训练和参数设置的入口,我们进来看看。

首先是设置一些训练参数,并加载MNIST数据集到train_loadertest_loader里面:

# Training settings
parser = argparse.ArgumentParser(description='PyTorch MNIST Example')
# 设置训练batch_size,默认为32
parser.add_argument('--batch-size', type=int, default=32, metavar='N',
                    help='input batch size for training (default: 32)')
# 设置测试的batch_size,默认为32
parser.add_argument('--test-batch-size', type=int, default=32, metavar='N',
                    help='input batch size for testing (default: 32)')
# 设置训练epochs数,默认为10
parser.add_argument('--epochs', type=int, default=10, metavar='N',
                    help='number of epochs to train (default: 10)')
# 设置学习率,默认为0.01
parser.add_argument('--lr', type=float, default=0.01, metavar='LR',
                    help='learning rate (default: 0.01)')
# 设置SGD的动量参数,默认为0.5
parser.add_argument('--momentum', type=float, default=0.5, metavar='M',
                    help='SGD momentum (default: 0.5)')
# 设置是否使用GPU训练
parser.add_argument('--no-cuda', action='store_true', default=False,
                    help='disables CUDA training')
# 设置随机数种子
parser.add_argument('--seed', type=int, default=1, metavar='S',
                    help='random seed (default: 1)')
# 没用到这个参数,不用管
parser.add_argument('--log-interval', type=int, default=10, metavar='N',
                    help='how many batches to wait before logging training status')

# 解析参数
args = parser.parse_args()
args.cuda = not args.no_cuda and torch.cuda.is_available()

torch.manual_seed(args.seed)
if args.cuda:
    # 为当前GPU设置随机种子
    # 如果使用多个GPU,应该使用torch.cuda.manual_seed_all()为所有的GPU设置种子
    torch.cuda.manual_seed(args.seed)

kwargs = {
   
   'num_workers': 1, 'pin_memory': True} if args.cuda else {
   
   }

# 加载数据。组合数据集和采样器,提供数据上的单或多进程迭代器
# 参数:
# dataset:Dataset类型,从其中加载数据
# batch_size:int,可选。每个batch加载多少样本
# shuffle:bool,可选。为True时表示每个epoch都对数据进行洗牌
# sampler:Sampler,可选。从数据集中采样样本的方法。
# num_workers:int,可选。加载数据时使用多少子进程。默认值为0,表示在主进程中加载数据。
# collate_fn:callable,可选。
# pin_memory:bool,可选
# drop_last:bool,可选。True表示如果最后剩下不完全的batch,丢弃。False表示不丢弃。

train_loader = torch.utils.data.DataLoader(
    datasets.MNIST('./MNIST', train=True, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=args.batch_size, shuffle=True, **kwargs)
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST('./MNIST', train=False, download=True,
                   transform=transforms.Compose([
                       transforms.ToTensor(),
                       transforms.Normalize((0.1307,), (0.3081,))
                   ])),
    batch_size=args.test_batch_size, shuffle=True, **
### DCN算法用于图像去雨痕的Python代码示例 以下是基于深度卷积网络(Deep Convolutional Network, DCN)实现图像去雨痕的一个简化版本。此代码展示了如何构建一个基础的DCN模型来处理图像中的雨痕去除问题。 ```python import tensorflow as tf from tensorflow.keras import layers, models def build_dcn_model(input_shape=(128, 128, 3)): model = models.Sequential() # 输入层 model.add(layers.Input(shape=input_shape)) # 卷积1:提取低级特征 model.add(layers.Conv2D(64, (3, 3), padding='same', activation='relu')) model.add(layers.BatchNormalization()) # 卷积层2:进一步提取特征 model.add(layers.Conv2D(128, (3, 3), strides=2, padding='same', activation='relu')) model.add(layers.BatchNormalization()) # 卷积层3:更深层次的特征学习 model.add(layers.Conv2D(256, (3, 3), strides=2, padding='same', activation='relu')) model.add(layers.BatchNormalization()) # 反卷积1:逐步恢复原始尺寸 model.add(layers.Conv2DTranspose(128, (3, 3), strides=2, padding='same', activation='relu')) model.add(layers.BatchNormalization()) # 反卷积层2:继续恢复到输入大小 model.add(layers.Conv2DTranspose(64, (3, 3), strides=2, padding='same', activation='relu')) model.add(layers.BatchNormalization()) # 输出层:生成清理后的图像 model.add(layers.Conv2D(3, (3, 3), padding='same', activation='tanh')) return model # 构建并编译模型 dcn_model = build_dcn_model() dcn_model.compile(optimizer=tf.keras.optimizers.Adam(), loss='mean_squared_error', metrics=['accuracy']) # 打印模型结构 dcn_model.summary() ``` 上述代码定义了一个简单的DCN架构,适用于初步研究图像去雨痕的任务。该模型通过多层卷积操作提取图像特征,并利用反卷积操作重建无雨痕的清晰图像[^1]。 需要注意的是,实际应用中可能需要调整模型复杂度、训练数据集以及损失函数设计等因素以获得更好的效果。此外,为了应对过拟合等问题,可以引入正则化技术或改进权重初始化方法。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值