如何找出检测到的人脸是真还是假

我正在开发一个与安全相关的项目,需要检查是否检测到任何人脸,如果检测到人脸,则执行一些操作,如果未检测到人脸则关闭应用程序。

一切都是完美的工作,我正在使用,这是实现的,在那个打开的相机和相机有一个方法名称是使用这种方法,我检测人脸。SurfaceViewSurfaceHolder.CallbackstartFaceDetection

代码以供参考

public class SurfaceViewPreview extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera mCamera;

    public SurfaceViewPreview(Context context, AttributeSet attrs) {
        super(context, attrs);
        setWillNotDraw(false);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED)
                return;

            mCamera = Camera.open(0);
            mCamera.setPreviewDisplay(mHolder);
        } catch (Exception e) {
            e.printStackTrace();
            if (this.mCamera != null) {
                this.mCamera.release();
                this.mCamera = null;
            }
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)
            return;
        mCamera.stopPreview();
        mCamera.release();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        if (Camera.getNumberOfCameras() <= 0 || ContextCompat.checkSelfPermission(getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED)
            return;

        mCamera.startPreview();
        mCamera.setFaceDetectionListener(new Camera.FaceDetectionListener() {
            @Override
            public void onFaceDetection(Camera.Face[] faces, Camera camera) {
               // face is detected.
            }
        });

        mCamera.startFaceDetection();
    }
}

现在,问题,如果任何人类帖子,如果我向相机展示然后被检测为人类,但我想要真正的人脸检测而不是假海报脸。

处理我的要求的可能方法。

1)定期捕获10张图像并检查所有变化是否相同,这意味着静态面在那里(就像安装在墙上的海报一样)。

2)编写任何适当的算法,告诉检测到的人脸是真人或假脸。

3)任何图书馆都是可用的,据说人脸真的可用或不可用。

如果有人有想法,请建议,如何解决上述问题(任何代码都可用,然后与我分享),非常感谢您的回复!

如何使用适应性学习方法来总结真实与虚假的图片/视频帧。


答案 1

您可以使用视差效果。首先,您从2个不同的位置拍摄2张照片,这些位置相距2厘米。然后,您可以比较图像并查看:

*如果它们非常相似(几乎相同),则图像是2D,并且是海报

*如果它们非常不同,那么它是3D面部

另一种方法是使用相机闪光灯。闪光灯会在照片上引起一些反射,这将阻止人们使用视频绕过您的系统,因为屏幕会导致大量眩光会阻挡脸部,从而阻止相机检测到人脸。您需要做的就是添加一个闪光灯(最好以100Hz的频率闪烁,这样人们就看不到它,但它会出现在图片中)

我希望这对:)


答案 2

我遇到了一个挑战,解决与@YogeshRathi类似的问题。我有一个带有CV2库(Python)的算法,可以识别从安全摄像头拍摄的人脸。每隔5秒钟我就拍照一次,算法识别出挂在墙上的海报上的面孔。

在测试了不同的解决方案(其他算法,训练模型......)之后,我最终做的是生成一个缓冲区,其中总是有5张图片,一张进一出。进入缓冲区的人使用包含人脸的所有矩形的坐标列表(图片中有5张面孔 - >5个矩形)进行操作,并与缓冲区内的其他图片进行比较。图片的比较包括比较两张图片之间的矩形(每个矩形有4个坐标),减去每个坐标。如果矩形是静态的(海报中的一张脸在不同的图片中几乎具有相同的矩形),则两个矩形之间的差异是简单的,因此,除非它们具有不同数量的矩形,否则如果两张图片中的所有矩形都具有简单的差异,否则它们是相似的。

如果在图片中出现一个真人,我们将有不同数量的矩形(海报内的面孔数量和属于真人的脸的数量),o其中至少有一个将与正在比较的图片的矩形列表不同。如果两张图片中的矩形相似,我会在历史字段中放置一个标志,即0。如果存在不同的矩形,则标志为 1。

将一对一进入缓冲区的图片与缓冲区中的其余图片进行比较。因此,当您完成时,您会将标志列表(如[0,0,0,1,1])附加到每张图片。

当图片从缓冲区中取出时,您将评估历史字段。如果列表中包含0,则意味着至少有一张相同的图片,因此您可以认为其上没有必须识别的面孔,因为它仅包含来自海报的假面孔。


推荐