机器学习入门四大实战项目:手写数字识别、声呐分类、垃圾短信识别与鸢尾花分类
简介这份资源面向零基础或刚接触机器学习的小白学习者围绕四个经典入门项目展开手写数字识别、声呐目标分类、垃圾短信识别与鸢尾花分类帮助读者在动手实践中理解分类任务的完整流程与常见算法思路。压缩包共13个文件约630KB包含4个csv数据集、3个ipynb交互式笔记本、3个py脚本、2个txt说明及1个md文档覆盖数据读取、模型训练与结果验证等环节便于边看边跑、逐步调试。目前已有142人学习下载适合作为课程实验、自学练手或项目作业的参考。读者可从中获得四套可直接运行的源码与配套数据借助笔记本与脚本对照理解特征处理、模型选择与评估方法并参考说明文档快速搭建环境、排查常见报错从而建立对机器学习项目结构的整体认知。1. 四个练手项目里哪个最容易被小白低估很多人第一次接触机器学习都是从手写数字识别开始的。MNIST 数据集小、教程多、跑通快成就感来得容易。但如果你只做过这一个项目很容易产生一种错觉机器学习就是调个库、fit 一下、看准确率。真正上手之后你会发现手写数字识别是四个项目里最“干净”的一个——图像居中、灰度归一化、类别均衡几乎不需要做特征工程。而声呐分类、垃圾短信识别、鸢尾花分类这三个项目各自暴露的是不同层面的问题声呐数据维度高样本少垃圾短信是文本特征提取的经典入口鸢尾花则是理解特征分布和分类边界的入门样本。这四个项目放在一起覆盖了图像、信号、文本、表格四种数据形态是小白建立完整认知的最短路径。这篇文章会按“数据长什么样 → 特征怎么提 → 模型怎么选 → 结果怎么验”的顺序把四个项目逐一拆开每个都给出可复现的代码和参数说明最后收在几个我踩过的坑上。2. 手写数字识别从像素到预测的最小闭环2.1 为什么选它作为第一个项目手写数字识别的核心价值不在于模型多复杂而在于它让你完整走一遍监督学习的流程加载数据、划分训练测试集、定义模型、训练、评估。这个流程走通了后面三个项目只是换数据源和特征提取方式。常见做法是用 scikit-learn 自带的 digits 数据集只有 1797 个样本8×8 像素跑一次不到一秒非常适合反复调试。如果要用更大的 MNIST建议先用 digits 把逻辑跑通再换。数据本身是 8×8 的灰度矩阵每个像素值 0 到 16。直接展平成 64 维向量就能喂给分类器。这里不需要做归一化也能跑但做了归一化会让后续换模型时更稳定。2.2 用逻辑回归跑通第一个基线from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.metrics import classification_report # 加载数据 digits load_digits() X, y digits.data, digits.target # 划分训练集和测试集stratify 保证类别比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) # 标准化把每个像素特征缩放到均值0方差1 scaler StandardScaler() X_train scaler.fit_transform(X_train) X_test scaler.transform(X_test) # 逻辑回归max_iter 调到 5000 避免不收敛警告 clf LogisticRegression(max_iter5000, multi_classmultinomial) clf.fit(X_train, y_train) # 输出每个类别的精确率、召回率、F1 print(classification_report(y_test, clf.predict(X_test)))这段代码里有两个参数值得注意。stratifyy保证训练集和测试集里每个数字的比例一致否则如果测试集里某个数字特别少评估结果会失真。max_iter5000是因为默认的 100 次迭代在 64 维特征下经常不收敛scikit-learn 会报警告虽然不影响结果但看着烦。multi_classmultinomial表示用 softmax 做多分类比默认的 one-vs-rest 更适合类别互斥的场景。跑完你会看到准确率大概在 95% 以上。如果低于这个数先检查是否漏了标准化再检查random_state是否固定。2.3 换模型和调参的边界在哪逻辑回归跑通之后可以换随机森林或 SVM 对比。随机森林不需要标准化但n_estimators低于 50 时方差会偏大。SVM 在 64 维小样本上表现很好但C值超过 10 之后容易过拟合建议从C1开始试。这里有一个容易被忽略的点digits 数据集只有 1797 个样本测试集只有 360 个。准确率波动 1% 可能只是随机划分导致的。我一般会跑 5 次不同的random_state看准确率的均值和标准差而不是只看一次结果。如果标准差超过 1.5%说明模型对数据划分太敏感需要增加样本或换更稳定的模型。3. 声呐分类高维小样本下的特征选择与模型约束3.1 声呐数据的特殊性在哪声呐分类的经典数据集是 UCI 的 Sonar包含 208 个样本每个样本有 60 个特征对应不同频段的能量值。二分类任务区分金属圆柱和岩石。这个数据集的特点是样本极少、特征维度高直接上复杂模型几乎必然过拟合。我一般会先看特征分布。60 个特征里有些频段的区分度明显更高。用SelectKBest做特征选择保留前 20 到 30 个特征往往比用全部特征效果更好。这不是玄学是因为高维空间下样本稀疏噪声特征会稀释有效信号。3.2 用特征选择加 SVM 建立可复现的流程import pandas as pd from sklearn.model_selection import train_test_split, cross_val_score from sklearn.feature_selection import SelectKBest, f_classif from sklearn.svm import SVC from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler # 假设数据已下载为 sonar.csv最后一列是标签 df pd.read_csv(sonar.csv, headerNone) X df.iloc[:, :-1].values y df.iloc[:, -1].values # 划分数据集stratify 保证两类比例一致 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.25, random_state42, stratifyy ) # 用 Pipeline 把标准化、特征选择、SVM 串起来 pipe Pipeline([ (scaler, StandardScaler()), (select, SelectKBest(f_classif, k25)), (svm, SVC(kernelrbf, C5, gammascale)) ]) # 5折交叉验证看模型稳定性 scores cross_val_score(pipe, X_train, y_train, cv5) print(f交叉验证准确率: {scores.mean():.3f} ± {scores.std():.3f}) # 在测试集上评估 pipe.fit(X_train, y_train) print(f测试集准确率: {pipe.score(X_test, y_test):.3f})SelectKBest的k25是我在多次实验后觉得比较稳的值。低于 15 会丢信息高于 35 会引入噪声。f_classif是方差分析 F 值适合连续特征和二分类标签。SVM 的C5是在小样本下比较保守的选择gammascale会自动根据特征方差调整比手动设gamma更省事。交叉验证的标准差如果超过 5%说明模型对数据划分太敏感这时候要么增加k值要么换更简单的模型比如逻辑回归。3.3 为什么不用深度学习208 个样本60 个特征用神经网络几乎一定过拟合。即使加 Dropout 和正则化调参成本也远高于 SVM。我试过用三层全连接网络训练集准确率能到 100%测试集只有 70% 左右。这不是模型不行是数据量不够。小样本场景下传统方法加特征工程往往比深度学习更靠谱。4. 垃圾短信识别文本特征提取与分类器选择4.1 从原始文本到特征矩阵垃圾短信识别是四个项目里唯一涉及文本的。原始数据是短信内容加标签spam/ham。文本不能直接喂给分类器需要先转成数值特征。最常见的方法是词袋模型加 TF-IDF。词袋模型统计每个词在文档中出现的次数TF-IDF 在此基础上降低高频常见词的权重。比如“的”“了”出现再多也没区分度TF-IDF 会自动压低它们的权重。这一步做完每条短信变成一个稀疏向量维度等于词汇表大小。4.2 用 TF-IDF 加朴素贝叶斯跑通基线import pandas as pd from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.naive_bayes import MultinomialNB from sklearn.metrics import classification_report, confusion_matrix # 假设数据为 spam.csv包含 label 和 message 两列 df pd.read_csv(spam.csv, encodinglatin-1) df df[[v1, v2]].rename(columns{v1: label, v2: message}) # 划分数据集 X_train, X_test, y_train, y_test train_test_split( df[message], df[label], test_size0.2, random_state42, stratifydf[label] ) # TF-IDF 向量化max_features 限制词汇表大小 vectorizer TfidfVectorizer( max_features3000, stop_wordsenglish, ngram_range(1, 2), min_df2 ) X_train_vec vectorizer.fit_transform(X_train) X_test_vec vectorizer.transform(X_test) # 朴素贝叶斯alpha 是平滑参数 clf MultinomialNB(alpha0.1) clf.fit(X_train_vec, y_train) # 评估 y_pred clf.predict(X_test_vec) print(classification_report(y_test, y_pred)) print(confusion_matrix(y_test, y_pred))max_features3000是权衡计算量和效果的结果。短信文本短词汇量不大3000 足够覆盖。ngram_range(1, 2)表示同时考虑单个词和相邻两个词的组合能捕捉“免费领取”这类短语。min_df2过滤掉只出现一次的词减少噪声。alpha0.1是拉普拉斯平滑的变体防止某个词在训练集没出现导致概率为零。朴素贝叶斯在文本分类上表现很稳因为它的独立性假设虽然不成立但在高维稀疏特征下反而有正则化效果。如果换 SVM需要调C值而且训练慢很多。4.3 混淆矩阵比准确率更重要垃圾短信识别里准确率不是唯一指标。如果垃圾短信占比只有 10%全部预测为正常也能有 90% 准确率。所以必须看混淆矩阵。重点关注两个数漏报的垃圾短信假阴性和误报的正常短信假阳性。漏报意味着用户收到垃圾短信误报意味着正常短信被拦截。哪个代价大取决于业务场景。我一般会调整alpha或换class_weightbalanced来平衡两类错误。5. 鸢尾花分类理解特征分布和决策边界5.1 为什么这个“最简单”的数据集值得反复看鸢尾花数据集只有 150 个样本4 个特征3 个类别。很多人跑完一遍就扔了。但它的价值在于可视化。把四个特征两两组合画散点图能直观看到哪些特征组合能把类别分开。比如花瓣长度和花瓣宽度组合下三个类别几乎线性可分。而萼片长度和萼片宽度组合下类别重叠严重。这个观察直接决定了模型选择。如果特征空间里类别近似线性可分逻辑回归就够了。如果重叠严重需要核方法或树模型。我一般会先用pairplot看分布再决定用什么模型。5.2 用决策树看特征重要性from sklearn.datasets import load_iris from sklearn.tree import DecisionTreeClassifier, export_text from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 加载数据 iris load_iris() X, y iris.data, iris.target # 划分数据集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.3, random_state42, stratifyy ) # 决策树max_depth 限制层数防止过拟合 tree DecisionTreeClassifier(max_depth3, random_state42) tree.fit(X_train, y_train) # 输出特征重要性 for name, importance in zip(iris.feature_names, tree.feature_importances_): print(f{name}: {importance:.3f}) # 输出决策规则 print(export_text(tree, feature_namesiris.feature_names)) # 评估 y_pred tree.predict(X_test) print(f准确率: {accuracy_score(y_test, y_pred):.3f})max_depth3是鸢尾花数据集上比较合适的值。不加限制的话决策树能长到把训练集完全分开但测试集准确率反而下降。输出决策规则能看到模型到底在怎么判断比如“花瓣长度小于 2.5 厘米的几乎都是某一类”。这种可解释性是决策树相比 SVM 的优势。特征重要性输出里花瓣长度和花瓣宽度通常排前两位和散点图观察一致。如果某个特征重要性接近零可以考虑删掉简化模型。5.3 三个类别的决策边界怎么验证鸢尾花有三个类别决策树会在特征空间里画出矩形边界。验证方法是把测试集样本投影到两个最重要的特征上看预测错误的点落在哪里。如果错误集中在两个类别的交界处说明这两个类别本身就有重叠不是模型的问题。我一般会画一个二维散点图用颜色表示真实类别用标记形状表示预测类别一眼就能看出错分模式。6. 四个项目跑完后这些坑我替你踩过了6.1 数据泄漏标准化在划分之前做现象测试集准确率异常高换一组测试数据后暴跌。 原因先对整个数据集做标准化再划分训练测试集。标准化用到了测试集的均值和方差相当于提前泄露了测试集信息。 解决永远先划分再在训练集上fit_transform在测试集上只transform。用 Pipeline 能自动避免这个问题。6.2 类别不平衡准确率骗了你现象垃圾短信识别准确率 95%但一条垃圾短信都没抓出来。 原因垃圾短信占比低模型全预测为正常也能拿高准确率。 解决看混淆矩阵和 F1 分数用class_weightbalanced或调整阈值。声呐分类里两类比例接近这个问题不明显但垃圾短信和鸢尾花如果抽样不均就会踩到。6.3 过拟合训练集 100%测试集 70%现象声呐分类用复杂模型训练集完美测试集崩了。 原因样本少特征多模型记住了噪声。 解决用交叉验证看稳定性加正则化做特征选择。小样本场景下模型复杂度要压住。6.4 文本预处理停用词表不是万能的现象垃圾短信识别里去掉停用词后效果反而下降。 原因短信里的“免费”“中奖”这类词如果被误判为停用词关键信号就丢了。 解决先不做停用词过滤跑一版再对比加了停用词的效果。stop_wordsenglish只适合标准英文文本短信这种非正式文本要谨慎。6.5 随机种子结果不可复现现象同样的代码两次运行准确率差 2%。 原因random_state没固定数据划分和模型初始化都带随机性。 解决所有涉及随机的步骤都设random_state包括train_test_split、模型初始化、交叉验证的cv参数。如果要看稳定性就固定多个种子跑多次看均值和标准差。7. 从跑通到跑稳交叉验证和超参数搜索的实操细节四个项目都能跑通之后下一步是让结果稳定可复现。我一般会做两件事用交叉验证替代单次划分用网格搜索替代手动调参。交叉验证的做法是把训练集分成 K 份每次用 K-1 份训练1 份验证循环 K 次。这样每个样本都当过验证集结果更能反映模型真实能力。K 通常取 5 或 10。样本少的时候取 5样本多的时候取 10。from sklearn.model_selection import GridSearchCV from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.svm import SVC # 以声呐分类为例 pipe Pipeline([ (scaler, StandardScaler()), (svm, SVC(kernelrbf)) ]) # 参数网格 param_grid { svm__C: [0.1, 1, 5, 10], svm__gamma: [scale, 0.01, 0.1] } # 网格搜索加 5 折交叉验证 grid GridSearchCV(pipe, param_grid, cv5, scoringf1_weighted, n_jobs-1) grid.fit(X_train, y_train) print(f最佳参数: {grid.best_params_}) print(f最佳交叉验证分数: {grid.best_score_:.3f}) print(f测试集分数: {grid.score(X_test, y_test):.3f})scoringf1_weighted比默认的准确率更适合类别不平衡场景。n_jobs-1用满所有 CPU 核心加速搜索。svm__C里的双下划线是 Pipeline 的语法表示svm步骤的C参数。网格搜索的代价是计算量成倍增加。参数组合多的时候先用粗粒度网格定位大致范围再用细粒度网格精调。比如先试C的 0.1、1、10确定 1 附近最好再在 0.5 到 2 之间细分。还有一个习惯每次实验都记录参数和结果。我一般用字典存下来跑完对比。不记录的话跑多了根本记不住哪个参数对应哪个分数。这个习惯在四个项目之间迁移时特别有用因为不同数据集的敏感参数不一样有记录才能快速定位。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

