如何使用多处理并行处理 OpenCV 的图像?



我在一个文件夹中有一组图像,我想使用一些OpenCV函数进行预处理。函数

detectAndaligncrop

采用图像路径使用 OpenCV 对其进行预处理并返回 utput 图像。 我能够使用以下方法做到这一点:

for image_path in files_list:
cropped_image, _=detectAndaligncrop(im)
cv2.imwrite("ouput_folder/{}".format(os.path.basename(image_path)),cropped_im*255.)

但是,这不起作用:

jobs=[]
for im_no, im in enumerate(files_list):
p=multiprocessing.Process(target=saveIm,args=[im])
jobs.append(p)
p.start()
for j in jobs:
j.join()

其中 saveIm 是:

im,lm=detectAndaligncrop(im_path)
fname="output_path/cropped2/{}".format(os.path.basename(im_path))
cv2.imwrite(fname,im)

我已经验证了它调用了检测和对齐裁剪函数,但不从以下行开始处理图像

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

在 detectAndaligncrop 中调用,因为每个图像都调用"在 cvtColor 之前",而"在 cvtColor 之后"不是:

def detectAndaligncrop(impath):
image=cv2.imread(impath)
image_float=np.float32(image)/255.0
print ("before cvtcolor")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
print ("after cvtcolor")
return gray, 1

另外,我尝试了:

with ThreadPoolExecutor(max_workers=32) as execr:
res=execr.map(saveIm,files_list)

这有效,但不比简单地运行 for 循环更快。是因为吉尔吗?

我需要一种多处理方法来预处理图像,然后再将它们馈送到神经网络。我遇到了一个名为"尴尬并行循环"的页面,其中数学任务正在并行运行数组/列表中的元素。我想知道这是否可以扩展到图像(毕竟图像只不过是数组,大型 3D 数组!

我决定从 OpenCV 执行加权操作到图像集合。使用此操作,您可以将不同的权重应用于两个图像并添加它们。它用于混合图像,如你在这里看到的

我在桌面上的一组图像中使用和不使用joblib 执行此功能,并比较了它们的性能。最后,我提到了图像的数量和所用图像的集体大小。

法典:

import os
import time
#--- Importing the required library ---
from joblib import delayed
#--- Choosing all available image formats of images from my desktop ---
path = r'C:UsersJacksonDesktop'
img_formats = ['.png', '.jpg', '.jpeg']
#--- Defining the addWeighted function from OpenCV ---
def weight(im):
addweighted = cv2.addWeighted(im, 0.7, cv2.GaussianBlur(im, (15, 15), 0), 0.3, 0)
return addweighted

#--- Using joblib library-----
start_time = time.time()
new_dir = os.path.join(path, 'add_Weighted_4_joblib')
if not os.path.exists(new_dir):
os.makedirs(new_dir)
def joblib_loop():
for f in os.listdir(path):
if any(c in f for c in img_formats):
img = cv2.imread(os.path.join(path, f))
r = delayed(weight)(img)
cv2.imwrite(os.path.join(new_dir, f + '_add_weighted_.jpg'), r)
elapsed_time = time.time() - start_time
print('Using Joblib : ', elapsed_time)
#--- Without joblib ---
start_time = time.time()
#--- Check whether directory exists if not make one
new_dir = os.path.join(path, 'add_Weighted_4')
if not os.path.exists(new_dir):
os.makedirs(new_dir)
for f in os.listdir(path):
if any(c in f for c in img_formats):
img = cv2.imread(os.path.join(path, f))
r = weight(img)
cv2.imwrite(os.path.join(new_dir, f + '_add_weighted_.jpg'), r)
elapsed_time = time.time() - start_time
print('Without Joblib : ', elapsed_time)

这是我得到的结果:

('Using Joblib : ', 0.09400010108947754)
('Without Joblib : ', 15.386000156402588)

如您所见,使用joblib可以疯狂地加快操作速度!!

现在让我向您展示我的桌面上有多少图像以及它们的总大小是多少:

overall_size = 0
count = 0
#for f in os.listdir(path):
for  f in os.listdir(path):
if any(c in f for c in img_formats):
img = cv2.imread(os.path.join(path, f))
overall_size+= img.size
count+= 1
print('Collective Size of all {} images in the predefined path is {} MB'.format(count, overall_size/10**6))

结果是:

Collective size of all 14 images in the predefined path is 58 MB

经过几次实验发现错误: 基本上,错误在于将读取的图像转换为灰度图像的方法。 如果我使用 :

gray = cv2.imread(impath,0)

而不是

image = cv2.imread(impath)
image_float = np.float32(image)/255.0
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

代码工作正常,

也许在多处理中使用cv2.cvtColor存在一些问题。有人可以阐明原因。是关于可挑剔的吗?

最新更新