Ansigts tracking og genkendelse med Xamarin Android

Xamarin Android

Der er rigtig mange apps som er begyndt at tilføje ansigst genkendelse til deres kamera funktionalitet og den mest kendte af dem er Snapchat. Her kan du smide et “filter” henover dit ansigt med diverse animationer og masker. Men hvordan er det muligt og kan det lade sig gøre med Xamarin Android?   Vi vil kigge på, hvordan det kan lade sig gøre at bruge Google Mobile Vision API til at lave ansigts tracking og ansigtsgenkendelse via Microsoft Cognitive Services Face API.
Ansigts tracking og genkendelse med Xamarin Android

Ansigts Tracking

Google Mobile Vision har et sæt API’er som giver adgang til f.eks. genkende ansigter, tekster og scanne stregkoder.   Vi vil kigge på Face API’et som finder menneskelige ansigter i billeder, videoer eller live-streams. Det finder også og sporer øjne, næse og mund. API’et giver også information om tilstanden af ansigtstræk – er personens øjne lukket? Er de sure? Med denne  teknologi kan du redigere billeder og video, forbedre video med effekter og dekorationer, skabe håndfri betjening til spil og apps eller reagere, når en person blinker eller smiler. Der er rigtig mange muligheder og du skal bare bruge Face API fra Google til at kunne få adgang til det hele. For at komme i gang skal du tilføje Xamarin.GooglePlayServices.Vision NuGet til dit projekt.
Xamarin Google Play services
Det næste du skal er, at få adgang til kameraet på Android mobilen. Her skal du først bede brugeren om tilladelse og tilføje kamera featuren til Android Manifest.

Bede om kamera tilladelse

if (ActivityCompat.CheckSelfPermission(this, Manifest.Permission.Camera) == Permission.Granted)

{

CreateCameraSource();
//...

}

else

{

Log.Warn(TAG, "Camera permission is not granted. Requesting permission");

var permissions = new string[] { Manifest.Permission.Camera };

if (!ActivityCompat.ShouldShowRequestPermissionRationale(this, Manifest.Permission.Camera)) {

ActivityCompat.RequestPermissions(this, permissions, RC_HANDLE_CAMERA_PERM);

return;

}

Snackbar.Make(mGraphicOverlay, Resource.String.permission_camera_rationale, Snackbar.LengthIndefinite)

.SetAction(Resource.String.ok, (o) => { ActivityCompat.RequestPermissions(this, permissions, RC_HANDLE_CAMERA_PERM); })

.Show();

}

Opret Kamera Kilde

private void CreateCameraSource()

{

var context = Application.Context;

FaceDetector detector = new FaceDetector.Builder(context)

.SetClassificationType(ClassificationType.All)

.Build();

detector.SetProcessor(

new MultiProcessor.Builder(this)

.Build());

if (!detector.IsOperational)

{

// Note: The first time that an app using face API is installed on a device, GMS will

// download a native library to the device in order to do detection.  Usually this

 // completes before the app is run for the first time.  But if that download has not yet

// completed, then the above call will not detect any faces.

//

// isOperational() can be used to check if the required native library is currently

// available.  The detector will automatically become operational once the library

// download completes on the device.

Log.Warn(TAG, "Face detector dependencies are not yet available.");

}

mCameraSource = new CameraSource.Builder(context, detector)

.SetRequestedPreviewSize(640, 480)

.SetFacing(CameraFacing.Front)

.SetRequestedFps(30.0f)

.Build();

}

Start live stream på kameraet

Nu hvor vi har adgang til kameraet og vi har oprettet kamera kilden, kan vi starte et live stream på kameraet. Det mest optimale er at kalde start koden i OnResume() på Activity og når app går i pause OnPause(), skal vi stoppe live streamet. På den måde sikre vi os at kamera ressourcerne kun bliver brugt, når app’en er åben.
private void StartCameraSource()

{

// check that the device has play services available.

int code = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(

this.ApplicationContext);

if (code != ConnectionResult.Success) {

var dlg = GoogleApiAvailability.Instance.GetErrorDialog(this, code, RC_HANDLE_GMS);

dlg.Show();

}

if (mCameraSource != null){

try {

mPreview.Start(mCameraSource, mGraphicOverlay);

}

catch (System.Exception e) {

Log.Error(TAG, "Unable to start camera source.", e);

mCameraSource.Release();

mCameraSource = null;

}

}

}