贪吃蛇AI实战:从状态编码到DQN训练,避开绕圈与撞墙的坑

简介:这份资源是一套用 C/C 编写的贪吃蛇游戏人工智能实现,面向对游戏 AI、路径搜索与强化学习感兴趣的开发者与学习者,帮助理解如何让蛇在自动寻路中尽可能吃满整张地图。压缩包共 57 个文件,以 34 个 Python 源码为主&#xff0…

2026/10/13 13:35:16 阅读更多 →
GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

GDAL 2.3.1 Windows预编译包使用指南:环境配置、格式转换与避坑实践

简介:本资源为自行编译的 GDAL 2.3.1 Windows 64 位版本压缩包,面向从事 GIS、遥感影像处理与空间数据转换的开发者及研究人员。GDAL 是支持 GeoTIFF、JPEG、HDF4、HDF5、ECW、MrSID 等多种栅格与矢量格式的开源地理空间库,自行编译便于按需选…

2026/10/13 13:35:16 阅读更多 →
内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

内网自建Git服务实战:CentOS 8 + Apache HTTP协议搭建轻量代码托管

1. 为什么要在内网自建 Git 服务1.1 从一次代码托管迁移说起前段时间帮一个做嵌入式开发的小团队整理代码仓库,他们之前一直把代码放在公共托管平台上,项目本身不涉及什么敏感内容,但问题是每次拉取和推送都要走外网,办公室的网络…

