【问题标题】:Unexpected results when passing webcam frames to object detection将网络摄像头帧传递给对象检测时出现意外结果
【发布时间】:2022-01-10 12:03:58
【问题描述】:

背景

我有一个来自tensorflow-zoo 的训练有素的ssd320x320 tensorflow 模型。报告非常好,因为火车日志表明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 方法中成功检测到所有帧,但不是实时检测到的。总结一下:

  • 我未能在网络摄像头帧(实时)中检测到点赞。
  • 我将框架保存在 test_dir 中,并带有唯一 ID。
  • test1()(9/10 屏幕截图)中打开jpg 后,我设法检测到了一个点赞。

我尝试过...

  • numpy array 的身份传递帧,但没有运气。
  • 再次扩展 tf 文档中提到的维度,但没有成功。

请注意...

  • 我只有 1 个标签,即 Like(手签)。
  • 我使用了大约 25 张训练图像和 9 张测试图像。
  • 如前所述,该模型在打开保存的jpg 文件时效果很好。评估报告看起来不错。
  • PY 是3.7,TF 是2.7,CV 是4.5.5

提前致谢!

【问题讨论】:

  • 您是否尝试将im_detected 保存为图像并查看它们是否有检测?
  • 是的,没有检测到。尽管使用test1() 打开图像可以检测到所有对象(正如我所提到的),但准确度非常好。这就是我迷路的原因……
  • 能不能把这个函数的内容显示出来self._load_image_into_numpy_array
  • 评论区有提到。它返回np.array(Image.open(path))

标签: python tensorflow opencv object-detection webcam


【解决方案1】:

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

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

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

image_np = image_np / 255.

【讨论】:

  • 英雄!好吧,我正在尝试检测 BGR 图像,哎呀...在转换为 RGB 并设置 min_score 值后,我的程序运行完美,感谢您。
猜你喜欢
  • 2016-03-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-09
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 2012-06-12
  • 2012-10-04
相关资源
最近更新 更多