1、Cmake相关
cmake -S . -B build
-S . 表示CMakeLists.txt在哪个目录
-B build CMake生成结果在哪个路径 build就是路径名
简短
cmake -B build
或进入build 文件夹下 cmake
cmake --build build
在build文件夹下编译
常量:CMAKE_CURRENT_LIST_DIR CMAKE_BUILD_TYPE
# INC_DIR
set(INC_DIR ${CMAKE_CURRENT_LIST_DIR}/../include CACHE INTERNAL "Header files directory for this project" FORCE)
# 第三方库头文件目录
set(INC_GTEST ${3RDPARTY_DIR}/googletest/${CMAKE_BUILD_TYPE}/include CACHE INTERNAL "INC_GTEST" FORCE)
# 设置第三方库文件路径
set(LINK_LIB_DIR_GTEST ${3RDPARTY_DIR}/googletest/${CMAKE_BUILD_TYPE}/lib CACHE INTERNAL "LINK_LIB_DIR_GTEST" FORCE)
set(LINK_DLL_DIR_GTEST ${3RDPARTY_DIR}/googletest/${CMAKE_BUILD_TYPE}/bin CACHE INTERNAL "LINK_DLL_DIR_GTEST" FORCE)
# 引入头文件
macro(include_headers)
# 引入头文件
include_directories(
${INC_DIR}
)
# 引入头文件(第三方)
include_directories(
${3RDPARTY_INC_DIR}
)
endmacro()
2、Linux命令
1、在 Linux 中,可以使用tar命令将文件或目录压缩成tar.gz格式
tar -czvf file.tar.gz file.txt
tar -czvf files.tar.gz file1.txt file2.txt file3.txt
tar -czvf mydir.tar.gz mydir
2、在Linux中,使用tar命令解压tar.gz格式文件
tar -xzvf file.tar.gz -C mydir
3、在Linux中,新建文件夹
mkdir fileName
4、删除文件或文件夹
rm -rf file
5、修改文件的访问权限
chmod 777 fileName
6、cmake编译
cmake -S pathInput -B pathOut
pathInput是 .cmake文件所在目录 还需要main.cpp和CMakeLists.txt文件
pathOut是编译生成的目录
3、CV相关
1、视频插帧算法:GitHub - baowenbo/DAIN: Depth-Aware Video Frame Interpolation (CVPR 2019)
DAIN的全称是Depth-Aware Video Frame Interpolation,即深度感知视频帧插值。
视频帧插值的目的是在原始帧之间合成不存在的帧。
2、常用的光流方法包括 Lucas-Kanade 光流法、Horn-Schunck 光流法等。
常用的深度学习方法包括DAIN、Super SloMo。
3、Quadratic Video Interpolation(QVI)方法考虑了视频中帧间物体运动的加速度信息,采用匀加速运动模型进行插帧。该方法包括两个关键模块:quadratic flow prediction 模块和 flow reversal 模块。quadratic flow prediction 模块通过分析相邻帧之间的像素变化,预测出物体的运动轨迹和加速度信息。然后,根据这些信息生成一个二次函数来描述物体的运动。flow reversal 模块则用于反转光流,以确保生成的插值帧在时间上的连续性。
4、新视角合成:GitHub - bmild/nerf: Code release for NeRF (Neural Radiance Fields)
GitHub - HengyiWang/spann3r: [3DV'25] 3D Reconstruction with Spatial Memory
GitHub - graphdeco-inria/gaussian-splatting: Original reference implementation of "3D Gaussian Splatting for Real-Time Radiance Field Rendering"
4、OpenCV相关
1、计算两个平面间的透视变换矩阵
Mat
findHomography
(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )输入数据格式CV_32FC2或者vector<Point2f>,输出矩阵3*3
目标寻找透视变换矩阵H,满足如下:
反投影误差:
2、计算4组点对间的透视变换矩阵
Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU)
Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU)
输入数据格式Point2f[],输出矩阵3*3,是findHomography的特殊版本
3、对2D/3D点做透视变换
void perspectiveTransform(InputArray src, OutputArray dst, InputArray m )
输入为CV_32FC2 / CV_32FC3, 透视变换矩阵为3*3 / 4*4 CV_32FC1,输出格式与src一致
4、对图片做透视变换
void warpPerspective( InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR)
输入为图片src,M为3*3矩阵,dsize为输出图像尺寸,输出为图片dst
5、计算2个2D点击间最优的2D仿射变换
cv::Mat estimateAffine2D(InputArray from, InputArray to, OutputArray inliers = noArray())
输入为2组2D点集,输出为2*3矩阵
6、计算3组点对间的仿射变换矩阵
Mat getAffineTransform( const Point2f src[], const Point2f dst[] )
Mat getAffineTransform( InputArray src, InputArray dst )
输入为3组点对,输出为2*3矩阵
7、计算仿射变换的逆变换
void invertAffineTransform( InputArray M, OutputArray iM )
输入为2*3矩阵,输出为2*3矩阵
8、元素的矩阵变换
void transform(InputArray src, OutputArray dst, InputArray m )
输入m为2*2 / 2*3 CV_32FC1,src.channels=m.cols or m.cols-1,输出dst.channels=m.rows
9、对图片做仿射变换
void warpAffine( InputArray src, OutputArray dst, InputArray M, Size dsize, int flags = INTER_LINEAR)
输入为图片src, 仿射变换M为2*3矩阵,输出为图片dst
10、计算最优的3D仿射变换
int
estimateAffine3D
(InputArray src, InputArray dst, OutputArray out, OutputArray inliers, double ransacThreshold=3, double confidence=0.99)输入两个3D点集,输出3D仿射变换矩阵3*4
11、寻找初始相机参数
Mat
initCameraMatrix2D
(InputArrayOfArrays objectPoints, InputArrayOfArrays imagePoints, Size imageSize, double aspectRatio=1.)
12、投影3D到图像平面
void
projectPoints
(InputArray objectPoints, InputArray rvec, InputArray tvec, InputArray cameraMatrix, InputArray distCoeffs, OutputArray imagePoints, OutputArray jacobian=noArray(), double aspectRatio=0 )输入:3*N/N*3的1通道 or 1*N/N*1的3通道(or vector<Point3f>)
输出:2*N/N*2的1通道 or 1*N/N*1的2通道(or vector<Point2f>)
13、计算目标位姿从3D-2D点
bool
solvePnP
(InputArray objectPoints, InputArray imagePoints, InputArray cameraMatrix, InputArray distCoeffs, OutputArray rvec, OutputArray tvec, bool useExtrinsicGuess=false, int flags=ITERATIVE )输入:3D点集和2D点集、相机参数、畸变参数
输出:旋转向量和平移向量
PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。
已知量是空间点的真实坐标和图像坐标,未知量是相机的位姿。
求解方法,例如用三对点估计位姿的 P3P 、直接线性变换(DLT)、EPnP。
5、深度估计
https://cloud.tencent.com/developer/article/2443971
深度估计是一种计算机视觉任务,旨在从2D图像估计深度。该任务需要输入RGB图像并输出深度图像。深度图像包括关于从视点到图像中的物体的距离的信息,该视点通常是拍摄图像的相机。
1、基于深度学习方法depth-estimation的开山之作:Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
https://arxiv.org/abs/1406.2283
2、再看2024年较火的由港大&字节提出用于任意图像的深度估计大模型:Depth Anything
- 首先, 基于数据集 Dl 学习一个老师模型 T;
- 然后, 利用 T 为数据集 Du 赋予伪标签;
- 最后, 基于两个数据训练一个学生模型 S 。
https://zhuanlan.zhihu.com/p/704319608
单目深度估计(Monocular Depth Estimation, MDE)旨在从单张图像中恢复出场景的三维结构。
6、搜索算法
两种常见的搜索算法:深度优先搜索(Depth-First Search,DFS)和广度优先搜索(Breadth-First Search,BFS)。
1、深度优先搜索是一种基于栈数据结构的搜索算法。它从起始节点开始,沿着一条路径尽可能深地探索下去,直到无法继续前进时,再回溯到上一个节点,尝试其他未探索的路径。
通常使用递归或者栈来模拟深度优先搜索的过程。
优点:内存占用相对较少,适合搜索深度较大的问题,能处理复杂的树形结构。
缺点:可能陷入无限循环(环路),不保证找到最优解。
应用场景:
-
图的连通性问题:判断一个图是否连通,通过深度优先搜索遍历图中的所有节点,若能访问到所有节点,则图是连通的。
-
迷宫求解:在迷宫中寻找出路,深度优先搜索可以不断尝试新的路径,直到找到出口或遍历完所有可能的路径。
-
回溯算法:许多问题可以通过回溯算法解决,而深度优先搜索是回溯算法的一种实现方式,例如八皇后问题、数独求解等。
2、广度优先搜索是一种基于队列数据结构的搜索算法。它从起始节点开始,依次访问其所有相邻节点,然后再依次访问这些相邻节点的相邻节点,如此逐层向外扩展,就像以起始节点为中心,一层一层地向外扩散搜索。
使用队列来实现广度优先搜索。
优点:一定能找到最短路径,不会陷入无限循环。
缺点:内存消耗较大 ,搜索时间可能较长。
应用场景:社交网络中的好友关系搜索、地图导航、层次遍历二叉树。
7、形态学
形态学通常用于二值图像。
膨胀就是求局部最大值的操作,核B与图像卷积,即计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。
腐蚀就是求局部最小值的操作。核B与图像卷积,即计算核B覆盖的区域的像素点的最小值,并把这个最小值赋值给参考点指定的像素。
开运算其实就是先腐蚀再膨胀,开运算可以用来可以去掉目标外的孤立点,消除小物体。
闭运算其实就是先膨胀再腐蚀,闭运算能够可以去掉目标内的孔。
形态学梯度就是膨胀图与腐蚀图之差。
顶帽就是原图与开运算图之差。
黑帽就是原图与闭运算图之差。
膨胀的原理应该是用结构的原点遍历所有原图中的背景点,看结构与原图中的前景点有没有重叠的部分,若有重叠的部分,则标记原图中的该背景点,使之成为新的前景点。
8、压缩模型
参考:模型压缩之知识蒸馏 - 飞桨AI Studio星河社区 (baidu.com)
1、知识蒸馏,迁移学习,通过采用预先训练好的负载模型(Teacher model)的输出作为监督信号去训练另一个简单的网络,这个简单的网络被称为student model。
softmax:输入一个实数向量并返回一个概率分布,输出的每一个元素都是非负,并所有元素的综合等于1,第i个softmax(x)的计算方式为
log_softmax:对softmax处理之后的结果执行一次对数运算, 即,log(softmax(output))。
NLLLoss:全称是negative log likelihood loss
CrossEntropy:交叉熵损失,等价于log_softmax+nll_loss,对于N分类问题,对于一个特定样本,已知真实标签,CrossEntropy计算公式为
其中,p表示真实值,one-hot形式,q是经过softmax计算后的结果,qk表示神经网络认为该样本为第k类的概率。
若该样本的真实标签为y,则CrossEntropy计算公式为
知识蒸馏:2014年,Geoffrey Hinton在 Distilling the Knowledge in a Neural Network 中提出知识蒸馏(KD)概念:把从一个复杂的大模型(Teacher Network)上学习到的知识迁移到另一个更适合部署的小模型上(Student Network),叫知识蒸馏。
2、剪枝
3、量化
量化是一种将较大尺寸的模型(如 LLM 或任何深度学习模型)压缩为较小尺寸的方法。量化主要涉及对模型的权重参数和激活值进行量化。
7B的大模型FP16部署权重14G,INT8是8G,INT4再砍半是4G。
量化两大作用:降低显存需要,提升推理性能。
FP32:深度学习默认使用精度,-3.4*10^38~3.4*10^38,精度10^-6
FP16:-65504~65504,精度10^-3
Int32:-2.15*10^9~2.15*10^9,精度1
Int16:-32768~32767,精度1
Int8:-128~127,精度1
Int4:-16~15,精度1
9、编译动态库
#include <string>
#ifndef IMAGEMULTIFOCUSHECHENG_d
#define IMAGEMULTIFOCUSHECHENG_d/* 宏定义导出*/
#ifndef MY_DLL
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endifMY_DLL_API int myFunc(const std::string &strRtPth, const std::string &strPth);
#endif
https://blog.csdn.net/qq_42279379/article/details/138598351
10、结构光相机
单目结构光相机
奥比中光的结构光深度相机由激光发射器projector、IR相机、RGB相机以及一块专门用于计算深度的处理器(深度引擎)组成。(IR表示红外,projector表示投影仪)
结构光的基本原理:由激光模组发射散斑打在物体上O点,然后由IR模组接收由不同距离物体反射回来的散斑K1点,对于激光发出的同一射线PO,经过参考平面上的R点,在IR sensor上的成像点为R1。因此对于R1和K1来说,该成像点实际上同一射线在不同距离下的投影点,这组匹配点位置的差作为视差d,而O到相机平面的距离称之为深度Z,所以Z与视差d的相关可以根据相似三角形得知:
双目结构光
双目结构光三维测量的硬件通常由单个DLP投影仪和一对双目相机组成,DLP用于投影光栅条纹到测量物体表面,然后通过触发信号至双目相机,并采集反射的条纹图像。
编码方式通常采用相移+时域相位解包,目的是为了获取绝对相位信息。其中,相移方法为了获取包裹相位,时域相位解包方法,例如格雷码方法、多频外差方法、倍频方法、Phase-coding方法,对相移方法得到的包裹相位进行解包,获取绝对相位信息。
11、