Identificer Ansigter

Der kan være mange ansigter på et billede. For hvert ansigt bliver der oprettet en Tracker instans af MultiProcessor’en. MultiProcessor kræver at vi implementere IFactory for at kunne identificerer ansigter via kameraet.
Graphic FaceTracker
public Tracker Create(Java.Lang.Object item)

{

return new GraphicFaceTracker(mGraphicOverlay, mCameraSource);

}
For hvert ansigt som bliver genkendt, bliver GraphicFaceTracker oprettet og tegner en firekant henover videokilden via GraphicOverlay view som indsættes via konstruktoren.
class GraphicFaceTracker : Tracker

{

private GraphicOverlay mOverlay;

private FaceGraphic mFaceGraphic;

public GraphicFaceTracker(GraphicOverlay overlay)

{

mOverlay = overlay;

mFaceGraphic = new FaceGraphic(overlay);

}

public override void OnNewItem(int id, Java.Lang.Object item)

{

mFaceGraphic.SetId(id);

}

public override void OnUpdate(Detector.Detections detections, Java.Lang.Object item)

{

mFaceGraphic.SetId(id);

}

public override void OnUpdate(Detector.Detections detections, Java.Lang.Object item)
{

var face = item as Face;

mOverlay.Add(mFaceGraphic);

mFaceGraphic.UpdateFace(face);

}

public override void OnMissing(Detector.Detections detections)
{

mOverlay.Remove(mFaceGraphic);

}

public override void OnDone()
{

mOverlay.Remove(mFaceGraphic);

}

}
Når et ansigt bliver godkendt oprettes en instans af FaceGraphic, som bliver opdateret, hvis ansigtet ændres eller fjernes, når ansigtet er udenfor rammen. Nu kan vi forsøge at genkende ansigter som vi har identificeret.

Ansigts genkendelse fra Live Stream

Der kræves en del avanceret teknologi så som Artificial Intelligence (AI) og Machine Learning (ML) for at kunne genkende ansigter og alt det får vi foræret ved at bruge Microsoft’s Cognitive Services API (MCSA) som er gratis at starte med at bruge. For at det kan lade sig gøre skal vi sende et billede, af det ansigt vi lige har identificeret, til MCSA som kan identificere personen for os. Du kan få gratis adgang til MCSA hvis du opretter dig via dette link og tilmelde dig Face API.
Face API
Når du har styr på det kan vi begynde at arbejde med at sende data til API’et og få hjælp til at genkende ansigts billederne.

Hent billede af ansigt

Opdater GraphicFaceTracker så den implementere CameraSource.IPictureCallback som det første og derefter skal du opdatere OnNewItem() for at gemme billede med ansigtet på.
class GraphicFaceTracker : Tracker, CameraSource.IPictureCallback
{

// ...

}

public override void OnNewItem(int id, Java.Lang.Object item)
{

mFaceGraphic.SetId(id);

if (mCameraSource != null && !isProcessing)

mCameraSource.TakePicture(null, this);

}
For at kunne identificere personen på billedet skal vi bruge hjælpeklasser som ImageAnalyser og LiveCamHelper.
public void OnPictureTaken(byte[] data)
{

Task.Run(async () =>

{

try {

isProcessing = true;

Console.WriteLine("face detected: ");

var imageAnalyzer = new ImageAnalyzer(data);

await LiveCamHelper.ProcessCameraCapture(imageAnalyzer);

}

finally {

isProcessing = false;

}

});

}

 

Opsummering

Ved at bruge Google’s Mobile Vision API og Microsoft’s Cognitive Services API, har vi kunnet på identificere og genkende ansigter og det er kun en begrænset del af all de muligheder vi får foræret ved at udnytte og anvende disse API’er fra Google og Microsoft. Du kan med fordel læse op på emnet på følgende sider: https://developers.google.com/vision/android/face-tracker-tutorial https://developers.google.com/vision/ https://blog.xamarin.com/adding-facial-recognition-to-your-mobile-apps/ https://blog.xamarin.com/adding-face-tracking-live-recognition-android-app/ Her er kildekoden til iOS og Android app’en, som du kan hente og køre på din mobil.