将网络摄像头帧传递给对象检测时出现意外结果
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
方法中已成功检测到所有帧,但不是实时检测到的。总结:
- 我未能在网络摄像头帧中检测到类似符号(实时)。
- 我用唯一 ID 将框架保存在
test_dir
中。
- 我在
test1()
(9/10 截图)中打开 jpg
后设法检测到一个类似的符号。
我试过...
- 作为
numpy array
传递帧,运气不佳。
- 再次按照 tf 文档中的说明展开维度,但没有成功。
请注意...
- 我只有1个标签,是
Like
(手写)。
- 我使用了大约 25 张训练图像和 9 张测试图像。
- 如前所述,该模型在打开保存的
jpg
文件时效果很好。评估报告看起来不错。
- PY是
3.7
,TF是2.7
,CV是4.5.5
.
提前致谢!
TensorFlow 模型最有可能在 RGB 图像上进行训练,而 cv2 适用于 BGR。尝试
image_np = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
此外,模型可能会在标准化图像上进行训练,因此,如果将 BGR 更改为 RGB 没有帮助,请尝试
image_np = image_np / 255.
背景
我有一个来自 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
方法中已成功检测到所有帧,但不是实时检测到的。总结:
- 我未能在网络摄像头帧中检测到类似符号(实时)。
- 我用唯一 ID 将框架保存在
test_dir
中。 - 我在
test1()
(9/10 截图)中打开jpg
后设法检测到一个类似的符号。
我试过...
- 作为
numpy array
传递帧,运气不佳。 - 再次按照 tf 文档中的说明展开维度,但没有成功。
请注意...
- 我只有1个标签,是
Like
(手写)。 - 我使用了大约 25 张训练图像和 9 张测试图像。
- 如前所述,该模型在打开保存的
jpg
文件时效果很好。评估报告看起来不错。 - PY是
3.7
,TF是2.7
,CV是4.5.5
.
提前致谢!
TensorFlow 模型最有可能在 RGB 图像上进行训练,而 cv2 适用于 BGR。尝试
image_np = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
此外,模型可能会在标准化图像上进行训练,因此,如果将 BGR 更改为 RGB 没有帮助,请尝试
image_np = image_np / 255.