【发布时间】: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