dlib / cv2处理十万张图片

时间:2018-11-30 18:43:53

标签: python python-3.x image dlib cv2

对于我的下一个大学项目,我将必须教卷积神经网络如何对人脸图像进行去噪,因此我开始从we中挖掘人脸数据集。我偶然发现了该数据集(CelebA),上面有200多张人的照片,但我发现了前几个问题:图片太多,无法对其进行基本计算。

我应该:

  1. 打开每个图像并制作一个numpy数组(dlib.load_rgb_image很好)
  2. 找到它的脸,使用5点形状预测器找到眼睛并对齐它们
  3. 旋转图片,使眼睛处于水平直线上
  4. 裁剪脸部并将其调整为256x256(我可以选择64x64,但节省时间不多)
  5. 制作副本并为其添加人工噪音
  6. 将它们都保存到两个不同的文件夹中

在大学给我的电脑上,我每分钟可以处理约40张图片,每24小时可以处理约57k张图片。

为了加快速度,我尝试了线程;每张图片一个线程,但加速速度为每分钟多出2-3张图片。

这是我正在运行的代码:

### Out of the threads, before running them ###
def img_crop(img, bounding_box):
    # some code using cv2.copyMakeBorder to crop the image

MODEL_5_LANDMARK = "5_point.dat"
shape_preditor = dlib.shape_predictor(MODEL_5_LANDMARK)
detector = dlib.get_frontal_face_detector()


### Inside each thread ###
img_in = dlib.load_rgb_image("img_in.jpg")
dets = detector(img_in, 1)
shape = shape_preditor(img_in, dets[0])

points = []
for i in range(0, shape.num_parts):
    point = shape.part(i)
    points.append((point.x, point.y))

eye_sx = points[1]
eye_dx = points[3]

dy = eye_dx[1] - eye_sx[1]
dx = eye_dx[0] - eye_sx[0]
angle = math.degrees(math.atan2(dy, dx))

center = (dets[0].center().x, dets[0].center().y)
h, w, _ = img_in.shape
M = cv2.getRotationMatrix2D(center, angle + 180, 1)
img_in = cv2.warpAffine(img_in, M, (w, h))

dets = detector(img_in, 1)
bbox = (dets[0].left(), dets[0].top(), dets[0].right(), dets[0].bottom())
img_out = cv2.resize(imcrop(img_in, bbox), (256, 256))
img_out = cv2.cvtColor(img_out, cv2.COLOR_BGR2RGB)

img_noisy = skimage.util.random_noise(img_out, ....)
cv2.imwrite('out.jpg', img_out)
cv2.imwrite('out_noise.jpg', img_noisy)

我的编程语言是Python3.6,如何提高速度?

另一个问题是将整个200k图像作为numpy数组加载到内存中,从我最初的测试开始,12k图像将花费大约80秒的时间,最终形状为(12000,256,256,3)。有没有更快的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

首先,请原谅我,因为我只熟悉c ++。如果有帮助,请在下面我的建议以加快dlib函数的速度并转换为python版本。

  1. 颜色与dlib无关。因此,在节省时间之前,将输入图像更改为灰色。

  2. 我看到您两次调用了以下函数,目的是什么?它可以使耗时增加一倍。如果需要在对齐后获取新的地标,请尝试直接旋转地标点,而不是重新检测。 How to rotate points

    dets = detector(img_in, 1)
    
  3. 因为您只想每个图像检测1张脸。尝试将pyramid_down设置为6(默认情况下为1-为图像留出空间以检测更多人脸)。您可以测试1-6中的值

    dets = detector(img_in, 6)
    
  4. 打开AVX指令。

注意:更多详细信息,请点击Dlib Github