NeRF学习——复现训练中的问题记录

news2024/9/22 5:28:20

代码复现的框架是基于:pengsida 的 Learning NeRF

希望各位可以通过学习 NeRF-Pytorch 的源码来自己复现一下试试看!

文章目录

  • 1 Windows bug
    • 1.1 DataLoader 的多进程 pickle
    • 1.2 imageio 输出图片
    • 1.3 I/O
  • 2 训练问题
    • 2.1 Evaluate 显存爆炸
    • 2.2 尝试一
    • 2.3 尝试二
    • 2.4 尝试三 (最终)
    • 2.5 其余小问题
      • 2.5.1 psnr 不上升
      • 2.5.2 加载再训练

1 Windows bug

源代码框架是基于 Linux 的,我在 Windows 上进行复现有以下的 bug,Windows 上 bug 修复的框架版本:Learning NeRF

1.1 DataLoader 的多进程 pickle

image-20240317200544474

在刚开始执行时就遇到了这个错误,开始以为是环境问题,结果鼓捣半天没用,仔细分析了一下错误原因,发现主要是这句话的原因

for iteration, batch in enumerate(data_loader):

也就是序列化的问题,后面还给出了多进程的报错,就应该是多进程的pickle问题,网上一搜,还真是,可能是Windows系统的原因导致的,在 configs 中的配置文件中修改 num_workers = 0,不使用多进程,就解决了报错(速度应该没啥影响)

1.2 imageio 输出图片

在执行到 evaluate 时,输出图片出了下面的错误:

envs\NeRFlearning\Lib\site-packages\PIL\Image.py", line 3102, in fromarray raise TypeError(msg) from e TypeError: Cannot handle this data type: (1, 1, 3), <f4

这是因为 imageio.imwrite 函数需要接收的图像数据类型为 uint8 ,而原始的 pred_rgbgt_rgb 可能是浮点数类型的数据。因此,我们需要将它们乘以255(将范围从0-1转换为0-255),然后使用 astype 函数将它们转换为 uint8 类型

# 将数据类型转换为 uint8
pred_rgb = (pred_rgb * 255).astype(np.uint8)
gt_rgb = (gt_rgb * 255).astype(np.uint8)
# 需要添加以上两行,否则报错
imageio.imwrite(save_path, img_utils.horizon_concate(gt_rgb, pred_rgb))

这里还有一个问题,我发现在已经生成过一张图片后,再次执行到这里,输出的新图片无法覆盖之前的旧图片,所以我加上了时间和当前周期作为扩展名

now = datetime.datetime.now()
now_str = now.strftime('%Y-%m-%d_%Hh%Mm%Ss')
base_name, ext = os.path.splitext(save_path)
save_path = f"{base_name}_{now_str}_epoch_{cfg.train.epoch}{ext}"

这样就会以这样的 res_2024-03-18_09h09m40s_epoch_10.jpg 格式正确输出每次的图像了

1.3 I/O

此项目是由 Linux 开发的,在Windows系统上,免不了出现各种麻烦。特别是,该项目的所有 I/O 都是 Linux 的 I/O 格式,所以要进行全面修改:

  • 使用 Python 的 os 模块中的 makedirs 函数来替换

    os.system('mkdir -p ' + model_dir)
    # |
    # V
    os.makedirs(model_dir, exist_ok=True)
    
  • shutil 模块中的 rmtree 函数来替换

    os.system('rm -rf {}'.format(model_dir))
    # |
    # V
    import shutil
    if os.path.exists(model_dir):
    	shutil.rmtree(model_dir)
    
  • Python 的 os 模块中的remove函数来替换

    os.system('rm {}'.format(os.path.join(model_dir, '{}.pth'.format(min(pths)))))
    # |
    # V
    os.remove(os.path.join(model_dir, '{}.pth'.format(min(pths))))
    
  • 使用 exit(0) 来结束当前进程

    os.system('kill -9 {}'.format(os.getpid()))
    # |
    # V
    exit(0)
    

2 训练问题

训练从尝试一开始,记录了一步一步修改改进,到尝试三就基本完成复现!

