【发布时间】:2018-07-30 14:42:36
【问题描述】:
我有一个代码,它使用 CSV 文件中的图像 URL 列表,然后对这些图像执行面部检测,然后加载一些模型并对这些图像进行预测。
我做了一些负载测试,发现代码中的 get_face 函数占用了生成结果所需的大部分时间,而额外的时间由为预测创建的 pickle 文件占用。
问题:是否有可能通过在线程中运行这些进程来减少时间,以及如何以多线程方式完成?
下面是代码示例:
from __future__ import division
import numpy as np
from multiprocessing import Process, Queue, Pool
import os
import pickle
import pandas as pd
import dlib
from skimage import io
from skimage.transform import resize
df = pd.read_csv('/home/instaurls.csv')
detector = dlib.get_frontal_face_detector()
img_width, img_height = 139, 139
confidence = 0.8
def get_face():
output = None
data1 = []
for row in df.itertuples():
img = io.imread(row[1])
dets = detector(img, 1)
for i, d in enumerate(dets):
img = img[d.top():d.bottom(), d.left():d.right()]
img = resize(img, (img_width, img_height))
output = np.expand_dims(img, axis=0)
break
data1.append(output)
data1 = np.concatenate(data1)
return data1
get_face()
csv 样本
data
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/23101834_1502115223199537_1230866541029883904_n.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/17883193_940000882769400_8455736118338387968_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/22427207_1737576603205281_7879421442167668736_n.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/12976287_1720757518213286_1180118177_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/23101834_1502115223199537_1230866541029883904_n.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/16788491_748497378632253_566270225134125056_a.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/21819738_128551217878233_9151523109507956736_n.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/14295447_318848895135407_524281974_a.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/18160229_445050155844926_2783054824017494016_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/23101834_1502115223199537_1230866541029883904_n.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/17883193_940000882769400_8455736118338387968_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/22427207_1737576603205281_7879421442167668736_n.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/12976287_1720757518213286_1180118177_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/23101834_1502115223199537_1230866541029883904_n.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/16788491_748497378632253_566270225134125056_a.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/21819738_128551217878233_9151523109507956736_n.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/14295447_318848895135407_524281974_a.jpg
https://scontent-frx5-1.cdninstagram.com/t51.2885-19/s320x320/18160229_445050155844926_2783054824017494016_a.jpg
https://scontent-frt3-2.cdninstagram.com/t51.2885-19/s320x320/23101834_1502115223199537_1230866541029883904_n.jpg
【问题讨论】:
-
您不应该使用 pandas 来读取 url 的 csv ......更不用说将图像存储回来。 Pandas 不是数据库。正如您现在所拥有的那样,(在我看来)不可能进行任何多线程处理,因为
get_face函数会将所有内容加载到数据帧中。 -
从表面上看,
get_face受 CPU 限制,在这种情况下使用 Python 线程并没有多大用处。您应该专注于multiprocessing模块并创建进程池。这样您就可以使用多个 CPU 内核。 -
@IgnacioVergaraKausel 你有什么建议?我使用 pandas 来避免遍历 csv 行的 for 循环,并且在函数中我将所有内容加载到 numpy 数组中;不是数据框
-
@Rehan 它可能会慢一点,前提是 pandas 更擅长阅读 csv ......但我认为这不是你的瓶颈。您确实说过函数
get_face是最常使用的函数,而该函数是您应该尝试并行化的函数。实际上,该函数应该被称为get_faces,因为它会处理所有这些。你应该制作一个真正的get_face,它只接受一个图像作为参数。这是您并行并使用队列来控制从 url reader 到 taks 的流程的第一步。 -
@Rehan 我不能给你具体的说明,因为你有很多函数调用,我不知道它们是如何工作的。我什至无法运行此代码,因为它不是MCVE。
标签: python multithreading python-multithreading