名称: fiftyone-find-duplicates 描述: 使用大脑相似度计算在FiftyOne数据集中查找重复或近似重复的图像。当用户需要去重数据集、查找相似图像、聚类视觉相似内容或移除冗余样本时使用。需要安装@voxel51/brain插件的FiftyOne MCP服务器。
在FiftyOne数据集中查找重复项
概述
使用FiftyOne的大脑相似度算子查找并移除重复或近似重复的图像。利用深度学习嵌入来识别视觉相似的图像。
在以下情况使用此技能:
- 从数据集中移除重复图像
- 查找近似重复图像(相似但不完全相同)
- 聚类视觉相似的图像
- 训练前清洗数据集
前提条件
- 已安装并运行FiftyOne MCP服务器
- 已安装并启用
@voxel51/brain插件 - 已在FiftyOne中加载包含图像样本的数据集
关键指令
始终遵循以下规则:
1. 首先设置上下文
set_context(dataset_name="my-dataset")
2. 启动FiftyOne应用
大脑算子需要委托并需要应用:
launch_app()
等待5-10秒进行初始化。
3. 动态发现算子
# 列出所有大脑算子
list_operators(builtin_only=False)
# 获取特定算子的模式
get_operator_schema(operator_uri="@voxel51/brain/compute_similarity")
4. 在查找重复项之前计算嵌入
execute_operator(
operator_uri="@voxel51/brain/compute_similarity",
params={"brain_key": "img_sim", "model": "mobilenet-v2-imagenet-torch"}
)
5. 完成后关闭应用
close_app()
完整工作流程
步骤1:设置
# 设置上下文
set_context(dataset_name="my-dataset")
# 启动应用(大脑算子必需)
launch_app()
步骤2:验证大脑插件
# 检查大脑插件是否可用
list_plugins(enabled=True)
# 如果未安装:
download_plugin(
url_or_repo="voxel51/fiftyone-plugins",
plugin_names=["@voxel51/brain"]
)
enable_plugin(plugin_name="@voxel51/brain")
步骤3:发现大脑算子
# 列出所有可用算子
list_operators(builtin_only=False)
# 获取compute_similarity的模式
get_operator_schema(operator_uri="@voxel51/brain/compute_similarity")
# 获取find_duplicates的模式
get_operator_schema(operator_uri="@voxel51/brain/find_duplicates")
步骤4:计算相似度
# 执行算子以计算嵌入
execute_operator(
operator_uri="@voxel51/brain/compute_similarity",
params={
"brain_key": "img_duplicates",
"model": "mobilenet-v2-imagenet-torch"
}
)
步骤5:查找近似重复项
execute_operator(
operator_uri="@voxel51/brain/find_near_duplicates",
params={
"similarity_index": "img_duplicates",
"threshold": 0.3
}
)
阈值指南(基于距离,越低越相似):
0.1= 非常相似(接近完全重复)0.3= 近似重复(推荐默认值)0.5= 相似图像0.7= 松散相似
此算子会自动创建两个保存的视图:
near duplicates:所有近似重复的样本representatives of near duplicates:每组中的一个代表
步骤6:在应用中查看重复项
查找重复项后,使用set_view在FiftyOne应用中显示它们:
选项A:按near_dup_id字段过滤
# 显示所有具有near_dup_id的样本(所有重复项)
set_view(exists=["near_dup_id"])
选项B:显示特定重复组
# 显示具有特定重复组ID的样本
set_view(filters={"near_dup_id": 1})
选项C:加载保存的视图(如果可用)
# 加载自动创建的保存视图
set_view(view_name="near duplicates")
选项D:清除过滤器以显示所有样本
clear_view()
find_near_duplicates算子会向样本添加一个near_dup_id字段。具有相同ID的样本彼此是重复项。
步骤7:删除重复项
选项A:使用去重算子(每组保留一个代表)
execute_operator(
operator_uri="@voxel51/brain/deduplicate_near_duplicates",
params={}
)
选项B:从应用UI手动删除
- 使用
set_view(exists=["near_dup_id"])显示重复项 - 在http://localhost:5151/的应用中查看样本
- 选择要删除的样本
- 在应用中使用删除操作
步骤8:清理
close_app()
可用工具
会话视图工具
| 工具 | 描述 |
|---|---|
set_view(exists=[...]) |
过滤字段具有非None值的样本 |
set_view(filters={...}) |
按精确字段值过滤样本 |
set_view(tags=[...]) |
按标签过滤样本 |
set_view(sample_ids=[...]) |
选择特定的样本ID |
set_view(view_name="...") |
按名称加载保存的视图 |
clear_view() |
清除过滤器,显示所有样本 |
用于重复项的大脑算子
使用list_operators()发现并使用get_operator_schema()查看参数:
| 算子 | 描述 |
|---|---|
@voxel51/brain/compute_similarity |
计算嵌入和相似度索引 |
@voxel51/brain/find_near_duplicates |
查找近似重复样本 |
@voxel51/brain/deduplicate_near_duplicates |
删除重复项,保留代表 |
@voxel51/brain/find_exact_duplicates |
查找完全重复的媒体文件 |
@voxel51/brain/deduplicate_exact_duplicates |
删除完全重复项 |
@voxel51/brain/compute_uniqueness |
计算唯一性分数 |
常见用例
用例1:移除完全重复项
对于意外重复的文件(相同字节):
set_context(dataset_name="my-dataset")
launch_app()
execute_operator(
operator_uri="@voxel51/brain/find_exact_duplicates",
params={}
)
execute_operator(
operator_uri="@voxel51/brain/deduplicate_exact_duplicates",
params={}
)
close_app()
用例2:查找并查看近似重复项
对于视觉相似但不完全相同的图像:
set_context(dataset_name="my-dataset")
launch_app()
# 计算嵌入
execute_operator(
operator_uri="@voxel51/brain/compute_similarity",
params={"brain_key": "near_dups", "model": "mobilenet-v2-imagenet-torch"}
)
# 查找重复项
execute_operator(
operator_uri="@voxel51/brain/find_near_duplicates",
params={"similarity_index": "near_dups", "threshold": 0.3}
)
# 在应用中查看重复项
set_view(exists=["near_dup_id"])
# 查看后,去重
execute_operator(
operator_uri="@voxel51/brain/deduplicate_near_duplicates",
params={}
)
# 清除视图并关闭
clear_view()
close_app()
用例3:按相似度排序
查找与特定样本相似的图像:
set_context(dataset_name="my-dataset")
launch_app()
execute_operator(
operator_uri="@voxel51/brain/compute_similarity",
params={"brain_key": "search"}
)
execute_operator(
operator_uri="@voxel51/brain/sort_by_similarity",
params={
"brain_key": "search",
"query_id": "sample_id_here",
"k": 20
}
)
close_app()
故障排除
错误:“没有可用的执行器”
- 原因:委托算子需要应用执行器进行UI触发
- 解决方案:引导用户到应用UI查看结果并手动完成删除
- 受影响的算子:
find_near_duplicates、deduplicate_near_duplicates
错误:“未找到大脑键”
- 原因:未计算嵌入
- 解决方案:首先使用
brain_key运行compute_similarity
错误:“未找到算子”
- 原因:未安装大脑插件
- 解决方案:使用
download_plugin()和enable_plugin()安装
错误:“缺少依赖项”(例如torch、tensorflow)
- MCP服务器会自动检测缺少的依赖项
- 响应包括
missing_package和install_command - 示例响应:
{ "error_type": "missing_dependency", "missing_package": "torch", "install_command": "pip install torch" } - 为用户提供运行安装命令
- 安装后,重启MCP服务器并重试
相似度计算缓慢
- 使用更快的模型:
mobilenet-v2-imagenet-torch - 如果可用,使用GPU
- 分批处理大型数据集
最佳实践
- 动态发现 - 使用
list_operators()和get_operator_schema()获取当前算子名称和参数 - 从默认阈值开始(0.3)并根据需要调整
- 删除前查看 - 引导用户到应用检查重复项
- 存储嵌入 - 通过
brain_key重复用于多个操作 - 优雅处理执行器错误 - 需要时引导用户到应用UI
性能说明
嵌入计算时间:
- 1,000张图像:约1-2分钟
- 10,000张图像:约10-15分钟
- 100,000张图像:约1-2小时
内存要求:
- 每张图像约2KB用于嵌入
- 每张图像约4-8KB用于相似度索引
资源
许可证
版权所有 2017-2025,Voxel51, Inc. Apache 2.0许可证