2.1 Evaluate 显存爆炸

在运行 evaluate 模块时,我用模型对一张图片进行推理,发现显存爆炸增长,经过一番寻找之后,找到了问题:

  • 在运行 run.py 的 evaluate 模块时,evaluator.evaluate(output, batch)这句话没有在 torch.no_grad() 中导致的。修改只需要加一个缩进即可

更新:重构了evaluate的代码,之前是我理解出现了问题,在evaluate中再一次进行了模型推理,现在不用了,代码恢复为以前的

2.2 尝试一

训练中:在 Dateset 的 __getitem__ 函数中进行 shuffle,导致每次迭代都会 shuffle 整个数据一次,耗费大量时间

  • 在经过10000次迭代(20个epoch)后:

    • psnr 整体是呈现一个上升的趋势,在10000次迭代后在24左右

      image-20240430195650221
    • loss 从一开始整体下降,之后就一直在0.1225左右徘徊(感觉出现问题)没有明显的下降趋势

      image-20240430195519373
  • 分别在5000次和10000次迭代的时候 evaluate 了两次:

    • 第一次:loss = 0.1201,psnr = 22.94,mse = 0.005223
    • 第二次:loss = 0.1191,psnr = 23.8,mse = 0.004276

    推理得到的图像如下:

其实在训练时获取光线时本来就是打乱了的,传入 __getitem__index 就是随机的,但是发现在移除所有光线的 shuffle 后,训练出现问题(一直 psnr = infloss = 0),具体原因还未知、

2.3 尝试二

现在我将 shuffle 放到了 __init__ 中去,只在创建数据集时进行一次 shuffle,训练正常进行,时间相比以前有了提升!

但出过拟合问题!

  • 在2500次迭代(5个epoch)后:

    • loss 持续下降到 0.000292,停止后再次开始训练时断崖上升

      image-20240430203600663
    • psnr 持续上升到40,停止后再次开始训练时断崖下降

      image-20240430203714312
  • 使用 run.py 的 evaluate 模块进行测试:

    输出的图像与指标不符,loss = 0.055psnr = 15.4939mse = 0.0282;具体生成图像也是比较糟糕,只能看到大致雏形

    image-20240430212522124

问题:

发现了问题出现在数据集的 __getitem__ 上,每次传入的 index 是随机图片索引,只有只有 1~200,只能得到前面的 1~200*1024 的数据太狭隘了,导致了过拟合。

目前解决方案在 index 的基础上乘上图像的宽高:

index = index * self.H * self.W

2.4 尝试三 (最终)

经过上述的修改,并且参考 nerf-pytorch 的代码在每隔一段时间(我现在暂时设定self.N_rays * cfg.ep_iter 次,即 1024*500)就会重新打乱一遍所有的32000000条光线

我将代码放到了阿里云的服务器上进行训练,经过10.48小时的训练,总共迭代了71,000次(142个epoch)

  • 训练:

    • loss 持续下降,目前在0.003左右波动

      image-20240501085109274
    • psnr 持续上升,目前在32左右波动

      image-20240501085258470
  • evaluate:我设定了每隔2500次迭代(5个epoch)就进行一次 evaluate,每次为了节省时间只用10张图片进行测试

    loss 持续下降到0.006mse 持续下降到0.0018psnr 持续上升到27.6134

    image-20240501085755386

    得到的图片:

    009

    训练完后对整体(200张图片)进行了一次 evaluate:得到 psnr = 28.4860

  • 与尝试一进行对比:在10000次迭代左右,时间大大减少,且loss、psnr都更加优秀

    image-20240501090741066

2.5 其余小问题

2.5.1 psnr 不上升

有时开始训练时的psnr从9左右开始就会导致 psnr 不上升一直徘徊在9左右,loss 正常下降,重新开始训练就有可能回归正常!

image-20240430212144837

尝试了5000次的迭代(10个epoch),测试出来图片如下:

lQLPKHHImplXjiHNAlTNBKqwQyL9R_cVfYgGGp3Cg3rNAA_1194_596

