基于内容的图像检索系统实战:颜色直方图与SIFT特征提取及索引构建
简介这份资源面向图像处理方向的开发者与学习者提供一套基于内容的图像检索CBIR系统完整实现方案帮助理解从特征提取到相似度匹配的全流程。包内共18个文件以12个Python源码为主辅以6个编译缓存文件压缩包约18KB源码覆盖颜色直方图、Gabor与LBP纹理、边缘形状特征及CNN深度特征提取并涉及PCA降维、特征量化编码、余弦相似度计算与FLANN近邻检索等模块还包含用户交互界面与测试脚本便于直接运行与二次开发。目前已有491人学习下载适合希望动手搭建CBIR系统、掌握图像检索核心环节的读者参考可快速获得可复用的特征提取脚本与检索流程框架。1. 从一堆图里找相似这套图像检索系统到底能干什么电商后台里躺着几十万张商品图运营想找“和这张差不多的所有款式”素材库里存了上千张设计稿设计师想按“主色调偏暖、构图居中”去翻监控截图要按“某件衣服的花纹”去比对——这些场景用文件名搜索根本搞不定靠人工翻页更是灾难。基于内容的图像检索系统CBIR就是干这个的它不看文件名、不看标签而是直接提取图像本身的视觉特征把“以图搜图”做成可复现的工程流程。这套资源包给的是一个完整可跑的实现覆盖特征提取、索引构建、相似度计算到检索接口的全链路适合做图像处理方向课程设计的学生、需要快速搭原型的后端开发者以及想搞懂 CBIR 底层到底怎么运转的从业者。它不依赖任何外部云服务本地就能跑通。2. 特征提取选型为什么是颜色直方图加 SIFT 而不是一把梭 CNN2.1 传统特征和深度特征的分界线在哪很多人一上来就想用预训练 CNN 提特征觉得“深度好用”。这话对一半。CNN 特征在语义相似度上确实强但它有两个现实问题一是模型文件动辄几十上百 MB资源包里如果塞进去部署门槛立刻拉高二是对“颜色分布”这类低层视觉属性反而不敏感——两张主色调完全不同的图CNN 可能因为语义接近给出高分。CBIR 的经典做法是分层提取低层用颜色、纹理、形状高层才上语义。这套资源走的是传统特征路线核心是颜色直方图 SIFT 关键点描述子好处是轻量、可解释、不依赖 GPU适合作为理解检索原理的起点。颜色直方图解决的是“整体色调像不像”。把图像从 RGB 转到 HSV 空间对 H 通道做 180 桶量化S 和 V 各做 256 桶拼成一个特征向量。为什么转 HSV因为 RGB 三个通道高度相关直接做直方图对光照变化极其敏感而 HSV 把色调和亮度解耦检索稳定性明显更好。SIFT 解决的是“局部结构像不像”它对尺度、旋转、部分遮挡都有鲁棒性适合匹配有明确主体的图像。2.2 颜色直方图提取的代码实现import cv2 import numpy as np def extract_hsv_histogram(image_path, h_bins180, s_bins256, v_bins256): 提取 HSV 三通道联合直方图特征 h_bins: 色调量化桶数180 对应 OpenCV 中 H 范围 0-179 s_bins: 饱和度桶数 v_bins: 明度桶数 img cv2.imread(image_path) if img is None: raise ValueError(f无法读取图像: {image_path}) # 统一缩放到固定尺寸避免分辨率差异干扰直方图统计 img cv2.resize(img, (256, 256)) hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 三通道联合直方图calcHist 的 channels 指定用哪几个通道 hist cv2.calcHist( [hsv], [0, 1, 2], None, [h_bins, s_bins, v_bins], [0, 180, 0, 256, 0, 256] ) # 归一化消除图像尺寸对直方图绝对值的影响 hist cv2.normalize(hist, hist).flatten() return hist这段代码的关键在三个参数。h_bins180是因为 OpenCV 读进来的 HSV 图像 H 通道范围是 0 到 179不是 0 到 360设 180 刚好一桶一度。cv2.normalize那一步不能省否则大图的直方图数值天然比小图大相似度计算会系统性偏向大图。resize到 256×256 是工程上的折中太小丢失细节太大拖慢批量处理速度。实际跑的时候如果数据集里图片长宽比差异很大建议先做 padding 再 resize避免拉伸变形改变纹理分布。2.3 SIFT 描述子的提取与聚合def extract_sift_features(image_path, max_keypoints500): 提取 SIFT 关键点描述子用 KMeans 聚合成固定长度向量 max_keypoints: 限制关键点数量防止大图产生过多描述子拖慢后续聚类 img cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) if img is None: raise ValueError(f无法读取图像: {image_path}) img cv2.resize(img, (256, 256)) sift cv2.SIFT_create(nfeaturesmax_keypoints) keypoints, descriptors sift.detectAndCompute(img, None) if descriptors is None: # 纯色图或纹理极少的图可能检测不到关键点返回零向量兜底 return np.zeros(128, dtypenp.float32) # 对描述子做均值聚合得到 128 维定长向量 # 更精细的做法是 Bag-of-Words 或 VLAD但均值聚合在中小数据集上够用 feature np.mean(descriptors, axis0) return feature.astype(np.float32)SIFT 描述子本身是 128 维的每张图检测出的关键点数量不固定没法直接拼成统一长度的特征向量。这里用均值聚合做了简化把 N×128 压成 1×128。均值聚合的代价是丢失了空间分布信息如果对精度要求更高常见做法是引入视觉词袋BoW先用 KMeans 在训练集上聚出 K 个聚类中心每张图的每个描述子映射到最近的聚类中心最后统计直方图。资源包里默认走均值路线胜在代码短、依赖少适合先跑通再优化。3. 索引构建与相似度计算从暴力搜索到 KD 树加速3.1 特征怎么存、怎么读特征提取完之后最直接的做法是存成.npy文件每行一个样本列是特征维度。颜色直方图是 180×256×256 展开后约 1179 万维——这个数字看着吓人但实际归一化后绝大多数桶是零稀疏存储更合理。不过为了代码简洁资源包里对颜色特征做了降维只保留 H 通道 180 维和 S 通道 64 维拼成 244 维向量。SIFT 均值聚合后是 128 维。两路特征各自归一化后拼接最终每张图对应 372 维向量。import os import numpy as np def build_feature_database(image_dir, output_pathfeatures.npy): 遍历目录下所有图片提取拼接特征并保存 image_dir: 图片存放目录 output_path: 特征矩阵保存路径 features [] filenames [] valid_ext {.jpg, .jpeg, .png, .bmp} for fname in sorted(os.listdir(image_dir)): ext os.path.splitext(fname)[1].lower() if ext not in valid_ext: continue fpath os.path.join(image_dir, fname) try: color_feat extract_hsv_histogram(fpath)[:244] # 截取前 244 维 sift_feat extract_sift_features(fpath) combined np.concatenate([color_feat, sift_feat]) features.append(combined) filenames.append(fname) except Exception as e: print(f跳过 {fname}: {e}) feature_matrix np.array(features, dtypenp.float32) np.save(output_path, feature_matrix) np.save(output_path.replace(.npy, _names.npy), np.array(filenames)) print(f完成 {len(filenames)} 张图片的特征提取矩阵形状 {feature_matrix.shape}) return feature_matrix, filenames这里有个容易翻车的点extract_hsv_histogram返回的是 180×256×256 展平后的向量直接截前 244 维等于只取了 H 通道的前 244 个桶逻辑上不严谨。更合理的做法是在提取函数里就按[180, 64]的桶数生成 H-S 二维直方图。资源包里为了演示拼接流程保留了这种写法实际使用时建议把颜色特征提取改成cv2.calcHist([hsv], [0, 1], None, [180, 64], [0, 180, 0, 256])得到 180×6411520 维后再做 PCA 降到 244 维。这个细节在后面的避坑章节还会展开。3.2 相似度度量余弦还是欧氏特征向量归一化之后余弦相似度和欧氏距离是等价的因为模长都是 1。资源包默认用余弦相似度计算方式是矩阵乘法def search_similar(query_feat, feature_matrix, top_k10): 在特征库中检索与查询特征最相似的 top_k 张图 query_feat: 查询图像的特征向量形状 (D,) feature_matrix: 特征库矩阵形状 (N, D) top_k: 返回结果数量 # 查询向量归一化 query_norm query_feat / (np.linalg.norm(query_feat) 1e-8) # 特征库归一化如果入库时已归一化可省略 matrix_norm feature_matrix / (np.linalg.norm(feature_matrix, axis1, keepdimsTrue) 1e-8) # 余弦相似度 归一化后的点积 similarities matrix_norm query_norm # argsort 返回升序索引取反后取前 top_k top_indices np.argsort(similarities)[::-1][:top_k] return top_indices, similarities[top_indices]1e-8是防止零向量导致除零。argsort默认升序[::-1]翻转成降序。这个暴力搜索的复杂度是 O(N×D)N 是图库大小D 是特征维度。一万张图、372 维单次查询大概几十毫秒完全能接受。但如果图库到百万级就得上近似最近邻ANN了。资源包里预留了 KD 树的接口用sklearn.neighbors.NearestNeighbors可以一行切换from sklearn.neighbors import NearestNeighbors # 构建 KD 树索引 index NearestNeighbors(n_neighbors10, metriccosine, algorithmkd_tree) index.fit(feature_matrix) # 查询 distances, indices index.kneighbors(query_feat.reshape(1, -1))注意 KD 树在高维空间通常超过 20 维会退化372 维下它的加速效果远不如 HNSW 或 IVF。资源包保留 KD 树主要是为了演示“索引切换”这个动作生产环境建议直接上 Faiss。3.3 检索结果的重排序策略初次检索返回的 top_k 里经常混入一些“颜色像但内容完全不对”的图。一个低成本的重排序手段是对 top_k 结果再算一次 SIFT 关键点匹配数按匹配点数量二次排序。这个操作只对少量候选做开销可控。def rerank_by_sift(query_path, candidate_paths, top_k10): 对初筛结果用 SIFT 匹配数重排序 sift cv2.SIFT_create() query_img cv2.imread(query_path, cv2.IMREAD_GRAYSCALE) kp_q, des_q sift.detectAndCompute(query_img, None) if des_q is None: return candidate_paths[:top_k] bf cv2.BFMatcher() scores [] for cpath in candidate_paths: cimg cv2.imread(cpath, cv2.IMREAD_GRAYSCALE) kp_c, des_c sift.detectAndCompute(cimg, None) if des_c is None: scores.append(0) continue matches bf.knnMatch(des_q, des_c, k2) # Lowes ratio test过滤误匹配 good [m for m, n in matches if m.distance 0.75 * n.distance] scores.append(len(good)) ranked sorted(zip(candidate_paths, scores), keylambda x: x[1], reverseTrue) return [p for p, _ in ranked[:top_k]]0.75这个比例是 Lowe 论文里的经验值调低到 0.6 会更严格、匹配数变少但更准调到 0.8 则召回更多但噪声也更多。实际调参时建议在验证集上画一条 precision-recall 曲线来定。4. 避坑与排查那些让检索结果“玄学”的细节4.1 现象同样的图检索结果每次不一样原因SIFT 关键点检测对图像缩放敏感如果每次读取时 resize 的插值方式不同比如一次用INTER_LINEAR一次用INTER_NEAREST检测到的关键点位置和数量会波动。另外 KMeans 聚类如果没设随机种子每次聚出来的中心也不同。解决固定cv2.resize的插值参数为cv2.INTER_AREA缩小图像时效果最稳并在所有涉及随机的地方设np.random.seed(42)和cv2.setRNGSeed(42)。4.2 现象纯色图或白底图检索时总是排第一原因纯色图的颜色直方图极度集中归一化后某个桶的值接近 1其余接近 0。这种稀疏向量和任何查询向量的余弦相似度都可能偏高因为余弦只看向量方向不看数值分布。SIFT 特征在纯色图上检测不到关键点返回零向量反而拉低了整体相似度——但颜色部分的异常高分把它盖过去了。解决在特征拼接前对颜色直方图做平滑加一个小的常数再归一化或者对纯色图做检测直接标记为低质量样本不参与检索。更彻底的做法是引入熵值判断直方图熵低于阈值的图颜色特征权重降为零。4.3 现象检索结果里全是同一张图的变体原因数据集里如果存在大量近似重复的图比如同一商品的不同角度它们的特征向量彼此非常接近top_k 会被这些变体占满真正多样的结果被挤掉。解决在返回结果前做一次去重用特征向量的余弦相似度做聚类相似度超过 0.95 的只保留一张。或者直接上最大边际相关性MMR重排序在相关性和多样性之间做权衡。4.4 现象换一批图库之前调好的 top_k 就不准了原因不同图库的特征分布差异很大。比如商品图库颜色集中、背景干净风景图库颜色分散、纹理复杂。固定 top_k 在不同分布下表现不稳定。解决不要固定 top_k改成固定相似度阈值。先算查询图和库内所有图的相似度分布取均值加两倍标准差作为截断线返回所有超过这条线的结果。这样结果数量自适应召回更合理。4.5 现象批量提取特征时内存爆掉原因颜色直方图如果按 180×256×256 全量存储单张图就是 1179 万个 float一万张图就是 470 GB显然扛不住。解决一是降维H 通道 180 桶、S 通道 64 桶、V 通道 64 桶总共 73 万维还是大继续用 PCA 降到 256 维以内。二是稀疏存储用scipy.sparse的 CSR 格式只存非零桶。资源包里默认走的是降维路线PCA 的n_components设成 244和 SIFT 的 128 维拼起来刚好 372。5. 进阶技巧用倒排索引把检索速度再压一个数量级5.1 为什么暴力搜索在中小规模下反而更稳前面说了暴力搜索复杂度 O(N×D)一万张图、372 维单次查询几十毫秒。这个量级下KD 树因为维度灾难实际可能比暴力还慢。我一般会先用暴力搜索跑通全流程确认特征和相似度逻辑没问题再考虑加索引。过早优化索引一旦检索结果不对你连是特征的问题还是索引的问题都分不清。5.2 倒排索引的构建思路倒排索引的核心是“先粗筛再精排”。用 KMeans 把特征空间聚成 K 个簇比如 K256每个簇维护一个成员列表。查询时先算查询向量到 K 个簇心的距离取最近的几个簇只在这些簇的成员里做精细相似度计算。这样每次只需要算 N/K×候选簇数 个样本速度提升接近一个数量级。from sklearn.cluster import MiniBatchKMeans def build_inverted_index(feature_matrix, n_clusters256): 构建倒排索引KMeans 聚类 簇成员列表 kmeans MiniBatchKMeans( n_clustersn_clusters, random_state42, batch_size1024, n_init3 ) labels kmeans.fit_predict(feature_matrix) # 构建簇到成员的映射 inverted {i: [] for i in range(n_clusters)} for idx, label in enumerate(labels): inverted[label].append(idx) return kmeans.cluster_centers_, inverted def search_with_inverted_index(query_feat, feature_matrix, centers, inverted, n_probe8, top_k10): n_probe: 探测的簇数量越大召回越高但越慢 # 查询向量到各簇心的距离 dists np.linalg.norm(centers - query_feat, axis1) nearest_clusters np.argsort(dists)[:n_probe] # 收集候选索引 candidate_indices [] for c in nearest_clusters: candidate_indices.extend(inverted[c]) if not candidate_indices: return [], [] # 在候选集上做精细相似度计算 candidate_matrix feature_matrix[candidate_indices] query_norm query_feat / (np.linalg.norm(query_feat) 1e-8) matrix_norm candidate_matrix / (np.linalg.norm(candidate_matrix, axis1, keepdimsTrue) 1e-8) sims matrix_norm query_norm top_local np.argsort(sims)[::-1][:top_k] top_global [candidate_indices[i] for i in top_local] return top_global, sims[top_local]n_probe是召回率和速度的调节旋钮。设成 1 就是只搜最近的一个簇速度最快但可能漏掉边界样本设成 8 到 16 是常见折中。MiniBatchKMeans比标准 KMeans 快很多代价是聚类中心略偏但在倒排索引场景下完全够用。n_init3表示跑三次不同初始化取最优设太高拖慢构建速度设 1 又容易陷局部最优。5.3 验证索引有没有拖垮精度建完索引后拿一批查询图分别走暴力搜索和倒排索引对比 top_10 的重合率。重合率低于 85% 就说明n_probe太小或者n_clusters设得不合理。我一般会跑一个 200 张图的验证集画一条“n_probe vs 重合率”的曲线选重合率到 95% 时的最小 n_probe 作为线上参数。参数建议范围影响n_clusters64512越大索引越细构建越慢查询越快n_probe432越大召回越高查询越慢batch_size5124096影响 KMeans 构建速度太大吃内存top_k1050返回结果数配合重排序使用从那以后我每次上线新的检索配置都强制走一遍“暴力 vs 索引”的重合率对比确认精度没掉才切流量。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Stacking集成模型+SHAP可解释性:糖尿病预测实战解析

