Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

* Если они сильно отличаются друг от друга, это 3D Face

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

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

Ответ 2

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

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

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

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

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