机器学习成矿预测实战:从数据准备到靶区圈定的完整源码工作流
简介机器学习在成矿预测中的应用项目源码提供了一份面向地质研究与数据科学实践的轻量级示例演示从传统统计模型如证据权重法到随机森林等机器学习方法的范式转变针对传统方法因条件独立性假设而难以刻画复杂地质系统的问题给出可运行实现。压缩包共含3个文件以 HTML 成果展示页、InsCode 在线运行配置和 Git 忽略配置为主总大小仅9KB结构紧凑便于直接查阅或嵌入个人实验环境。已有59人参与学习该源码可作为入门与对照实现通过阅读代码理解特征选择、非线性关系拟合等关键环节也可借助运行配置快速复现结果。这一实现契合当前地学大数据环境有助于直观感受机器学习模型从高维地质数据中提取交互作用的方式相比传统统计方法更具非线性建模优势为后续勘探应用或算法扩展提供起步基础。1. 机器学习成矿预测为什么它比传统“找矿公式”更值得你投入源码实践先说一个反直觉结论机器学习在成矿预测里最值钱的不是“预测准确率”而是“高召回率下的精准定位”。传统方法用经验公式给地质体打分结果往往是“全区都高”圈出的靶区大而空而一个训练得当的模型能把“可能成矿”的范围压缩到原先的十分之一让野外验证工作量骤降。这就是为什么越来越多地勘单位开始把机器学习模型、项目源码和地质大数据绑在一起做二次开发。本文讲的不是学术论文复现而是一套能落地的“成矿预测”工作流数据怎么准备、特征怎么构造、模型怎么训练、参数怎么调到本地圈闭有效以及源码实践中那些让你半夜挠头的坑。适合有地质背景但编程是半吊子的从业者也适合刚接触机器学习、想拿地学数据练手的人。跟着走一遍你会得到一个可复用的预测流程而不是一堆飘在云端的术语。2. 先解决数据和标签问题成矿预测的“题眼”从来不是模型2.1 数据从哪来把地质图、化探、物探和已知矿点叠进一张表机器学习吃的是结构化表格但地学数据天然是图层、散点和等值线。我的常规做法是把所有信息统一落到“栅格单元”或“1km×1km 网格”上每个网格一行记录所有特征都提到这个网格里。常见数据源有四类地质图地层、岩体、断层、化探数据Au、As、Sb 等元素含量、物探数据磁法、重力、电阻率以及已知矿点/矿化点做标签用。import geopandas as gpd import pandas as pd import numpy as np from rasterio.mask import mask # 1. 生成1km格网研究区范围从矢量边界读取 area gpd.read_file(study_area.shp) grid gpd.GeoDataFrame(geometrygpd.make_grid(area.total_bounds, 1000, 1000)) grid grid.intersection(area.unary_union).reset_index() # 2. 把断层距离算出来每个网格中心到最近断层的距离 centers grid.geometry.centroid faults gpd.read_file(faults.shp) dist_to_fault centers.geometry.apply(lambda p: faults.distance(p).min()) grid[dist_fault] dist_to_fault # 3. 化探Au含量用栅格值按位置提取 with rasterio.open(au_soil.tif) as src: coords [(p.x, p.y) for p in centers] grid[au_ppm] [v[0] for v in src.sample(coords)]这里有几个参数需要解释。1000是网格尺寸单位米它直接决定样本量和空间分辨率网格太小特征空间相关性过强模型会把“相邻单元高度一致”当成规律形成伪高精度网格太大矿化信息被平均掉模型学不到局部异常。我一般先用 500m 试跑再用 1km 和 2km 做对照。dist_fault这种特征非常关键因为大多数热液型矿床严格受断裂和岩体接触带控制距离断层越近成矿概率越高。如果只有矢量断层务必计算欧氏距离如果有断层密度或走向数据也一并加进去不要手软。2.2 正负样本构造没有“无矿区”标签怎么办这是整个流程里最容易被新手搞砸的一步。已知矿点可能只有三五十个这远远不够训练模型而“无矿区”在哪儿根本没有标注。业内通用做法是缓冲区分级以已知矿点为核心半径 200m 内作为正样本标签 1往外 1km 到 5km 范围作为负样本标签 0。注意负样本不要紧贴正样本边界否则模型学会了“离矿点越近越像矿”而实际预测时这是完全无用的规律。from scipy.spatial import cKDTree # 矿点坐标 ore_points gpd.read_file(ore_deposits.shp)[[geometry]] ore_xy np.array([(p.x, p.y) for p in ore_points.geometry]) grid_xy np.array([(p.x, p.y) for p in grid.geometry.centroid]) # 找每个网格最近矿点距离 tree cKDTree(ore_xy) dist, _ tree.query(grid_xy) # 标签规则200m 正样本1500m 负样本中间丢弃过渡带不要 grid[label] np.nan grid.loc[dist 200, label] 1 grid.loc[dist 1500, label] 0 grid grid.dropna(subset[label]).reset_index(dropTrue)label列是监督信号但在实际成矿预测中标签不能只看“用矿点定义矿”。正确思路是找已知矿床的外围和深部以及同一成矿带内类似地质环境但尚未探明的区域这些才是模型真正要预测的目标。出于这个原因我不建议用三分之一的矿点做验证集因为空间自相关性会让验证分数虚高更好的做法是按成矿带划分而不是按随机样本划分。如果项目源码里只给了随机切分建议你改一下否则后面的评价指标都不可信。2.3 特征标准化与缺失值处理别让化探数据的量纲毁掉模型成矿预测的特征量纲差异极大——Au 含量可能是 ng/g 级别断层距离是米岩体年龄是百万年。如果不做标准化基于距离的模型SVM、KNN会直接被大数值特征主导而树模型虽然不受量纲影响但对缺失值很敏感。化探数据经常有未测出的低于检出限的值通常记为 0 或负值这是物理意义上的“无信号”不是随机缺失。from sklearn.preprocessing import RobustScaler from sklearn.impute import SimpleImputer feature_cols [dist_fault, au_ppm, as_ppm, mag_value, gravity] X grid[feature_cols].copy() # 低于检出限的一律替换为列最小值的一半比填0更符合地球化学背景 for col in [au_ppm, as_ppm]: min_val X.loc[X[col] 0, col].min() X.loc[X[col] 0, col] min_val / 2 # 缺失值用中位数填不破坏分布 imp SimpleImputer(strategymedian) X pd.DataFrame(imp.fit_transform(X), columnsfeature_cols) # 标准化RobustScaler 抗异常值比 StandardScaler 稳 scaler RobustScaler() X_scaled scaler.fit_transform(X)如果你拿到的“机器学习在成矿预测中的应用[项目源码]”跑出来的精度很高但野外验证靶区完全不对大概率是特征标准化的版本不对。RobustScaler适合化探数据因为化探元素含量经常有几个数量级的离群点如果直接用 StandardScaler均值会被拉走异常点反而变成“正常”模型就废了。还有一个细节填充低于检出限的值用最小值一半是地球化学领域的习惯做法这比简单填 0 更合理因为分母上的 1 在对数变换中不会崩。3. 模型选型与训练随机森林、XGBoost 还是开源的深度模型3.1 为什么优先选树模型非线性、特征交互和小样本友好成矿预测的本质是“多元地质要素的非线性叠加”。没有哪个单一特征能决定成矿但断层距离密 蚀变异常强 特定地层组合三者同时满足时概率指数上升。树模型天然刻画这种交互作用而逻辑回归或线性 SVM 必须手工设计交互特征否则学不到组合规律。在样本量只有几百到一两千的典型项目中随机森林比深度学习更安全因为深度模型在小样本上极易过拟合训练集的“高精度”对野外验证没有任何意义。from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GroupKFold from sklearn.metrics import roc_auc_score # 按成矿带分组做交叉验证而不是随机划分 groups grid[mineral_belt_code] cv GroupKFold(n_splits5) auc_scores [] for train_idx, val_idx in cv.split(X_scaled, grid[label], groups): model RandomForestClassifier( n_estimators500, max_depth8, min_samples_leaf10, class_weightbalanced_subsample, random_state42 ) model.fit(X_scaled[train_idx], grid[label].iloc[train_idx]) pred model.predict_proba(X_scaled[val_idx])[:, 1] auc_scores.append(roc_auc_score(grid[label].iloc[val_idx], pred)) print(fGroupKFold AUC: {np.mean(auc_scores):.3f} ± {np.std(auc_scores):.3f})class_weightbalanced_subsample对正负样本不均衡特别重要。成矿预测中正样本通常只占 5%~10%如果不管类别权重模型把所有样本都判为“无矿”也能拿到 90% 以上的 accuracy但完全没用。AUC 比 accuracy 更适合评估这种场景而GroupKFold按成矿带分组每一折的训练集和验证集来自不同成矿带能真实反映模型在未知区域的泛化能力。注意min_samples_leaf10不是随手写的它控制叶子节点的最小样本数对抑制过拟合比单纯减小max_depth更有效。3.2 XGBoost 调参三个必调参数和早停策略如果随机森林的精度不够第二步就是上 XGBoost。它和随机森林最大的区别是** boosting 机制**每棵树都在拟合前一棵树的残差所以它对“微弱的地球化学异常”更敏感。代价是参数多容易过拟合。我的经验是只调三个核心参数n_estimators、max_depth和subsample其余用默认值或保持不动尤其是learning_rate调小了训练时间长调大了AUC 波动大0.1是稳妥起点。import xgboost as xgb dtrain xgb.DMatrix(X_scaled[train_idx], labelgrid[label].iloc[train_idx].values) dval xgb.DMatrix(X_scaled[val_idx], labelgrid[label].iloc[val_idx].values) params { objective: binary:logistic, eval_metric: auc, max_depth: 4, learning_rate: 0.1, subsample: 0.8, colsample_bytree: 0.7, min_child_weight: 5, scale_pos_weight: 10, # 正负比约1:10直接设置权重而非采样 } model_xgb xgb.train( params, dtrain, num_boost_round2000, evals[(dval, val)], early_stopping_rounds50, verbose_eval50 )scale_pos_weight是这个模型最值得玩味的地方它等同于把正样本的损失乘以 10迫使模型更关注那些“像矿但被判成无矿”的网格。early_stopping_rounds50的意思是验证集 AUC 连续 50 轮不提升就停止训练防止学到训练集噪声。这里有个坑verbose_eval50会让你每 50 轮打印一次训练信息如果发现验证集 AUC 在上升后突然下跌不是参数问题而是树太多——回退到早停时的best_iteration即可。3.3 可解释性分析看 SHAP 值而不是特征重要性树模型自带的feature_importances_在成矿预测中误导性很强。它只统计“这个特征被选中作为分裂点的次数”但一个特征可能只在少数区域起关键作用它重要性低出野外时却可能正好卡在矿体位置。SHAP 值解决的是“每个样本的每个特征贡献了多少预测概率”它可以告诉你这个网格被判高概率究竟是靠 Au 异常还是断层距离。import shap explainer shap.TreeExplainer(model_xgb) shap_values explainer.shap_values(X_scaled[val_idx]) # 查看单个样本的预测解释 shap.force_plot( explainer.expected_value, shap_values[0, :], X.iloc[val_idx].iloc[0], matplotlibTrue ) # 全局排名按平均绝对SHAP值排序 shap.summary_plot(shap_values, X_scaled[val_idx], feature_namesfeature_cols)经验是当成矿预测模型里dist_fault的 SHAP 值分布呈“断崖式”——距离小于 500m 时贡献显著为正大于 2km 时骤降——说明模型学到的是断层接触带控制规律这是符合地质常识的。反之如果au_ppm的 SHAP 值完全主导模型学到的就是“化探异常即矿”这在某些蚀变型矿床里适用但在覆盖区运积土覆盖会完全失效。拿到源码后建议先跑一段 SHAP看看模型依赖的特征是否和本区成矿模式一致。4. 成矿预测项目源码的五个常见翻车点现象、原因与修复4.1 训练集准确率 98%野外验证一个靶区都没打中这是最常见的翻车故事几乎每个做这类项目的人都经历过。现象是交叉验证 AUC 0.95 以上模型听起来完美但圈出的靶区要么全在已知矿点周围要么完全随机。原因几乎总是空间泄漏矿点周围的网格天然离矿点近而距离特征把“离已知矿点近”这个信息直接喂给了模型模型实际学的是距离拟合而不是成矿规律。修复方案是把所有距离特征全部删掉或者至少在建模时换成不依赖矿点位置的信息比如“距最近断层距离”而非“距已知矿点距离”。源码里如果没有删除距离特征的选项手动剔除对应列。4.2 随机划分验证集导致 AUC 虚高 0.15 以上很多开源项目源码默认用train_test_split随机划分数据这在成矿预测里是个大规模事故源头。同一成矿带的网格空间高度自相关训练集和验证集里可能包含来自同一个矿田的样本模型等于“开卷考试”。判定方法很简单把验证集的预测结果按空间位置画出来如果高概率点成片分布且恰好位于已知矿点周围说明空间泄漏了。修改方案是使用GroupKFold或BlockCV库按地质单元或经纬度分块划分这才是真正模拟未知勘探区。4.3 化探数据负值和零值处理不当造成模型偏差我在 2.3 节反复提到低于检出限的替换但很多项目的原始数据里Cd、Hg 等元素由于分析精度不够出现大量负值直接填入NaN会让模型丢掉这一行的全部特征。更隐蔽的问题是人家的源码里用了SimpleImputer(strategymean)均值填充会让大量一样的小数点出现在不同网格树模型会误以为“相同值相同类别”。正确的做法是负值一律替换为该元素列最小正值的 1/2然后在特征工程里额外加一个“是否低于检出限”的 0/1 标志位因为“没测出来”本身就是一种蚀变环境信息。这个标志位的 SHAP 值往往出乎意料地高。4.4 坐标参考系不统一导致网格错位、特征提取到错误位置地质数据来源五花八门有西安 80、北京 54、WGS84 和 CGCS2000投影坐标和经纬度坐标混在一起。源码跑起来不报错但特征值全错——化探Au含量被提取到了千里之外的网格上。排查唯一靠对比把提取后的特征值渲染在图上如果 Au 异常点与原始化探异常图位置明显偏移就是坐标系问题。解决方法是所有图层读取后统一投影通常转换为 UTM 或 Albers 等积投影再进行网格生成。代码里加一行.to_crs(EPSG:32650)之类代价是几分钟运算时间但能省后面一个月的返工。4.5 交叉验证 AUC 稳定但各个成矿带的表现天差地别模型整体 AUC 不错但如果按成矿带拆开看A 带 0.9B 带只有 0.6。这意味着模型只学好了数据样本量大的成矿带而样本稀少的带完全不被关注。这种现象在中小比例尺成矿预测里非常常见。修复不是堆数据而是引入“成矿带编号”作为特征让模型有机会区分不同构造环境或者用sample_weight给样本量少的成矿带更高的权重。有些源码会提供scale_pos_weight参数但极少有人意识到它也适用于“不同区域样本不平衡”只需要在 DMatrix 的weight参数里按带设置权重即可。5. 让预测结果真正用于部署网格概率到靶区圈定预测概率图出来了怎么把它变成可落地的靶区我的习惯是取预测概率的 90 分位数作为靶区阈值而不是用 0.5 这种默认二分类阈值。原因很简单成矿预测允许漏掉低概率区但圈出的每一个高概率网格都要经得起野外验证的考验。用 0.5 阈值在矿点密集区会圈出一大团毫无区分度。# 计算全图预测概率 pred_prob model_xgb.predict(xgb.DMatrix(X_scaled_full)) threshold np.percentile(pred_prob, 90) # 取高分位作为靶区阈值 # 连通域分析剔除零星孤立网格 from scipy.ndimage import label binary (pred_prob threshold).astype(int).reshape(grid_shape) labeled, num_features label(binary) # 只保留面积 3 个网格的靶区 for feat_id in range(1, num_features 1): if np.sum(labeled feat_id) 3: binary[labeled feat_id] 0两个参数在这里很关键threshold的分位数选择直接影响靶区面积70 分位数圈出大面积远景区90 分位数则锁定核心靶区。我通常同时输出三档70 分位给普查、85 分位给详查、95 分位给钻探验证建议。连通域剔除面积小于 3 个网格的孤立点是为了过滤单点异常——单网格高概率经常是化探数据中的孤立噪点而真正有意义的靶区应该有连续多网格响应。最后一个环节是野外验证记录。我一直保留一个习惯每次出野外都带上一份模型的 TOP 10 靶区清单和对应的 SHAP 解释表。到了现场先看岩性、构造和蚀变是否和 SHAP 里突出贡献的特征吻合——比如模型说 Au 异常贡献大但现场看不到任何硅化和黄铁矿化那就说明特征工程里混入了某种人为偏差。这个方法听着朴素但它是我用来检验“模型是真的在找矿还是记住了矿点位置”最可靠的手段。模型可以用新数据重新训练但现场填的记录会告诉你下一轮迭代该调整哪些东西。希望这些经验帮你少走一些弯路。本文还有配套的精品资源点击获取

