超像素提取加svm训练,鼠标点击选择标签(左键为正样本,右键为负样本)
自己写的demo记个笔记用
替换掉图片路径和保存路径svm训练的模型路径就可以跑
效果我觉的不行,目前也不知到如何优化、希望有大佬可以给点建议
流程
处理超像素
选择超像素
提取HOG、颜色直方图、LBP直方图特征
训练
预测
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/ximgproc.hpp>
#include <opencv2/ml.hpp>using namespace cv;
using namespace std;
using namespace cv::ml;
Mat g_LabelSlic;
Mat g_MaskSlic;
int g_NumSuperPixels;//目标图像和标签
multimap<int, Mat>g_mapImgSuperPixelsOfTarget;
multimap<int, Mat>g_mapImgSuperPixelsOfNonTarget;struct MouseCallbackData {Mat img; // 原始图像Mat imgClone; // 克隆图像
};Mat GetSuperPixelsByLabel(const Mat& img, int superpixelID)
{int minX = img.cols, minY = img.rows, maxX = 0, maxY = 0;for (int y = 0; y < img.rows; y++) {for (int x = 0; x < img.cols; x++) {if (g_LabelSlic.at<int>(y, x) == superpixelID) {// 更新边界框坐标if (x < minX) minX = x;if (y < minY) minY = y;if (x > maxX) maxX = x;if (y > maxY) maxY = y;}}}// 确保边界框有效if (minX > maxX || minY > maxY) {cout << "未找到有效的超像素!" << endl;return Mat(); }Rect superPixelBoundingBox(minX, minY, maxX - minX + 1, maxY - minY + 1);Mat croppedRegion = img(superPixelBoundingBox).clone(); for (int y = 0; y < croppedRegion.rows; y++) {for (int x = 0; x < croppedRegion.cols; x++) {int origX = x + minX;int origY = y + minY;if (g_LabelSlic.at<int>(origY, origX) != superpixelID) {croppedRegion.at<Vec3b>(y, x) = Vec3b(0, 0, 0); }}}return croppedRegion;
}vector<float> GetHOGDescriptor(Mat img)
{if (img.empty()) {std::cerr << "输入图像为空!" << std::endl;return {};}resize(img, img, Size(64, 64));Mat imgGray;cvtColor(img, imgGray, COLOR_BGR2GRAY);HOGDescriptor hog(Size(32, 32), // 图像窗口大小Size(8, 8), // 块大小Size(4, 4), // 块步长Size(4, 4), // cell 大小9 // 梯度方向 bins 数);vector<float> descriptors;hog.compute(imgGray, descriptors);return descriptors;
}// 提取 LBP 特征及其直方图
void ExtractLBPFeatures(Mat img, Mat& lbp, Mat& lbpHist)
{resize(img, img, Size(64, 64));// 转换为灰度图Mat gray;if (img.channels() == 3) {cvtColor(img, gray, COLOR_BGR2GRAY);}else {gray = img.clone();}// 初始化 LBP 特征矩阵lbp = Mat(gray.size(), CV_8UC1, Scalar(0));for (int y = 1; y < gray.rows - 1; y++) {for (int x = 1; x < gray.cols - 1; x++) {uchar center = gray.at<uchar>(y, x);uchar code = 0;code |= (gray.at<uchar>(y - 1, x - 1) > center) << 7; // 128code |= (gray.at<uchar>(y - 1, x) > center) << 6; // 64code |= (gray.at<uchar>(y - 1, x + 1) > center) << 5; // 32code |= (gray.at<uchar>(y, x + 1) > center) << 4; // 16code |= (gray.at<uchar>(y + 1, x + 1) > center) << 3; // 8code |= (gray.at<uchar>(y + 1, x) > center) << 2; // 4code |= (gray.at<uchar>(y + 1, x - 1) > center) << 1; // 2code |= (gray.at<uchar>(y, x - 1) > center); // 1lbp.at<uchar>(y, x) = code; // 将计算的 LBP 值存储}}// 计算 LBP 直方图const int histSize = 256; // LBP 特征值的范围const float range[] = { 0, 256 };const float* histRange = { range };calcHist(&lbp, 1, 0, Mat(), lbpHist, 1, &histSize, &histRange);normalize(lbpHist, lbpHist);
}Mat ExtractHSVHistogram(Mat img)
{resize(img, img, Size(64, 64));Mat hsv_img;cvtColor(img, hsv_img, cv::COLOR_BGR2HSV); vector<cv::Mat> hsv_planes;split(hsv_img, hsv_planes); // 分割 H, S, V 通道int histSize = 256; // 直方图分为 256 个区间float h_range[] = { 0, 180 }; // H 通道范围是 0-180float s_v_range[] = { 0, 256 }; // S 和 V 通道范围是 0-256const float* h_histRange = { h_range };const float* sv_histRange = { s_v_range };Mat h_hist, s_hist, v_hist;calcHist(&hsv_planes[0], 1, 0, cv::Mat(), h_hist, 1, &histSize, &h_histRange, true, false); // H 通道直方图calcHist(&hsv_planes[1], 1, 0, cv::Mat(), s_hist, 1, &histSize, &sv_histRange, true, false); // S 通道直方图calcHist(&hsv_planes[2], 1, 0, cv::Mat(), v_hist, 1, &histSize, &sv_histRange, true, false); // V 通道直方图// 合并 H, S, V 直方图Mat hist;hconcat(h_hist, s_hist, hist);hconcat(hist, v_hist, hist);Mat normalizedHist;normalize(hist, normalizedHist);return normalizedHist; // 返回归一化后的直方图
}void OnMouse(int event, int x, int y, int flags, void* param)
{MouseCallbackData* data = static_cast<MouseCallbackData*>(param);Mat& img = data->img;Mat& imgClone = data->imgClone;int mouseButtonClicked = 0;if (event == EVENT_LBUTTONDOWN) {mouseButtonClicked = 1;if (x >= 0 && x < img.cols && y >= 0 && y < img.rows) {int superpixelID = g_LabelSlic.at<int>(y, x);cout << "点击目标超像素ID: " << superpixelID << endl;g_mapImgSuperPixelsOfTarget.insert({ mouseButtonClicked, GetSuperPixelsByLabel(img, superpixelID) });circle(imgClone, Point(x, y), 3, Scalar(0, 255, 0), -1);imshow("Imageview", imgClone);}}else if (event == EVENT_RBUTTONDOWN) {mouseButtonClicked = 2;if (x >= 0 && x < img.cols && y >= 0 && y < img.rows) {int superpixelID = g_LabelSlic.at<int>(y, x);cout << "点击非目标超像素ID: " << superpixelID << endl;g_mapImgSuperPixelsOfNonTarget.insert({ mouseButtonClicked, GetSuperPixelsByLabel(img, superpixelID) });circle(imgClone, Point(x, y), 3, Scalar(0, 0, 255), -1);imshow("Imageview", imgClone);}}
}void SvmClassifier(multimap<int, vector<float>> HOGDescriptorOFTarget,multimap<int, Mat> lbpHistOFTarget,multimap<int, Mat> hsvHistOFTarget,multimap<int, vector<float>> HOGDescriptorOFNonTarget,multimap<int, Mat> lbpHistOFNonTarget,multimap<int, Mat> hsvHistOFNonTarget)
{cout << "star svm model train ..." << endl;Mat featureList;Mat labels;for (const auto& pair : HOGDescriptorOFTarget) {Mat hogMat(pair.second, CV_32F);normalize(hogMat, hogMat, 0, 1, NORM_MINMAX);hogMat = hogMat.reshape(1, 1);Mat lbpHist = lbpHistOFTarget.find(pair.first)->second;lbpHist.convertTo(lbpHist, CV_32F);lbpHist = lbpHist.reshape(1, 1); // 展平Mat hsvHist = hsvHistOFTarget.find(pair.first)->second;hsvHist.convertTo(hsvHist, CV_32F);hsvHist = hsvHist.reshape(1, 1); // 展平Mat combinedFeature;hconcat(hogMat, lbpHist, combinedFeature); hconcat(combinedFeature, hsvHist, combinedFeature); featureList.push_back(combinedFeature);labels.push_back(1); }for (const auto& pair : HOGDescriptorOFNonTarget) {Mat hogMat(pair.second, CV_32F);normalize(hogMat, hogMat, 0, 1, NORM_MINMAX); hogMat = hogMat.reshape(1, 1);Mat lbpHist = lbpHistOFNonTarget.find(pair.first)->second;lbpHist.convertTo(lbpHist, CV_32F);lbpHist = lbpHist.reshape(1, 1); Mat hsvHist = hsvHistOFNonTarget.find(pair.first)->second;hsvHist.convertTo(hsvHist, CV_32F);hsvHist = hsvHist.reshape(1, 1); Mat combinedFeature;hconcat(hogMat, lbpHist, combinedFeature);hconcat(combinedFeature, hsvHist, combinedFeature);featureList.push_back(combinedFeature);labels.push_back(0); }Mat trainingData;vconcat(featureList, trainingData); //Mat labelsMat;// = Mat(labels).reshape(1, 1);Mat labelsMat = labels;trainingData.convertTo(trainingData, CV_32F);labelsMat.convertTo(labelsMat, CV_32S);Ptr<SVM> svm = SVM::create();svm->setKernel(SVM::RBF);svm->setType(SVM::C_SVC);svm->trainAuto(trainingData,ROW_SAMPLE,labelsMat,10);/*svm->setC(1.5);svm->setGamma(0.5);svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 200, 1e-6));svm->train(trainingData, ROW_SAMPLE, labelsMat);*/svm->save("C:/Users/svs/Desktop/svm_model2.xml"); // 保存训练好的模型
}void DrawSuperpixelRegion(Mat& img, int targetLabel) {for (int y = 0; y < img.rows; y++) {for (int x = 0; x < img.cols; x++) {if (g_LabelSlic.at<int>(y, x) == targetLabel) {img.at<Vec3b>(y, x) = Vec3b(0, 255, 0); }}}
}int main() {Mat img = imread("C:/Users/svs/Desktop/test.jpeg");if (img.empty()) {cerr << "无法读取图片!" << endl;return -1;}//图片进行超像素分割int region_size = 50;float ruler = 20.0;int num_iterations = 100;Ptr<ximgproc::SuperpixelSLIC> slic = ximgproc::createSuperpixelSLIC(img, ximgproc::SLICO,region_size, ruler);slic->iterate(num_iterations);slic->getLabels(g_LabelSlic);slic->getLabelContourMask(g_MaskSlic);g_NumSuperPixels = slic->getNumberOfSuperpixels();Mat imgWithContours;img.copyTo(imgWithContours, ~g_MaskSlic);imshow("Superpixel Contours", imgWithContours);cout << "请点击选择一个超像素区域...\n";namedWindow("Imageview", WINDOW_AUTOSIZE);imshow("Image", img);Mat imgClone = img.clone();imshow("Imageview", imgClone);MouseCallbackData data;data.img = img;data.imgClone = imgClone;setMouseCallback("Imageview", OnMouse, &data);// 等待用户按 'q' 退出while (true) {const char key = waitKey(0);if (key == 'q') {break;}}/*提取获取图片的特征*/multimap<int, vector<float> >HOGDescriptorOFTarget;multimap<int, Mat >lbpHistOFTarget;multimap<int, Mat >hsvHistOFTarget;multimap<int, vector<float> >HOGDescriptorOFNonTarget;multimap<int, Mat>lbpHistOFNonTarget;multimap<int, Mat>hisHistOFNonTarget;for (const auto& pair : g_mapImgSuperPixelsOfTarget) {vector<float> vectorHOGDescriptor = GetHOGDescriptor(pair.second);HOGDescriptorOFTarget.insert({ pair.first, vectorHOGDescriptor});Mat lbpImg, lbpHist;ExtractLBPFeatures(pair.second, lbpImg, lbpHist);lbpHistOFTarget.insert({ pair.first, lbpHist });Mat hsvHist;hsvHist = ExtractHSVHistogram(pair.second);hsvHistOFTarget.insert({ pair.first,hsvHist });/*imshow("true", pair.second);waitKey(0);*/}for (const auto& pair : g_mapImgSuperPixelsOfNonTarget){vector<float> vectorHOGDescriptor = GetHOGDescriptor(pair.second);HOGDescriptorOFNonTarget.insert({ pair.first,vectorHOGDescriptor });Mat lbpImg, lbpHist;ExtractLBPFeatures(pair.second, lbpImg, lbpHist);lbpHistOFNonTarget.insert({ pair.first, lbpHist });Mat hsvHist;hsvHist = ExtractHSVHistogram(pair.second);hisHistOFNonTarget.insert({ pair.first,hsvHist});/* imshow("false", pair.second);waitKey(0);*/}SvmClassifier(HOGDescriptorOFTarget, lbpHistOFTarget, hsvHistOFTarget,HOGDescriptorOFNonTarget,lbpHistOFNonTarget, hisHistOFNonTarget);Ptr<SVM> svm = SVM::load("C:/Users/svs/Desktop/svm_model2.xml");if (svm.empty()) {std::cerr << "模型加载失败!\n";return -1;}//进行预测cout << "star predict ...\n";multimap<int, Mat> testSuperPixelsImg;vector<float> testHOGDescriptor;Mat testLbpHist;Mat testHsvHist;// 遍历每个超像素块for (int superpixelID = 0; superpixelID < g_NumSuperPixels; ++superpixelID) {Mat superpixelRegion = GetSuperPixelsByLabel(img, superpixelID);testSuperPixelsImg.insert({ superpixelID, superpixelRegion });}for (const auto& pairs : testSuperPixelsImg) {/*imshow("test", pairs.second);waitKey(0);*/testHOGDescriptor = GetHOGDescriptor(pairs.second);Mat lbpImg;ExtractLBPFeatures(pairs.second, lbpImg,testLbpHist);testHsvHist = ExtractHSVHistogram(pairs.second);if (testHOGDescriptor.empty()){cerr << "HOG特征为空,超像素ID: \n";}if (testLbpHist.empty()){cerr << "LBP特征为空,超像素ID: \n";}if(testHsvHist.empty()){cerr << "Hsv直方图为空,超像素ID:\n";}Mat testHogMat(testHOGDescriptor, CV_32F);normalize(testHogMat, testHogMat, 0, 1, NORM_MINMAX);testHogMat = testHogMat.reshape(1, 1);testLbpHist.convertTo(testLbpHist, CV_32F);testLbpHist = testLbpHist.reshape(1, 1); testHsvHist.convertTo(testHsvHist, CV_32F);testHsvHist = testHsvHist.reshape(1, 1); Mat combinedFeature;hconcat(testHogMat, testLbpHist, combinedFeature);hconcat(combinedFeature, testHsvHist, combinedFeature);// 进行预测float response;response = svm->predict(combinedFeature);if (response == 1) {}else {DrawSuperpixelRegion(img, pairs.first);}}imshow("Image with Green Superpixel", img);cout << "predict successful\n";waitKey(0);destroyAllWindows();return 0;
}
相关文章:
超像素提取加svm训练,鼠标点击选择标签(左键为正样本,右键为负样本)
自己写的demo记个笔记用 替换掉图片路径和保存路径svm训练的模型路径就可以跑 效果我觉的不行,目前也不知到如何优化、希望有大佬可以给点建议 流程 处理超像素 选择超像素 提取HOG、颜色直方图、LBP直方图特征 训练 预测 #include <iostream> #include <…...
Vue 中引入 ECharts 的详细步骤与示例
在Vue项目中引入ECharts,可以让我们轻松地在前端页面中展示各种图表。ECharts 是一个基于 JavaScript 的开源可视化图表库,它提供了丰富的图表类型和强大的配置选项,使得在Vue项目中集成和使用变得非常方便。 一、准备工作 创建Vue项目&…...

在 EC2 AWS 中开启防火墙后将自己锁定在 SSH 之外
在搭建ftp时,开启了系统防火墙的几个端口,并且设置了防火墙开机自启。当设置好之后,关闭了putty,再次连接SSH时,发现连接错误。仔细一想,防火墙没有开启22端口,这不嘎了么,自己把自己…...
OpenGL 进阶系列02 - OpenGL绘制三角形的必要步骤
目录 一:概述 二:必要的绘制步骤 三:相关OpenGL API 含义: 1. glViewport 介绍 2. OpenGL的 VAO 介绍 3. OpenGL的VBO介绍 4. OpenGL的着色器 API 介绍 5. OpenGL 绘制API介绍 四:例子 一:概述 要使用 OpenGL 绘制一个三角形,通常需要几步,需要使用哪些必要的Open…...
MySql基础34题写题记录(11-20)
11、取得最后入职的5名员工 select ename from emp order by hiredate desc limit 5; 12、取得每个薪水等级有多少员工 先取每个员工的薪水等级 Select e.ename,s.grade grade From emp e Join salgrade s On e.sal between s.losal and s.hisal 接着直接分组求 Select …...
设计模式——单例模式(1)
一、写在前面 设计模式有23种,每一篇是一种模式,从简单到难,第一篇从最简单的单例模式试试水创建型模式 单例模式工厂方法模式抽象工厂模式原型模式建造者模式 结构型模式行为型模式 二、介绍 单例模式是指一个类只能创建出一个对象&#…...

剧本杀小程序:提升玩家游戏体验,带动经济效益
剧本杀作为一个新兴游戏方式,能够满足年轻人的社交需求,让大众体验到不太一样的人生,在角色中进行演绎。这种独特的游戏模式吸引了众多的年轻玩家,由此,剧本杀行业进入了爆发期。 如今,在科技的不断创新下…...

Linux系统通过编辑crontab来设置定时任务---定时关机
在Linux系统中,crontab 是用来设置周期性被执行的指令的守护进程。通过编辑 crontab,您可以安排定时任务,比如定时关机、定时备份文件、定时运行脚本等。以下是如何编辑 crontab 来设置定时任务的步骤: 打开终端:您可以…...

Mac电脑word文档误删,4个方法快速恢复
对于使用Mac的用户来说,丢失重要的Word文档可能会为学习或工作带来严重的影响。不过,幸运的是,关于mac word 文档恢复方法还是有很多的,通常帮助Mac用户轻松找回丢失的word文档。接下来,小编将介绍一些在Mac上恢复丢失…...

threejs-基础材质设置
一、介绍 主要内容:基础材质(贴图、高光、透明、环境、光照、环境遮蔽贴图) 主要属性: side: three.DoubleSide, //设置双面 color: 0xffffff, //颜色 map: texture, //纹理 transparent: true, // 透明度 aoMap: aoTexture, //ao贴图 aoMapIntensity: 1…...
【大模型开发】AI提示词框架:解锁ICIO、CRISPE、BROKE和RASCEF的强大潜力
作为一名经验丰富的程序员,您是否曾感到在与AI助手交互时难以获得理想的输出?本文将为从事AI开发或经常使用AI工具的技术人员介绍四个强大的AI提示词框架:ICIO、CRISPE、BROKE和RASCEF。这些框架能帮助您更有效地与AI模型沟通,提高工作效率。 1. ICIO框架:简洁而有力 IC…...

Rust学习如何更有信心?
关于如何学习Rust,在Hacker News上有一篇非常火的教程,作者通过自己的Rust学习经历,向大家指出了一条如何学习Rust的路径。 学习一门编程语言必不可少的是阅读技术书籍和编写代码,要想掌握Rust,两者的交替学习至关重要…...

3个简单易懂的方法,教你马上掌握excel表格数据打印技巧
在EXCEL表格里制作表格后,表格的数据有可能不正好是一页,如果就这样打印出来,数据有可能不完整,表格也不美观,还浪费纸张,那么如何将表格打印在一张纸上呢?下面小编为你介绍几种方法和解决方案&…...
dbt 增量策略模型实战教程
上文我们介绍了增量策略的理论知识,本文结合实际场景介绍如何合理利用增量策略,内容包括应用场景、常见问题及解决方案。 应用场景 增量模型是定义如何增量向数据模型添加数据的有效方法——假设我们有描述信用卡交易的数据表——我们创建DBT模型&#…...

【含文档】基于Springboot+Android的校园论坛系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…...
Go版数据结构 -【8.4 快速排序】
8.4 快速排序 快速排序是一种分而治之的排序算法。它通过随机选择一个基准元素,将数组分为两部分。 一部分比基准元素小,另一部分比基准元素大,之后对两部分排序。 快速排序以其平均情况下的 O(n log n) 时间复杂度和良好的性能而广泛应用…...

达梦DBLINK访问ORACLE配置方法
目录 1、概述 2、测试环境 3、语法简介 4、配置访问DM的DBLINK 5、配置访问ORACLE的DBLINK 5.1 通过OCI配置 5.2 通过ODBC配置 1、概述 本文介绍了达梦DBLINK的配置方法。有3部分内容,1)达梦访问到达梦的配置方法;2)通过OC…...
基础知识1
目录 1、gcd最大公因数 2、最小公倍数 3、素数问题 ①简单数学求法 ②素数筛 ③线性筛 1、gcd最大公因数 int gcd(int a,int b){return b0?a:gcd(b,a%b);} 做题过程中,如果数据太大,需要边做边对分子分母进行约分 2、最小公倍数 int a,b;scanf(&…...
网页前端开发之Javascript入门篇(9/9):对象
Javascript对象 什么是对象? 答:其概念跟 Python教程 的字典基本相似,虽然存有一些差异,不过对于目前的教程来讲可以忽略。 下面是对象的语法: var aaa {"弓" : "张","木" : "李",&…...

Oracle RAC IPC Send timeout detected问题分析处理
一、报错信息 今天在进行数据库巡检时,在集群节点1发现了IPC相关报错信息: 2024-10-10T10:22:06.84631708:00 IPC Receiver dump detected. Sender instance 2 Receiver pnum 277 ospid 377527 [oraclezxsszpt-sjkfwq1 (PPA6)], pser 124403 2024-10-1…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
OCR MLLM Evaluation
为什么需要评测体系?——背景与矛盾 能干的事: 看清楚发票、身份证上的字(准确率>90%),速度飞快(眨眼间完成)。干不了的事: 碰到复杂表格(合并单元…...