PCL从理解到应用【06】 RANSAC原理分析 | 案例分析 | 代码实现

前言

本文分析RANSAC算法的原理,集合案例深入理解,同时提供源代码。

RANSAC,随机采样一致性,是一种迭代的算法,用于从一组包含异常值的数据中估计模型参数。

应用案例:平面拟合、线段拟合、球体拟合等。

 看看基于RANSAC的球体拟合可视化结果,如下图所示:

输出的拟合系数

Model coefficients: 1.96703 0.455202 3.86515 1.24063

对应:球体的中心(x,y,z)和半径r

一、RANSAC 原理分析

RANSAC(Random Sample Consensus,随机采样一致性)是一种迭代的算法,用于从一组包含异常值的数据中估计模型参数。

它由Fischler和Bolles于1981年提出,特别适用于在存在大量噪声或异常值的情况下,估计模型的参数。

  • 输入数据和模型

    • 输入数据集,其中包含内点(符合模型的数据点)和外点(异常值)。
    • 选择一个适合于问题的模型,例如直线、平面、变换矩阵等。
  • 迭代过程

    • 设定最大迭代次数N和误差阈值T
    • 在每次迭代中,随机选择一个最小子集的数据点(样本集),该子集应该足够小以保证计算模型参数。
    • 根据样本集计算模型参数。
  • 模型评估

    • 使用计算出的模型参数评估所有数据点,计算每个数据点与模型的误差。
    • 统计误差在阈值T内的内点数目。
    • 如果当前模型的内点数目超过之前的最佳模型,则更新最佳模型和最佳内点集。
  • 终止条件

    • 迭代达到最大次数N或者找到了足够好的模型。
  • 输出

    • 最佳模型参数和对应的内点集。

下面分析一下与RANSAC相近的算法

    算法       简介                     原理         特点计算复杂度         优点        缺点
RANSAC随机采样一致性算法迭代随机采样,估计模型参数,选择内点最多的模型通用模型估计中等简单易实现,对异常值鲁棒需要设定参数,效率较低
MLESAC基于最大似然估计的采样一致性算法结合最大似然估计,通过最大化数据的似然估计来选择模型参数提高了参数估计的准确性较高对噪声和异常值处理更好计算复杂度高,参数选择敏感
MSAC基于M估计的采样一致性算法类似于RANSAC,但通过最小化所有数据点的代价函数来选择最佳模型更好地考虑所有数据点的误差较高对异常值有更好的容忍度计算复杂度相对较高
PROSAC进步采样一致性算法利用数据点的排序信息,优先从高质量点中选择样本集,提高采样效率高效准确,快速收敛较高更快地收敛到最佳模型需要对数据点进行排序,预处理时间较长
LMedS最小中位数平方算法通过最小化残差的中位数来估计模型参数对异常值非常鲁棒很高对异常值非常鲁棒,不需要预设误差阈值计算复杂度高,处理大数据集时效率较低
Theil-Sen非参数线性回归估计计算所有数据点对之间斜率的中位数来估计回归系数非参数方法,特别适用于线性回归较低对异常值具有较强的抗干扰能力,计算简单,效率较高主要用于线性模型,适用范围较窄

RANSAC算法广泛应用于计算机视觉和图像处理领域,如:

  • 图像拼接:在图像配准过程中,通过RANSAC算法估计变换矩阵。
  • 三维重建:用于点云配准,估计旋转和平移矩阵。
  • 平面拟合:在三维点云数据中,拟合平面或其他几何模型。

二、RANSAC常用方法

在PCL中,RANSAC(随机采样一致性)是一种常用的模型拟合算法,用于从点云数据中提取几何模型。

PCL 提供了多个与 RANSAC 相关的函数和类,用于不同类型的模型拟合

  • pcl::SampleConsensusModel:这是一个抽象基类,定义了所有采样一致性模型应实现的接口。具体的模型类继承自这个基类。
  • pcl::SampleConsensusModelPlane:用于平面模型的拟合。
  • pcl::SampleConsensusModelLine:用于线模型的拟合。
  • pcl::SampleConsensusModelCircle2D:用于二维圆模型的拟合。
  • pcl::SampleConsensusModelSphere:用于球体模型的拟合。
  • pcl::SampleConsensusModelCylinder:用于圆柱体模型的拟合。
  • pcl::SampleConsensusModelNormalPlane:用于法线约束的平面模型的拟合。
  • pcl::RandomSampleConsensus:这是 RANSAC 算法的具体实现类。可以与上述模型类结合使用。

1. pcl::SampleConsensusModel

pcl::SampleConsensusModel 是所有采样一致性模型的基类。

它定义了所有模型应实现的基本接口。具体的模型类会从这个基类继承并实现其方法。

2. pcl::SampleConsensusModelPlane

这个类用于平面模型的拟合。它继承自 pcl::SampleConsensusModel 并实现了平面模型的特定方法。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算平面模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

3. pcl::SampleConsensusModelLine

这个类用于线模型的拟合。它也继承自 pcl::SampleConsensusModel 并实现了线模型的特定方法。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算线模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

4. pcl::SampleConsensusModelCircle2D

这个类用于二维圆模型的拟合。它适用于在 XY 平面中的点云数据。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算二维圆模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

5. pcl::SampleConsensusModelSphere

这个类用于球体模型的拟合。它适用于三维点云数据中的球体检测。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算球体模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

6. pcl::SampleConsensusModelCylinder

这个类用于圆柱体模型的拟合。它适用于三维点云数据中的圆柱体检测。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算圆柱体模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

7. pcl::SampleConsensusModelNormalPlane

这个类用于法线约束的平面模型的拟合。它在普通的平面模型拟合基础上增加了法线约束,以提高拟合精度。

主要方法:

  • computeModelCoefficients(const std::vector<int> &samples, Eigen::VectorXf &model_coefficients): 计算带法线约束的平面模型的系数。
  • isModelValid(const Eigen::VectorXf &model_coefficients): 检查模型是否有效。

8. pcl::RandomSampleConsensus

pcl::RandomSampleConsensus 是 RANSAC 算法的具体实现类。它可以与上述各种模型类结合使用,以实现不同类型的几何模型拟合。

主要方法:

  • computeModel(int debug_verbosity_level = 0): 运行 RANSAC 算法,计算模型系数。
  • getInliers(): 获取内点集合。
  • getModelCoefficients(): 获取模型系数。

三、RANSAC优缺点分析

优点

  • 对于有大量异常值的数据集,RANSAC算法可以有效地估计模型参数。
  • 算法简单易实现,且适用于多种不同类型的模型估计问题。

缺点

  • 需要设定最大迭代次数和误差阈值,参数的选择对算法的效果有很大影响。
  • 随机采样可能导致计算时间较长,特别是在数据集较大且异常值较多的情况下。
  • 如果数据中内点比例非常低,RANSAC可能需要大量的迭代才能找到合适的模型。

用途:

  1. 平面拟合,可以用于从点云数据中提取平面。这在3D建模、建筑扫描和机器人导航中非常有用。
  2. 线条检测,在图像处理和计算机视觉中,RANSAC 可以用于从二维数据中检测直线,如道路检测、车道线识别等。
  3. 圆和球体检测,用于检测二维图像中的圆形或三维点云中的球体。这在物体识别和形状分析中很有用。
  4. 立体视觉,用于立体匹配中的基础矩阵或单应矩阵的估计。这有助于从两个视点重建3D场景。
  5. 相机标定,在相机标定中,RANSAC 可用于估计相机的内参和外参,处理噪声和异常值的影响,提高标定精度。
  6. 运动估计,用于运动估计,如在视频序列中跟踪物体的运动,估计相机运动,处理场景中的动态对象。
  7. 点云配准,在点云配准中,RANSAC 可用于估计点云之间的变换矩阵,特别是在初始对齐阶段,用于处理错误匹配。
  8. 特征匹配,可以用于图像特征匹配,如SIFT、SURF等特征点之间的匹配,通过处理错误匹配来提高匹配的可靠性。

四、RANSAC案例——平面拟合

使用 PCL 中的 RANSAC 生成一个随机平面点云,进行平面拟合,并可视化结果。

  • 生成随机平面点云

    • generateRandomPlane 函数随机生成一个平面上的点云数据。
    • 平面的参数 a, b, c, d 随机生成,点的坐标 (x, y, z) 满足平面方程 ax + by + cz + d = 0
  • 执行平面拟合

    • 创建 pcl::SampleConsensusModelPlane 对象用于定义平面模型。
    • 创建 pcl::RandomSampleConsensus 对象并设置适当的距离阈值。
    • 调用 ransac.computeModel() 方法执行 RANSAC 算法,计算平面模型参数。
    • 获取内点索引和模型系数。

