基于Matlab的花朵识别系统实战:从预处理到SVM分类
在Matlab里把一朵花识别系统从零搭起来这个需求比很多人想象中要曲折。它不一定需要高深算法但需要把图像预处理、特征提取、分类器训练、界面交互这些环节像流水线一样串起来任何一环掉链子最后识别效果都会惨不忍睹。我前后折腾了三周完成了一套基于Matlab的花朵识别系统实战项目输入一张花图系统能在几秒内给出类别测试集准确率稳定在八成五左右。这套东西适合正在准备图像处理课设、毕业设计或者想系统理解传统模式识别流程的开发者就算你平时用Python也可以看看Matlab在图像处理方向的工作流长什么样。1. 实战项目全貌与思路拆解1.1 这套系统到底能帮你做什么先明确需求。系统输入是任意一张植物花卉照片输出是它所属的类别名称比如玫瑰、向日葵、菊花、郁金香、蒲公英。我做了一个带图形界面的版本左侧显示当前图片右侧显示识别结果和置信度。除了单张识别还能对测试文件夹做批量预测最后输出准确率和混淆矩阵方便观察哪些类别容易混淆。实际应用场景不止是课程展示。比如做植物科普小程序、家庭花卉图鉴、智能相册分类甚至农产品分拣的初步验证都能用这套逻辑。它的核心价值在于把“图像输入—类别输出”这件事做成一个可解释、可扩展的小工具。传统特征加分类器的方式每个模块都可以单独调试训练也快不需要GPUMatlab跑起来很轻量。1.2 为什么是Matlab为什么不是直接上深度学习选Matlab的原因很实际图像处理工具箱的函数封装非常完整读图、滤波、形态学、特征提取都有现成接口写起来效率高。App Designer和GUIDE能做可视化界面不用像Python那样另外学一套PyQt或Web框架。调试时矩阵结果直接看变量可视化也方便适合快速验证想法。另一个问题是为什么不直接用深度学习。很多人看到花朵识别就想到卷积神经网络但小样本场景下CNN并不友好。每类几十张图、没有预训练权重时CNN很容易过拟合训练时间却比传统方法多一个数量级。传统特征加SVM的优势在于特征维度低、训练速度快、结果可解释性强老师答辩时也愿意听你讲为什么选这个特征。当然数据量大之后CNN会更强但作为实战项目传统方法依然是练手和学习原理的好路线。后面我会提到如何用迁移学习提升精度那是进阶玩法。这个方案的主线是构造数据集、统一尺寸、预处理、提取颜色/形状/纹理特征、训练SVM多分类器、封装GUI。下面我就按这个顺序把每一步的关键细节都过一遍。2. 数据集准备与图像预处理细节2.1 数据集怎么整理才不容易被坑数据集决定了模型上限。我用的是公开可下载的花卉图像整理出的5类每类50张共250张包含玫瑰、向日葵、菊花、郁金香、蒲公英。下载后我没有直接开训而是先做了三件事。第一统一图片格式和尺寸全部转成JPG缩放为256×256。不统一尺寸后续特征长度会变SVM没法训练。第二检查图片是否包含大量人、文字等噪声有的话手动裁掉或用脚本剔除否则会把背景噪声当特征。第三按类别建文件夹用类名加序号重命名。命名规则为英文比如rose_01.jpg避免中文路径带来的各种诡异报错。训练集和测试集按7:3划分划分方式必须是随机且按类分层确保每类在训练集和测试集都有分布。如果只有250张明显偏少。我做了基础数据增强训练集水平翻转、随机旋转5度以内、亮度调整0.9到1.1倍。传统方法的数据增强和深度学习不太一样增强后的图片要保存在硬盘上提前把特征提取好存成特征矩阵。要注意旋转角度不能太大花朵是离散物体转太多会引入背景反倒降低原始特征质量。2.2 预处理参数慢慢调不要照抄默认值预处理的核心目标是消除无关变量包括尺度、噪声和光照变化。我写的preprocess函数做了四步操作。第一步imresize统一为256×256。这个尺寸是权衡结果太小会丢失花瓣纹理太大GLCM计算很慢。第二步im2double把像素值从0~255映射到0~1避免后面计算颜色矩时数值差异过大影响SVM距离。第三步对灰度图做高斯滤波sigma设为1.5。sigma太小时去噪效果弱太大图像变糊、花瓣边缘形状特征被抹平。第四步对灰度图做直方图均衡化提升对比度削弱光照不均的影响。function processedImg preprocess(img) img imresize(img, [256 256]); img im2double(img); gray rgb2gray(img); gray imgaussfilt(gray, 1.5); gray histeq(gray); processedImg.gray gray; processedImg.color img; end这条代码里我特意保留了原始彩色图因为颜色特征需要在RGB/HSV空间计算不能只在灰度图上提取。很多新手把图像转灰度后就直接丢弃原图导致颜色特征全部失真这是第一坑。另外有些手机照片自带Exif旋转信息直接读出来可能是横着的务必先用imrotate校准方向再走预处理。判断方式很简单读图后用size检查宽高如果宽大于高且花应该是直立状态就要转90度。这一步在我调数据集时踩过几次别忽略。3. 特征提取与分类器选型3.1 颜色、形状、纹理三个特征怎么搭配特征选取是我花时间最多的地方。只用一个特征比如颜色直方图光照一换就废掉只算纹理背景复杂时也容易混淆。我最终采用的是三类特征组合HSV颜色矩9维灰度图Hu矩7维GLCM纹理特征4维加起来20维刚好满足小样本分类的要求且不冗余。颜色矩计算的是HSV三个通道的均值、标准差和偏度共9维。用HSV而不是RGB因为HSV对光照强度变化更鲁棒饱和度与色相分离后阴影区域对识别的干扰会小一些。偏度能反映颜色分布是否偏斜对区分不同花瓣颜色很有帮助。形状特征用的是Hu矩它能描述二值化后花瓣轮廓的平移、旋转、缩放不变性。提取前需要对灰度图做阈值分割得到二值图再用imclose做闭运算填补花瓣内部空洞。阈值分割我用了大津法也就是imbinarize的默认算法。如果图像背景复杂导致二值图有多个连通域要先用bwareaopen去掉小面积区域再保留最大连通域否则轮廓形状会被大量噪声干扰。纹理特征用灰度共生矩阵GLCM。我计算0度、45度、90度、135度四个方向距离设1得到对比度、能量、相关性、熵四个统计量最后取四个方向均值。这组特征对花瓣纹理的疏密、平滑程度非常敏感。总体特征提取代码如下function feat extractFeature(procImg) hsvImg rgb2hsv(procImg.color); % 颜色矩仅示意 muH mean(mean(hsvImg(:,:,1))); stdH std2(hsvImg(:,:,1)); skewH skewness(hsvImg(:,:,1), 0, all); % 依次算S、V通道拼接成9维 colorMoment [muH, stdH, skewH, muS, stdS, skewS, muV, stdV, skewV]; % Hu矩 bw imbinarize(procImg.gray); bw bwareaopen(bw, 50); bw imclose(bw, strel(disk, 3)); stats regionprops(bw, Image); [~, maxIdx] max([stats.Area]); huVec computeHuMoments(stats(maxIdx).Image); % 7维 % GLCM glcm graycomatrix(procImg.gray, ... Offset, [0 1; -1 1; -1 0; -1 -1], ... NumLevels, 32, Symmetric, true); glcmStats graycoprops(glcm, {Contrast, Energy, Correlation, Entropy}); textFeat mean([mean(glcmStats.Contrast), mean(glcmStats.Energy), ... mean(glcmStats.Correlation), mean(glcmStats.Entropy)]); feat [colorMoment, huVec, textFeat]; end这段代码中graycomatrix的NumLevels参数默认是8我改成了32。把灰度级从8提升到32后纹理细节保留更多识别率有明显提升但再往上到64或256矩阵越来越大速度急剧下降收益却趋近于零32是实测最均衡的取值。计算Hu矩时我自己写了一个computeHuMoments函数本质是按不变矩公式计算。这里提个小细节regionprops返回的Image是逻辑类型直接计算矩时最好转换成double否则数值会错得离谱。很多现成脚本不检查这个直接跑出NaN坑得很。3.2 SVM参数选择用交叉验证代替瞎猜分类器我选了SVM配合fitcecoc做一对多多分类。在小样本、非线性、特征维度不高的情况下SVM的泛化能力通常比KNN和决策树好。KNN对特征尺度极其敏感决策树容易过拟合SVM加RBF核能容忍一定噪声C和gamma决定边界复杂度。template templateSVM(KernelFunction, rbf, KernelScale, auto); model fitcecoc(featuresNorm, labels, Learners, template, KFold, 5);KernelScale设auto让算法自动估计尺度省很多事。如果追求更高精度可以做网格搜索C取2的-4到4次方KernelScale取2的-4到4次方用5折交叉验证对比准确率。我最终选择C1、KernelScale0.35验证集准确率最高。所有特征在训练SVM前必须做标准化也就是z-score减均值除以标准差。20维特征里GLCM的熵可能只有0.4而颜色矩的std可能是0.5量级差异不大但Hu矩可能到十几个数量级不标准化SVM的RBF计算会被大数覆盖模型几乎不可用。4. 核心代码实现与GUI搭建4.1 训练脚本的惯用结构把整个训练过程串成一个脚本是项目稳定复现的关键。我梳理了训练脚本的逻辑遍历每个类别的文件夹读取图片预处理提取特征把所有特征和标签拼装成矩阵标准化训练SVM并保存模型。clear; clc; root flower_dataset; classes {rose, sunflower, daisy, tulip, dandelion}; featureSet []; labelSet []; for ci 1:numel(classes) folder fullfile(root, classes{ci}); imgFiles dir(fullfile(folder, *.jpg)); for fi 1:numel(imgFiles) img imread(fullfile(folder, imgFiles(fi).name)); procImg preprocess(img); feat extractFeature(procImg); featureSet(end1, :) feat; labelSet{end1, 1} classes{ci}; end end mu mean(featureSet); sigma std(featureSet); featuresNorm (featureSet - mu) ./ sigma; svmModel fitcecoc(featuresNorm, labelSet, ... Learners, templateSVM(KernelFunction, rbf, KernelScale, auto)); save(flowerModel.mat, svmModel, mu, sigma);这段代码有个明显问题featureSet动态增长会导致内存反复分配。样本只有250张时无所谓但如果扩展到上千张就要预先分配矩阵featureSet zeros(numImages, 20)再按索引填充速度能快一倍以上。预测阶段必须做和训练时完全一样的预处理和特征提取然后套用同样的mu和sigma标准化再调用predict。我踩过一个经典错误训练时标准化了预测时忘了标准化测试准确率直接从85%掉到20%。这类问题很难一眼发现解决办法是写一个predictOne函数把标准化放在函数里避免二次调用时遗漏。function label predictOne(imgPath, model) img imread(imgPath); procImg preprocess(img); feat extractFeature(procImg); featNorm (feat - model.mu) ./ model.sigma; label predict(model.svmModel, featNorm); end4.2 用App Designer把识别过程做成界面Matlab新版推荐App Designer比老GUIDE好用太多。界面结构我做成左侧坐标区显示原图右侧显示预处理后的灰度图下面放“打开图片”“开始识别”“退出”三个按钮以及一个显示结果和置信度的文本框。做GUI的关键不是画控件而是把逻辑拆到函数的回调里。打开图片按钮的回调function OpenButtonPushed(app, event) [file, path] uigetfile({*.jpg;*.png;*.bmp, 图像文件}); if file 0 return; end app.imgPath fullfile(path, file); app.originalImage imread(app.imgPath); imshow(app.originalImage, Parent, app.UIAxes); app.ResultLabel.Text ; end识别按钮的回调相对简单调用predictOne然后把结果显示到文本控件。如果是批量识别则读取文件夹里所有图片循环调用。但注意在回调里做循环计算会阻塞界面用户会看到窗口“无响应”。我后来改用uiprogressdlg显示进度并在循环内调用drawnow刷新界面体验好很多。App Designer后台加载模型在startupFcn回调中load(flowerModel.mat)把模型赋值给app.model这样回调里才能直接使用。如果在startupFcn里加载失败多半是当前路径没有包含flowerModel.mat用绝对路径最保险。此外要保证整个项目所在路径不出现中文否则uigetfile返回的路径在部分版本会乱码进而导致imread报错。5. 常见问题与排查实录5.1 训练集准确率接近100%测试集却只有一半这是典型的过拟合。传统特征加SVM也会过拟合尤其在样本只有每类四五十张的情况下。我的第一次实验就踩了训练准确率97%测试只有63%。排查后发现三个问题第一特征没有标准化SVM边界被少数大数值特征带偏第二数据集划分时没分层部分类别的测试样本过于集中第三直方图均衡化只做了灰度图颜色特征尺寸五花八门。解决办法严格按类别分层划分训练测试集使用cvpartition的Stratify选项所有特征进入SVM前必须标准化增加数据增强样本。如果还不行减少特征维度比如去掉Hu矩里方差过大的几个分量用PCA压缩到10维左右有时反而更稳。5.2 光照变化一大识别结果就乱跳花朵在自然光下拍摄光照方向、阴影、色温差异很大。我试过一张在晴天向日葵照片模型自信地判成了菊花。原因是原始图像中花瓣被阴影压暗、颜色偏灰HSV的颜色矩发生了剧烈变化。解决光照问题最有效的一招是分段处理。先用颜色阈值分割出前景花朵区域比如在HSV空间用色相H的统计范围滤掉绿色背景然后只在分割出的ROI内提取颜色和纹理特征背景不参与计算。实现时要注意H范围是0到1绿色在0.25到0.45附近。调试时最好实时显示分割掩膜否则纯靠数值看不到提取区域是否正确。我做了几版后总结把分割步骤放在预处理之后可以明显提高复杂光照下的鲁棒性但分割参数需要按花朵颜色调整通用性会下降。5.3 程序跑得慢内存疯涨小尺寸图片没事但如果你用3000万像素的原图直接跑GLCM内存会立刻爆炸。我刚开始没限制尺寸一张图跑了十几秒还经常内存不足。先统一缩放成256×256GLCM的NumLevels设32速度能接受。另外提取特征时用parfor并行遍历文件四核机器直接快将近三倍。使用parfor要注意worker无法保存中间变量因此每个iteration要独立完成读取、预处理、特征提取返回特征向量最后汇总。还遇到过内存“边用边涨”的情况原因是featureSet动态增长每次end1都会重新分配矩阵。预先分配后内存占用就平稳了。5.4 界面卡死与路径乱码GUI点击识别按钮后卡死是因为回调内同步执行了一个几十张图片的批量循环。解决方法是把批量识别放到单独的函数中调用每处理完一张更新一次进度条。路径乱码问题则在于Matlab对中文路径支持不佳最简单的方案是强制把所有图片和工程文件放在纯英文路径下这是最省心的处理方式。6. 实战优化与个人心得6.1 想再提精度可以按优先级做这三件事第一优先级是做好前景分割把花朵区域从复杂背景中剥离出来。背景对传统特征影响极大绿色草地、深色树干都会混进特征向量。第二优先级是做特征扩展和融合。当前20维特征是基础款可以加入颜色直方图的卡方距离特征、LBP纹理特征再使用PCA降维。特征不是越多越好但合理组合确实能提升区分度。第三优先级是模型集成。我用SVM、KNN、朴素贝叶斯各训练一个模型再投票决策准确率比单个SVM稍微高一点。如果你的数据量翻倍也可以考虑迁移学习用预训练网络提取图像深层特征再用SVM分类效果会显著提升但训练耗时和对GPU的要求也随之上升。6.2 回头看看这套系统的价值在哪我最深的体会是传统机器学习方案在真实小数据场景下并没有过时。它训练快、好调试、原理透明特别适合作为第一个完整的图像识别项目。你在调特征的过程中会真正理解“什么信息能区分类别”而不是把一切丢给黑盒CNN。如果让我重新做一遍我会坚持先写脚本后做GUI先用一组小图片跑通再扩展数据最后套界面。这个顺序能少走两天弯路。另一个值得养成的习惯是每次改动特征或参数都记录下准确率方便回溯。我后来在项目目录下放了一个result_log.xlsx每次实验写一行模型迭代立刻有迹可循。这套流程也不仅限于花朵识别。叶子、果实、简单工业零件分类本质上都是“图像预处理—特征提取—分类器训练”的套路换成任何对象都能复用。希望这篇实战记录能帮你少踩几个坑也期待看到你调出更高的准确率。