Stacking集成模型+SHAP可解释性:糖尿病预测实战解析

先来点实在的。今天这篇不搞概念铺垫,也不写那种"模型原理综述"的软文,直接拿糖尿病数据集(Pima Indians Diabetes)跑一遍"Stacking集成模型 SHAP可解释性分析"的组合拳。Stacking负责把模型精度往上顶&…

2026/10/19 5:32:22 阅读更多 →
Nexus私服搭建与Maven集成实战:从安装部署到权限管理

Nexus私服搭建与Maven集成实战:从安装部署到权限管理

1. 为什么我们需要一个Maven私服做过Java项目的人大概率都经历过这样的场景:团队里几个人同时开发,每个人电脑上都有一个巨大的本地仓库,依赖版本各不一致,今天你拉下来的jar包是1.2.3,明天他拉的是1.2.4,结…

2026/10/19 5:32:22 阅读更多 →
本体驱动AI开发:用结构化知识构建可解释、可维护的AI应用

本体驱动AI开发:用结构化知识构建可解释、可维护的AI应用

1. 项目概述:当“知识结构”成为AI应用的底层操作系统你有没有试过这样开发一个AI功能:不是先写prompt,不是先调API,也不是先堆模型,而是先坐下来,用一张白纸(或者一个在线编辑器)把…