相关新闻

工业级温度监测系统设计:PJ85718DM与STM32F373RC协同实现高精度低功耗测温

工业级温度监测系统设计:PJ85718DM与STM32F373RC协同实现高精度低功耗测温

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

2026/10/11 1:06:17 阅读更多 →
树莓派 OS 任务栏重大更新:自愈机制、插件隔离与迁移指南

树莓派 OS 任务栏重大更新:自愈机制、插件隔离与迁移指南

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

2026/10/11 1:06:17 阅读更多 →
机房搬迁零中断标准方案:电力/网络/存储硬性控制点

机房搬迁零中断标准方案:电力/网络/存储硬性控制点

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

2026/10/11 1:06:17 阅读更多 →

最新新闻

主动悬架真正难的并不是算法

主动悬架真正难的并不是算法

前言 做主动悬架时间久了,有一个很深的感受: 主动悬架真正难的,往往不是算法。 刚开始接触这个领域时,很容易把注意力集中在控制算法上。Skyhook、LQR、H∞、MPC,甚至更复杂的预测控制和整车协同控制,看起来…

2026/10/11 1:50:41 阅读更多 →
translators_CN-zotero:Zotero中文元数据本地化中间件

translators_CN-zotero:Zotero中文元数据本地化中间件

简介:本资源是专为中文文献管理优化的Zotero插件包translators_CN,面向高校师生、科研人员及需高频使用CNKI数据库的学术工作者,解决Zotero原生识别器对CNKI题录解析失败、字段缺失等核心痛点。压缩包共31个文件,以21个JavaScript…

