Tensorflow / Keras与django无法正常使用芹菜

时间:2017-07-10 16:46:24

标签: django tensorflow celery keras

我们正在构建一个用于人脸识别的脚本,主要是基于视频的基本识别功能的张量流。

当我们直接尝试使用python test-reco.py(将视频路径作为参数)时,它可以完美地运行。

现在我们正试图通过我们的网站在芹菜任务中整合它。

这是主要代码:

def extract_labels(self, path_to_video):
    if not os.path.exists(path_to_video):
        print("NO VIDEO!")
        return None
    video = VideoFileClip(path_to_video)
    n_frames = int(video.fps * video.duration)

    out = []
    for i, frame in enumerate(video.iter_frames()):
        if self.verbose > 0:
            print(
                'processing frame:',
                str(i).zfill(len(str(n_frames))),
                '/',
                n_frames
            )

        try:
            rect = face_detector(frame[::2, ::2], 0)[0]
            y0, x0, y1, x1 = np.array([rect.left(), rect.top(), rect.right(), rect.bottom()])*2
            bbox = frame[x0:x1, y0:y1]
            bbox = resize(bbox, [128, 128])
            bbox = rgb2gray(bbox)
            bbox = equalize_hist(bbox)
            y_hat = self.model.predict(bbox[None, :, :, None], verbose=1, batch_size=1)[0]
            # y_hat = np.ones(7)
            out.append(y_hat)
        except IndexError as e:
            print(out)
            print(e)

我们需要尝试捕捉,因为有时候第一帧中没有任何面孔。

但是我们有这条线: y_hat = self.model.predict(bbox[None, :, :, None], verbose=1, batch_size=1)[0] 阻塞。就像一个无限循环。

bbox不是空的。

芹菜工人只是阻止它,你就不能退出这个过程(温暖/寒冷的戒烟永远不会发生)

与芹菜的张量流是否有特定的关系?

2 个答案:

答案 0 :(得分:4)

我有一个非常相似的设置和问题。在我的例子中,它简单地将引用Keras东西的所有导入转换为专用的初始化函数,导致这样的设置:

from celery import Celery
from celery.signals import worker_process_init

CELERY = ...

@worker_process_init.connect()
def init_worker_process(**kwargs):

    // Load all Keras related imports here
    import ...


@CELERY.task()
def long_running_task(*args, **kwargs):

    // Actual calculation task
    ...

答案 1 :(得分:2)

tf.Session(Tensorflow会话)不是叉安全的。如果包装不是叉子安全的话,芹菜不会工作。

我猜self.model.predict会在某处调用tf.Session并被阻止。