有没有办法知道正确的相机预览尺寸是不是与面部检测器兼容(产生检测到的面部)
Posted
技术标签:
【中文标题】有没有办法知道正确的相机预览尺寸是不是与面部检测器兼容(产生检测到的面部)【英文标题】:Is there a way to know if a correct camera preview size will be compatible with the face detector (yield detected faces)有没有办法知道正确的相机预览尺寸是否与面部检测器兼容(产生检测到的面部) 【发布时间】:2020-07-29 23:16:16 【问题描述】:使用 Camera 2 API 和 Firebase,我们可以在来自摄像头的预览流中检测人脸。 以下 sn-p 是我们如何确定与我们要使用的相机兼容的预览尺寸的示例:
Size[] cameraSupportedOutputSizes;
StreamConfigurationMap map = ch.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
if(map != null)
cameraSupportedOutputSizes = map.getOutputSizes(SurfaceTexture.class);
List<Size> sizes = Arrays.asList(cameraSupportedOutputSizes);
Log.e(TAG, Arrays.asList(cameraSupportedOutputSizes).toString());
这将产生以下输出(例如):
[960x720,640x640,800x480,720x480,768x432,640x480,480x640,576x432,640x360,480x360,480x320,384x288,352x288,320x240,240x320,240x160,176x144,144x176,160x120]
让我们说,为了优化性能,我们选择较小的预览尺寸之一,例如 800x480,并像这样配置我们的 Firebase 人脸检测器元:
faceDetectorFrameMetadata = new FirebaseVisionImageMetadata.Builder()
.setRotation(correctRotation)
.setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
.setHeight(previewSize.getHeight())
.setWidth(previewSize.getWidth())
.build();
现在,一旦我们打开相机并开始检测人脸,我们会发现人脸检测器在预览尺寸方面是“挑剔的”。我可以告诉你一个事实,在许多情况下,除了最大的预览尺寸和几个典型的预览尺寸(例如,但不限于 16:9 设备上的 1280 x 720 或旧 4:3 设备上的 1024 x 768 ) 将允许正确实例化人脸检测器,但不会产生任何人脸。人脸检测任务监听器将返回 0 个找到的人脸。
有没有办法预先确定哪种预览尺寸适合 Firebase 检测器的喜好?
谢谢!
【问题讨论】:
【参考方案1】:感谢您的提问!
基础模型需要更小的方形图像(例如 256 * 256)。在运行模型之前,ML Kit 会将输入图像调整为更小的尺寸。我猜在某些情况下,调整大小后的图像太扭曲而无法检测到人脸。如果您能提供一些图像示例,那就太好了。
在人脸检测器中,它也有一个face size option来选择感兴趣的人脸尺寸。因此,请确保人脸尺寸足够大,可以被检测到。
【讨论】:
谢谢!这可能为我指明了正确的方向,但还不是答案。您在哪里找到有关模型重新缩放方形图像的信息?这是在剪脸之前还是之后?我很期待前者是这样的。您提到的面部大小选项是一个相对设置,应该与预览大小无关。 我来自 ML Kit 团队。我们将很快在我们的文档中提供有关预期图像大小的更多详细信息。在人脸检测之前调整整个图像的大小。 太棒了!非常感谢您的工作。我会留意更新的文档。如果在此期间您可以与我分享任何内容(关于使用 ML 套件的最佳预览大小),它将对我的工作有所帮助。我对你所说的在人脸检测之前重新缩放整个图像感到惊讶,因为我可以成功地为距离他们的设备 2 米的人获得 eyeOpenProbability。如果图像是 256x256 像素,则没有足够的像素来分辨眼睛! :)以上是关于有没有办法知道正确的相机预览尺寸是不是与面部检测器兼容(产生检测到的面部)的主要内容,如果未能解决你的问题,请参考以下文章