Hi there, this is NCJ! 👋

Welcome to my blog!

[Topped] About Me

Hi, this is NCJ! Welcome to my blog! Please refer to my homepage (https://www.ncj.wiki) for more information about me.

August 17, 2020 · 1 min · 19 words · NCJ

我用 AI 画了个新 Logo

最近扩散模型加持的 AI Art 有点🔥,周末想着也玩一玩,又受到 OctoSQL 作者的启发,决定体验一下这玩意的同时顺手翻新一下已经用了六年的头像。有一说一最近看到的不少 AI Art 的作品还是很惊艳我的。 不觉得这很酷吗?作为一名理工男我觉得这太酷了,很符合我对未来生活的想象,科技并带着趣味 我选用的模型是 Stable Diffusion,原因非常简单——这玩意真·开源,你可以在本地真正的运行它而不是调云端的 API,同时它生成效果不错且相对来说占用资源还是比较少的。本来一开始想用官方的 codebase,但后来发现 huggingface 出了一个 Diffusers,而且还提供了 fp16 版本的权重,果断换用抱抱脸🤗的产品。然后就开始了玄学的人工 prompt engineering。 改造老 Logo 首先第一想法是能不能用这玩意改造一下现在的 logo。于是找出老 logo,加上一段简单的 prompt,得到了第一个能看的结果: A silver specular logo saying ‘NCJ’, unreal engine, bright color 效果还行,但感觉还缺一点点细节,多加一点元素进 prompt 试试: a huge transparent glass dome, a logo saying text ‘NCJ’, unreal engine, Artstation, PCB electronic design, Massive scale, Fog, Highly detailed, Cinematic, Colorful 感觉有点味道了,于是我悄悄把这个头像换上了,但半天内都没人发现我换头像了! 一气之下,我决定从头弄一个新的(X 白底黑字的原始图片 Stable Diffusion 和 DALL·E 2 这类 work 的一个缺陷在于他们不能很好的把完整的单词/字母弄到生成的图片上,因此对于 logo 而言还是很有必要把要展示的文字/形象在一开始就放好。...

September 4, 2022 · 2 min · 281 words · NCJ

绕过 macOS 上的 GPG passphrase 要求

今天在 MacBook 上配置 gpg 的时候,总是要求我设置 passphrase,但我懒,网上查到说可以创建之后再用 passwd 删除,但试了试不行,修改密码的时候不允许新密码为空。 然后发现 quick-gen-key 可以先生成一个没有 passphrase 的密钥,然后再编辑它绑定邮箱和备注啥的。 gpg --batch --passphrase '' --quick-gen-key USER_ID default default 印象中一年前配置黑苹果的时候就遇到了一次,忘了当时咋处理的了,这次还是简单记一下好了。

July 30, 2022 · 1 min · 22 words · NCJ

小米手环复制 ZJU 校园卡简记

两年前在某宝上买了一个 PN532 模块,然后踩了一堆坑复制了本科的校园卡到小米手环 4 NFC上,最近要读研了要换卡,又把坑踩了一遍,遂简记一下避免再次踩坑 (虽然我大概后面再也用不到了(雾 一句话概括 代理卡片不要写完整的扇区 0,要把加密删了,后面扇区 0 的加密是可以改回来的 ZJU 校园卡的特性 0 - 5 扇区会被加密,即第一个扇区也会被加密,这一特性导致网上的方案不可行 小米手环复制门卡的特性 要求门卡非加密,任何一个扇区加密都不行 只能有第一个扇区有内容,即扇区 0 仅复制扇区 0 中的卡号,且强制将厂家信息写为小米自己的(至少手环 4 是这样的) 但是,第一个扇区的其他内容(含加密信息),以及其他扇区的信息都可以在复制完门卡后再次外置写入,利用这一点可以将复制出来的非加密卡转为加密卡 解决方案 软件 xcicode/MifareOneTool: A GUI Mifare Classic tool on Windows 虽然这玩意 19 年就停工了但也不是不能用 另外 Linux 上用 mfcuk 去操作也是可以的 步骤 使用 MifareOneTool 破解原始的校园卡 既然小米手环只能复制第一个扇区的卡号部分,那就使用 CUID 卡创建一个非加密的仅包含卡号信息的代理卡(直接按照网上的方案创建只包含扇区 0 的卡是不行的,一定要把扇区 0 的加密手工删掉,否则无法复制),然后让小米手环去复制这张卡 使用 MifareOneTool 对着手环上新复制的这张卡再次写入完整的数据(即扇区 0 - 15,因为扇区 0 需要靠这个步骤转换回加密的状态),此时选择写普通卡 / 写 CUID 卡区别不大,毕竟小米手环上的卡是不能写卡号和厂商信息的 大功告成,可以使用 MCT 之类的工具检查一下卡片复制是否成功

July 23, 2022 · 1 min · 71 words · NCJ

[Paper Reading] RXMesh: A GPU Mesh Data Structure

1. 这篇文章究竟讲了什么问题? 如何利用 GPU 来并行加速大规模的网格处理 2. 这个问题的性质是什么?如果不完全是一个新问题,那为什么它“仍然重要”? 属于改进类的问题 以往的网格加速方法要么是: application-specific 需要从线性代数上对问题进行 reform mesh 会变为稀疏矩阵 减少了中间变量,但是局部性变差,性能不够好 所以需要一个通用的高性能加速框架 3. 这篇文章致力于证明什么假设? 通过高效的数据结构 + 更好的变成模型,可以实现通用的网格处理加速 4. 有哪些与这篇文章相关的研究? 高性能编程模型 图像处理:Halide,调度与算法分离 稀疏体素计算 / simulation:太极 纯模拟:Ebb 图处理:Gunrock 5. 这篇文章提出的问题解决方案中,核心贡献是什么? 一个 high-level 的编程模型 用户顶层 定义好每个 mesh 上执行的计算 八种查询 以计算 vertex normal 为例: 非常清晰 模型底层 通过将整个 mesh 切分成很多 patch,然后按照 patch 来往 GPU 的 block 上分配计算任务,进而增加了局部性 patching 之后的 index 可视化出来如下图,很明显,比起直接按照 global sorting 的划分,patching 下相同 index 的部分会更加集中,相关数据在查询、计算的时候可以常驻 shared memory 那么 patch 如何表示?...

February 15, 2022 · 2 min · 233 words · NCJ

[Paper Reading] Volumetric Appearance Stylization with Stylizing Kernel Prediction Network

1. 这篇文章究竟讲了什么问题? 通过体积风格转移的方法,来高效地构造颜色外观上符合要求的、异质单反射体积。 网络使用了一个体积的自编码器,并且使用了 stylizing kernel predictor 2. 这个问题的性质是什么?如果不完全是一个新问题,那为什么它“仍然重要”? 属于改进性质的问题,之前已经有不少人研究过了体积上的风格迁移,但是文章提出的方法能够得到更好的效果。 同时这篇 paper 也属于 Artistic Appearance Design,传统的方法需要较为复杂的人工调整才能得到较好的效果,而本文的方法不需要人工干预,效率更高。 3. 这篇文章致力于证明什么假设? 证明它的这套风格迁移的框架是 work 的,并且效果很好 4. 有哪些与这篇文章相关的研究? Neural Style Transfer for Images Neural Style Transfer for 3D Contents Artistic Appearance Design Differentiable Rendering 5. 这篇文章提出的问题解决方案中,核心贡献是什么? 核心 idea 提出了一个将颜色外观从二维图形转移到三维图形上的框架 细节 设计了一个多尺度的基于 kernel 的神经网络来进行任意的风格迁移并保证时间上的一致性 SKP 首先使用 CNN (VGG) 来提取多个尺度的二维图片上的特征 然后选用 channel-wise 的均值和方差(实际网络中用的是标准差)进行拼接,得到一个特征向量 将这个向量通过一系列全连接层映射到一个 kernel 上 VolAE 经典的 encoder-decoder 结构,中间带有 skip 连接 在 decode 阶段将前面 SKP 得到的 kernel 插入进来,来将二维的风格加入到生成的体积中 引入了一个密度感知的 instance normalization 层,来避免色彩偏移...

February 13, 2022 · 2 min · 246 words · NCJ

[Paper Reading] Antithetic Sampling for Monte Carlo Differentiable Rendering

Disclaimer: 这几篇 paper reading 是我去年暑期在 MSRA 实习期间留下的笔记,近期整理文件翻出遂转至博客。其中的内容不保证正确性,观点仅供参考。 “十问” 的格式来源于沈向洋老师的分享,指路 👉 1. 这篇文章究竟讲了什么问题? 蒙特卡洛可微渲染中的对偶采样 问题: 可微渲染:渲染是在3D场景中进行积分得到2D图片,可微渲染就是逆向渲染的一个方法,通过微分从2D图片得到3D场景的部分参数 本文主要研究的是 physical-based 可微渲染,不是光栅化那种的 传统的 sampling 方法在面对高光表面的时候,会非常低效,尤其是在对全局的几何求导的时候 引入对偶采样可以大幅提高采样效率 2. 这个问题的性质是什么?它的重要性何在? 对于传统方法的改进,解决掉了传统的 sampling 方法在面对高光物体时的低效问题 重要性: 计算制造、计算成像、遥感 不过感觉高光这件事在成像上重要一些,遥感这种远场的情况很少出现高光 完善了以往的方法,使得整个 BSDF 的对偶采样框架有更好的普适性 3. 这篇文章致力于证明什么假设? 利用了对偶采样的蒙特卡洛算法能够很好的估计内部积分,从而使得整个采样框架具有更好的效率和普适性 4. 有哪些与这篇文章相关的研究?这一领域有哪些关键人物? 本文的作者(Zhao Shuang)就是专门做可微渲染的,在去年的 SIGGRAPH20 上给了一个可微渲染的 course,CVPR21 又给了一个 tutorial talk Wenzel Jakob, 开发了 mitsuba2 的团队,mitsuba2 主要解决了可微渲染中高性能 auto diff 的问题 还有 Tzu-Mao Li 老师 5. 这篇文章提出的问题解决方案中,核心贡献是什么? 面对高光表面,蒙特卡洛为什么慢? When 𝐹 contains high-magnitude positive and negative regions, estimating 𝐼 using Monte Carlo methods with independent samples can suffer from very slow convergence....

February 12, 2022 · 1 min · 203 words · NCJ

[Paper Reading] Efficient Reflectance Capture Using an Autoencoder

1 导言 从现实世界中采集高精度的材质信息是一件非常重要而又非常具有挑战性的问题。这个问题可以被建模为空间变化的双向反射分布函数(SVBRDF)的采集,即一个六维的随位置、光照、视角变化而变化的函数。直接采集一个未知的 SVBRDF 函数需要上千张照片,因为你需要足够多的样本去涵盖所有可能的位置、光照、视角,这也直接导致了直接采集在时间和储存上的高成本。 为此,人们开展了很多关于提升采集效率的工作。一类主流的方法就是通过设计精巧的光照模式来实现采样的”并行化“,即在一次拍摄中尽可能采集更多的组合。但是即便是此前最好的解决方案(Guojun Chen, 2014. Reflectance Scanning: Estimating Shading Frame and BRDF with Generalized Linear Light Sources),也需要采集上百张照片。这使得这项技术在落地时仍然遇到巨大的困难。 为此,论文作者提出两个基于光照模式的反射采集方法的根本性问题: 在光照模式的数量有限的情况下,到底什么光照模式是最优的? 如何从这些模式下采集的照片中,还原出原本的物体? 以往的工作对于前两个问题的回答都是手工操作,也就是通过手工推导来设计各种复杂的光照模式,然后再解算出重建的方法。但是这样的方法有两个问题:1. 光照模式的数量往往取决于推导的方法,而无法任意根据所需的精度进行选择;2. 这些光照模式并没有在足够多的实际数据中进行其有效性的验证。 因此,论文作者选择使用数据驱动的方法,自动从大量真实物体的材质数据中学到最优的光照模式。 2 相关工作 2.1 直接采样 直接采样就是通过遍历 SVBRDF 的不同参数组合,来重建出整个 SVBRDF 函数。这一系列的工作精度非常的高,但工作量也非常的大,耗时很久,效率很低。 2.2 优化采样 这一方向主要是是增加假设来对于 BRDF 采样本身进行优化,比如 Matusik 等人通过假设一个任意的 BRDF 函数都落在一个预先捕捉好的各向同性的子空间中,成功将采样数量降低到了 800 张。而 Nielsen 等人通过一个能够优化光照和视角的改进算法,将采样数量降低到了 20 张。Xu 等人在 2016 年甚至通过在近场相机忽略掉视角的变化,将采样数降低到了 2 张,并通过假设表面没有法向的变化,将方法拓展到了各向同性的 SVBRDF 上。 2.3 复杂光照模式 但是增加假设的方法对于真实世界中的绝大多数情况都是不具有拓展性的,因此另一个方向是优化采集本身的效率。[Gardener et al. 2003; Ghosh et al. 2009; Aittala et al....

August 5, 2021 · 3 min · 543 words · NCJ

OptiX 入门笔记

这其实是我大三上图形学大作业的报告,最近整理本科期间的项目,于是把报告里面比较关于 OptiX 的部分拿出来水篇博客做个笔记。 个人认为 API 没有什么讲的价值,所以博客里更多是讲讲关于 OptiX 的编程模型/思想。 另外有关光追基本知识的部分此处也不过多赘述。 1 基本架构 OptiX 的主要结构如上图所示,由光追渲染管线、加速结构、着色器表及相关资源构成。 值得注意的是,OptiX 其实只负责了渲染的部分,也就是说每次 OptiX 程序运行完成后返回的都是一帧渲染好的图像,而建模、交互,甚至包括画面的显示,都不是 OptiX 所负责的。你可以搭配 OpenGL 之类的来完成这些显示窗口的维护和交互工作。 1.1 光追渲染管线 光追渲染管线是整个光追的核心,它负责了光线的发射、相交的检测、每条光线的着色,以及这些全部计算的调度 1.2 加速结构 加速结构 (Acceleration Structure) 加速的其实是相交检测,OptiX 中使用加速结构来标记物体的每个面,然后计算的就是每条光线与加速结构的相交情况 加速结构本身是一个树形的结构,使用加速结构可以加速光线相交检测的遍历 在注册完全部的加速结构后,OptiX 会编译一个查询表,通过这个加速表可以实现非常高效的相交检测 但是需要注意的是,当建模发生变化的时候,加速结构就会发生变化,进而导致查询表的重新编译,所以在 OptiX 中,modeling 的变化会使得计算压力增大 1.3 着色器表 着色器表 (Shader Table) 中储存了各种与最后的着色有关的资源的索引,可以用于索引一次光线追踪中可能用到的所有资源,比如材质、纹理、法向等,通过着色器表,我们可以快速的获取到这些资源,然后完成相关的计算 每次渲染时,由光追渲染管线调度光线的发射,当光线发生相交后,加速结构给出发生相交处的物体的属性索引,然后我们在着色器表中按照索引查找相关的属性和资源,再交给着色器进行最后的着色,就得到了这个像素上这条光线渲染出来的结果。 2 光追可编程渲染管线 与光栅化一样,光追的渲染管线也是可编程的。光追的渲染管线在前面已经解释,其中可以编程的主要是光线发射、相交检测、着色三个部分。 2.1 光线发射 OptiX 可以实现比较复杂的光线发射,指向针对光源进行重要性采样,不过在我们这儿因为场景足够亮,所以没有做相关的定制。 2.2 相交检测 相交检测背后的算法是二叉树 BVH (Bounding Volume Hierachy),是空间切分技术之一。使用树形组织的加速结构,可以加速相交检测的计算。但是即便如此,依然是一个开销非常大的计算,在没有 RT Core 的传统 GPU 上,只能通过软件模拟的方法实现相关的计算。 而在 RTX GPU 上,这一算法有相关的硬件实现,因此可以得到非常高的运行效率。 在 OptiX 中直接提供的加速结构只有三角网格结构,不过三角网格的建模能力已经非常强了,所以暂时也没有新增其他结构的需求。...

August 1, 2021 · 1 min · 96 words · NCJ

NeRF-Related Review 2020

2020 年,在 CV/CG 界,一篇叫做 NeRF 的论文爆火,“只需要输入少量静态图片,就能做到多视角的逼真3D效果。”但是实际上,在这篇论文之前,学术界已经有不少这方面的尝试,相关的研究也有不少,因此本文尝试做一个简单的综述,来简单看看这篇论文及其相关的研究。 〇、背景:建模(表面、体积) & 渲染 众所周知,计算机图形学中一个长期研究目标就是将虚拟的世界尽可能的渲染的真实。这里面包括了三个方面: 建模:通过表面建模、曲面建模等方式,将真实世界中的场景在虚拟世界中还原出来 渲染:按照物理中光照的规律,将虚拟世界中建好的模型绘制成人眼可见的画面 动画:通过仿真等方式,模拟出物体真实的运动轨迹等,使得动画看起来更加自然 NeRF 及相关工作所尝试解决的,主要是建模与渲染部分,也就是重建。建模的本质,其实是构造出一个空间中描述物体的函数:传统的建模大多采用显式的表示,比如曲线、曲面等等,或是球体、长方体;而近年来,随着神经网络的发展,有人提出能否使用神经网络来表示这一函数,毕竟神经网络本质上就是一个隐式函数,只不过其形式更加复杂、表示能力也更强。 在三维建模中,两个非常重要的通用建模方式是表面建模和体积建模:表面建模是通过描述表面曲面的方式构建模型,而体积建模则是通过描述空间点(体素)的方式构建模型;在表面建模里没有三维实体,实体只是闭合表面;在体积建模里没有二维表面,表面只是很薄的体素。学界在神经网络建模方面,也进行了类似的尝试,即使用神经网络来表示曲面(神经隐式曲面)和使用神经网络表示体积(神经隐式体积)。基于这两个大的思想,人们逐渐设计出各式各样的网络,并得到了越来越好的效果。 当然,建模之后,如果不能够进行渲染是没有意义的,因此如何高效地渲染出这些隐式表示的模型,也是学术界非常热门的话题。 一、序章:神经隐式曲面 1.1 基于分类的网络 第一大类的尝试,就是使用神经网络来表示曲面(Neural Implicit Surfaces)。前面提到,对于一个物体,实际上就是一个闭合的曲面,因此最直白的表示方法,就是给空间中的点进行分类,标记它在曲面内、还是曲面外。 Occupancy networks 和 IM-Net 都是基于这一思想的,两者主要是网络内部结构上不同,但是输入都是一个特征向量和一个空间点坐标,输出都是一个布尔值:在曲面内或在曲面外。下图是 IM-Net 的网络结构,以作示例: 另外还有将纹理特征一并结合的网络,如 PIFu:它除了编码了每个点是 inside 还是 outside,还将每个点的颜色信息也通过网络编码,从而实现了完整的高分辨率的着装人体数字化重建。 1.2 基于回归的网络 使用分类模型进行的表面建模确实是一个非常大的创新,但是一个很大的缺点就是这个模型所表示的函数并不可导——它不是连续的,毕竟物体内外这一输出本身就决定了函数的值域是一个离散的二值。因此,人们尝试使用一个连续的表示方式:有符号距离场,也就是大名鼎鼎的 SDF。 SDF 的定义很简单,其数值就是空间中的一个点距离曲面最近的距离,而符号表示其在闭合曲面的内部还是外部。这样通过一个有符号数,就将两个信息一起编码进去了,并且得到了一个在空间上可导的量。 SDF 的形式化定义如下: DeepSDF 那么这样一个函数,非常自然的想到使用神经网络的 regression 进行解决,这也是 DeepSDF 的主要思想 —— 将一个描述物体形状特征的 Code 和空间坐标一并放入网络,然后输出该点的 SDF,从而实现利用深度网络重建一系列同类的物体。 值得关注的一点是,这个特征 Code 的特征是利用 Auto-decoder (注意不是 Auto-encoder)优化提炼的,作者们称之为 Encoder-less Learning,因为他们觉得 encoder 在推导的时候并没有被用到,所以不如不要,实际的重建效果也是非常的好,感觉是个非常有意思的想法。 DeepSDF 的诞生彻底引爆了这个领域,此后涌现出了大量相关的工作,如达摩院的 Curriculum DeepSDF 以及伯克利的 Extending DeepSDF,DeepSDF 本身也成为了不少工作的 baseline。...

December 27, 2020 · 3 min · 515 words · NCJ