核心代码:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <cstdlib>
#include <ctime>
#include <thread> 
#include <chrono>void generateRandomPlane(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num_points) {std::srand(std::time(nullptr));float a = static_cast<float>(std::rand()) / RAND_MAX;float b = static_cast<float>(std::rand()) / RAND_MAX;float c = static_cast<float>(std::rand()) / RAND_MAX;float d = static_cast<float>(std::rand()) / RAND_MAX;for (int i = 0; i < num_points; ++i) {pcl::PointXYZ point;point.x = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point.y = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point.z = -(a * point.x + b * point.y + d) / c;cloud->points.push_back(point);}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;
}int main(int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 生成随机平面点云generateRandomPlane(cloud, 1000);// 创建平面模型对象pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptrmodel_plane(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));// 创建 RANSAC 对象pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_plane);ransac.setDistanceThreshold(0.01);ransac.computeModel();// 获取内点索引std::vector<int> inliers;ransac.getInliers(inliers);// 输出模型系数Eigen::VectorXf coefficients;ransac.getModelCoefficients(coefficients);std::cout << "Model coefficients: " << coefficients[0] << " "<< coefficients[1] << " "<< coefficients[2] << " "<< coefficients[3] << std::endl;// 创建可视化对象pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加原始点云到可视化窗口pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 255, 255);viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color, "sample cloud");// 可视化拟合的平面pcl::ModelCoefficients::Ptr plane_coefficients(new pcl::ModelCoefficients);plane_coefficients->values.resize(4);plane_coefficients->values[0] = coefficients[0];plane_coefficients->values[1] = coefficients[1];plane_coefficients->values[2] = coefficients[2];plane_coefficients->values[3] = coefficients[3];viewer->addPlane(*plane_coefficients, "plane");// 开始主循环while (!viewer->wasStopped()) {viewer->spinOnce(100);std::this_thread::sleep_for(std::chrono::milliseconds(100));}return 0;
}

看看可视化结果,如下图所示:

输出的模型拟合系数:

Model coefficients:  0.837264 0.258466 0.481855 0.425604

对应平面的参数 a, b, c, d ,点的坐标 (x, y, z) 满足平面方程 ax + by + cz + d = 0

五、RANSAC案例——线段拟合

使用 PCL 中的 RANSAC 生成随机线段点云,进行线条拟合,并可视化结果。

  • 生成随机线段点云:创建一个函数随机生成线段上的点。
  • 执行线条拟合:使用 RANSAC 算法拟合线条模型。
  • 可视化结果:使用 PCL 的可视化工具显示点云和拟合的线条。

核心代码:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_line.h>
#include <cstdlib>
#include <ctime>
#include <thread>
#include <chrono>
#include <random>// 生成随机点云,并添加散乱的噪声
void generateRandomPointCloudWithScatterNoise(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num_points, float noise_stddev, int num_noise_points) {std::srand(std::time(nullptr));// 随机生成线段的两个端点pcl::PointXYZ point1, point2;point1.x = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point1.y = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point1.z = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point2.x = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point2.y = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;point2.z = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;// 创建一个正态分布生成器,用于添加噪声std::default_random_engine generator;std::normal_distribution<float> distribution(0.0, noise_stddev);// 生成线段上的随机点for (int i = 0; i < num_points; ++i) {float t = static_cast<float>(std::rand()) / RAND_MAX;pcl::PointXYZ point;point.x = point1.x + t * (point2.x - point1.x) + distribution(generator);point.y = point1.y + t * (point2.y - point1.y) + distribution(generator);point.z = point1.z + t * (point2.z - point1.z) + distribution(generator);cloud->points.push_back(point);}// 添加散乱的噪声点for (int i = 0; i < num_noise_points; ++i) {pcl::PointXYZ noise_point;noise_point.x = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;noise_point.y = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;noise_point.z = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;cloud->points.push_back(noise_point);}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;
}int main(int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 生成带有散乱噪声的随机点云generateRandomPointCloudWithScatterNoise(cloud, 1000, 0.05f, 200);// 创建线段模型对象pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptrmodel_line(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud));// 创建 RANSAC 对象pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_line);ransac.setDistanceThreshold(0.05);ransac.computeModel();// 获取内点索引std::vector<int> inliers;ransac.getInliers(inliers);// 输出模型系数Eigen::VectorXf coefficients;ransac.getModelCoefficients(coefficients);std::cout << "Model coefficients: " << coefficients[0] << " "<< coefficients[1] << " "<< coefficients[2] << " "<< coefficients[3] << " "<< coefficients[4] << " "<< coefficients[5] << std::endl;// 创建可视化对象pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加原始点云到可视化窗口pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 255, 255);viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color, "sample cloud");// 可视化拟合的线条pcl::ModelCoefficients::Ptr line_coefficients(new pcl::ModelCoefficients);line_coefficients->values.resize(6);line_coefficients->values[0] = coefficients[0];line_coefficients->values[1] = coefficients[1];line_coefficients->values[2] = coefficients[2];line_coefficients->values[3] = coefficients[3];line_coefficients->values[4] = coefficients[4];line_coefficients->values[5] = coefficients[5];viewer->addLine(*line_coefficients, "line");// 开始主循环while (!viewer->wasStopped()) {viewer->spinOnce(100);std::this_thread::sleep_for(std::chrono::milliseconds(100));}return 0;
}
  • 生成随机点云并添加散乱噪声

    • generateRandomPointCloudWithScatterNoise 函数随机生成线段上的点,并在每个点的坐标上添加噪声。
    • 同时,生成一些散乱的噪声点,分布在整个空间中。
  • 执行线条拟合

    • 创建 pcl::SampleConsensusModelLine 对象用于定义线条模型。
    • 创建 pcl::RandomSampleConsensus 对象并设置适当的距离阈值(这里设置为 0.05,以考虑添加的噪声)。
    • 调用 ransac.computeModel() 方法执行 RANSAC 算法,计算线条模型参数。
    • 获取内点索引和模型系数。

看看可视化结果,如下图所示:

输出的拟合系数

Model coefficients: 6.4163 6.92066 2.9858 0.919972 -0.385063 0.0733363

对应:线段的两个端点(x1,y1,z1),(x2,y2,z2)

六、RANSAC案例——球体拟合

使用 PCL 中的 RANSAC 生成随机点云,进行球体检测,并可视化结果。

  • 生成随机球体点云并添加噪声

    • generateRandomSphereWithNoise 函数随机生成球体上的点。
    • 首先随机生成球体的中心和半径,然后在球体表面生成随机点,并在每个点的坐标上添加噪声。
    • 噪声是通过正态分布生成的,标准差由 noise_stddev 参数指定。
  • 执行球体检测

    • 创建 pcl::SampleConsensusModelSphere 对象用于定义球体模型。
    • 创建 pcl::RandomSampleConsensus 对象并设置适当的距离阈值(这里设置为 0.05,以考虑添加的噪声)。
    • 调用 ransac.computeModel() 方法执行 RANSAC 算法,计算球体模型参数。
    • 获取内点索引和模型系数。

核心代码:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_sphere.h>
#include <cstdlib>
#include <ctime>
#include <thread>
#include <chrono>
#include <random>// 生成随机球体点云,并添加噪声
void generateRandomSphereWithNoise(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, int num_points, float noise_stddev) {std::srand(std::time(nullptr));// 随机生成球体的中心和半径pcl::PointXYZ center;center.x = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;center.y = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;center.z = 10.0f * static_cast<float>(std::rand()) / RAND_MAX;float radius = 5.0f * static_cast<float>(std::rand()) / RAND_MAX + 1.0f; // 半径在 1.0 到 6.0 之间// 创建一个正态分布生成器,用于添加噪声std::default_random_engine generator;std::normal_distribution<float> distribution(0.0, noise_stddev);// 生成球体上的随机点,并添加噪声for (int i = 0; i < num_points; ++i) {float theta = 2.0f * M_PI * static_cast<float>(std::rand()) / RAND_MAX;float phi = M_PI * static_cast<float>(std::rand()) / RAND_MAX;pcl::PointXYZ point;point.x = center.x + radius * std::sin(phi) * std::cos(theta) + distribution(generator);point.y = center.y + radius * std::sin(phi) * std::sin(theta) + distribution(generator);point.z = center.z + radius * std::cos(phi) + distribution(generator);cloud->points.push_back(point);}cloud->width = static_cast<uint32_t>(cloud->points.size());cloud->height = 1;cloud->is_dense = true;
}int main(int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);// 生成带噪声的随机球体点云generateRandomSphereWithNoise(cloud, 1000, 0.05f);// 创建球体模型对象pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptrmodel_sphere(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));// 创建 RANSAC 对象pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_sphere);ransac.setDistanceThreshold(0.05);ransac.computeModel();// 获取内点索引std::vector<int> inliers;ransac.getInliers(inliers);// 输出模型系数Eigen::VectorXf coefficients;ransac.getModelCoefficients(coefficients);std::cout << "Model coefficients: " << coefficients[0] << " "<< coefficients[1] << " "<< coefficients[2] << " "<< coefficients[3] << std::endl;// 创建可视化对象pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);// 添加原始点云到可视化窗口pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color(cloud, 255, 255, 255);viewer->addPointCloud<pcl::PointXYZ>(cloud, cloud_color, "sample cloud");// 可视化拟合的球体pcl::ModelCoefficients::Ptr sphere_coefficients(new pcl::ModelCoefficients);sphere_coefficients->values.resize(4);sphere_coefficients->values[0] = coefficients[0];sphere_coefficients->values[1] = coefficients[1];sphere_coefficients->values[2] = coefficients[2];sphere_coefficients->values[3] = coefficients[3];viewer->addSphere(*sphere_coefficients, "sphere");// 开始主循环while (!viewer->wasStopped()) {viewer->spinOnce(100);std::this_thread::sleep_for(std::chrono::milliseconds(100));}return 0;
}

看看可视化结果,如下图所示:

输出的拟合系数

Model coefficients: 1.96703 0.455202 3.86515 1.24063

对应:球体的中心(x,y,z)和半径r

分享完成~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/46923.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++报错已解决】 “Undefined Reference“

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 前言 在编译程序时&#xff0c;遇到 “Undefined Reference” 报错总是令人头疼。这个错误提示通常意味着编译器找不到某个符号…

ctfshow 信息收集(1-20)

Web1 F12查看页面元素 Ctrlu查看源码 Web2 Ctrlu查看源码 Js代码知识点 //禁用鼠标右键 window.document.oncontextmenu function() { return false; } //禁用复制 window.document.onselectstart function() { return false; } //禁用F12 document.onkeydown fun…

【数学建模】技术革新——Lingo的使用超详解

目录 基础知识 1. 变量声明 示例 2. 常量声明 语法格式 示例 3. 目标函数 语法格式 示例 4. 约束条件 语法格式 示例 5. 完整的Lingo模型示例 示例 解释 6. 整数变量声明 语法格式 示例 7. 非线性规划 示例 8. 多目标优化 语法格式 示例 9. 数据输入与…

第一个AI应用(文心智能体平台)

第一个AI应用&#xff08;文心智能体平台&#xff09; 官网&#xff1a;https://agents.baidu.com/ 平台简介&#xff1a;https://agents.baidu.com/docs/ 部分内容由AI生成&#xff0c;注意甄别 一、什么是AI应用及其功能 AI应用&#xff0c;即人工智能应用&#xff0c;是利用…

虚拟化如何简化和加速灾难恢复

一. 简化恢复 在 IT 基础设施领域&#xff0c;灾难恢复是确保业务连续性的重要过程。通过传统机械方法进行恢复既费力又费时。然而&#xff0c;随着虚拟化技术的出现&#xff0c;这种情况发生了改变&#xff1b;虚拟化技术简化并加速了这一过程。 二. 传统恢复 传统的 DR 方法…

为ppt中的文字配色

文字的颜色来源于ppt不可删去的图像的颜色 从各类搜索网站中搜索ppt如何配色&#xff0c;有如下几点&#xff1a; 1.可以使用对比色&#xff0c;表示强调。 2.可以使用近似色&#xff0c;使得和谐统一。 3.最好一张ppt中&#xff0c;使用的颜色不超过三种主要颜色。 但我想强调…

Linux中六种常见工具

一、软件包管理器yum 1、yum概念 yum是一个软件下载安装管理的客户端&#xff0c;例如手机上的小米一应用商城。 那为什么我们推荐在Linux中用yum下载软件呢&#xff1f; 其实软件的安装有三种方式&#xff1a;源代码安装&#xff0c;rpm包安装&#xff0c;yum安装。 a、源…

pc端注册页面 密码校验规则

1.密码校验规则 格应包含大小写字母、数字和特殊符号,长度为8-20 var validateRetrievePassword (rule, value, callback) > {let reg /^(?.*[A-Za-z])(?.*\d)(?.*[~!#$%^&*()_<>?:"{},.\/\\;[\]])[A-Za-z\d~!#$%^&*()_<>?:"{},.\/\\;…

SPIQA:一个大规模的计算机科学论文多模态问题回答数据集

在科学论文中挖掘相关信息是一个至关重要的研究领域&#xff0c;因为它能够赋予学生和研究人员高效解决他们在读到科学论文时自然引发的问题的能力。然而&#xff0c;现有基于学术论文的问题回答数据集在规模上受到限制&#xff0c;并且主要分析的是科学文章论文的摘要、结论和…

写给大数据开发:为什么我们容易不信任数据

目录 1. 产品经理视角&#xff1a;数据优先级低故事与示例伪代码示例 2. 开发者视角&#xff1a;数据任务缺乏技术挑战故事与示例伪代码示例 3. 测试人员视角&#xff1a;数据的不可见性和逻辑复杂性故事与示例伪代码示例 4. 组织文化视角&#xff1a;缺乏数据意识故事与示例伪…

【Linux杂货铺】期末总结篇2:文件操作命令 | 目录操作命令

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 第四章4.1 ⛳️Linux与windows的文件系统差别4.2 ⛳️目录相关的常用术语4.3 ⛳️Linux文件类型…

嵌入式人工智能(3-树莓派4B点亮LED灯及LED灯闪烁)

1、LED与树莓派连接 LED是一种常用。廉价、高效的光源&#xff0c;其灯泡长腿为正极&#xff0c;短腿为负极。使用LED的注意如果将其直接连接到高于1.7V的电源上&#xff0c;会产生一个非常大的电流&#xff0c;导致LED甚至树莓派的损坏。通常情况下为LED配备一个串联电阻&…

Attention机制解析

Attention机制解析 1. 引言 Attention机制在自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;等领域取得了广泛的应用。其核心思想是通过对输入数据的不同部分赋予不同的权重&#xff0c;使模型能够更加关注重要的信息。本文将详细介绍Attent…

最优控制公式推导(代数里卡提方程,李雅普诺夫方程,HJB方程)

本文探讨了线性时不变系统&#xff08;LTI系统&#xff09;的最优控制问题&#xff0c;特别是线性二次调节器&#xff08;LQR&#xff09;问题。通过Hamilton-Jacobi-Bellman (HJB) 方程的推导&#xff0c;求得了系统的最优控制律&#xff0c;并进一步推导了代数里卡提方程&…

Python新手必学:如何解决Python安装包下载缓慢/无法下载的问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 临时使用镜像源📝 永久修改镜像源Windows系统macOS/Linux系统📝 推荐镜像源⚓️ 相关链接 ⚓️📖 介绍 📖 你是否曾在使用Python进行项目开发时,遇到过安装包下载速度如蜗牛爬行般的窘境?尤其是在急…

焊死,这38条命令还不会?难怪你的Windows那么费劲

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 下午好&#xff0c;我的网工朋友。 我们每天都在和各种设备打交道&#xff0c;而命令提示符&#xff08;CMD&#xff09;无疑是我们这些技术宅的得…

玩转HarmonyOS NEXT之IM应用首页布局

本文从目前流行的垂类市场中&#xff0c;选择即时通讯应用作为典型案例详细介绍HarmonyOS NEXT的各类布局在实际开发中的综合应用。即时通讯应用的核心功能为用户交互&#xff0c;主要包含对话聊天、通讯录&#xff0c;社交圈等交互功能。 应用首页 创建一个包含一列的栅格布…

Java进阶之路66问 | 谈谈对熔断,限流,降级的理解

熔断&#xff08;Circuit Breaker&#xff09; 熔断机制类似于电路中的保险丝&#xff0c;用于在服务或系统出现异常或超负荷时暂时关闭&#xff0c;防止问题进一步扩大&#xff0c;待问题解决后再逐步恢复。这可以有效保护系统免受过载的影响。 想象你在使用电器时&#xff0…

JAVA 异步编程(异步,线程,线程池)一

目录 1.概念 1.1 线程和进程的区别 1.2 线程的五种状态 1.3 单线程,多线程,线程池 1.4 异步与多线程的概念 2. 实现异步的方式 2.1 方式1 裸线程&#xff08;Thread&#xff09; 2.1 方式2 线程池&#xff08;Executor&#xff09; 2.1.1 源码分析 2.1.2 线程池创建…

南京邮电大学计算机考研考情分析!专业课均分127分!复试录取比例偏高近2:1!计算机类共录取543人!

南京邮电大学&#xff08;Nanjing University of Posts and Telecommunications&#xff09;&#xff0c;位于南京市&#xff0c;简称南邮&#xff08;NJUPT&#xff09;&#xff0c;是教育部、工业和信息化部、国家邮政局与江苏省共建高校&#xff0c;国家“双一流”建设高校&…