2026/10/13 13:35:16 阅读更多 →

最新新闻

MT9M001C全局快门CMOS驱动LCD实战:FPGA时序控制与信号链调试

MT9M001C全局快门CMOS驱动LCD实战:FPGA时序控制与信号链调试

简介:本资源是面向FPGA初学者与嵌入式图像处理学习者的实战项目,聚焦于MT9M001 CMOS图像传感器的驱动与实时显示实现,适用于基于Altera/Intel FPGA的开发板平台。项目完整呈现了从传感器数据采集、FPGA逻辑控制(含时序生成、像素流…

2026/10/13 14:22:18 阅读更多 →
机器学习驱动的Web异常检测:特征工程、模型选择与部署实践

机器学习驱动的Web异常检测:特征工程、模型选择与部署实践

简介:面向网络安全分析与机器学习学习者,这个项目压缩包围绕Web异常检测展开,提供一套从数据理解、特征处理到模型构建与评估的完整实践资源。压缩包共七个文件,包含四张预处理前后对比的可视化图片、两个正负样本数据集文本以及一…

2026/10/13 14:22:18 阅读更多 →
企业级AI工作伙伴框架:从聊天到干活的工具调用实战

企业级AI工作伙伴框架:从聊天到干活的工具调用实战

1. 从“只会聊天”到“真能干活”:企业级 AI 工作伙伴到底长什么样公司里那套 AI 助手,你是不是也受够了?问它“帮我查一下上季度的报销异常”,它回你一段“作为一个人工智能,我无法访问您的内部系统”;问它…

2026/10/13 14:22:18 阅读更多 →
企业级AI工作伙伴实战:工具调用、记忆与知识检索的智能体架构设计

企业级AI工作伙伴实战:工具调用、记忆与知识检索的智能体架构设计

1. 从“只会聊天”到“真能干活”:企业级 AI 工作伙伴的设计思路1.1 为什么通用对话模型在企业场景里总差一口气过去两年,我接触过不少团队把对话模型接进内部系统,结果大多停在“问答机器人”阶段。员工问一句“上季度差旅报销政策是什么”&…

2026/10/13 14:22:18 阅读更多 →
基于SVM的机器学习入侵检测系统源码解析与复现要点

基于SVM的机器学习入侵检测系统源码解析与复现要点

简介:这是一套基于机器学习的入侵检测系统完整实现,包含源代码与配套文档,适合计算机相关专业的在校学生用于毕业设计、课程设计或项目初期立项演示,也适合初学者进阶学习。系统采用Python编写,代码涵盖数据预处理、SV…

2026/10/13 14:22:18 阅读更多 →
CATIA V5R13汽车线束设计:三维布线到展平BOM的避坑指南

CATIA V5R13汽车线束设计:三维布线到展平BOM的避坑指南

简介:针对CATIA V5R13汽车线束设计的PPT课件,面向电气工程初学者与CATIA V5新用户,系统讲解线束在数字样机中的创建、装配与连接方法。在整车开发中,线束承担汽车电气系统中电能与信号传输,设计质量直接影响整车布线合…

2026/10/13 14:21:17 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →