首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用10万张图片的dlib/cv2 2

使用10万张图片的dlib/cv2 2
EN

Stack Overflow用户
提问于 2018-11-30 18:43:53
回答 1查看 590关注 0票数 1

在我的下一个大学项目中,我将不得不教一个复杂的神经网络如何去模糊一张脸的图片,所以我开始挖掘我们的脸数据集。我偶然发现了这个数据集( dataset,CelebA)上的人的200k+图片,我发现了前几个问题:有太多的图片无法在它们上进行基本计算。

我应该:

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

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

为了加快速度,我尝试了线程;每个图片都有一个线程,但是加速比大约是每分钟2-3张图片。

这是我正在运行的代码:

代码语言:javascript
复制
### 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个)。有更快的方法来实现这一点吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-12 09:27:03

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

  1. 对于dlib来说,颜色并不重要。因此,在进行之前,将输入图像更改为灰色,以节省时间。
  2. 我看到你两次调用下面的函数,目的是什么?它可以使消耗的时间增加一倍。如果你需要得到新的地标后,对齐,尝试旋转地标点直接,而不是重新检测。如何旋转点 dets =检测器(img_in,1)
  3. 因为你只想检测每幅图像一张脸。尝试将pyramid_down设置为6(默认情况下,这是一个空间外的图像,以检测更多的脸)。您可以从1-6测试值。 dets =检测器(img_in,6)
  4. 打开AVX指令。

注意:更详细的信息可以在这里找到,Dlib Github

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53563169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档