Как узнать, обнаружено ли лицо настоящее или поддельное

Я занимаюсь разработкой одного проекта, связанного с безопасностью, необходимо проверить, обнаружено ли какое-либо лицо или нет, если обнаруживается лицо, выполните какое-либо действие, если лицо не обнаружено, закройте приложение.

Все отлично работает, я использую 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) Доступна любая библиотека, которая говорит, что человеческое лицо действительно доступно или нет.

Если у кого-то есть идея, пожалуйста, предложите, как решить вышеупомянутую проблему (любой код доступен, тогда поделитесь со мной), ответ приветствуется!

Как можно использовать адаптацию способов обучения, чтобы сделать вывод о реальной или фальшивой картинке / видеокадре.

1 ответ

Вы можете использовать эффект параллакса. Сначала вы делаете 2 фотографии из 2 разных мест, которые находятся на расстоянии 2 см друг от друга. тогда вы можете сравнить изображения и увидеть:

* Если они очень похожи (почти одинаковы), то изображение 2 d и это плакат

* Если они очень разные, то это 3D Face

Другой способ сделать это - использовать вспышку камеры. Вспышка будет немного отражаться на фотографиях, и это будет препятствовать тому, чтобы люди использовали видео для обхода вашей системы, так как экран вызвал бы много бликов, которые блокировали бы лицо, мешая камере распознавать лицо. Все, что вам нужно сделать, это добавить вспышку (желательно мигать с частотой 100 Гц, чтобы люди не могли ее увидеть, но она появилась бы на картинке)

Я надеюсь, что это помогло:)

У меня была проблема с решением проблем, похожая на @YogeshRathi. У меня был алгоритм с библиотекой CV2 (Python), распознающий лица, снятые с камеры безопасности. Каждые 5 секунд я фотографировал, и алгоритм распознавал лица на постере, подвешенном на стене.

После тестирования различных решений (других алгоритмов, моделей поездов...) я наконец-то сгенерировал буфер, в котором всегда было 5 картинок, одна на другую, а другая на выходе. Тот, кто входит в буфер, делает это со списком координат всех прямоугольников, содержащих лицо (5 граней на рисунках -> 5 прямоугольников), и сравнивает их с остальными изображениями внутри буфера. Сравнение изображений состоит в сравнении прямоугольников (каждый прямоугольник имеет 4 координаты) между двумя изображениями путем вычитания каждой отдельной координаты. Если прямоугольник статичен (у лица на плакате почти одинаковый прямоугольник на разных рисунках), разница между обоими прямоугольниками является символической, поэтому, если у них нет разного количества прямоугольников, если все прямоугольники на обоих рисунках имеют символические различия, они похожи.

Если на изображении появляется реальный человек, у нас будет разное количество прямоугольников (количество лиц внутри плаката и лицо, принадлежащее реальному человеку), o хотя бы одно из них будет отличаться от списка прямоугольников картина сравнивается с. Если прямоугольники на обоих рисунках похожи, я помещаю флаг в поле "История", то есть 0. Если есть разные прямоугольники, флаг равен 1.

Вы сравниваете изображение, которое входит в буфер один к одному, с остальными изображениями в буфере. Поэтому, когда вы закончите, у вас есть список флагов (например, [0,0,0,1,1]), прикрепленный к каждой картинке.

Когда картинка выходит из буфера, вы оцениваете Историческое поле. Если в списке содержится 0, это означает, что, по крайней мере, изображение идентично, так что вы можете считать, что на нем нет лиц, которые нужно идентифицировать, поскольку все они содержат только поддельные лица с плаката.

Другие вопросы по тегам