K3s Cloud Master and Local Agent Setup
Setting up a cloud-based k3s master node with local agent nodes allows for easy management of distributed infrastructure. This setup is ideal for scenarios such as integrating a local GPU cluster or managing edge devices like vending machines, ensuring stable network connectivity without the need for additional software. Use Cases Local GPU Cluster: You can add your local GPU cluster as a worker node to the cloud k3s master, enabling centralized scheduling of complex tasks without worrying about network issues....
Transitioning from GitFlow to GitHub PR Workflow: A Journey in Streamlining Our Development Process
Transitioning from GitFlow to GitHub PR Workflow: A Journey in Streamlining Our Development Process Introduction In our company, we originally adopted the GitFlow model for our development workflow. This model served us well, facilitating a structured approach to feature development, release management, and hotfixes. However, with the introduction of GitHub and its powerful pull request (PR) workflow, we decided to transition to a more integrated system. This blog post outlines our journey, the challenges we faced, and the solutions we implemented to streamline our development process....
非线性优化 - Ceres Solver
我们考虑这个优化问题: $$ \min_{\mathbf{x}} \quad \frac{1}{2} \sum_{i} \rho_i \left(||f_i (x_{i_1}, … ,x_{i_k})||^2\right) $$ $$ \text{s.t.} \quad l_j \le x_j \le u_j $$ 这个问题又称为非线性最小二乘问题。 具体来说,我们寻找$x$的最小值,并且$x$满足了约束$l_j \le x_j \le u_j$,使得函数$\rho_i \left(||f_i (x_{i_1}, … ,x_{i_k})||^2\right)$的和最小。我们又把$\rho_i \left(||f_i (x_{i_1}, … ,x_{i_k})||^2\right)$称之为残差块(ResidualBlock),$f_i (x_{i_1}, … ,x_{i_k})$成为代价函数(CostFunction),且依赖于$x_i$。$x_i$称为参数块(ParameterBlock)。同时参数块受到了$l_i$和$u_i$的约束。 特别的这里的$\rho_i$称为损失函数(LossFunction),用于减少外值对解的影响。 特别的,当我们的$\rho_i = f(x) = x$且上下界都为无穷大时,我们的问题简化为: $$ \min_{\mathbf{x}} \quad \frac{1}{2} \sum_{i} \left(||f_i (x_{i_1}, … ,x_{i_k})||^2\right) $$ 一个最简单的例子 我们考虑优化一个函数: $$ \frac{1}{2}(10-x)^2 $$ 我们用Ceres Solver来求解这个问题。很显然,这里的代价函数是$f(x) = 10 - x$,$\rho$为 1,且$x$在实数域上没有约束。所以我们定义我们的代价函数 struct CostFunctor { template <typename T> bool operator()(const T* const x, T* residual) const { residual[0] = 10....
单目视觉vSLAM
Matlab 官方提供了完整的单目视觉 vSLAM 的 pipeline,https://www.mathworks.com/help/vision/ug/monocular-visual-simultaneous-localization-and-mapping.html。这里对 Matlab 的这边文章的关键点做一个笔记和讨论,具体的实现可以参考原文文档。 初始化数据集 Matlab 提供了imageDatastore类用于初始化图像存储集合,其接受一个图像的文件夹路径的参数。 imageFolder = [dataFolder,'rgbd_dataset_freiburg3_long_office_household/rgb/']; imds = imageDatastore(imageFolder); 初始化地图 在 SLAM 管线中,首先我们应该对相机进行标定,相机标定可以用Computer Vision 工具箱中的相机标定工具。如果预先知道了相机的内参,可以通过cameraIntrinsics类直接进行初始化。 % Create a cameraIntrinsics object to store the camera intrinsic parameters. % The intrinsics for the dataset can be found at the following page: % https://vision.in.tum.de/data/datasets/rgbd-dataset/file_formats % Note that the images in the dataset are already undistorted, hence there % is no need to specify the distortion coefficients. focalLength = [535....
基于TinyTex的中文本地Tex环境
在TinyTex之前,我已经换过无数个排版工具。从最开始的Word,到Pages,再到基于Markdown开发的MWeb和Ulysses。我很喜欢Ulysses,因为他既支持Markdown,又通过MathJax支持了LaTex语法。但是Markdown的排版能力还是非常有限的,尤其是theorem库的缺乏,Markdown只能作为一个快速笔记软件使用。 后来,我一直在使用Overleaf,不得不说Overleaf是一个非常不错的项目,至今市面上都没有更好的替代品。这也导致Overleaf的价格非常高,甚至学生价格都很高。作为一个研究生和普通的程序员的低频用户,肯定无法为这么高昂的价格付费。而单单免费版本,则又缺乏了类似GitHub同步之类的功能。之所以使用LaTex排版而不是Word,最大原因之一就是LaTex对Git优化,连Git都无法用了,Overleaf实在没有更多吸引我的地方。 之后,我同样使用了一些第三方的LaTex环境。比如在macOS上很好用的Texifier。Texifier这个项目不得不说也是花了很多心思,但可以看得出团队的预算不足,很多地方存在设计的瑕疵和开发的Bug。而且作为一款编辑器来说,他实在算不上功能强大。只不过在LaTex的开箱即用上面,至少做到了顺手。 我还使用了MacTex(或者是Tex Live)+ VScode + LaTex Workshop,从易用性到编辑器的熟悉程度以及到各种细节小问题的处理上,这一套方案基本是最佳方案,唯一的遗憾是庞大的MacTex和墙内的渣网速。在调研搜索过程中,看到了TinyTex这个发行版,TinyTex又有R语言的R Markdown背书,从文件大小到稳定性基本都满足了一个基本的Tex排版要求。 1. 下载TinyTex二进制发行版 TinyTex的发行版可以直接从GitHub, https://github.com/rstudio/tinytex-releases下载获得。我下载的是TinyTeX版本,TinyTeX-2的体积过于庞大,TinyTeX-1和TinyTeX-0的预置package又太少。 下载完成后解压缩放到任意文件夹下,并且将bin目录添加到PATH变量中。我是用的是macOS,因此我的PATH为 export PATH=$PATH:$HOME/TinyTeX/bin/universal-darwin 2. 更新tlmgr源和安装中文支持 设置好环境变量后,重启终端就可以访问tlmgr。为了在国内更快的访问速度,可以修改tlmgr源为清华源,执行 tlmgr option repository https://mirrors.tuna.tsinghua.edu.cn/CTAN/systems/texlive/tlnet 然后安装ctex包获得中文支持 tlmgr install ctex 3. 安装VScode + LaTex Workshop 在VScode中安装LaTex Workshop插件,安装成功后打开任意tex文件就可以愉快的书写啦。 对于中文支持,可以使用CJKutf8 \documentclass{article} \usepackage{CJKutf8} \begin{document} \begin{CJK*}{UTF8}{gbsn} \section{前言} \section{关于数学部分} 数学、中英文皆可以混排。You can intersperse math, Chinese and English (Latin script) without adding extra environments. \end{CJK*} \bigskip %% Just some white space You can also insert Latin text in your document \bigskip %% Just some white space \begin{CJK*}{UTF8}{bsmi} 這是繁體中文。 \end{CJK*} \end{document} 进行中英文混排。
渲染方程中的路径积分
路径追踪是第一个光线传输算法,并广泛应用于Realistic Rendering中。路径追踪将渲染方程的积分式转换成一个路径积分的形式,并且通过蒙特卡洛积分方法对每一项进行积分,从而得到一个统计上无偏的渲染结果。因为路径积分的无偏属性,路径积分也常常被用作为渲染的Ground Truth,用于对比其他的渲染方法。 渲染方程 要完全推导路径积分并且用代码表示路径积分的计算过程,我们需要从渲染方程入手。 首先需要明确的一点是,渲染的目标是计算最终进入眼睛(摄像机)的辐射亮度(Radiance),即单位面积,单位立体角上的光通量(辐射功率)。另外一个重要的概念是辐射照度,辐照度(Irradiance),即单位面积上光通量(辐射功率)。根据几何光学的线性假设,当光射到物体表面产生反射的时候,其反射方向的辐射亮度的微分,和入射方向上辐射照度的微分成线性关系。这两者比例常数由入射角$\omega_i$和反射角$\omega_o$和物体表面属性直接给出,我们把这个函数称之为BRDF(双向反射分布函数),$f(p, \omega_i, \omega_o)$。双向反射分布函数理解起来比较具有挑战性,一个简单的方法是将其辐照度和辐亮度类比为连续型概率的中的随机变量和累积概率函数,那么累积概率函数和随机变量的微分比值,即BRDF,就是概率密度函数。 $$dL_o(p, \omega_o) = dE(p, \omega_i) = f(p, \omega_i, \omega_o)L_i(p, \omega_i)cos\theta_id\omega_i$$ 有了BRDF函数,我们就建立起了,对于物体表面上的一个点,点$p$,其反射的辐射亮度$L_o(p, \omega_o)$和入射的辐射亮度之间的关系,进一步的,如果我们考虑$p$上的自发光的辐射亮度$L_e(p, \omega_o)$,那我我们就可以建立起渲染方程 $$L_o(p, \omega_o) = L_e(p, \omega_o) + \int f(p, \omega_i, \omega_o)L_i(p, \omega_i)cos\theta_id\omega_i$$ 如果我们只考虑不透明反射模型,而不考虑更复杂的折射和次表面反射,那么我们的积分范围即是围绕表面法线的半球积分。 方向积分形式和面积积分形式 从渲染方程中,对于$L_e$项是相对简单的,我们可以从物体表面材质定义获得。对于积分项,我们则需要知道每个方向的$L_i$。首先需要明确一点,在真空环境中,光在传播过程中,辐射亮度并不发生变化。对于$L_i$项来说,其就等于它来自方向的点$p’$的反射的辐射亮度。为了更好的表示这一点,我们用函数$t(p, w_i) = p’$表示。函数$t$指的是,从$p$点出发,沿着$w_i$方向,第一个相交的点,即为$p’$。由此,渲染方程可以改写为 $$L_o(p, \omega_o) = L_e(p, \omega_o) + \int f(p, \omega_i, \omega_o)L_o(t(p, \omega_i), \omega_i')cos\theta_id\omega_i$$ 然而我们无法显式定义函数$t$,于是上面这个式子就无法显式定义,对于上面函数的展开,则必然包含着一个关于函数$t$的递归项无法消除。这使得我们仅仅可能通过递归黎曼求和的形式得到积分结果,而无法使用诸如蒙特卡洛近似的方式进行数值上的快速拟合。 为了显式改写该函数,我们重新定义一些记号,用于方更方便阅读。 首先是反射的辐射量度和入射的辐射亮度。在光线传输过程中提到,对于真空来说,辐射亮度在传输过程中不发生变化。那么对于一个点的入射辐射亮度,即是其来自方向反射(或者自发光)的辐射亮度。于是我们是用$L(p_1, p_0)$记号替代$L_i$和$L_o$,其表示点$p_1$到点$p_0$的辐射亮度。 同样的,BRDF方程记号我们也可以做相应的变化,我们使用$f(p_2, p_1, p_0)$表示从点$p_2$出发,击中表面点$p_1$,发生反射到达$p_0$的光路的BRDF。显然,该表达方式蕴涵了之前的立体角,从而在数学上是等价的。 经过上面两次记号的变化,在表达式上我们已经消除了立体角$\omega$的存在,然而微分项$d\omega_i$依然存在,我们需要将该微分项同样转换为关于点的表达式。由于 $$\omega = \frac{Acos\theta'}{d^2}$$ 我们便将立体角的微分转换为对应顶点处的面积微分,为此,我们引入一个函数 $$G(p_0, p_1) = V(p_0, p_1)\frac{|cos\theta_0||cos\theta_1|}{||p_0-p_1||^2}$$ 其中函数$V(p_0, p_1)$为可见性函数,如果两个点相互可见,则$V=1$,否则$V=0$。 于是渲染方程可以改写为...
《动物庄园》自由和平等的谎言引发的独裁
一部小说描述的是故事情节,一则寓言揭示的是事物的本质。《动物庄园》出版于1945年,值二战胜利前夕。作者乔治.奥威尔在书中描写了一只猪引发的革命,随着时间推移,革命开始退化为独裁统治,并最终失败。 推想革命失败的原因,有人说是独裁政治,有人说是极权主义,这些当然是革命失败的显然因素。然而这巨大的不幸却一早就隐藏在了自由和平等的巨大谎言中。动物们的革命动力来自于老麦哲的美好愿景。肥沃的土地,丰富的食物,整个庄园都是欣欣向荣的样子。老麦哲宣告,推翻人类统治,建立一个自由与平等的庄园。动物们坚定不移的相信,自由和平等带来的是美好的一切,是没有压迫没有剥削的乌托邦的社会。 然而现实并不是如此。整一个自然界中永远不会存在自由和平等。无论是残忍的生存法则,还是一条条的生物链,都昭示着自然界对自由和平等嗤之以鼻。没有任何理由能说明为什么老虎可以吃别的动物,也没有任何原因可以解释为什么蚂蚁天生就弱小,被其他动物欺凌。动物们所谓的自由和平等绝不会催生出一个乌托邦一般美好的社会,而他们的信仰却成为独裁者的欺世的谎言。正如书中的动物们,他们不断被聪明狡诈的猪们威胁说,“你们可不想琼斯先生回来吧。要是琼斯先生回来,我们就再也不会有自由”。动物们都害怕失去自由,然而动物们却都不知道到底什么是自由,谁也无法定义什么是人人平等。所有人知道的,便是记着老麦哲的美好愿景,他们误以为,那是自由和平等带来的未来。这样不明就里的相信,使得信仰变成了统治者统治的工具,信心成为独裁者控制的最佳法器。 反过来问,我们的世界是否要自由和平等。需要的!我们需要的自由是一套完整制度,完整法令保护下的人格的独立。法国大革命《人权宣言》对自由的定义是:“自由即有权做一切无害于他人的任何事情。”在二战中,罗斯福提出了四大自由:“言论自由,信仰自由,免于匮乏的自由和免于恐惧的自由。”在联合国人权宣言中,四大自由被重申。反观《动物庄园》中动物们的自由,却哪里找得到言论,信仰,免于匮乏和恐惧的自由。反而较之以前,动物们被更多的剥削,这一点从鸡们被麦哲伦要求上缴更多的鸡蛋就可以看出。但是具有讽刺的是,动物们并没有马上意识到自己被愚弄,动物们心中所想的事,反而是需要更加努力的工作。比如Boxer就是一个典型的例子,他从最开始和小公鸡约定要提前半小时起床工作到后来的提前一个小时提前工作。Boxer是革命的忠实拥护者,他小心翼翼的维护者革命的成果,他更加是自由和平等的拥护者。但是正因为他的固执地坚信老麦哲的政治思想——即自由会带来丰收,而无人类的约束即是最大的自由。他的固执使得他深受毒害,最终也造成了他惨死悲剧。 作为寓言故事,《动物庄园》影射了当时俄国从十月革命到1940年的历史过程。其实在现实过程中,不乏这样的革命者。中国历史上垒起呐喊着消灭暴政的各样农民起义,最终沦为新的苛政。而作为革命的主题的农民们,依然把持着美好的愿景,甘心的被奴役。着眼于中国现代史,这样的事件也屡见不鲜。革命者曲解社会主义,塑造了共产主义的美好愿景,却直接导致了大跃进等经济上的严重倒退。 那么我们需要什么样的自由和平等?动物们所需要的,不仅仅是一个美好的愿景,不仅仅是一场革命,不仅仅是推翻一个领袖,不仅仅是七戒这样的一张宣言,更不仅仅是一个能带领动物们走向自由的麦哲伦一般的领袖。他们需要的是一套制度以及能使这套制度运行的动力。而动物们所想的自由,所想的美好愿景,是这一套法律能够给予保护的人格的独立。动物们需要的是一套法案,他规范了所有动物的职责,任何超越这些职责的动物都应当受到谴责。他限制了所有人的职能,没有一个人——比如麦哲伦——可以独断的决定一切。当然动物们还需要的是带动整个社会运作的动力。从动物们的风车计划就可以看出动物们并没有能力支撑起他们小小庄园的运作。他们松散的结构根本无法供给自身。这样一个缺乏能量来源的乌托邦社会,最终沦为麦哲伦手中的玩物,和人类大摇大摆的做起交易,并安上了一个救世主的美名。 我们无比渴望自由,但是正如孙中山先生所说,这个世界上没有绝对的自由。在此告诫改革者们,即使是一套有漏洞有缺陷的制度,也远远比假大空的空想愿景更好。