新闻中心

【论文复现赛】ResNet18_3D

2025-07-24
浏览次数:
返回列表
本文复现了3D ResNet-18在UCF-101数据集的表现,旨在验证视频数据集训练深3D卷积网络的可行性。基于PaddleVideo,修改2D ResNet-18得到3D网络,不使用预训练权重,经数据处理、训练等步骤,最终在UCF-101验证集准确率达43.98%,超目标值42.4%,印证相关结论。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

【论文复现赛】resnet18_3d -

【论文复现赛】Can Spatiotemporal 3D CNNs Retrace the History of 2D CNNs and ImageNet?

本文的目标是检验当前的视频数据集是否有充足的数据来训练非常深的3D卷积神经网络(原文:The purpose of this study is to determine whether current video datasets h*e sufficient data for training very deep convolutional neural networks with spatio-temporal three-dimensional kernels),作者在当前的数据集上使用不同深度的网络进行了实验,得到以下几个结论:
1、ResNet-18在UCF-101,HMDB-51,ActivityNet数据集上过拟合,Kinetics数据集未过拟合;
2、Kinetics数据集有充分的数据训练深的3D卷积网络;
3、网络加载在Kinetics数据集预训练的权重,在其他数据集(UCF-101/HMDB-51)上也可以得到不错的效果。
本次复现的目标是不使用预训练权重,在UCF-101数据集准确率达到42.4%,本次复现的准确率为43.98%,本次复现基于PaddleVideo。
代码参考:
1、https://github.com/kenshohara/3D-ResNets-PyTorch/tree/CVPR2018
2、【从零开始学视觉Transformer】
本项目地址:https://github.com/justld/3D-ResNets_paddle

一、 网络结构

【论文复现赛】ResNet18_3D -
上图未本文实验使用的不同网络结构,红框部分为本次复现的网络结构(ResNet18_3D),ResNet18结构非常简单,而且巧合的是在本次论文复现赛期间官方推出了【从零开始学视觉Transformer】课程,第一节课朱老师就带着大家写了一个ResNet18(2D CNN),只需要对该模型稍加修改即可得到ResNet18_3D,非常感谢朱老师的激情讲解。

二、实验结果

【论文复现赛】ResNet18_3D -
上表为各个模型在UCF-101和HMDB-51数据集上的准确率,Scratch表示未加载Kinetics权重从头训练,未标明Scratch表示使用Kinetics数据集预训练权重。可以看出,使用Kinetics数据集预训练权重可以显著提高准确率,缓解UCF-101和HMDB-51数据集数据不充分的问题。

三、核心代码

class ConvBNRelu(nn.Layer):
    def __init__(self, in_channels, out_channels, kernel_size, **kwargs):        super().__init__()        self.conv = nn.Conv3D(in_channels, out_channels, kernel_size=kernel_size, **kwargs)        self.bn = nn.BatchNorm3D(out_channels)        self.relu = nn.ReLU()    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.relu(x)        return xclass Block(nn.Layer):
    def __init__(self, in_channels, out_channels, stride=1):        super().__init__()        self.block = nn.Sequential(
            ConvBNRelu(in_channels, out_channels, 3, stride=stride, padding='same'),
            nn.Conv3D(out_channels, out_channels, 3, stride=1, padding='same'),
            nn.BatchNorm3D(out_channels),
        )        if in_channels != out_channels or stride != 2:            self.downsample = nn.Sequential(
                nn.Conv3D(in_channels, out_channels, kernel_size=1, stride=stride),
                nn.BatchNorm3D(out_channels),
            )        else:
            self.downsample = Identity()        self.relu = nn.ReLU()    
    def forward(self, x):
        res = self.downsample(x)
        x = self.block(x)
        x = self.relu(x + res)        return xclass Identity(nn.Layer):
    def __init__(self):        super().__init__()    
    def forward(self, x):        return x@BACKBONES.register()class ResNet18(nn.Layer):
    def __init__(self, in_channels=3, num_seg=8):        super(ResNet18, self).__init__()        self.num_seg = num_seg        self.stem = nn.Sequential(
            ConvBNRelu(in_channels, 64, kernel_size=7, stride=(1, 2, 2), padding=(3, 3, 3), bias_attr=False),
            nn.MaxPool3D(kernel_size=(3, 3, 3), stride=2, padding=1),
        )        self.layer1 = self._make_layer(64, 64, 2, 1)        self.layer2 = self._make_layer(64, 128, 2, 2)        self.layer3 = self._make_layer(128, 256, 2, 2)        self.layer4 = self._make_layer(256, 512, 2, 2)        self.pool = nn.AdaptiveAvgPool3D(1)    def _make_layer(self, in_channels, out_channels, n_blocks, stride=1):
        layer_list = []
        layer_list.append(Block(in_channels, out_channels, stride))        for i in range(1, n_blocks):
            layer_list.append(Block(out_channels, out_channels))        return nn.Sequential(*layer_list)    def forward(self, x):
        nt, c, h, w = x.shape
        x = x.reshape([-1, self.num_seg, c, h, w]).transpose([0, 2, 1, 3, 4]) # N, C, T, H, W
        x = self.stem(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x) # N, C, T, H, W
        x = self.pool(x).reshape([paddle.shape(x)[0], -1]) # N, C
        return x

       

I-Shop购物系统 I-Shop购物系统

