首页 > 解决方案 > 如何使重复图像查找过程比 joblib 更快?

问题描述

我有近 300 张非常大的图像。并找出哪个图像是重复的。因此,打开所有图像并使它们变小图像(64,64),并转换为 numpy 数组。最后比较所有 numpy 数组,如果一对数组的 sum() 为零,则该对是重复的。

这很简单。但问题是速度。

所以我正在尝试使用 joblib 作为并行化包。

但是,它非常慢。

我想,腌制的数据太大了,所以开销会变慢。

我怎样才能使这个代码效率并行?以下是所有代码。

import pandas as pd
from PIL import Image
import os
import numpy as np
from tqdm import tqdm
import joblib
from joblib import Parallel, delayed
from itertools import combinations

导入包

data = pd.DataFrame(os.listdir("git"), columns=["dir"])
data["dir"] = "git/"+data["dir"]
tqdm.pandas()
data["image"] = data["dir"].progress_apply(Image.open)

加载数据

在此处输入图像描述

data["small_image"] = data["image"].progress_apply(lambda x: x.resize((64,64)))

为速度制作​​更小的图像

data["small_image"] = data["small_image"].progress_apply(np.array)

将图像转换为 np 数组。

在此处输入图像描述

def test(i, j):
    tmp = data["small_image"][i]-data["small_image"][j]
    if tmp.sum() == 0:
        print("DUPLICATE!")
        return (i, j)
    else:
        return 0

这是判断哪个图像对重复的功能。

最后,

set(Parallel(n_jobs=1)(delayed(test)(i,j) for i, j in combinations(range(4), 2)))
# Wall time: 2.93 ms
set(Parallel(n_jobs=2)(delayed(test)(i,j) for i, j in combinations(range(4), 2))) # 2,3, -1, -2 almost same time
# Wall time: 49.2 s

标签: pythonjoblib

解决方案


推荐阅读