将网络摄像头帧传递给对象检测时出现意外结果

Unexpected results when passing webcam frames to object detection

背景

我有一个来自 tensorflow-zoo 的训练有素的 ssd320x320 张量流模型。报告非常好,因为训练日志表明 loss 很低,而评估日志表明 9 个测试图像中有 7 个被成功检测到。该模型使用 GPU 训练并保存为 ckpt3.

目标是检测一个人何时“喜欢”他们的手。

问题

从最后一个检查点加载模型效果很好,我使用以下函数实现了检测:

    def test1(self):
        # Works great
        for img_path in glob.glob("test_dir\*.jpg"):
            plt.figure()
            plt.imshow(self.get_image_np_with_detections(self._load_image_into_numpy_array(img_path)))
            plt.show()

# Note that get get_image_np_with_detections() is the detection @tf.function() 
# as it is written in tensorflow documentation, with no changes.
# _load_image() function simply returns np.array(Image.open(path))

图像中的对象检测成功已在test1中实现。 问题是我未能检测到网络摄像头帧中的对象。

从打开我的网络摄像头的另一个函数中,我为每一帧调用了相同的检测函数。这个功能失效了,屏幕上连一个绿色检测框都没有出现

    def open_webcam(self):
        # Doesn't show detection green boxes at all
        cap = cv2.VideoCapture(0)
        while cap.isOpened():
            ret, image_np = cap.read()
            im_detected = self.get_image_np_with_detections(image_np)
            cv2.imshow('object detection', cv2.resize(im_detected, (800, 600)))
        # release, destroy...

问题出在哪里

在调试期间,我从我的网络摄像头中保存了 屏幕截图,而 运行 open_webcam() 功能(每隔 1-2 截屏秒)。截图保存到test_dir,然后处理到test1。测试成功,因为 所有 屏幕截图都标有绿色检测框(手状符号)。

此测试表明问题与我将帧传递给函数的方式有关,因为在 test1 方法中已成功检测到所有帧,但不是实时检测到的。总结:

我试过...

请注意...

提前致谢!

TensorFlow 模型最有可能在 RGB 图像上进行训练,而 cv2 适用于 BGR。尝试

image_np  = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)

此外,模型可能会在标准化图像上进行训练,因此,如果将 BGR 更改为 RGB 没有帮助,请尝试

image_np = image_np / 255.