2026/10/19 5:32:22 阅读更多 →

最新新闻

AI原生开发平台架构规划与落地实操指南

AI原生开发平台架构规划与落地实操指南

做技术交流的时候,被问得最多的一个问题,差不多就是标题这句:AI原生开发平台到底是什么、架构怎么规划、怎么落地。说实话,每次回答完我都觉得还有话没说完,因为这三个问题其实是层层递进的——概念不清就谈不上规划&a…

2026/10/19 7:38:21 阅读更多 →
diagram-design:从草图到可维护图示系统的设计方法论

diagram-design:从草图到可维护图示系统的设计方法论

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到“diagram-design”这个词,很多人会以为它只是“画图工具”的另一个说法。但真正在项目里摸爬滚打过的人都知道,图这件事从来不是“画出来”那么简单。它背后牵扯的是信…

2026/10/19 7:38:21 阅读更多 →
MCP 三种传输方式全解析:stdio、SSE、Streamable HTTP 选型实战

MCP 三种传输方式全解析:stdio、SSE、Streamable HTTP 选型实战

聊 MCP 的三种传输方式之前,先承认一件事:大多数人在看 MCP 文档的时候,最容易卡住的就是传输层这一节。stdio、SSE、Streamable HTTP 三个词单独拎出来都认识,合在一起却不知道它们为什么同时存在、各自解决什么问题。这不怪你&a…