部分功能简介:商品收藏夹功能热门商品最新商品分级价格功能自选风格打印结算页面内部短信箱商品评论增加上一商品,下一商品功能增强商家提示功能友情链接用户在线统计用户来访统计用户来访信息用户积分功能广告设置用户组分类邮件系统后台实现更新用户数据系统图片设置模板管理CSS风格管理申诉内容过滤功能用户注册过滤特征字符IP库管理及来访限制及管理压缩,恢复,备份数据库功能上传文件管理商品类别管理商品添加/修改/

I-Shop购物系统 0 查看详情 I-Shop购物系统

上述代码根据【从零开始学视觉Transformer】实战作业ResNet18修改而成,没上课的同学快去看看吧。

四、在线体验

实现ResNet18_3D在UCF-101训练、验证、预测,只需要以下几步:
1、解压数据集
2、处理数据,从视频数据集提取帧,可参考PaddleVideo处理UCF-101数据集的方法
3、安装依赖包
4、训练
5、验证精度
6、模型导出
7、模型预测

In [ ]
# step 1: 解压数据集%cd ~/data/data105621/
!unzip -oq UCF101.zip%cd ~/
    In [ ]
# step 2: 下载标注文件,生成list, 这里需要的时间比较长(约半小时),请耐心等待%cd ~/PaddleVideo/data/ucf101/
%cp -r /home/aistudio/data/data105621/UCF-101 ~/PaddleVideo/data/ucf101/videos# !bash download_annotations.sh # 此版本已经提供了标注信息,下载有时候网络不给力!python extract_rawframes.py ./videos/ ./rawframes/ --level 2 --ext *i
!python build_ucf101_file_list.py rawframes/ --level 2 --format rawframes --out_list_path ./
    In [ ]
# step 3: pip install requirements%cd ~/PaddleVideo/
!pip install -r requirements.txt
    In [ ]
# step 4: training%cd /home/aistudio/PaddleVideo/
!python3 main.py -c configs/recognition/resnet18_3d/resnet18_3d_ucf101_frames.yaml --validate --seed=10001
    In [ ]
# step 5: test%cd /home/aistudio/PaddleVideo/
!python3 main.py -c configs/recognition/resnet18_3d/resnet18_3d_ucf101_frames.yaml --test -w output/Res18/Res18_best.pdparams
    In [ ]
# step 6: export model!python3.7 tools/export_model.py -c configs/recognition/resnet18_3d/resnet18_3d_ucf101_frames.yaml -p output/Res18/Res18_best.pdparams -o inference/Res18_3D
    In [ ]
# step 7: predict,用数据集中的一个数据预测一下,该视频类别为:0%cd /home/aistudio/PaddleVideo/
!python3.7 tools/predict.py --config configs/recognition/resnet18_3d/resnet18_3d_ucf101_frames.yaml --input_file /home/aistudio/data/data105621/UCF-101/ApplyEyeMakeup/v_ApplyEyeMakeup_g08_c01.*i --model_file inference/Res18_3D/Res18.pdmodel --params_file inference/Res18_3D/Res18.pdiparams --use_gpu=True --use_tensorrt=False
   

五、复现结果

本次复现的目标是UCF-101验证集acc 42.4%,复现的为acc 43.98%。
环境:
Tesla V100 * 1
PaddlePaddle==2.2.0

model dataset acc
ResNet18_3D UCF-101 43.98%

以上就是【论文复现赛】ResNet18_3D的详细内容,更多请关注其它相关文章!


# git  # seo bt  # 连云港模板网站建设  # 淄博优秀seo报价  # 青岛线上营销如何做推广  # 只需  # 带着  # 几个  # 加载  # 的是  # 官网  # 从零开始  # 购物系统  # 一言  # 中文网  # fig  # udio  # igs  # red  # ai  # python  # 南阳网站推广招商代理  # 华侨城营销推广计划  # 淘宝seo长尾词  # seo是什么职Seoseo  # 邢台网站自然优化  # 合肥seo结构优化 


相关栏目: 【 行业资讯67740 】 【 技术百科0 】 【 网络运营39195


相关推荐: 苹果的type-c接口是什么  固态硬盘如何查看盘符  awful是什么意思  计数器上power是什么意思  为什么youtube音乐打不开  单片机显存怎么设置最佳  春运抢票还用取票吗  固态硬盘如何迁移系统  sofa是什么意思  爱奇艺会员qq登录可以几个人用?  为什么夸克流畅播失败  老电脑如何装固态硬盘  ssd固态硬盘如何安装  通配符的用法  在遥控器中power是什么意思  三星固态硬盘如何安装  iphone拍电子屏有横条如何解决  固态硬盘如何安装win10系统安装  建伍遥控器power是什么意思  苹果16更新了哪些功能  域名批量查询工具有哪些  基金市盈率是什么意思  如何加装固态硬盘  typescript多久能学完  win10windows资源管理器在哪里打开  nfc功能是什么意思怎么开启  如何查看电脑的固态硬盘  typescript中文怎么读  市盈率3.2是什么意思  typescript干什么的  分享一个稳定的ao3镜像网址  苹果16系统有哪些系列  ts什么意思  折叠屏手机为什么这么小  折叠屏手机为什么凉凉  gs是什么意思  春运辅助抢票怎么抢  如何在命令提示符播放音频  焊机上power灯闪是什么意思  typescript有哪些版本  如何以管理员身份打开命令提示符  360桌面壁纸怎么弄掉  固态硬盘4k如何看  怎么把手机里爱奇艺的视频下载到u盘里  如何查看固态硬盘速度  typescript要用什么工具  手机拍显示屏有条纹怎么去除  typescript变量是什么  为什么有的夸克带电  怎么在爱奇艺中投屏到电视最新方法 

搜索