更正pythoniterab上池的使用

2024-09-21 01:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用multi-threading.pool根据相似性比较图像。虽然我的代码是在单个内核上工作的,使用for loopmap()对数据进行迭代,但在大量图像上的速度非常慢。出于这个原因,我一直在尝试实现多处理,但我似乎无法正确实现它。我的主要问题是为什么下面代码中的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))  

谢谢你的帮助


Tags: 代码图像importforreturndefmultiprocessingglob
1条回答
网友
1楼 · 发布于 2024-09-21 01:17:34

您忘记将来自multiprocessing.map的结果分配给变量。键函数可能应为

def findSimilar(imagesdata):
    limg = imagesdata.pop()
    global img1  # making img1 accessible to getssim, a bad idea!
    img1 = limg[0][1]
    p = multiprocessing.Pool(maxtasksperchild=2)
    imagesdata = p.map(getssim, imagesdata)
    p.close()
    p.join()                                                                     
    imagesdata.sort(key=operator.itemgetter(1))
    return limg[0][0]  #return name of image

由于您没有提供足够的细节,我无法测试您的代码,但我认为这是关键点

相关问题 更多 >

    热门问题