【CVPR2018 3D ResNet】3D ResNet网络结构详解

这篇具有很好参考价值的文章主要介绍了【CVPR2018 3D ResNet】3D ResNet网络结构详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

3D ResNet系列网络由日本国家工业科学技术研究院的Kensho Hara等人提出。接下来,我将对3D ResNet系列网络做出详细的网络结构解释,欢迎大家补充与提问。

我的github链接主页为XuecWu (Conna) · GitHub文章来源地址https://www.toymoban.com/news/detail-523745.html


import math
import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial


def conv3x3x3(in_planes, out_planes, stride=1):
    # 3x3x3 convolution with padding
    return nn.Conv3d(in_channels=in_planes, out_channels=out_planes, kernel_size=3, stride=stride, padding=1,bias=False)

#------------------------------------#
# 此为对于ResNet-101中的Bottleneck的定义
#------------------------------------#
class Bottleneck(nn.Module):
    expansion = 4

    def __init__(self, in_planes, planes, stride=1, downsample=None):
        super(Bottleneck, self).__init__()

        self.stride     = stride
        self.conv1      = nn.Conv3d(in_planes, planes, kernel_size=1, bias=False)
        self.bn1        = nn.BatchNorm3d(planes)
        self.conv2      = nn.Conv3d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
        self.bn2        = nn.BatchNorm3d(planes)
        self.conv3      = nn.Conv3d(planes, planes * self.expansion, kernel_size=1, bias=False)
        self.bn3        = nn.BatchNorm3d(planes * self.expansion)
        self.relu       = nn.ReLU(inplace=True)
        self.downsample = downsample

    def forward(self, x):
        residual = x

        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)

        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu(out)

        out = self.conv3(out)
        out = self.bn3(out)

        if self.downsample is not None:
            residual = self.downsample(x)

        out = out + residual
        out = self.relu(out)
        return out

