首页 游戏 软件 资讯 排行榜 专题
首页
AI
【论文复现赛】ResNet18_3D

【论文复现赛】ResNet18_3D

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

【论文复现赛】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 have 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
登录后复制

       

上述代码根据【从零开始学视觉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 avi!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.avi --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

来源:https://www.php.cn/faq/1425677.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Pywinrm,一个 Python 管理利器!
科技数码
Pywinrm,一个 Python 管理利器!

Pywinrm 通过Windows远程管理(WinRM)协议,让Python能够像操作本地一样执行远程Windows命令,真正打通了跨平台管理的最后一公里。 在混合IT环境中,Linux机器管理Wi

热心网友
04.07
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?
科技数码
全网炸了!5亿人用的Axios竟被投毒,你的密钥还保得住吗?

早些时候,聊过 Python 领域那场惊心动魄的供应链攻击。当时我就感叹,虽然我们 JavaScript 开发者对这类套路烂熟于心,但亲眼目睹这种规模的“投毒”还是头一次。 早些时候,聊过 Pyth

热心网友
04.07
Toga,一个超精简的 Python 项目!
科技数码
Toga,一个超精简的 Python 项目!

Toga 是 BeeWare 家族的核心成员,号称“写一次,跑遍所有平台”,而且用的是系统原生控件,不是那种一看就是网页套壳的界面 。 写了这么多年 Python,你是不是也想过:要是能一套代码跑

热心网友
04.07
Python 异常处理:别再用裸奔的 try 了
科技数码
Python 异常处理:别再用裸奔的 try 了

异常处理的核心:让错误在正确的地方被有效处理。正确的地方,就是别在底层就把异常吞了,也别在顶层还抛裸奔的 Exception。 异常处理写得好,半夜不用起来改 bug。1 你是不是也这么干过?tr

热心网友
04.07
OpenClaw如何自定义SKILL
AI
OpenClaw如何自定义SKILL

1 Skills机制概述 提起OpenClaw的Skills机制,不少人可能会把它想象成传统意义上的可执行插件。其实,它的内涵要更精妙一些。 简单说,Skills本质上是一套基于提示驱动的能力扩展机制。它并不是一个可以独立“跑”起来的程序模块,而是通过一份结构化描述文件(核心就是那个SKILL m

热心网友
04.07

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查
web3.0
美国SEC主席Paul Atkins证实:加密货币安全港提案已送交白宫审查

加密货币行业翘首以盼的监管里程碑,终于有了实质性进展。美国证券交易委员会(SEC)主席保罗·阿特金斯(Paul Atkins)近日证实,那份允许加密项目在早期获得注册豁免权的“安全港”框架提案,已经正式送抵白宫,进入了最终审查阶段。 在范德堡大学与区块链协会联合举办的数字资产峰会上,阿特金斯透露了这

热心网友
04.08
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币
web3.0
微策略Strategy报告:第一季录得144.6亿美元浮亏 再斥资约3.3亿美元买进4871枚比特币

微策略Strategy报告:第一季录得144 6亿美元浮亏 再斥资约3 3亿美元买进4871枚比特币 市场震荡的威力有多大?看看Strategy的最新季报就明白了。根据其最新向美国证管会(SEC)提交的8-K报告,受市场剧烈波动影响,这家公司所持的比特币在第一季度录得了一笔惊人的数字——144 6亿

热心网友
04.08
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch
web3.0
稳定币发行商Tether再扩Web3版图!Paolo Ardoino:正开发去中心化搜索引擎Hypersearch

稳定币巨头Tether的动向,向来是加密世界的风向标。这不,它向Web3基础设施的版图扩张,又迈出了关键一步。公司执行长Paolo Ardoino在社交平台X上透露,其工程团队正在全力“烹制”一个新项目——去中心化搜索引擎 “Hypersearch”。这个消息一出,立刻引发了行业的广泛猜想。 采用D

热心网友
04.08
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线
web3.0
Base链首个原生DeFi借贷协议Seamless Protocol倒闭 将于2026年6月30日下线

基地位于Coinbase旗下以太坊Layer2网络Base的Seamless Protocol,日前正式宣告了服务的终结。这个曾经吸引了超过20万用户的原生DeFi借贷协议,在运营不到三年后,终究没能跑赢时间。它主打的核心产品是Integrated Leverage Markets(ILMs)——一

热心网友
04.08
PAAL代币如何参与治理?社区投票能决定哪些事项?
web3.0
PAAL代币如何参与治理?社区投票能决定哪些事项?

PAAL代币揭秘:深度解析Web3社区治理的核心钥匙 在去中心化自治组织的浪潮中,谁真正掌握了项目的话语权?PAAL代币提供了一套系统化的答案。它不仅是生态内流转的价值媒介,更是开启链上治理大门的核心凭证。通过持有并质押PAAL代币,用户能够对协议升级、资金分配乃至战略方向等关键事务投出决定性的一票

热心网友
04.08