【问题标题】:How to find out detected face is real or fake如何找出检测到的人脸是真的还是假的
【发布时间】:2016-12-24 03:32:12
【问题描述】:

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

一切都很完美,我正在使用SurfaceView,它实现了SurfaceHolder.Callback,并且在那个打开的相机和相机中有一个方法名称是startFaceDetection,我使用这种方法检测人脸。

参考代码

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) 任何说人脸是否真的可用的库都是可用的。

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

如何使用自适应学习方法来判断真假图片/视频帧。

【问题讨论】:

  • 你有没有尝试过任何“可能的方式”?您想如何从视频中检测假脸?
  • 我们如何使用自适应学习方法来得出真假图片/视频帧。我不想从视频中检测,我想从相机中检测,继续相机将运行并检查是否检测到人脸
  • 您可以进行瞳孔和虹膜检测并在分类器中对其进行验证,很难在脸上伪造眼睛。我不认为只写几行代码就能解决这个问题。你需要大量的图像分析知识才能达到这个目标
  • 你可以看看Eulerian Video Magnification。引用:“许多看似静态的场景包含肉眼看不见的细微变化。但是,可以通过使用我们开发的算法从视频中提取这些细微变化。我们提供了一种可视化这些细微变化的方法通过放大它们,我们提出算法以从这些视频中提取有趣的信号,例如人体脉搏、振动物体的声音和热空气的运动。”
  • @Micka 两个摄像头就够了。在两个摄像头前从两个预定义的角度同步同一个人的两个视频真的很难

标签: java android opencv face-detection face-recognition


【解决方案1】:

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

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

*如果它们非常不同,那么它就是一个 3d 人脸

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

我希望这会有所帮助:)

【讨论】:

  • 如果你能添加一些对那个 flash 想法的引用,我认为它对 OP 会更好。 (和我自己:P)
  • 但是我的相机是静态的,如何从两个位置拍摄
  • @Hulk 可以旋转最小的量吗?
  • @Hulk 如果您的相机无法旋转,请使用相机闪光灯
  • @GajuKollur 但您需要为此添加一些黑客逻辑,例如在 5 秒后捕获 2 张图像并检查检测属性是否相同,然后可能是它的图像。但它的逻辑不正确。
【解决方案2】:

我在解决与@YogeshRathi 类似的问题时遇到了挑战。我有一个使用 CV2 库 (Python) 的算法来识别从安全摄像头拍摄的面孔。 我每 5 秒拍照一次,算法识别出挂在墙上的海报中的面孔。

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

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

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

当图片超出缓冲区时,您评估 Historial 字段。如果列表中包含 0,则意味着至少有一张相同的图片,那么您可以认为上面没有您需要识别的面孔,因为它只包含来自海报的假面孔。

【讨论】:

  • @fluente 您好,感谢您描述您的方法,有什么联系方式吗?您能否解释一下为什么要测量这 5 个缓冲图像的矩形?如果我做对了,5张人脸图像会有不同的矩形,是的,但是假图像应该有大约相同大小的矩形,我这样说对吗?但是如果你通过前后移动来改变打印照片的距离呢?
  • 感谢@hxdef 为您解答。就我而言,我用安全摄像头拍照,固定不动。因此,它可以识别挂在墙上的海报中的面孔,在每张照片中,矩形具有相似的坐标。当 pict 将进入缓冲区时,您将 pict 候选中的每个矩形的坐标与缓冲区中的每个矩形的坐标进行比较。稍有不同,如果坐标非常相似,则矩形属于静态面(您可以说它是海报中的新闻)。如果您需要更多信息,请给我发送电子邮件至 fernando.delafuentemunoztech@gmail.com
  • 回答您的问题@hxdef,缓冲区仅在从同一点拍摄照片时才有效。如果你改变前后移动的距离,静态物体的坐标显然会改变,你将不得不寻找另一种解决方案。
  • 哦,您的方法仅适用于海报。我认为它也可以应用于真实的面孔(但你知道其他防止照片攻击和视频攻击的解决方案吗?
猜你喜欢
  • 1970-01-01
  • 2019-11-18
  • 1970-01-01
  • 2019-08-09
  • 2016-06-24
  • 2019-02-27
  • 2020-12-31
  • 2020-12-12
  • 1970-01-01
相关资源
最近更新 更多