目前原因可能是初始化导致的😭(小问题,重新开始训练就行)

2.5.2 加载再训练

当我将保存的模型加载接着训练的时候,我发现了 loss 相较于之前突然变大了再缓慢下降,psnr 也是相似的,一开始相较之前的要小再缓慢上升

应该是存储和读取模型时的问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1974135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于VScode和C++实现Protobuf数据格式的通信

目录 1. Protobuf 概述1.1 定义1.2Protobuf的优势 2. Protobuf 语法3、序列号和反序列化3.1 .pb.h 头文件3.2 序列化3.3 反序列化 4、测试用例 Protobuf详细讲解链接 1. Protobuf 概述 1.1 定义 protobuf也叫protocol buffer是google 的一种数据交换的格式&#xff0c;它独立…

递归题解集

目录 递归&#xff1a; 一、汉诺塔问题 1.题目链接&#xff1a;面试题 08.06. 汉诺塔问题 2.题目描述&#xff1a; 3.解法&#xff1a;&#xff08;递归&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法流程&#xff1a; &#x1f335;算法代码&…

掌握SEO站外推广优化的五大绝招

对于网站运营者和数字营销人员来说&#xff0c;SEO站外推广是提升网站流量和排名的重要手段。以下是五个有效的SEO站外推广优化方法&#xff0c;希望对大家有所帮助。 1. 高质量的外链建设 高质量的外部链接&#xff08;Backlinks&#xff09;是搜索引擎排名的重要因素之一。…

Openboxes开发环境配置及本地化、API测试

目录 Openboxes简介 开发环境配置及启动 更新中文多语言配置 API测试 Openboxes简介 Openboxes是一款开源的仓库管理软件&#xff0c;提供了库存管理、采购管理、销售管理等功能&#xff0c;可以帮助用户高效地管理仓库及库存。并提供了丰富的API接口。系统基于java8 和Gr…

关于微信,qq小程序的登录,数据库-前端-接口解析

一、背景 当我们在对接微信平台&#xff0c;开发微信小程序时&#xff0c;用户标识是必不可少的。用户标识贯通了整个开发过程&#xff0c;所以获取到唯一的用户标识是必须的。 二、多平台兼容 因为考虑到一次开发&#xff0c;可多端运行&#xff0c;需要考虑兼容多平台兼…

SAP 财务管理系统 —— 企业财务智能化的领航者

在当今数字化时代&#xff0c;企业财务管理的智能化已成为推动企业持续增长的关键因素。SAP 财务管理系统通过智能化技术&#xff0c;帮助财务部门提高收入、控制成本并降低财务风险&#xff0c;释放财务数字化转型的价值。财务 ERP 作为 SAP 的核心组成部分&#xff0c;将帮助…

【机器学习】成本函数在逻辑回归中的形式以及逻辑回归的成本函数

引言 在机器学习中&#xff0c;逻辑回归是一种用于二分类问题的线性回归的扩展。逻辑回归的成本函数是用来评估模型预测结果与实际结果之间差异的函数 文章目录 引言一、成本函数在逻辑回归中的形式1.1 成本函数的具体形式1.1.1 对于单个训练样本 二、逻辑回归的成本函数实现2.…

股指期货的期现套利及其作用是什么?

股指期货市场提供了一种独特的投资机会&#xff0c;即通过期现套利策略来捕捉无风险利润。这种策略基于股指期货与对应的现货指数之间的价格差异。当这种差异超出正常范围时&#xff0c;投资者可以利用套利操作来实现稳定收益。 期现套利的核心在于同时买入现货指数的代表性投…

STM32DMA数据传输

我估计大多数人学这么久连听说都没听说过DMA&#xff0c;更不用提知道它是干嘛的。其实DMA的本质就是一个数据的搬运工。平常的时候当我们没有配置的时候&#xff0c;一直都是CPU在搬运数据&#xff0c;但是这个活又累又没有技术含量&#xff0c;所以DMA的重要性还是有的。 目…

centos8.5.2111切换阿里云镜像

备份 mv /etc/yum.repos.d/CentOS-Linux-BaseOS.repo /etc/yum.repos.d/CentOS-Linux-BaseOS.repo.backup下载最新的源 wget -O /etc/yum.repos.d/CentOS-Linux-BaseOS.repo http://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo更改第二个配置文件 cd /etc/yum.repo…

自定义CustomRatingBar控件

通过自定义RatingBar的样式实现⭐️⭐️⭐️指示器的方式功能过于受限&#xff0c;而且显示的样式阴影会受到影响。 系统自带显示&#xff1a; 自定义样式&#xff1a; 因此简单自一个符合要求的 CustomRatingBar 支持设置星星数量支持设置星星Rating(float)支持设置空显示…

计算机毕业设计选题推荐-健康饮食系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【优秀python 数据分析案例】基于python的穷游网酒店数据采集与可视化分析的设计与实现

1 需求分析 1.1 用户需求 1.1.1 背景与现状 穷游网是国内知名的旅游社区&#xff0c;在其网站上&#xff0c;用户可以自由分享旅行经验和攻略&#xff0c;也可以浏览其他用户的经验和攻略&#xff0c;以便更好地规划自己的旅行。而酒店信息是旅行攻略中不可或缺的一部分&#…

正点原子imx6ull-mini-Linux驱动之设备树下的 platform 驱动编写(15)

上一章我们详细的讲解了 Linux 下的驱动分离与分层&#xff0c;以及总线、设备和驱动这样的驱动 框架。基于总线、设备和驱动这样的驱动框架&#xff0c;Linux 内核提出来 platform 这个虚拟总线&#xff0c;相应 的也有 platform 设备和 platform 驱动。上一章我们讲解了传统的…

vue2学习 -- 脚手架

文章目录 1. 使用2. render函数3. vue.config.js配置文件4. ref属性5. props配置6. mixin7. 插件8. scoped 1. 使用 脚手架文档 安装脚手架 npm install -g vue/cli 选择工作目录&#xff0c;创建项目 vue create name 2. render函数 关于不同版本的Vue.js vue.js与vue.run…

在 VueJS 项目中实现多个可拖拽的弹出框(多个可拖拽el-dialog弹出框,共用同一函数)

前言 在项目开发中&#xff0c;弹出框&#xff08;Dialog&#xff09;是常见的UI组件。默认情况下&#xff0c;弹出框的位置是固定的&#xff0c;但在某些场景下&#xff0c;我们希望用户可以自由拖动弹出框的位置&#xff0c;以提升用户体验。之前单个视频拖拽弹框&#xff0…

Spring Boot 参数校验 Validation 使用

概述 当我们想提供可靠的 API 接口&#xff0c;对参数的校验&#xff0c;以保证最终数据入库的正确性&#xff0c;是必不可少的活。前、后端校验都是保证参数的准确性的手段之一&#xff0c;前端校验并不安全&#xff0c;任何人都可以通过接口来调用我们的服务&#xff0c;就算…

springboot电影购票系统-计算机毕业设计源码85384

目录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1系统开发流程 2.2.2 用户登录流程 2.2.3 系统操作流程 2.2.4 添加信息流程 2.2.5 修改信息流程 2.2.6 删除信息流程 2.3 系统功能…

ComfyUI插件:ComfyUI layer style 节点(三)

前言&#xff1a; 学习ComfyUI是一场持久战&#xff0c;而ComfyUI layer style 是一组专为图片设计制作且集成了Photoshop功能的强大节点。该节点几乎将PhotoShop的全部功能迁移到ComfyUI&#xff0c;诸如提供仿照Adobe Photoshop的图层样式、提供调整颜色功能&#xff08;亮度…

哪里可以找到数据恢复软件?5 款顶级数据恢复软件分享

在当今的数字时代&#xff0c;我们的数据既是我们最宝贵的资产&#xff0c;也是我们最大的弱点。由于硬件故障、意外删除或软件问题&#xff0c;丢失重要文档、珍贵照片或对职业至关重要的项目的风险始终存在。值得庆幸的是&#xff0c;强大的数据恢复软件可以帮助找回最初看似…