0.简介
- 官方github网址
- 项目目的:当前大规模图像数据集一团糟,数据量巨大但质量堪忧,有时候训练集、验证集、测试集会有重复数据造成数据泄露。FastBup可以识别重复项、近似重复项、异常图像、错误标注、异常值,在cpu上就可以处理数百万的图片。
1.安装
- 支持环境:Python 3.7 and 3.8 (Ubuntu 20.04 or Ubuntu 18.04 or Mac M1)
- 安装:
python3.8 -m pip install fastdup
- kaggle上安装:
!pip install fastdup matplotlib -Uq
2.简单使用
- 基本
import fastdup
work_dir = "./fastdup_report"#分析结果输出文件夹
images_dir = "/train"#待分析图像所在文件夹
fd = fastdup.create(work_dir, images_dir)
fd.run(ccthreshold=0.9, threshold=0.8, overwrite=True)
- 结果保存
#结果保存
fastdup.create_duplicates_gallery('similarity.csv', save_path='.') #create a visual gallery of found duplicates
fastdup.create_duplicates_gallery('outliers.csv', save_path='.') #create a visual gallery of anomalies
- 可视化显示重复图像,距离1代表完成相同,0代表完全不同,0.98以上认为是几乎相同
#可视化显示重复图像,距离1代表完成相同,0代表完全不同
fd.vis.duplicates_gallery(num_images=50)
- 可视化显示异常图
#可视化显示异常图
fd.vis.outliers_gallery()
- 查看最暗的图片
fd.vis.stats_gallery(metric='dark')
- 查看最亮的图片
fd.vis.stats_gallery(metric='bright')
- 查看最模糊的图片
fd.vis.stats_gallery(metric='blur')
- 可视化相似族,将相似图片划分为一簇
#可视化相似族,将相似图片划分为一簇
fd.vis.component_gallery()
- 表格形式查看相似图片,方便自定义可视化
#表格形式查看
fd.similarity()
3.详细的python API 文档
-
官方全英github文档
-
input_dir:
- 字符串
- 图片或视频的文件夹,会递归地处理该文件夹下的所有图片
- 或者是一张纸图片的完整路径,每个图片占一行
-
work_dir:
- 字符串
- 用来保存中间结果和最终输出的目录
-
特征向量文件:默认文件名 features.dat,n行576列的二进制numpy数组
由于二进制python不方便操作,所以提供了函数:file_list, mat_features = fastdup.load_binary('features.dat')
返回的是长度为x的图片全程的列表和x行576列的np数组
-
图片完整路径与特征向量映射的csv文件:默认文件名features.dat.csv(图片的处理顺序可能因为系统不同而发生改变,并且有些图片损坏无法计算特征,所以需要这个映射文件记录)
-
features.bad.csv里面会记录无法生成特征向量的损坏图像
-
相似对列表:similarity.csv,三列(from,to,distance),并按distance降序排序,最大为1,表示两张图片完全一致(类似余弦距离)
-
faiss.index:使用faiss时生成的索引文件
-
components_info.csv:创建连通图时的每个联通节点(图片)
-
connected_components.csv:第一列是features.dat.csv文件中的索引(图像列表),文件根据列表排序,包括pagerank输出、角度分布和连通图的参数
-
-
compute:
- 字符串
- 使用cpu还是gpu计算,默认是cpu
-
verbose:
- bool
- 是否详细。默认False
-
num_threads
- int
- 线程数,默认-1,会自动设为cpu核数
-
num_images:
- int
- 要计算的图片数,默认-1,计算输入路径下的所有图片
-
turi_param:
- str
- turi的可选附加参数
- nnmodel
- 0/1/2
- 聚类特征使用的最近邻模型
- 仅对turi有效,对faiss无效
- 0:brute_force,准确的
- 1:ball_tree
- 2:lsh:locality sensitive hashing,局部敏感散列
- ccthreshold
- [0,1]之间
- 构建相似性图的阈值,相似度大于该值时构建相似度图
- run_cc
- 0/1
- 是否进行相似度图上的连通分量计算
- run_pagerank
- 0/1
- 是否进行相似图页面排名计算
- run_degree
- 0/1
- 是否进行相似图角度分布计算
- nnmodel
-
faiss相关参数:
- faiss_mode:
- str
- HNSW32(默认)等faiss字符串
- faiss_param:
- str
- 如: ‘efSearch=175,nprobes=200’(指定faiss参数)
- bounding_box:
- str
- 在应用faiss前裁剪图像
- 如:bounding_box=‘rows=100,cols=100,width=250,height=310’(行和列给出左上角坐标),裁剪图像范围 [rows:rows+height, cols:cols+width]
- faiss_mode:
-
distance:
- str
- 最近邻算法的距离度量
- 余弦距离(cosine,默认)、欧几里得距离(euclidean)、平方欧几里得距离(squared_euclidean)、曼哈顿距离(manhattan)
-
threshold:
- float
- 相似程度衡量的阈值
- 默认0.85,大于该值认为图片非常相似,小于该值不会记为相似图片
-
lower_threshold:
- float
- 衡量异常图片的阈值(和总体分布相比较远的离群点)
- 默认0.3
-
model_path:
- str
- ONNX模型文件的可选位置
- 不应该被使用
-
version:
- bool,不需要传入任何参数
- 是否打印版本信息
-
nearest_neighbors_k:
- int
- 默认2,对每张照片寻找多少张相似图片
-
run_mode:
- int
- 0/1/2、3、4,选择软件执行功能
- 0:同时计算特征向量、NN embedding和相似度(默认,但对于大型数据集,更明智的办法是分成几步,这样即使出错也能保留下来部分中间数据)
- 1.:只计算特征向量(可并行计算)
- 2:只计算相似度(需要读取已有的特征文件):input_dir参数会被忽略,work_dir需要指向特征文件的完整路径和文件名
- 3:计算特征向量和相似度(需读取faiss.index的NN模型):input_dir指定要计算相似度的图片文件夹,work_dir指向NN模型,用来将训练集上得到的NN模型直接用到新的测试集上来衡量相似度
- 4:只计算相似度(需1里面的特征向量和2里面的NN模型):work_dir指向所需文件
-
nn_provider:
- turi/faiss
- 最近邻算法的选择
-
与并行计算图像子集划分有关参数:
- min_offset:
- int
- 默认-1,在完整文件列表上开始迭代的可选最小偏移量(最小图像子集)。
- max_offset:
- int
- 默认-1,在完整文件列表上开始迭代的可选最大偏移量(最大图像子集)。
- min_offset:
-
返回值:
- 0/1
- 0:成功
- 1:失败
-
举例:
fastdup.run('/path/to/folder', nn_provider='turi', nnmodel='brute_force')
-
可视化输出:
- jupyter notebook能得到表格,其他环境得到的是html报告
- 函数fastdup.create_duplicates_gallery(similarity_file, save_path, num_images=20, descending=True)
- 或者fastdup.generate_duplicates_gallery(similarity_file, save_path, num_images=20, descending=True),官方文档写了两次,前后函数名字不一致
- 由于参数里没有input_dir,所以要与前面的计算在同一台电脑上,保证输入图片路径完全一致
- similarity_file:
- str
- 之前计算出的相似度的csv文件
- save_path:
- str
- 可视化相关输出保存位置
- num_images:
- int
- 最多相似的照片数量,默认50
- descending:
- bool
- 默认True,从最相似到最不相似打印