yoloexplorer
用 SQL + 向量搜索探索 YOLO 数据集,快速定位问题图片并迭代清洗
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
用 SQL + 向量搜索探索 YOLO 数据集,快速定位问题图片并迭代清洗
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
"给目标检测数据装上一双慧眼——YOLO 开发者的高效数据集迭代工具"
想象一下这个场景:你训练了一个 YOLOv8 模型,但精度始终卡在 82%,模型总是把泰迪熊误判成狗、把滑板车误判成自行车。你翻遍了 12800 张训练图片,在 Excel 里一条条筛,眼睛都快瞎了——这大概是每一位计算机视觉工程师都经历过的"数据清洗地狱"。
YOLOExplorer 正是为解决这个痛点而生。它由向量数据库厂商 LanceDB 打造,让 YOLO 数据集的探索和迭代变得像查询数据库一样简单高效。

▲ 在 Jupyter Notebook 中快速启动 YOLOExplorer,几行代码完成数据集初始化
目标检测模型的训练效果,80% 取决于数据质量。然而 YOLO 生态长期缺少一套好用的数据集探索工具。数据集通常存储为 YAML 配置 + 图片目录 + 标注文件的组合,工程师只能靠笨拙的手工方式去理解数据:打开图片、记下问题、关闭、再打开……
传统做法有几个明显缺陷:无法批量筛选相似图片——当你发现某张图有问题,想找到风格相似的其他图几乎不可能;无法用语义查询数据——你想找"包含人和自行车但背景是室内"的图片?对不起,只能一张张看;数据集版本管理混乱——手动删除/添加图片后,标签文件同步是个噩梦。
LanceDB 团队在内部开发中遇到了同样的困境,于是将向量数据库 LanceDB 与 Ultralytics YOLO 生态深度整合,做出了 YOLOExplorer。目前已在 GitHub 获得 144 颗星,topics 涵盖 computer-vision、object-detection、yolov5、yolov8 等核心领域。
YOLOExplorer 将数据集注册为一张虚拟数据库表,直接支持 DuckDB SQL 查询。你可以像查数据库一样筛选数据:
from yoloexplorer import Explorer
coco_exp = Explorer("coco128.yaml")
coco_exp.build_embeddings()
# 找同时含 person 和 cat 的样本
df = coco_exp.sql("SELECT * from 'table' WHERE labels like '%person%' and labels LIKE '%cat%'")
coco_exp.plot_imgs(ids=df["id"][0:4].to_list())

▲ SQL 查询结果可视化,直观看到同时含 person 和 cat 的图片
这是 YOLOExplorer 最亮眼的能力。通过 ResNet18/50 或 MobileNet 等预训练模型提取图片特征向量,存入 LanceDB 向量数据库,然后用任意图片去搜索语义相似的样本:
# 以 ID=117 的图片为锚点,搜索 6 张最相似的图
imgs, ids = coco_exp.get_similar_imgs(117, n=6)
coco_exp.plot_imgs(ids)

▲ 基于 ResNet 特征向量的相似图片搜索效果
这一功能在数据清洗时价值巨大:当你发现一张图片标注有问题,可以一键找到所有相似的"嫌疑图片",批量确认后一起清理。
plot_similarity_index() 功能可以绘制整个数据集的相似度热力图,帮助发现异常数据和重复图片。如果一张图片和大量其他图片高度相似,可能说明它处于一个大量重复的子集中,对训练贡献有限。

▲ 数据集相似度指数热力图,异常区域一目了然
从源码结构来看,YOLOExplorer 的架构清晰分为四层:
数据层:dataset.py 继承自 ultralytics.data.dataset.YOLODataset,直接复用 YOLO 原生数据集解析逻辑(YAML 配置解析、图片加载、数据增强)。这保证了与 YOLO 生态的零门槛兼容。
存储层:explorer.py 核心是 LanceDB 向量数据库 + DuckDB SQL 引擎。所有图片元数据(路径、类别标签、边界框、分割标注)以 Arrow 格式存储,向量嵌入单独建表,支持高效向量检索。
模型层:yolo_predictor.py 中的 YOLOEmbeddingsPredictor 继承自 Ultralytics DetectionPredictor,通过 embed_from=-1 截取 YOLO 模型的中间层特征图,经 AdaptiveAvgPool 后输出固定维度向量。支持 ResNet18/50、EfficientNet、MobileNet 等多种特征提取器。
界面层:frontend/ 目录下是基于 Streamlit 的 Web 仪表盘,支持多数据集联合浏览、跨数据集增删样本、实时嵌入可视化等高级功能。
依赖栈:ultralytics(YOLO 生态)、lancedb(向量数据库)、duckdb(OLAP 引擎)、pandas(数据框操作)、scikit-learn(PCA 降维)、streamlit(Web UI)、plotly(交互图表)。
YOLOExplorer 安装极简,一条命令搞定:
pip install yoloexplorer
# 或从源码安装
pip install git+https://github.com/lancedb/yoloexplorer.git
最低要求 Python 3.8,不强制 GPU(纯 CPU 即可运行,小数据集场景完全够用)。首次初始化时调用 build_embeddings() 建立向量索引,耗时取决于数据集规模(128 张图的 coco128 约需 1-2 分钟)。
如果你习惯 Jupyter Notebook,可以用 Colab 直接打开官方示例 notebook,零环境配置即可体验全部功能。
YOLOExplorer 不只是查询工具,它还能直接修改数据集并输出可训练版本:
# 删除问题图片
coco_exp.remove_imgs([100, 120, 300])
# 从其他数据集添加好样本
coco_exp.add_imgs(other_exp, idxs=[5, 10, 88])
# 持久化为新数据集并输出训练命令
coco_exp.persist()
# 输出:yolo task=detect mode=train data=..., model=yolov8n.pt, batch=16...
这意味着整个"发现问题 -> 找相似样本 -> 决策增删 -> 重新训练"的闭环可以在 YOLOExplorer 内完成,无需切换其他工具。
值得指出的是,YOLOExplorer 目前仍处于非常早期的阶段(setup.py 中版本号仅为 0.0.1),存在以下局限:
1. 仅支持 Detect 任务:当前代码基于 Ultralytics YOLO 的 DetectionPredictor,尚不支持分割(Segmentation)和关键点(Pose)任务的 Embedding 提取。
2. 无官方 Docker 支持:项目没有提供 Dockerfile 或 docker-compose.yml,对于习惯容器化部署的团队来说,需要自行封装。
3. 嵌入模型选择有限:当前仅支持 torchvision 内置的几个预训练模型(ResNet 系列、EfficientNet、MobileNet),无法使用 CLIP、SigLIP 等更强大的多模态编码器。
4. 数据集规模受限于内存:向量嵌入全部在内存中构建,百万级图片的数据集可能会遇到性能瓶颈。
YOLOExplorer 代表了一个重要趋势:数据管理工具的专业化。过去两年 AI 社区的注意力大量集中在模型架构创新上,数据层面的工具相对滞后。随着 YOLOv8 生态走向成熟,围绕 YOLO 的数据迭代工具链正在快速补全。
LanceDB 作为向量数据库厂商,将自身擅长的语义检索能力与 YOLO 生态深度结合,为这个领域树立了一个好样本。这种"垂直生态 + 向量检索"的结合方式,未来可能也会在其他模型生态(如 SAM、Grounding DINO)中复制。
如果你经常训练目标检测模型,YOLOExplorer 值得一试——它不能解决所有数据问题,但至少能让"找相似图片"这个高频需求,从手工劳动变成一行代码。