Rust C++小记录
Rust/C++
很久之前(3个月前吧)写的文档了,当时还在学Rust以及零零散散地学一些C++STL库用法(哪知《effective modern C++》这般好书?)。Rust部分的记录还挺有趣的,C++部分就没有那么有趣了。索性就贴在此处,供日后查阅。(不过很长啊,这叫snippet?)
很久之前(3个月前吧)写的文档了,当时还在学Rust以及零零散散地学一些C++STL库用法(哪知《effective modern C++》这般好书?)。Rust部分的记录还挺有趣的,C++部分就没有那么有趣了。索性就贴在此处,供日后查阅。(不过很长啊,这叫snippet?)
科研恢复性训练。之前把CUDA加速的全并行shadow caster写完了,算是复习了CUDA、Rust以及FFI的使用。深度学习方面就以复现Ref NeRF为一个小任务。论文CVPR 2022 Best Student Honorable Mention: Ref NeRF - Structured View-Dependent Appearance for Neural Radiance Fields对反射现象进行了良好的建模。之前我一直在研究折射现象的NeRF建模,就折射建模思路而言,此文对我有很大的启发。并且个人认为,基于Ref NeRF以及mip NeRF作为框架是比较好的选择(除此之外就是要考虑如何让训练变快了,Instant NGP当然是不二选择)。当然,由于在复现过程中也遇到了许多问题,本文在阐述复现思路以及论文理解的同时,也会探讨踩过的坑。目前,Ref NeRF的复现结果还没有达到令我满意的程度,只是具备雏形,毕竟融合两篇文章的idea可能导致冲突,深度学习这种玄学就更是这样了,模型炸了都不知道从哪一个先开始。复现见 Enigmatisms/NeRF
(未完成,请勿点击)Rust FFI(foriegn function interface)非常有吸引力,特别是当你用熟了nannou库之后(啊,nannou,比OpenCV香了不知道多少倍,OpenGL-base库牛逼!)。CUDA编程也属于很有吸引力的活动(谁会讨厌优化代码,在已经比多线程CPU快n倍的基础上看着它跑得越来越快呢)。两者放在一起只能说是让人觉得万事皆空。本文记录了在以下两个项目:
中,使用CUDA/Rust混合编程所遇到的/产生的:(1)语言方面的坑。(2)CUDA程序设计上的一些坑。(3)一些算法设计思路。
(未完成,请勿点击)。最近读了非常多关于NeRF的论文,毕竟这玩意从ECCV 2020被提出来之后就爆火了,变体层出不穷,基本上我能想到的卷法,都有人卷过了。低垂的果实总是被有能力又有准备的人先摘走,留下来的都是一些需要费大力气才能摘到的果实。论文不仅需要读,好的论文一定要复现,才能深入了解其精髓,西安交大人工智能学院的刘龙军副教授曾经在组会上说到:读论文不复现等于白读!大家都深以为然:>。而其中最有复现价值(并且难度没那么高的,不像Instant NGP,official repo代码都看不懂)的当属:
其中Mip NeRF 360中的proposal network已经成为目前个人所实现的NeRF框架的基础。本文是复现过程中的一些心得以及对其他所读的NeRF论文的总结。
变量的lifetime之前的部分,理解起来都比较简单。而一到lifetime出场,一群妖魔鬼怪也就跟着出场了。不过其实是因为之前的两天学习中,对于变量的引用,所有权的租借理解不够到位。本文仍然是在跟着Rust官方(的非官方,它自己写的)教程学习过程中,整活扩展的一些记录。
Rust,好!可能主要由于所有权机制上的创新,学习时的感觉与学其他语言的感觉完全不同,于是没有像学JS一样,觉得无聊,也没有像觉像学haskell一样,觉得过于抽象。但是这样一种语言创新,必然会给学习带来障碍,毕竟编程思想是完全不同的。此外,可能我使用Rust的工具链不对,个人认为vscode对于Rust的支持明显不足(缺乏自动补全,没有函数快速查看以及定义跳转等等),第一天学的时候,只能实现一些强逻辑性算法(比如什么快排,归并排序等等),无法深入使用数据结构(给我一个数据结构我根本不知道里面有什么方法)。
第一天快结束时,想学习一下Rust的可视化工具Plotters,结果发现,之前从菜鸟教程了解的写法过于粗浅,基本看不懂Plotters代码,遂投身更加深入的学习。但却发现,给自己设置的小目标 --- 写一个链表,按照之前了解的语法知识,我都是写不出来的。快要放弃只是接触到了一个教程以及其官方文档:
教程详细介绍了对于链表的实现,较为通俗易懂,有些难以思考的问题,其实沉下心来想也很快能想出来。本文是跟着教程实现过程中,笔者对于遇到的一些问题的处理方法以及自己的心得。由于笔者非常不喜欢依葫芦画瓢(因为这样,感觉自己完全学不到东西),所以笔者也在自己的实现中整活(超前学习),本文也记录了整活过程中遇到的坑及处理方法。本篇为Rust学习心得的第一章。
毕设工作设计到与cartographer进行定量实验比较。本人在Enigmatisms/cartographer_tester中整理了cartographer以及ros驱动代码,添加了自动化轨迹读取等功能,两周前在Ubuntu 18.04上已经完成了测试,但在Ubuntu 20.04上一直编译不通过,调了一下午才调出来。本文记录了cartographer在不同版本的Ubuntu上(尤其是20.04)的一些典型编译问题以及解决方案。笔者现已经通过文中所说的解决方案完成了cartographer的编译。
最近工程浓度太高,关于【如何设计】以及【为什么】的思考显著少于【如何实现】以及【怎么解决】。为了平衡科研与工程,我复现了最近读的一篇多视角重建论文(见上一篇博客 Neural Randiance Field【1】):
NeRF这篇论文,读的时候觉得作者写得还是非常清晰,只要搞清楚了基本概念,流畅地读下来基本上没什么问题。但实现过程中,发现到处都是坑(坑主要来源于个人没有清晰的设计思路,不同模块间的输入输出连续性不强,导致接口经常改动,此外... 有些问题确实也挺坑的)。有别于NeRF的官方tensorflow实现,本论文复现使用Pytorch + CUDA,主要代码中约有50% CUDA,50%python。本论文主要记录复现思路,以及复现过程中遇到的主要问题。复现见Github repo: Enigmatisms/NeRF
深度学习的大环境下,视图合成(view synthesis)必然不会缺席(毕竟没什么数学能力也能搞,是吧)。NeRF作为其中比较杰出的工作之一,文章后续也受到很多关注,包括但不限于【NeRF++,NeRF--,Point NeRF】。本文是一篇关于NeRF及其++版本的论文理解,后续将在[Neural Radiance Field【2】]中介绍Point NeRF以及NeRF的复现: