【opencv】示例-points_classifier.cpp 使用不同机器学习算法在二维空间中对点集进行分类...

94d0054ae0ba0d7ff35aadbf072116ea.png

4db1625a5a1856eaa4e9fdee0c7e235d.png

bdd39b4a84bdd382b384c669847bc528.png

#include "opencv2/core.hpp" // 包含OpenCV核心功能的文件
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理功能的文件
#include "opencv2/ml.hpp" // 包含OpenCV机器学习模块的文件
#include "opencv2/highgui.hpp" // 包含OpenCV用户界面组件的文件#include <stdio.h>using namespace std; // 使用标准命名空间
using namespace cv; // 使用OpenCV命名空间
using namespace cv::ml; // 使用OpenCV机器学习命名空间const Scalar WHITE_COLOR = Scalar(255,255,255); // 定义一个常量表示白色
const string winName = "points"; // 窗口名
const int testStep = 5; // 测试步长Mat img, imgDst; // 定义两个图像矩阵,img为原图,imgDst为显示结果用
RNG rng; // 随机数生成器vector<Point> trainedPoints; // 存储训练用的点
vector<int> trainedPointsMarkers; // 存储训练点所属的分类标记
const int MAX_CLASSES = 2; // 最大分类数
vector<Vec3b> classColors(MAX_CLASSES); // 存储每个分类的颜色
int currentClass = 0; // 当前选择的分类
vector<int> classCounters(MAX_CLASSES); // 存储每个分类的计数器// 定义一些预处理器标志以确定哪些分类器将会被使用
#define _NBC_ 1 // 正态贝叶斯分类器
#define _KNN_ 1 // K最近邻分类器
#define _SVM_ 1 // 支持向量机
#define _DT_  1 // 决策树
#define _BT_  1 // ADA提升
#define _GBT_ 0 // 梯度提升树
#define _RF_  1 // 随机森林
#define _ANN_ 1 // 人工神经网络
#define _EM_  1 // 期望最大化// 鼠标事件回调函数
static void on_mouse( int event, int x, int y, int /*flags*/, void* )
{if( img.empty() )return;int updateFlag = 0; // 更新标志if( event == EVENT_LBUTTONUP ) // 当鼠标左键松开时{trainedPoints.push_back( Point(x,y) ); // 添加一个点到训练集中trainedPointsMarkers.push_back( currentClass ); // 为这个点标记当前的类别classCounters[currentClass]++; // 相应类别的计数器加一updateFlag = true; // 设置更新标志为真}// 绘制if( updateFlag ){img = Scalar::all(0); // 将图像设置为黑色// 绘制点for( size_t i = 0; i < trainedPoints.size(); i++ ){Vec3b c = classColors[trainedPointsMarkers[i]]; // 获取点的颜色circle( img, trainedPoints[i], 5, Scalar(c), -1 ); // 在图像上用这个颜色绘制一个圆}imshow( winName, img ); // 显示图像}
}// 准备训练样本的辅助函数
static Mat prepare_train_samples(const vector<Point>& pts)
{Mat samples;Mat(pts).reshape(1, (int)pts.size()).convertTo(samples, CV_32F); // 将Point集合转换为Mat格式并改变数据类型return samples;
}// 准备训练数据的辅助函数
static Ptr<TrainData> prepare_train_data()
{Mat samples = prepare_train_samples(trainedPoints); // 准备样本return TrainData::create(samples, ROW_SAMPLE, Mat(trainedPointsMarkers)); // 创建训练数据对象
}// 使用模型进行预测并绘制结果的辅助函数
static void predict_and_paint(const Ptr<StatModel>& model, Mat& dst)
{Mat testSample( 1, 2, CV_32FC1 ); // 创建一个包含两个float类型数值的测试样本for( int y = 0; y < img.rows; y += testStep ) // 按步长遍历图像所有的y坐标{for( int x = 0; x < img.cols; x += testStep ) // 按步长遍历图像所有的x坐标{testSample.at<float>(0) = (float)x; // 设置样本x值testSample.at<float>(1) = (float)y; // 设置样本y值int response = (int)model->predict( testSample ); // 使用模型进行预测dst.at<Vec3b>(y, x) = classColors[response]; // 根据预测结果上色}}
}// 下面的一系列#if预处理器指令是为了在最终的程序中包含或者排除某些分类器的相关代码#if _NBC_
// 使用正态贝叶斯分类器找出决策边界
static void find_decision_boundary_NBC()
{// 学习分类器Ptr<NormalBayesClassifier> normalBayesClassifier = StatModel::train<NormalBayesClassifier>(prepare_train_data());// 预测并绘制决策边界predict_and_paint(normalBayesClassifier, imgDst);
}
#endif#if _KNN_
// 使用K最近邻分类器找出决策边界,并设置K值
static void find_decision_boundary_KNN( int K )
{// 创建KNN对象Ptr<KNearest> knn = KNearest::create();// 设置K值knn->setDefaultK(K);// 设置为分类模式knn->setIsClassifier(true);// 训练模型knn->train(prepare_train_data());// 预测并绘制决策边界predict_and_paint(knn, imgDst);
}
#endif#if _SVM_
// 使用支持向量机找出决策边界,并设置错误惩罚参数C
static void find_decision_boundary_SVM( double C )
{// 创建SVM对象Ptr<SVM> svm = SVM::create();// 设置SVM类型为C-SVCsvm->setType(SVM::C_SVC);// 设置核函数为多项式核svm->setKernel(SVM::POLY); // 也可以选用线性核SVM::LINEAR;// 设置多项式核参数degreesvm->setDegree(0.5);// 设置核函数参数gammasvm->setGamma(1);// 设置核函数参数coef0svm->setCoef0(1);// 设置SVM参数Nusvm->setNu(0.5);// 设置SVM参数Psvm->setP(0);// 设置训练算法的终止条件svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 1000, 0.01));// 设置错误惩罚参数Csvm->setC(C);// 训练模型svm->train(prepare_train_data());// 预测并绘制决策边界predict_and_paint(svm, imgDst);// 绘制支持向量Mat sv = svm->getSupportVectors();for( int i = 0; i < sv.rows; i++ ){const float* supportVector = sv.ptr<float>(i);circle( imgDst, Point(saturate_cast<int>(supportVector[0]),saturate_cast<int>(supportVector[1])), 5, Scalar(255,255,255), -1 );}
}
#endif#if _DT_
// 使用决策树找出决策边界
static void find_decision_boundary_DT()
{// 创建决策树对象Ptr<DTrees> dtree = DTrees::create();// 设置决策树最大深度dtree->setMaxDepth(8);// 设置节点最小样本数dtree->setMinSampleCount(2);// 设置是否使用代理分割dtree->setUseSurrogates(false);// 设置交叉验证折数dtree->setCVFolds(0); // 0表示不进行交叉验证// 设置是否使用1SE规则dtree->setUse1SERule(false);// 设置是否修剪被减枝的决策树dtree->setTruncatePrunedTree(false);// 训练模型dtree->train(prepare_train_data());// 预测并绘制决策边界predict_and_paint(dtree, imgDst);
}
#endif#if _BT_
// 使用提升树算法找出决策边界
static void find_decision_boundary_BT()
{// 创建提升树对象Ptr<Boost> boost = Boost::create();// 设置提升类型boost->setBoostType(Boost::DISCRETE);// 设置弱分类器数量boost->setWeakCount(100);// 设置权重修剪率boost->setWeightTrimRate(0.95);// 设置最大深度boost->setMaxDepth(2);// 设置是否使用代理分割boost->setUseSurrogates(false);// 设置类别先验概率boost->setPriors(Mat());// 训练模型boost->train(prepare_train_data());// 预测并绘制决策边界predict_and_paint(boost, imgDst);
}
#endif#if _GBT_
// 使用梯度提升树算法找出决策边界
static void find_decision_boundary_GBT()
{// 设置GBT模型参数GBTrees::Params params( GBTrees::DEVIANCE_LOSS, // 损失函数类型100, // 弱分类器数量0.1f, // 收缩率1.0f, // 子采样比例2, // 最大深度false // 是否使用代理分割);// 创建梯度提升树对象Ptr<GBTrees> gbtrees = StatModel::train<GBTrees>(prepare_train_data(), params);// 预测并绘制决策边界predict_and_paint(gbtrees, imgDst);
}
#endif#if _RF_
// 使用随机森林算法找出决策边界
static void find_decision_boundary_RF()
{// 创建随机森林对象Ptr<RTrees> rtrees = RTrees::create();// 设置最大深度rtrees->setMaxDepth(4);// 设置节点最小样本数rtrees->setMinSampleCount(2);// 设置回归精度rtrees->setRegressionAccuracy(0.f);// 设置是否使用代理分割rtrees->setUseSurrogates(false);// 设置类别数量rtrees->setMaxCategories(16);// 设置类别先验概率rtrees->setPriors(Mat());// 设置是否计算变量重要性rtrees->setCalculateVarImportance(false);// 设置活跃变量数量rtrees->setActiveVarCount(1);// 设置训练算法的终止条件rtrees->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 5, 0));// 训练模型rtrees->train(prepare_train_data());// 预测并绘制决策边界predict_and_paint(rtrees, imgDst);
}
#endif#if _ANN_
// 使用人工神经网络找出决策边界
static void find_decision_boundary_ANN( const Mat& layer_sizes )
{// 创建类别标签矩阵Mat trainClasses = Mat::zeros( (int)trainedPoints.size(), (int)classColors.size(), CV_32FC1 );for( int i = 0; i < trainClasses.rows; i++ ){trainClasses.at<float>(i, trainedPointsMarkers[i]) = 1.f; // 对应类别置为1}// 准备训练样本Mat samples = prepare_train_samples(trainedPoints);// 创建训练数据对象Ptr<TrainData> tdata = TrainData::create(samples, ROW_SAMPLE, trainClasses);// 创建人工神经网络对象Ptr<ANN_MLP> ann = ANN_MLP::create();// 设置网络层大小ann->setLayerSizes(layer_sizes);// 设置激活函数ann->setActivationFunction(ANN_MLP::SIGMOID_SYM, 1, 1);// 设置训练算法的终止条件ann->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 300, FLT_EPSILON));// 设置训练方法,这里使用反向传播算法ann->setTrainMethod(ANN_MLP::BACKPROP, 0.001);// 训练模型ann->train(tdata);// 预测并绘制决策边界predict_and_paint(ann, imgDst);
}
#endif#if _EM_
// 使用期望最大化算法找出决策边界
static void find_decision_boundary_EM()
{img.copyTo(imgDst); // 将当前图像复制给目标图像Mat samples = prepare_train_samples(trainedPoints); // 准备训练样本int i, j, nmodels = (int)classColors.size(); // 分类数量vector<Ptr<EM>> em_models(nmodels); // 存储每个类别对应的EM模型Mat modelSamples;// 遍历所有分类来训练EM模型for (i = 0; i < nmodels; i++){const int componentCount = 3; // 每个模型的分量数modelSamples.release(); // 释放模型样本空间// 提取当前类别的所有样本for (j = 0; j < samples.rows; j++){if (trainedPointsMarkers[j] == i)modelSamples.push_back(samples.row(j));}// 训练模型if (!modelSamples.empty()) // 如果当前类别有样本{Ptr<EM> em = EM::create(); // 创建EM模型em->setClustersNumber(componentCount); // 设置聚类数量em->setCovarianceMatrixType(EM::COV_MAT_DIAGONAL); // 设置协方差类型为对角线em->trainEM(modelSamples, noArray(), noArray(), noArray()); // 训练EM模型em_models[i] = em; // 存储训练好的模型}}// 使用贝叶斯分类器对坐标平面的点进行分类// y(x) = arg max_i=1_modelsCount likelihoods_i(x)Mat testSample(1, 2, CV_32FC1); // 测试样本Mat logLikelihoods(1, nmodels, CV_64FC1, Scalar(-DBL_MAX)); // 存储每个样本的概率// 遍历图像上的每个点for (int y = 0; y < img.rows; y += testStep) {for (int x = 0; x < img.cols; x += testStep){testSample.at<float>(0) = (float)x;testSample.at<float>(1) = (float)y;for (i = 0; i < nmodels; i++){if (!em_models[i].empty()) // 如果EM模型有效// 计算测试样本的对数似然概率logLikelihoods.at<double>(i) = em_models[i]->predict2(testSample, noArray())[0];}Point maxLoc;// 找到概率最大的类别minMaxLoc(logLikelihoods, 0, 0, 0, &maxLoc);// 将图像对应位置染成最大概率类别的颜色imgDst.at<Vec3b>(y, x) = classColors[maxLoc.x];}}
}
#endifint main()
{cout << "Use:" << endl<< "  key '0' .. '1' - switch to class #n" << endl<< "  left mouse button - to add new point;" << endl<< "  key 'r' - to run the ML model;" << endl<< "  key 'i' - to init (clear) the data." << endl << endl;cv::namedWindow("points", 1); // 创建一个名为"points"的窗口img.create(480, 640, CV_8UC3); // 创建一个大小为480x640的图像imgDst.create(480, 640, CV_8UC3); // 创建一个用于显示结果的图像imshow("points", img); // 显示原始图像setMouseCallback("points", on_mouse); // 设置鼠标回调函数,response to mouse events// 初始化两个分类的颜色,第一个分类颜色为绿色,第二个分类颜色为红色classColors[0] = Vec3b(0, 255, 0);classColors[1] = Vec3b(0, 0, 255);// 主循环for (;;){char key = (char)waitKey(); // 等待按键if (key == 27) break; // 如果按键是ESC,退出程序if (key == 'i') // 初始化{img = Scalar::all(0); // 清除图像trainedPoints.clear(); // 清除训练点trainedPointsMarkers.clear(); // 清除训练点标记classCounters.assign(MAX_CLASSES, 0); // 重置类别计数器imshow(winName, img); // 显示清除后的图像}if (key == '0' || key == '1') // 切换类别{currentClass = key - '0'; // 根据按键设置当前类别}if (key == 'r') // 运行机器学习模型{double minVal = 0;minMaxLoc(classCounters, &minVal, 0, 0, 0); // 检查每个类别至少有一个点if (minVal == 0){printf("each class should have at least 1 point\n"); // 否则提示并继续循环continue;}img.copyTo(imgDst); // 将图像复制到目标图像上
#if _NBC_find_decision_boundary_NBC(); // 执行NBC算法找决策边界imshow("NormalBayesClassifier", imgDst); // 显示NBC的结果
#endif
#if _KNN_
// 使用K-最近邻算法找出决策边界,这里展示了两种不同的K值find_decision_boundary_KNN(3); // 使用k值为3来找到决策边界imshow("kNN", imgDst); // 显示k值为3的结果find_decision_boundary_KNN(15); // 使用k值为15来找到决策边界imshow("kNN2", imgDst); // 显示k值为15的结果
#endif#if _SVM_
// 使用支持向量机算法找出决策边界find_decision_boundary_SVM(1); // 使用C值为1来找到决策边界imshow("classificationSVM1", imgDst); // 显示C值为1的结果find_decision_boundary_SVM(10); // 使用C值为10来找到决策边界imshow("classificationSVM2", imgDst); // 显示C值为10的结果
#endif#if _DT_
// 使用决策树算法找出决策边界find_decision_boundary_DT(); // 执行决策树算法找到决策边界imshow("DT", imgDst); // 显示决策树的结果
#endif#if _BT_
// 使用提升树算法找出决策边界find_decision_boundary_BT(); // 执行提升树算法找到决策边界imshow("BT", imgDst); // 显示提升树的结果
#endif#if _GBT_
// 使用梯度提升树算法找出决策边界find_decision_boundary_GBT(); // 执行梯度提升树算法找到决策边界imshow("GBT", imgDst); // 显示梯度提升树的结果
#endif#if _RF_
// 使用随机森林算法找出决策边界find_decision_boundary_RF(); // 执行随机森林算法找到决策边界imshow("RF", imgDst); // 显示随机森林的结果
#endif#if _ANN_
// 使用人工神经网络算法找出决策边界Mat layer_sizes1(1, 3, CV_32SC1); // 设置神经网络的层数和每层的节点数layer_sizes1.at<int>(0) = 2; // 输入层节点数layer_sizes1.at<int>(1) = 5; // 隐藏层节点数layer_sizes1.at<int>(2) = (int)classColors.size(); // 输出层节点数,即类别数find_decision_boundary_ANN(layer_sizes1); // 执行人工神经网络算法找到决策边界imshow("ANN", imgDst); // 显示人工神经网络的结果
#endif
#if _EM_// 执行EM算法找决策边界find_decision_boundary_EM();// 显示EM算法的结果imshow("EM", imgDst);
#endif}}return 0; // 程序结束
}

这段代码实现了一个简单的机器视觉和机器学习应用程序。其主要功能是在图形用户界面中用鼠标标记出不同的类别点,然后通过多种机器学习模型(如正态贝叶斯分类器、K最近邻分类器、支持向量机等),学习这些点的分布规律,并预测整个图像坐标面中每个点的类别,并进行着色以区分不同类别。

代码的核心部分包括鼠标回调函数(on_mouse),它处理用户的鼠标事件,根据用户点击添加新的类别点;数据准备辅助函数,用于将标记的点转换为训练模型所需的格式;模型训练和预测函数,包括每个分类器独立的训练和预测逻辑;以及主函数,它负责初始化应用程序界面、处理用户输入并触发机器学习模型的训练和预测。

这段代码展示了多个不同的机器学习算法在机器视觉和机器人技术应用程序中确定决策边界的方法。每个#if块介绍了如何使用一个特定的算法来训练一个模型用于分类,并预测图像上每个像素点的类别,并用不同的颜色来表示不同类别的决策区域。具体来说,包括:

  1. 使用正态贝叶斯分类器(NBC)确定决策边界。

  2. 使用K最邻近算法(KNN)确定决策边界,K值可以调整。

  3. 使用支持向量机(SVM)确定决策边界,其中C为错误项的惩罚系数。

  4. 使用决策树(DT)来确定决策边界。

  5. 使用提升树(Boosted Trees, BT)来确定决策边界。

  6. 使用梯度提升树(Gradient Boosted Trees, GBT)来确定决策边界。

  7. 使用随机森林(Random Forest, RF)来确定决策边界。

  8. 使用人工神经网络(Artificial Neural Network, ANN)来确定决策边界,其中层的大小可以调整,通常由输入层、一个或多个隐藏层和输出层构成。

9. 期望最大化(Expectation Maximization, EM)算法在寻找决策边界的实现方式。EM是一种迭代优化算法,用于参数估计,特别适合处理有隐变量的概率模型。它通常用于聚类或者潜在变量模型的估计。在find_decision_boundary_EM函数中,这个算法先是为每个类别训练了一个EM模型。接着通过遍历图像上的每个像素,计算该像素属于每个模型的概率,然后选择概率最大的模型对应的类别,为该像素分配颜色。

这些算法通常用于机器视觉中的模式识别、分类任务或者机器人路径规划中的决策制定等应用场景。

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

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

相关文章

【vue】slot 匿名插槽 / 具名插槽

slot父组件向子组件传递数据 匿名插槽–直接写 具名插槽–指定名称 父组件中 子组件中&#xff1a; 代码 App.vue <template><h2>App.vue</h2><!-- 匿名插槽 --><Header><a href"1234567890.com">1234567890</a>&…

LLM大语言模型微调方法和技术汇总

本文详细介绍了机器学习中的微调技术&#xff0c;特别是在预训练模型上进行微调的方法和技术。文章首先解释了什么是微调&#xff0c;即在预训练模型的基础上&#xff0c;通过特定任务的数据进行有监督训练&#xff0c;以提高模型在该任务上的性能。随后&#xff0c;详细介绍了…

C++格式化输出开源库fmt入手教程

fmt项目快速上手指南 1. cmake环境配置 include(FetchContent) FetchContent_Declare(fmtGIT_REPOSITORY https://github.com/fmtlib/fmtGIT_TAG 10.0.0GIT_SHALLOW TRUE) # 1. 下载fmt库 FetchContent_MakeAvailable(fmt)add_executable(fmt_guide main.cpp) # 2. 链接fmt库…

【opencv】示例-minarea.cpp 如何寻找一组随机生成的点的最小外接矩形、三角形和圆...

// 包含OpenCV库的高GUI模块和图像处理模块的头文件 #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp"// 包含标准输入输出流的头文件 #include <iostream>// 使用命名空间cv和std&#xff0c;这样我们就可以直接使用OpenCV和标准库的…

Android开发:Camera2+MediaRecorder录制视频后上传到阿里云VOD

文章目录 版权声明前言1.Camera1和Camera2的区别2.为什么选择Camera2&#xff1f; 一、应用Camera2MediaPlayer实现拍摄功能引入所需权限构建UI界面的XMLActivity中的代码部分 二、在上述界面录制结束后点击跳转新的界面进行视频播放构建播放界面部分的XMLActivity的代码上述代…

WebLogic-XMLDecoder(CVE-2017-10271)反序列化漏洞分析及复现

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

OpenCV轻松入门(六)——简单图片处理【马赛克、毛玻璃、浮雕效果】

马赛克效果 马赛克指现行广为使用的一种图像&#xff08;视频&#xff09;处理手段&#xff0c;此手段将影像特定区域的色阶细节劣化并造成色块打乱的效果&#xff0c;因为这种模糊看上去有一个个的小格子组成&#xff0c;便形象的称这种画面为马赛克。其目的通常是使之无法辨…

Unity让地图素材遮挡人物

点击编辑/项目设置/图形&#xff0c;透明度排序模式设置自定义轴&#xff0c;透明度排序轴Y设置为1其他为0。 此时人物和地图素材的图层排序相等&#xff0c;当人物的高度大于地图素材时&#xff0c;人物则被遮挡。

C# 图形化的导航界面的设计方法

目录 一、涉及到的知识点 1、BackColor属性 2、FlatStyle属性 3、TextlmageRelation属性 4、其它共性设计 二、设计实例 1、 Resources.Designer.cs 2、Form1.Designer.cs 3、Form1.cs 4、运行结果 图形化导航用于代替文字导航&#xff0c;比如对Button控件 进行图形…

222 基于matlab的天线线性阵列分布

基于matlab的天线线性阵列分布。运用遗传算法&#xff0c;对天线的庞斑进行优化&#xff0c;得到最佳的线性阵列的分布。输出迭代曲线&#xff0c;主平面方向图&#xff0c;阵元放置位置。程序已调通&#xff0c;可直接运行。 222 天线线性阵列分布 - 小红书 (xiaohongshu.com…

底层开发必知的三个内存结构概念

大家好&#xff0c;今天给大家介绍底层开发必知的三个内存结构概念&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在底层开发中&#xff0c;以下是三个关键的内存结构概念&…

常见的数据结构

链表 链表&#xff1a;适用于插入删除多、读少的场景。 链表在新增、删除数据都比较容易&#xff0c;可以在 O(1) 的时间复杂度内完成。 但对于查找&#xff0c;不管是按照位置的查找还是按照数值条件的查找&#xff0c;都需要对全部数据进行遍历。这显然就是 O(n) 的时间复杂…

爱奇艺APP Android低端机性能优化

01 背景介绍 在智能手机市场上&#xff0c;高端机型经常备受瞩目&#xff0c;但低端机型亦占据了不可忽视的份额。众多厂商为满足低端市场的需求&#xff0c;不断推出低配系列手机。另外过去几年的中高端机型&#xff0c;随着系统硬件的快速迭代&#xff0c;现已经被归类为低端…

【大语言模型】轻松本地部署Stable Diffusion

硬件要求&#xff1a; 配备至少8GB VRAM的GPU&#xff0c;如果你的电脑只有CPU&#xff0c;请看到最后。根据部署规模&#xff0c;需要足够的CPU和RAM。 软件要求&#xff1a; Python 3.7或更高版本。支持NVIDIA GPU的PyTorch。Hugging Face的Diffusers库。Hugging Face的Tr…

4.2 面向对象程序设计-类的继承实验

本文仅供学习交流&#xff0c;严禁用于商业用途&#xff0c;如本文涉及侵权请及时联系将于24小时内删除 目录 1.实验内容 2.实验原理 2.1类的继承 2.2 继承的优点和缺点 2.3 继承的方式 3.实验代码 1.实验内容 创建一个父类CalcTime&#xff0c;在父类中依次定义用于保存…

Pods/Nodes

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列、spring教程等&#xff0c;大家有兴趣的可以看一看 &#x1f4d9;Jav…

初步学习node.js文件模块

环境已安装好&#xff1b; 写一个read1.js如下&#xff1b; var fs require("fs"); var data ;// 创建一个流 var stream1 fs.createReadStream(test1.jsp); stream1.setEncoding(UTF8);// 绑定data事件 stream1.on(data, function(mydata) {data mydata; });/…

程序员Java.vue,python前端后端爬虫开发资源分享

bat面试资料 bat面试题汇总 提取码&#xff1a;724z 更多资料

项目总体测试计划书

目的&#xff1a;编写此测试方案的目的在于明确测试内容、测试环境、测试人员、测试工作进度计划等&#xff0c;以保证测试工作能够在有序的计划安排进行。 测试目标&#xff1a;确保XXX项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保…

【Web】DASCTF 2023 0X401七月暑期挑战赛题解

目录 EzFlask MyPicDisk ez_cms ez_py 让俺看看401web题 EzFlask 进来直接给了源码 import uuidfrom flask import Flask, request, session from secret import black_list import jsonapp Flask(__name__) app.secret_key str(uuid.uuid4())def check(data):for i i…