
技术学习笔记
文章平均质量分 84
主要做一些技术学习经验分享,记录一些重要的trick备忘。
程序猿老甘
NTU博后,主要研究领域为图形学,计算机视觉,几何分析等。
展开
-
Multidimensional Scaling(MDS多维缩放)算法及其应用
在这篇博客中,我将与大家分享在流形分析领域的一个非常重要的方法,即多维缩放MDS。整体来说,该方法提供了一种将内蕴距离映射到显性欧氏空间的计算,为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作[1],才下定决心在人脸数据分析中使用内蕴度量来建立特征分析方法,可以说MDS对我的学术之路起到了很大的影响作用。原创 2023-12-06 18:01:49 · 782 阅读 · 0 评论 -
我复现的第一个神经网络: LeNet
学习深度学习已经有小一年的时间,看了很多视频和书本内容,学习了很多代码,可始终感觉认知不够扎实。结合李沐老师的视频课程,我决定在本博客中介绍下复现LeNet的过程。代码基于Pycharm2021平台,选用python3.8版本+Pytorch1.12.1+cu116。基本上把各个包的版本都刷到最新版本,以方便后续的网络升级和向后兼容。原创 2022-09-07 18:36:22 · 2005 阅读 · 3 评论 -
基于Eigen求解线性方程组Ax=b的性能分析
在上一篇博客中,我们介绍了三维人脸参数化方法。在该算法中,涉及到求解线性方程AX=b的问题。这里的A为针对网格的拉普拉斯权重矩阵,规模是比较大的,尺度为N*N,N为网格点数。对于人脸数据,动则10000以上的点数,为线性方程求解带来挑战。Eigen提供了一系列的求解线性方程的解法,本博客就基于人脸参数化方法,对比下这些解法的性能特点,以帮助需要深入了解求解大规模线性方程的同学,选择合适的计算工具。原创 2022-09-05 13:54:58 · 1475 阅读 · 0 评论 -
基于测地距离场的三维人脸参数化方法
三维人脸数据的识别与处理,一直是视觉与图形学领域的热点问题。相对于人脸图像来说,三维人脸数据拥有完整的几何信息,能够支持更加精确的人脸数据分析算法。在进行相关的计算之前,我们希望三维人脸能够有一个统一的表示形式,以准确的界定人脸的区域以及对应的位置,尽可能的消除姿态以及尺度不一致带来的影响。基于该目的,人脸参数化方法被提出。原创 2022-09-02 16:23:44 · 1602 阅读 · 0 评论 -
基于Pycharm运行李沐老师的深度学习课程代码
最近在b站看李沐老师的深度学习课程,受益颇多。不过觉得光看视频实在是不过瘾,最好还是能实际的玩起来。鉴于我还是习惯使用pycharm,且不需要过多的中间过程展示,所以代码的编写基本都是在pycharm进行。由于李沐老师的代码主要是在Jupyter运行的,在pycharm上使用会略有差异。本篇博客以求解线性优化问题代码为例,来谈一谈在pycharm运行相关代码的一些注意事项。原创 2022-08-23 17:00:08 · 7361 阅读 · 6 评论 -
Eigen矩阵运算库快速上手
做科研类项目,尤其是与线性优化,主成分分析有关的项目,势必需要用到矩阵计算及相关的优化工具。很多同学会利用matlab完成项目需求,这当然是一个不错的选择。但是,对于平台有一定要求的项目,尤其是那些基于C++开发的工程项目,使用matlab就会带来一些不便。我们希望有方便的矩阵开源工具,可以集成在项目中,以简化程序部署与使用的难度。这里就不得不提到大名鼎鼎的矩阵开源库,Eigen。今天这篇博客,就来跟大家介绍下Eigen部署与使用的基本知识,方便新手朋友能够快速掌握基于Eigenv实现的矩阵计算与优化功能。原创 2022-06-30 17:34:51 · 5176 阅读 · 0 评论 -
浅谈调和形状上下文特征HSC对3DSC的改进
在上一篇博客中(浅谈三维形状上下文特征3DSC理论及应用),我们已经介绍了3DSC的设计原理以及实现细节,以及该特征在一定程度上受限于法线估计的缺陷。事实上,在文献[1]中,作者在提出3DSC的同时,也给出了对应的解决方案,以缓解3DSC的内在缺陷,即调和形状上下文特征HSC。今天我们将具体学习一下HSC的原理以及实现。.........原创 2022-06-10 13:59:44 · 693 阅读 · 1 评论 -
浅谈三维形状上下文特征3DSC理论及应用
在之前的博客中,我们已经介绍过了使用FPFH在点云上建立局部形状描述,实现对点云局部隐曲面几何特征的高效表达(浅谈FPFH算法实现原理及其在点云配准中的应用)。今天,我们将介绍另外一种局部形状描述子: 3DShapeContext (3DSC)。最近上课需要准备这部分内容,本打算找一个现成的博客学习一下了事的。但是看了几个博客,感觉还是差点意思,于是我下载了原始论文,从头读了一遍,将一些原理与实现细节在这篇博客做个展开,希望能够帮助到有需要的同学。...原创 2022-06-09 19:02:37 · 2782 阅读 · 3 评论 -
VS2019+Libtorch实现基于C++的图像语义分割
基于深度学习框架的图像语义分割算法在近年成为主流研究方向,包括像DeepLab系列,U-Net等,在ImageNet,Cityscapes,PASCAL VOC 2012等库上,都获得了不错的性能。在之前的博客中,我们已经介绍了DeepLabV3+。我在最近的研究中,希望可以直接在C++上部署类似的图像语义分割程序,并在VS平台集成的项目中使用其强大的图像语义分析功能。原创 2022-06-02 18:13:15 · 2816 阅读 · 4 评论 -
点云深度学习系列博客(二): 点云配准网络PCRNet
凡是对点云相关应用有些了解的同学,相信都接触过点云配准。配准相关的经典算法,包括ICP,NDT,FPFH,已被广泛应用于工业设计,定位,SLAM,自动驾驶等领域。尤其在SLAM和自动驾驶领域,随着家庭清扫机器人和电动汽车的普及,基于激光扫描技术的点云配准技术越发重要。可见点云配准及其相关研究的重要性。今天的点云深度学习系列博客为大家介绍一个用于点云配准深度网络:PCRNet [1]。原创 2022-05-20 18:36:41 · 6161 阅读 · 4 评论 -
点云深度学习系列博客(一): 点云特征学习网络PCPNet
最近开始研究点云分析的相关项目,经过文献调研我发现,近几年比较热的方法,基本都是基于深度学习框架设计的。正好我计划在2022年切入点云深度学习这个研究方向,于是我决定创建一个博客专题,翻译和编辑一批具有代表性意义的点云深度学习研究报告,即方便为我自己的研究计划提供素材,又希望能够帮助到有需要的小伙伴参考与学习。如果你对这个专题感兴趣,希望能够关注我的博客,那将是对我创作的最大支持。原创 2022-04-30 13:08:50 · 5697 阅读 · 1 评论 -
VS项目中PCL与OpenCV的冲突
最近做三维视觉项目,用到了PCL库和OpenCV两个库。比较坑的是,在编译过程,会报一些函数访问异常,如下:报错内容为:error C2079: "pcl::KdTreeFLANN<PointT,flann::L2_Simple<float>>::param_k_" uses undefined struct "flann::SearchParams"。主要是我在其他的项目中使用同样的代码,没有任何问题。很显然,是由于PCL与OpenCV的函数命名冲突造成项目在使用函数时,访原创 2022-04-27 12:59:31 · 1088 阅读 · 0 评论 -
正态分布变换NDT算法原理及其在点云配准中的应用
正态分布变换Normal Distributions Transform(NDT)方法最早由Biber于2003年提出。该方法最早用于解决SLAM问题中,激光扫描数据的匹配问题。该方法的核心思路是通过建立数据基于概率密度的表示形式,构建一个对匹配的连续的评估函数,并且连续可微。这样,匹配问题就转换成了对一个连续函数的极值优化问题。下面,我们就来展开介绍下NDT算法的一些理论知识与技术细节。原创 2022-04-25 15:14:54 · 6080 阅读 · 0 评论 -
基于GMM模型的图像分割与颜色迁移算法
我们在之前的博客中已经介绍过了一些主流的图像颜色迁移方法。这些方法一般通过计算全局颜色分布对应或者语义分析对应,来构建颜色迁移策略。这带来了一个问题,就是对图像建立一个统一的颜色迁移策略,会降低颜色映射的灵活性,使得结果图缺少色彩的对比度,不能突出一些特定的区域。一个简单的解决方案是首先把图像分成不同的色块或者基于颜色分类的不同区域,然后针对这些区域来建立不同的颜色映射方案。基于GMM模型的图像颜色迁移方法,就是通过GMM来实现图像分割,然后基于分割结果,建立分区域的颜色迁移方案,获得更好的结果。原创 2022-04-17 13:01:01 · 4399 阅读 · 0 评论 -
Win10快速部署基于Pytorch(GPU)的深度学习环境
目前,接受度最高的深度学习框架恐怕就是Pytorch了。相对来说,Pytorch部署比较简单,版本之间的兼容程度明显好于Tensorflow。使用一些预先定义好的框架实现深度学习功能还是很方便的。这篇博客基于我对Pytorch代码部署的一些经验,提炼出一些部署该平台的注意事项,希望能够帮助那些对于该平台没有任何知识背景的同学,尽快上手。1. 基于Anaconda虚拟环境的Python环境首先我们需要安装Pycharm与Anaconda。Pycharm:下载 PyCharm:JetBrains 为原创 2022-04-05 14:29:22 · 2097 阅读 · 3 评论 -
浅谈FPFH算法实现原理及其在点云配准中的应用
统计分析方法在看一个点是否为特征点时,除了考虑该点的几何特征,同时还会考虑该点附近的区域,一些几何特征的分布情况。这样做的好处就是避免了一些异常的点被错误识别的情况。其原理在于,一个或少数几个点带有异常值,会破坏特征识别,但是我们分析这些异常点的邻域,对邻域内的点做统计计算,就会显著降低异常权重,使得对该点或者该区域的几何特征表述,更加稳定。FPFH算法正是基于该思想所提出。...原创 2022-04-01 14:39:18 · 20111 阅读 · 19 评论 -
一文读懂傅里叶变换的几何解释
我读硕士的时候就一直搞不清楚图像处理里基于傅里叶变换的时频计算到底是个什么东西。我只是模糊的知道傅里叶离散变换公式,可以将灰度图对应到频域中,然后做一些操作,滤掉一些信息,然后反向映射回时域,似乎有一些效果, 比如模糊,锐化等等。又比如,我知道傅里叶变换的一些基本观点,如波的叠加以及周期性的计算可以表示各种信息,如图像、声音等。傅里叶变换的目标就是把信息分解为频率清楚的波。可是,它背后的原理是什么,这种变换是否有直观的解释?直到我在B站上学习了2Blue1Brown频道的双语课程,介绍了傅里叶变换的几何解释原创 2022-03-16 17:55:05 · 6066 阅读 · 0 评论 -
火爆科研圈的三维重建技术:Neural radiance fields (NeRF)
如果说最近两年最火的三维重建技术是什么,相信NeRF[1]是一个绝对绕不过去的名字。这项强到逆天的技术,一经提出,就被众多研究者所重视,并投入人力对该技术进行深入研究并改进。仅仅过了不到两年的时间,NeRF及其变种网络已经成为重建领域的主流方法。由此可见,NeRF技术的新颖性与实用性。今天,我们就来看一看NeRF是个啥,学习以下该方法到底强在哪里。1. 简介NeRF全称为Neural Radiance Fields(神经辐射场),是一项利用多目图像重建三维场景的技术。该项目的作者来自于加州大学伯..原创 2022-02-20 17:43:41 · 35535 阅读 · 2 评论 -
Gaussian Mixture Model:混合高斯模型介绍
最近看一些计算机视觉和图形学类的文章,经常发现一个被称为Gaussian mixture model(GMM)的技术,应用在图像图形处理的算法中。出于好奇,我最近阅读了GMM的文献[1]。基于该文献,我将在这篇博客介绍一下GMM的一些核心思想以及比较成功的应用。1. 简介GMM是一个参数概率密度函数,由加权的分块高斯密度和表示。GMM通常被用来表示一个概率密度分布的参数模型,以提供一个特征度量。GMM的参数由训练数据获得,通过迭代计算Expectation-Maximization(EM,最大期望)原创 2022-02-16 19:50:33 · 3619 阅读 · 0 评论 -
C++各种数据类型(char*, string, int, double等)的相互转换
岁数大了,脑子就记不住东西了。每次写程序,到了数据转换这里,都要现查网上的代码。为了节省时间,我就在这篇博客里列出一些经常用到的类型转换代码,方便查找并使用,也希望能够帮助有需要的同学。1. String转换string转char*和char[]string _3D_object_path="Hello!";char * p = new char[strlen(_3D_object_path.c_str()) + 1];strcpy(p, _3D_object_path.c_str());原创 2022-01-28 16:10:35 · 2613 阅读 · 0 评论 -
panda的read_csv方法报错 No module named request?
今天学习李沐老师的Pytorch课程,复现一段读csv的代码,用到了panda包的read_csv方法。可是程序运行会报错,No module named 'request'。真是百思不得其解。在网上搜解决方案,发现一个哥们碰到跟我相同的问题,如下:查看底底下的回复,发现:我真心想骂人,这个什么panda和pandas什么的,为啥非要搞成这种极易混淆的样子...卸载原来安装的panda,改成pandas,包引用改为:import pandas as pd问题解决。...原创 2022-01-20 23:22:13 · 2497 阅读 · 1 评论 -
C++字符串操作
格式不严格,仅供参考1.获得指定字符或字符子串在字符串中的位置string s = "HelloWorld.obj"int n = s.find(".obj", 1);2.按照指定的标号截取字符串string s2 = s(0, 3);//第一个参数为起始位置,第二个参数为截取长度3.字符串连接string s3 = s1 + s2;原创 2017-01-20 20:07:50 · 157 阅读 · 0 评论 -
json对象的遍历(C++)
在使用C++的项目中,对json进行解析时,如果对象列表过长,通常就需要对对象进行遍历,来实现解析。我参看了博客,如下:https://blog.youkuaiyun.com/hellokandy/article/details/51607311使用iterater对json对象列表进行遍历。由于缺乏对json的理解,没有将其成功的应用到我自己的程序中。在查询json文档后,我发觉有函数可以将...原创 2018-12-04 17:47:22 · 9067 阅读 · 0 评论 -
在Linux上安装Cuda的问题汇总
在linux上调深度学习代码,最麻烦的调试老代码,需要配置各种版本的cuda。这就涉及到经常要删除cuda,重装cuda。中间有任何的错误,都可能导致前功尽弃。本文记录下我在配置cuda中遇到的问题以及各种尝试,以做备忘。问题1. 使用deb安装cuda,版本会自动升级。这个问题很奇怪,我按照nvidia官网上的安装方法安装cuda,下载的是10.1,结果安装完后直接变成11.4。神奇的是,我下的是local的安装包,不是在线安装。代码如下:sudo dpkg -icuda-repo-ubun.原创 2021-07-29 19:37:49 · 2008 阅读 · 0 评论 -
VS2019本地项目同步Github仓库
最近出于实际应用的需求,需要尝试对VS项目进行同步管理。这里选择基于github仓库进行同步。在网上找了很多的介绍,加上自己的一点常识,在这里给出具体的实现方法。一. 将本地项目发布到Guthub仓库1. 安装插件:菜单栏 -> 扩展 -> 管理扩展 -> 搜索GitHub Extension for Visual Studio 并安装2. 建立本地仓库2.1 首先设置源代码插件2.2 右键解决方案->将解决方案添加到源代码管理这样基本就完成了原创 2020-09-07 15:07:00 · 4943 阅读 · 2 评论 -
基于vector实现带有键值的最小(大)堆
最小(大)堆作为一个二叉树结构,广泛应用于最值维护问题。其时间复杂度相对于最小值查找来说,能够从O(n)降低到O(logn)。这里,我们介绍基于vector和C++标准库的带键值最小堆实现。首先需要引入相关的头文件:# include <vector># include <functional># include <algorithm>如果是不带键值的最小堆,比较容易实现。vector<int> minList;make_heap(m原创 2020-10-28 11:44:23 · 390 阅读 · 0 评论 -
C++字符串与字符数组转换
不是很严格的方法,仅供参考。字符串转字符数组:string fileNameObj ="Hello World!"”;char fileNameChar[128];strcpy(fileNameChar, fileNameObj.c_str());字符数组转字符串直接赋值即可 string fileNameObj;char fileNameChar[128]="Hel...原创 2017-01-20 16:14:33 · 700 阅读 · 0 评论 -
L-BFGS算法在点云网格重建中的应用
在上一篇博客(https://blog.youkuaiyun.com/aliexken/article/details/108020050)中,我们已经介绍了L-BFGS算法的由来于功能,在这一篇中,我们来用一个点云重建工作的实例来具体说明L-BFGS算法是如何解决实际优化问题的。1. 问题描述在之前的工作中,我们已经描述过利用CVT算法实现点云网格重建,即基于Centroidal Voronoi Tessellation (CVT)算法的点云三角网格化方法,https://blog.youkuaiyun.com/alie原创 2020-08-19 18:03:48 · 686 阅读 · 1 评论 -
Interior-point methods(内点法)学习笔记
最近在搞点云处理的项目,其中对于拉普拉斯图的相关处理中,使用到了内点法进行优化,于是开始着手学习。部分内容转载自:https://blog.youkuaiyun.com/dymodi/article/details/464417831. 问题描述:(障碍函数法)内点法用于求解带有约束的优化命题。f0为优化目标函数,fi{i=1,...,m}(二阶可导的凸函数)以及Ax=b为约束函数。存...原创 2020-01-15 16:11:22 · 6294 阅读 · 1 评论 -
优化方法:牛顿法,BFGS和L-BFGS算法。
部分内容转自:https://blog.youkuaiyun.com/weixin_39445556/article/details/84502260之前已经介绍过利用Mosek实现带边界的多元函数优化问题,今天我们来具体看一下这些优化方法底层的实现,包括牛顿法,BFGS以及L-BFGS方法。一. 牛顿法牛顿发现,对一个函数求根,可以根据迭代的计算切空间映射的值来逼近,演示如下:牛顿法求根步骤:1. 已知函数f(x)的情况下,随机产生点x0。2. 由已知的x0点按照进行k此迭代。3. 如原创 2020-08-17 12:00:33 · 3410 阅读 · 0 评论 -
使用Python的matplotlib画图
最近做论文大修,按照审稿人的要求,需要对实验图片进行重画。做了下调研,还是觉得用matplot比较方便,所以特意学了一下,把一些比较关键的功能分享给大家,做个参考。在pycharm里,下载相关的功能包,包括numpy和matplot。首先导入包:import matplotlib.pyplotas pltimport numpy as np1. 画一条直线和一条二次曲线:...原创 2020-02-18 15:36:53 · 1128 阅读 · 0 评论 -
基于有道词典的英文词汇翻译API接口介绍,以及基于VS平台的C#程序实现
在很多文本处理有关的应用中,需要用户提供对英文词汇的翻译功能。人工处理费时费力,如果能够有基于脚本与云服务的英文词典API实现自动的英文单词服务,将大大提高类似应用的执行效率。这里介绍一种基于有道智云相关服务的单词自动翻译实现方法。在部署应用前,可先登陆有道智云:https://ai.youdao.com/?keyfrom=old-openapi可以在该网站上查看有道智云的相关服务,以...原创 2019-09-11 09:46:03 · 3800 阅读 · 0 评论 -
利用自然语言处理项目实现分词与词性理解(VS2017+百度自然语言处理SDK)
最近在做一些语音识别和语义理解方面的项目,在VS平台上配置还是费了点劲。记录下来一些重要的步骤,和大家分享。1.配置curl,json和openssl这个部分我按照网上一些博客的指导,在win32平台下进行了编译,下载文件见下边:https://download.youkuaiyun.com/download/aliexken/108276702.配置项目:将百度的项目按照说明文档进行...原创 2018-12-04 16:57:02 · 402 阅读 · 1 评论 -
json的中文显示以及转码问题
利用服务器返回结果的一些程序中,返回的汉字是UTF-8格式,如百度语音识别处理的返回结果,直接打印如下:返回的结果是正确的,但是由于是UTF格式,所以不能正确显示为汉字,原因是系统对汉字的显示方式,默认不是UTF-8。为了能够正确的显示汉字返回结果,这里需要做一个转码过程,代码如下:(忘记是从哪里找的了。。。)std::string UTF8_To_string(const std...原创 2019-08-26 14:39:59 · 4773 阅读 · 0 评论 -
VS项目中配置matplotlib-cpp绘制图片
很难让人接受的是,相比Python,在C++项目中使用绘图工具竟然是一件困难的事。当然,我也用过一些开源的C++绘图工具库,但是始终不能让人满意。结果是,我会利用opencv绘制部分图片,另外配合python中使用matplotlib来完成一些更复杂的绘图任务。这样的工作流让人异常绝望。最近我发现matplotlib是提供了C++的接口的,即matplotlib-cpp。为了能够建立更加高效的基于C++的绘图工具流,我决定学习一下这个库,并希望这篇博客能够帮助到那些希望使用C++绘制图片的人。原创 2021-12-03 17:44:44 · 10752 阅读 · 13 评论 -
新mosek学习笔记4:部分API接口介绍与数据交互
API约定边界向量格式:三种不同的向量格式在MOSEK API中完整的稠密向量MSKrealt * c = MSK_calloctask(task, numvar, sizeof(MSKrealt));if ( c ) res = MSK_getc(task,c);else printf("Out of space\n");向量切分...原创 2020-03-03 21:23:34 · 438 阅读 · 0 评论 -
新mosek学习笔记3.2:优化过程 (二次优化)
Quadratic Optimization这里介绍一个二次优化的例子,也是在我的算法实现中需要学习的部分。Q^0和Q^k是对称的,因为:这样一个非对称的Q能够被替换为对称矩阵:优化问题需要确定边界,矩阵Q^0必须是正半正定, 第k个约束的形态伴随负半正定Q^k的形式如果不满足凸性(即半限定)条件,MOSEK将不会产生可靠的结果或工作。实例:...原创 2020-03-03 17:15:42 · 1823 阅读 · 0 评论 -
新mosek学习笔记3.1:优化过程 (线性优化)
这里就不扯咸蛋了,主要介绍两个优化问题,一个线性优化,一个就是让我蛋疼的二次优化。Linear Optimization一般形式:通过实例来看:处理流程:1. 创建环境; 2. 创建一个优化任务; 3. 载入一个问题进入任务对象; 4. 优化; 5. 获取求解结果按照处理流程我们来分析代码:1. 创建环境 r = MSK_makeenv(&env,...原创 2020-03-03 10:11:20 · 1847 阅读 · 4 评论 -
新mosek学习笔记2:设计框架
接口的主要特定为:接优化问题,如下形式:该优化问题被描述为矩阵形式:矩阵A,向量b,c, 以及约束列表K。简化:一旦问题数据被设置为矩阵形式,可以直接输入到优化器中利用稀疏:数据被输入稀疏的格式,允许可以有效地定义和解决巨大的稀疏问题。高效:在用户定义的问题表示与mosek内部实现之间,优化器API几乎不会产生额外的开销不同于fusion,基于C的优化API不提供建模服...原创 2020-02-29 17:22:44 · 639 阅读 · 0 评论 -
死磕Mosek!新mosek学习笔记1:VS项目配置。
啥也不说了,我就跟Mosek死磕了,从头开始学MOSEKOptimizer API for C 9.1.13。Create a project or open an existing project in Visual Studio. In theSolution Explorerright-click on the relevant project and selectPrope...原创 2020-02-29 15:48:06 · 1742 阅读 · 3 评论