相关新闻

用好LLM写安全代码:别让提示词成为唯一防线

用好LLM写安全代码:别让提示词成为唯一防线

我见过不少团队把LLM当成一个“不会犯错的实习生”,甩给它一句“写安全的代码”就撒手不管。直到一次代码评审里,我发现模型自动补全的登录接口把异常分支里的鉴权检查直接删掉了,才意识到这个思路有多危险。今天想聊的就是怎么用LLM写出更安…

2026/10/17 9:19:35 阅读更多 →
基于MobileNetV3的动物声音分类识别系统:从频谱图到部署

基于MobileNetV3的动物声音分类识别系统:从频谱图到部署

每年选题季,我都能在实验室门口遇上一批攥着手机来回踱步的同学。他们的问题出奇一致:毕设题目要有真实数据、能跑通系统、答辩能讲出深度,但显卡只有一张勉强能用的消费级卡,时间只剩三个月。今年被问得最多的一个方向&#xff0…

2026/10/17 9:18:34 阅读更多 →
WSL2下Docker Desktop迁移到D盘:彻底解决C盘空间不足

WSL2下Docker Desktop迁移到D盘:彻底解决C盘空间不足

自从开始用 WSL2 跑 Docker,C 盘空间就见鬼一样地往下掉。一开始以为是镜像下多了,清理几次发现根本治标不治本,后来查了才发现问题出在根子上:Docker Desktop 默认会把整个 WSL 发行版的数据放在C:\Users\用户名\AppData\Local\D…

