oym*_*onk 3 python opencv sift orb
我有一个图像目录,其中包含许多无法识别的重复项。我的目标是识别重复项。由于重复项已被裁剪、调整大小或转换为不同的图像格式,因此无法通过比较其哈希值来检测它们。
我编写了一个可以成功检测重复项的脚本,但有一个主要缺点:该脚本速度很慢。在对包含 60 个项目的文件夹进行测试时,运行需要五个小时(这也可能反映了我的计算机越来越有问题且速度缓慢)。由于我的目录中有大约 66,000 个图像,因此我估计脚本需要 229 天才能完成。
有人可以提出解决方案吗?我的研究表明,您可以通过在循环完成时“释放”存储在变量中的图像来释放内存,但有关如何执行此操作的所有信息似乎都是用 C 编写的,而不是用 Python 编写的。我也想过尝试使用orb而不是 sift,但担心它的准确性。有谁对这两种选择中哪一种更好有建议吗?或者重写脚本以减少内存占用的方法?提前谢谢了。
from __future__ import division
import cv2
import numpy as np
import glob
import pandas as pd
listOfTitles1 = []
listOfTitles2 = []
listOfSimilarities = []
# Sift and Flann
sift = cv2.xfeatures2d.SIFT_create()
index_params = dict(algorithm=0, trees=5)
search_params = dict()
flann = cv2.FlannBasedMatcher(index_params, search_params)
# Load all the images1
countInner = 0
countOuter = 1
folder = r"/Downloads/images/**/*"
for a in glob.iglob(folder,recursive=True):
for b in glob.iglob(folder,recursive=True):
if not a.lower().endswith(('.jpg','.png','.tif','.tiff','.gif')):
continue
if not b.lower().endswith(('.jpg','.png','.tif','.tiff','.gif')):
continue
if b.lower().endswith(('.jpg','.png','.tif','.tiff','.gif')):
countInner += 1
print(countInner, "", countOuter)
if countInner <= countOuter:
continue
image1 = cv2.imread(a)
kp_1, desc_1 = sift.detectAndCompute(image1, None)
image2 = cv2.imread(b)
kp_2, desc_2 = sift.detectAndCompute(image2, None)
matches = flann.knnMatch(desc_1, desc_2, k=2)
good_points = []
if good_points == 0:
continue
for m, n in matches:
if m.distance < 0.6*n.distance:
good_points.append(m)
number_keypoints = 0
if len(kp_1) >= len(kp_2):
number_keypoints = len(kp_1)
else:
number_keypoints = len(kp_2)
percentage_similarity = float(len(good_points)) / number_keypoints * 100
listOfSimilarities.append(str(int(percentage_similarity)))
listOfTitles2.append(b)
listOfTitles1.append(a)
countInner = 0
if a.lower().endswith(('.jpg','.png','.tif','.tiff','.gif')):
countOuter += 1
zippedList = list(zip(listOfTitles1,listOfTitles2, listOfSimilarities))
print(zippedList)
dfObj = pd.DataFrame(zippedList, columns = ['Original', 'Title' , 'Similarity'])
dfObj.to_csv(r"/Downloads/images/DuplicateImages3.csv")
Run Code Online (Sandbox Code Playgroud)
我认为通过简单的更改可以获得显着的性能改进:
files = ... # preload all file names with glob
for a_idx in range(len(files)):
for b_idx in range(a_idx, len(files)): # notice loop here
image_1 = cv2.imread(files[a_idx])
image_2 = cv2.imread(files[b_idx])
Run Code Online (Sandbox Code Playgroud)
这考虑了所有不重复的对,例如 (a, b) && (b, a)
for a_idx in range(len(files)):
image_1 = cv2.imread(files[a_idx])
kp_1, desc_1 = sift.detectAndCompute(image1, None) # never recoompute SIFT!
for b_idx in range(a_idx, len(files)):
image_2 = cv2.imread(files[b_idx])
kp_2, desc_2 = sift.detectAndCompute(image2, None)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3123 次 |
| 最近记录: |