#------------------------------#
# 此为对于ResNet的定义
# 这里需要注意,如果更换了数据集,那么
# 我们就要更换相应的num_classes值!!!
#------------------------------#
class ResNet(nn.Module):
    def __init__(self, block, layers, sample_size, sample_duration, shortcut_type='B', num_classes=8):
        super(ResNet, self).__init__()

        self.in_planes = 64
        self.conv1     = nn.Conv3d(3, 64, kernel_size=7, stride=(1, 2, 2), padding=(3, 3, 3), bias=False)
        self.bn1       = nn.BatchNorm3d(64)
        self.relu      = nn.ReLU(inplace=True)
        self.maxpool   = nn.MaxPool3d(kernel_size=(3, 3, 3), stride=2, padding=1)
        self.layer1    = self._make_layer(block, 64, layers[0], shortcut_type)
        self.layer2    = self._make_layer(block, 128, layers[1], shortcut_type, stride=2)
        self.layer3    = self._make_layer(block, 256, layers[2], shortcut_type, stride=2)
        self.layer4    = self._make_layer(block, 512, layers[3], shortcut_type, stride=2)
        #-------------------------------------#
        # math.ceil()方法的含义为向上取整
        # 之后又加了一个int限制,以充分确保该数为整数
        #-------------------------------------#
        last_duration  = int(math.ceil(sample_duration / 16))
        last_size      = int(math.ceil(sample_size / 32))

        self.avgpool   = nn.AvgPool3d((last_duration, last_size, last_size), stride=1)
        self.fc        = nn.Linear(512 * block.expansion, num_classes)

        for m in self.modules():
            if isinstance(m, nn.Conv3d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out') #对于3D卷积所采用的权重初始化方法

            elif isinstance(m, nn.BatchNorm3d):
                m.weight.data.fill_(1)
                m.bias.data.zero_()

    def _make_layer(self, block, planes, blocks, shortcut_type, stride=1):
        downsample = None

        if stride != 1 or self.in_planes != planes * block.expansion:
            if shortcut_type == 'A':
                assert True, 'Not implemented!!!'
            else:
                downsample = nn.Sequential(
                    nn.Conv3d(self.in_planes, planes * block.expansion, kernel_size=1, stride=stride, bias=False),
                    nn.BatchNorm3d(planes * block.expansion),)

        layers = []
        layers.append(block(self.in_planes, planes, stride, downsample))

        self.in_planes = planes * block.expansion

        for i in range(1, blocks):
            layers.append(block(self.in_planes, planes))
        return nn.Sequential(*layers)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

        x = self.avgpool(x)

        x = x.view(x.size(0), -1)
        x = self.fc(x)

        return x

到了这里,关于【CVPR2018 3D ResNet】3D ResNet网络结构详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CVPR 2018 | Spotlight论文:单摄像头数秒构建3D人体模型

    想把自己的身体形象投射进电子游戏里?现在已经是很容易的事了。人工智能算法此前已被广泛应用于虚拟现实头像、监视、服装试穿或电影等多种任务的人体建模上,但大多数方法需要特殊的照相设备来检测景深,或从多个角度探查人体。近日,来自德国布伦瑞克工业大学

    2024年02月06日
    浏览(42)
  • (CVPR 2018) 3D Semantic Segmentation with Submanifold Sparse Convolutional Networks

    卷积网络是分析图像、视频和3D形状等时空数据的事实标准。虽然其中一些数据自然密集(例如照片),但许多其他数据源本质上是稀疏的。示例包括使用LiDAR扫描仪或RGB-D相机获得的3D点云。当应用于此类稀疏数据时,卷积网络的标准“密集”实现非常低效。我们引入了新的

    2023年04月08日
    浏览(50)
  • 【pytorch】ResNet18、ResNet20、ResNet34、ResNet50网络结构与实现

    选取经典的早期Pytorch官方实现代码进行分析 https://github.com/pytorch/vision/blob/9a481d0bec2700763a799ff148fe2e083b575441/torchvision/models/resnet.py 各种ResNet网络是由BasicBlock或者bottleneck构成的,它们是构成深度残差网络的基本模块 ResNet的大部分各种结构是1层conv+4个block+1层fc 需要注意的是最后

    2024年02月02日
    浏览(47)
  • torchvision中的标准ResNet50网络结构

    注:仅用以记录学习 打印出来的网络结构如下: 结构: 修改最后一层(fc层)代码: 用于特定的分类任务,其中最后一层全连接层的输出类别数量被指定为输入参数

    2024年02月04日
    浏览(43)
  • CVPR2022 3D目标检测(GLENet )增强型3D目标检测网络

    图 1:(a) 给定一个不完整 LiDAR 观测的对象,可能存在多个具有不同大小和形状的潜在合理的真实边界框。 (b) 当注释来自 2D 图像和部分点时,标签过程中的模糊和不准确是不可避免的。在给定的情况下,只有后部的汽车类别的类似点云可以用不同长度的不同真实值框进行注释

    2023年04月08日
    浏览(38)
  • 【论文阅读】通过3D和2D网络的交叉示教实现稀疏标注的3D医学图像分割(CVPR2023)

    论文:3D Medical Image Segmentation with Sparse Annotation via Cross-Teaching between 3D and 2D Networks 代码:https://github.com/hengcai-nju/3d2dct 问题1 :医学图像分割通常需要大量且精确标注的数据集。但是获取像素级标注是一项劳动密集型的任务,需要领域专家付出巨大的努力,这使得在实际临床场

    2024年02月05日
    浏览(65)
  • Abaqus CAE 2018插件使用详解:基于周期性边界条件定义3D几何模型的实践指南**

    注:这篇文章是为了帮助读者更好地理解和使用Abaqus CAE 2018的插件来定义周期性边界条件。所提供的信息是基于我个人的理解和实践,如有不准确或者有更好的建议,欢迎读者们指正和交流。 一、 引言 在进行无限或半无限域建模时,周期性边界条件可为我们提供了一种模拟

    2024年02月11日
    浏览(49)
  • YOLOX网络结构详解

    论文名称:YOLOX: Exceeding YOLO Series in 2021 论文下载地址:https://arxiv.org/abs/2107.08430 论文对应源码地址:https://github.com/Megvii-BaseDetection/YOLOX 在bilibili上的视频讲解:https://www.bilibili.com/video/BV1JW4y1k76c 在之前文章中我们已经聊过YOLO v5了,今天我们再来聊聊YOLOX。YOLOX是旷视科技在2

    2024年02月04日
    浏览(41)
  • VGG网络结构详解

    参考论文:Very Deep Convolutional Networks for Large-Scale Image Recognition 论文中提供的6种网络配置: 整个网络有5个vgg-block块和5个maxpool层逐个相连,然后进入FC层,直到最后1000个softmax输出。多种VGG网络设计都很统一,都有相同的224×224×3的input层+5个maxpool层+3层fc全连接层,区别在于中

    2024年02月07日
    浏览(37)
  • PointNet++详解(二):网络结构解析

    如有错误,恳请指出。 在之前对PointNet与PointNet++网络进行了介绍,接下来是对其代码的解析。 1. 论文阅读笔记 | 三维目标检测——PointNet 2. 论文阅读笔记 | 三维目标检测——PointNet++ 参考的github项目为:https://github.com/yanx27/Pointnet_Pointnet2_pytorch 这篇博客的内容主要是将PointN

    2024年02月02日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包