我正在尝试使用multi-threading.pool根据相似性比较图像。虽然我的代码是在单个内核上工作的,使用for loop
或map()
对数据进行迭代,但在大量图像上的速度非常慢。出于这个原因,我一直在尝试实现多处理,但我似乎无法正确实现它。我的主要问题是为什么下面代码中的getssim()
不更改列表
iterable的结构如下所示:
[[("images/000.jpg",np.ndarray),0.923],...]
其中,float是与正在测试的当前图像相比的图像的相似性指数。以下是(略为缩写的)非工作代码:
import cv2
import glob
from skimage.measure import structural_similarity as ssim
import operator
import multiprocessing
def makeSimilarList(imagesdata):
simImgList = [] #list of images ordered by their similarity
while(imagesdata):
simImg = findSimilar(imagesdata)
simImgList.append(os.path.basename(simImg))
return simImgList
def getssim(imgd):
similarityIndex = ssim(img1,imgd[0][1])
print(similarityIndex) #this prints correctly
imgd[1] = similarityIndex
return imgd #this appears to have no effect
def findSimilar(imagesdata):
limg = imagesdata.pop()
global img1 #making img1 accessible to getssim, a bad idea!
img1 = limg[0][1]
p = multiprocessing.Pool(processes=multiprocessing.cpu_count(),maxtasksperchild=2)
p.map(getssim,imagesdata)
p.close()
p.join()
imagesdata.sort(key=operator.itemgetter(1))
return limg[0][0] #return name of image
images = [f for f in glob.glob(src + "*." + ftype)]
images.reverse()
imagesdata = [[(f,cv2.imread(f,0)),""] for f in images]
finalList = makeSimilarList(imagesdata)
with open("./simlist.txt", 'w') as f:
f.write('\n'.join(finalList))
谢谢你的帮助
您忘记将来自
multiprocessing.map
的结果分配给变量。键函数可能应为由于您没有提供足够的细节,我无法测试您的代码,但我认为这是关键点
相关问题 更多 >
编程相关推荐