2026/10/19 7:38:21 阅读更多 →
AI论文降重指令实战:6类提示词破解查重与AIGC检测

AI论文降重指令实战:6类提示词破解查重与AIGC检测

2025年的毕业季明显比前几年多了一道坎:不只是查重率,还多了AI检测。我身边好几个准备答辩的朋友,论文初稿写得很顺,结果一查重,标红一片;好不容易把重复率压下来了,送审前又被提醒“部分段落机…

2026/10/19 7:38:21 阅读更多 →
rea模块开发指南:从命名解析到高复用架构设计与性能优化

rea模块开发指南:从命名解析到高复用架构设计与性能优化

1. 从“rea”这个标题说起:一个被低估的通用缩写第一次看到“rea”这个标题的时候,我脑子里蹦出来的第一反应是——这大概率又是一个被缩写玩坏了的项目名。在技术圈混久了你会发现,越是短到只有三个字母的标题,背后藏的东西往往越…

2026/10/19 7:38:21 阅读更多 →
diagram-design:从设计令牌到语义化图表的系统化设计方法

diagram-design:从设计令牌到语义化图表的系统化设计方法

1. 从一张草图到一套系统:diagram-design 到底在解决什么问题第一次听到 “diagram-design” 这个词,很多人会以为它只是“画图工具”的另一个说法。但真正在项目里被图表折磨过的人知道,问题从来不是“画不出来”,而是“画得乱、…

2026/10/19 7:37:20 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于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/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54: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/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 阅读更多 →