2026/10/11 1:50:41 阅读更多 →
Rocky linux9安装Jenkins最新版本2.585

Rocky linux9安装Jenkins最新版本2.585

目录 前言: 一、安装步骤 1.下载jenkins yum源 2.执行yum源更新 3.安装jenkins所依赖的jdk 4.安装jenkins软件包 5.加载服务 二、启动jenkins 1.设置开机启动 2.启动jenkins服务,并查看其状态 3.打开首页 三、插件安装 1.调用可用插件菜单 …

2026/10/11 1:50:41 阅读更多 →
编译期常量查找表(LUT)的极致生成:constexpr 物理数学模拟器实战

编译期常量查找表(LUT)的极致生成:constexpr 物理数学模拟器实战

在数字信号处理(DSP)、实时物理仿真以及大语言模型非线性激活函数(如 GELU、Swish、Sigmoid、Softplus)的高频计算中,浮点超越函数(Transcendental Functions,如 $\exp$、$\sin$、$\text{erf}$&…

2026/10/11 1:50:41 阅读更多 →
字段级数据血缘追踪:从源头 Kafka Topic 到终端报表的全链路图谱

字段级数据血缘追踪:从源头 Kafka Topic 到终端报表的全链路图谱

在大数据团队里,最让人心惊肉跳的场景莫过于此:数仓工程师小李在 ODS 层清理了一个自认为没人用的冷门字段,十分钟后,CEO 手机上的高管核心看盘看板赫然出现整片空白,报警电话瞬间打爆整个组。 当事后复盘时&#xff0…

2026/10/11 1:50:41 阅读更多 →
做了10年计划排产,最后靠这三张表把排产管住了!

做了10年计划排产,最后靠这三张表把排产管住了!

很多计划员最怕的,不是订单多,而是计划永远赶不上变化。早上刚排好的计划,中午销售插单;下午采购说关键料没到;车间临时停机;老板又追着问订单为什么还没交。计划员只能不停改表、调设备、挪订单、发通知。…

2026/10/11 1:49:40 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/10 10:38:42 阅读更多 →