2026/10/17 9:18:34 阅读更多 →

最新新闻

2.42GHz宽带低相噪LC压控振荡器:调谐与噪声的平衡设计

2.42GHz宽带低相噪LC压控振荡器:调谐与噪声的平衡设计

简介:一份围绕2.42 GHz宽带低相噪LC压控振荡器的设计文档,面向射频集成电路设计人员、通信系统工程师及学习频率合成技术的高年级学生。方案采用开关电容阵列(SCA)与电压、电流滤波相结合的互补交叉耦合型LC VCO结构,先…

2026/10/18 22:16:34 阅读更多 →
baseflight飞控源码入门:从裸机主循环到混控输出的完整链路解析

baseflight飞控源码入门:从裸机主循环到混控输出的完整链路解析

简介:baseflight-master 是一套面向无人机飞控算法研究者的开源源码包,适合具备一定嵌入式与C语言基础的开发者学习或定制飞控特性。包内代码清晰展示飞控系统的核心运行逻辑:硬件初始化、传感器数据融合、PID姿态控制、命令解析、故障检测与…

2026/10/18 22:16:34 阅读更多 →
LLM填槽实战:从规则模板到结构化生成,打造高准确率对话系统

LLM填槽实战:从规则模板到结构化生成,打造高准确率对话系统

直接从从业者的角度切入,聊聊“LLM填槽”这件事。做了几年对话系统,从早期的规则模板一路折腾到大模型落地,我对填槽这件事的理解是:它本质上不是“解析字符串”,而是“从对话里复刻用户脑子里的完整需求”。这篇文章不…

2026/10/18 22:16:34 阅读更多 →
Python美食数据全链路实战:爬取清洗分析可视化闭环

Python美食数据全链路实战:爬取清洗分析可视化闭环

简介:本资源是一套完整的Python数据科学实战项目,面向数据分析初学者与爬虫爱好者,聚焦美食领域从数据获取到可视化呈现的全流程实践。项目涵盖网络爬虫(requestsBeautifulSoup)、数据清洗分析(pandasNumPy…

2026/10/18 22:16:34 阅读更多 →
如何用工作手机管理微信聊天?品牌推荐与选型参考(技术选型篇)

如何用工作手机管理微信聊天?品牌推荐与选型参考(技术选型篇)

摘要:本文从企业微信管理的真实痛点出发,拆解工作手机的核心能力要求,并对无极、云客、先发三款方案做横向对比,最后给出一套可直接落地的选型 CheckList,供销售团队管理员和 IT 负责人参考。一、管理需求:…

2026/10/18 22:16:34 阅读更多 →
SPACE沙箱生命周期完全指南:Running/Paused/Suspended三种状态如何选?附pause/suspend/wake实战

SPACE沙箱生命周期完全指南:Running/Paused/Suspended三种状态如何选?附pause/suspend/wake实战

【免费下载链接】SPACE Sandboxed Platform for Agentic Code Execution: pluggable-runtime sandboxes for running agent and user code in isolation. 项目地址: https://gitcode.com/gh_mirrors/space34/SPACE 点击查看 免费下载 SPACE 是一款面向 AI Agent 的…

2026/10/18 22:15:33 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →