Dankzij TensorFlow Mobile en TensorFlow Lite is het insluiten en gebruiken van deep-modellen in Android-applicaties heel eenvoudig geworden. Het ontwerpen en trainen van de modellen vereist echter nog steeds veel vaardigheid, tijd en moeite, om maar te zwijgen van rekenkracht. Om deze reden zijn de meeste informele ontwikkelaars niet enthousiast over het toevoegen van machine-learning-mogelijkheden aan hun apps. Met Firebase ML Kit hoopt Google dat te veranderen.
Firebase ML Kit is een bibliotheek waarmee u moeiteloos en met minimale code een groot aantal zeer nauwkeurige, vooraf getrainde diepe modellen kunt gebruiken in uw Android-apps. De meeste modellen die het biedt, zijn zowel lokaal als op de Google Cloud beschikbaar.
Momenteel zijn de modellen beperkt tot alleen computervisie-gerelateerde taken, zoals optische tekenherkenning, barcodescanning en objectdetectie.
In deze zelfstudie laat ik u zien hoe u Firebase ML Kit kunt toevoegen aan een Android Studio-project en enkele basis-API's kunt gebruiken.
Zorg voordat u doorgaat voor toegang tot het volgende:
Als u Firebase-services voor uw app wilt inschakelen, moet u er een Firebase-project voor maken. Meld u dus aan bij de Firebase-console en druk in het welkomstscherm op Voeg een project toe knop.
In het dialoogvenster dat verschijnt, geeft u het project een naam die u gemakkelijk kunt onthouden en drukt u op Maak een project knop.
Na enkele seconden ziet u een melding dat het nieuwe project klaar is. druk de Doorgaan met om verder te gaan.
Ga in het volgende scherm naar Ontwikkelen sectie en klik op de ML Kit link om alle services te bekijken die ML Kit biedt.
In deze zelfstudie gebruiken we drie services: tekstherkenning, gezichtsdetectie en beeldetikettering. U hoeft geen stappen te ondernemen om ze expliciet in te schakelen als u alleen met de lokale modellen die met ML Kit worden geleverd wilt werken. In deze zelfstudie gebruiken we echter zowel lokale als cloudgebaseerde modellen. Dus klik op de Cloud API-gebruik link volgende.
U wordt nu naar de Google Cloud-console gebracht, waar u eenvoudig op de knop kunt drukken in staat stellen knop weergegeven in de Cloud Vision API-sectie om de cloud-gebaseerde modellen te activeren. Houd er echter rekening mee dat dit alleen werkt als u facturering heeft ingeschakeld voor uw Google Cloud-account.
Voordat u de API-API's van Firebase ML Kit gaat gebruiken, moet u een verbinding maken tussen uw Android Studio-project en het Firebase-project dat u in de vorige stap hebt gemaakt. Open hiervoor het Firebase-assistent-paneel door naar Hulpmiddelen> Firebase.
De Firebase-assistent heeft momenteel geen ondersteuning voor ML Kit. Desondanks kunt u, door het te gebruiken om Firebase Analytics toe te voegen, nog steeds voorkomen dat u de verbinding handmatig tot stand brengt. Breid daarom het Analytics sectie, klik op de Log een Analytics-evenement link en druk op de Maak verbinding met Firebase knop.
Zoek in het dialoogvenster dat verschijnt de optie Kies een bestaand Firebase- of Google-project optie en kies het Firebase-project dat u hebt gemaakt.
druk de Maak verbinding met Firebase knop volgende. Op dit punt downloadt de assistent automatisch een google-services.json bestand, met API-sleutels en project-ID's, en voeg het toe aan de app
module.
Nadat de verbinding tot stand is gebracht, controleert u of u op Voeg Analytics toe aan uw app om verschillende core Firebase-afhankelijkheden toe te voegen aan uw app
module build.gradle het dossier.
Als u vervolgens de ML Kit-bibliotheek daadwerkelijk wilt toevoegen, opent u de build.gradle bestand en typ het volgende in implementatie
afhankelijkheden:
implementatie 'com.google.firebase: firebase-ml-vision: 16.0.0' implementatie 'com.google.firebase: firebase-ml-vision-image-label-model: 15.0.0'
Om het downloaden van afbeeldingen van internet te vereenvoudigen en ze in uw app weer te geven, raad ik u aan ook een afhankelijkheid voor de Picasso-bibliotheek toe te voegen.
implementatie 'com.squareup.picasso: picasso: 2.5.2'
Voeg daarnaast Anko toe als afhankelijkheid om ervoor te zorgen dat uw Kotlin-code zowel beknopt als intuïtief is.
implementatie 'org.jetbrains.anko: anko-commons: 0.10.5'
Standaard worden de lokale modellen van Firebase ML Kit automatisch gedownload naar de apparaten van uw gebruikers wanneer dat nodig is. Als u wilt dat ze worden gedownload zodra uw app is geïnstalleerd, voegt u de volgende code toe aan de AndroidManifest.xml het dossier:
In deze zelfstudie maken we een app waarmee gebruikers URL's van afbeeldingen kunnen typen en tekstherkenning, gezichtsdetectie en bewerking van afbeeldingslabels kunnen uitvoeren. Daarom moet de lay-out van de app een Tekst bewerken
widget, waar de gebruikers kunnen typen in de URL's en drie Knop
widgets, waarmee ze kunnen kiezen welke bewerking ze willen uitvoeren.
Optioneel kunt u een Figuurweergave
widget om de afbeeldingen weer te geven.
Als u alle bovenstaande widgets plaatst met een Relatieve layout
widget, je lay-out XML-bestand zou dit leuk moeten vinden:
Hier is een meer visuele weergave van de lay-out:
In de bovenstaande XML ziet u mogelijk dat elke knop een bij klikken
attribuut verwijst naar een on-click event handler-methode. Die methoden bestaan nog niet, dus maak ze nu in je activiteit.
fun recognityText (v: View) // Te doen fun detectFaces (v: View) // Te doen fun generateLabels (v: View) // Te doen
Wanneer de gebruiker op de Gedaan toets na het typen van de URL van een afbeelding in de Tekst bewerken
widget, onze app moet de afbeelding downloaden en weergeven in de Figuurweergave
widget.
Om acties te detecteren die worden uitgevoerd op het virtuele toetsenbord van de gebruiker, associeert u een OnEditorActionListener
object met de Tekst bewerken
widget. In de luisteraar, na te hebben bevestigd dat het IME_ACTION_DONE
actie werd uitgevoerd, kunt u gewoon Picasso's bellen laden()
en in()
methoden om het beeld respectievelijk te laden en weer te geven.
Voeg daarom de volgende code toe binnen de onCreate ()
methode van uw activiteit:
image_url_field.setOnEditorActionListener _, action, _ -> if (action == EditorInfo.IME_ACTION_DONE) Picasso.with (ctx) .load (image_url_field.text.toString ()) .into (image_holder) true false
Firebase ML Kit heeft afzonderlijke detectorklassen voor alle verschillende beeldherkenningshandelingen die het biedt. Om tekst te herkennen, moet u de FirebaseVisionTextDetector
klasse, die afhankelijk is van een lokaal model, of gebruik de FirebaseVisionCloudTextDetector
klasse, die afhankelijk is van een cloud-gebaseerd model. Laten we voorlopig de eerste gebruiken. Het is veel sneller, maar het kan alleen tekst in het Latijnse alfabet aan.
Een ML Kit-detector verwacht dat de invoer in de vorm van een FirebaseVisionImage
voorwerp. Om een dergelijk object te maken, hoeft u alleen het. Te bellen fromBitmap ()
utility-methode van de FirebaseVisionImage
klasse en geef er een bitmap aan door. De volgende code, die moet worden toegevoegd aan de recognizeText ()
gebeurtenishandler die we eerder hebben gemaakt, laat u zien hoe u de afbeelding converteert die in de lay-outs wordt weergegeven Figuurweergave
widget in een bitmap en maak vervolgens een FirebaseVisionImage
bezwaar van het:
val textImage = FirebaseVisionImage.fromBitmap ((image_holder.drawable as BitmapDrawable) .bitmap)
Vervolgens, om een verwijzing naar een te krijgen FirebaseVisionTextDetector
object, moet u a gebruiken FirebaseVision
aanleg.
val detector = FirebaseVision.getInstance (). visionTextDetector
U kunt nu het tekstherkenningsproces starten door het detectInImage ()
methode en het doorgeven van de FirebaseVisionImage
er bezwaar tegen hebben. Omdat de methode asynchroon wordt uitgevoerd, wordt a geretourneerd Taak
voorwerp. Om het resultaat te kunnen verwerken wanneer het beschikbaar is, moet u daarom een OnCompleteListener
bijvoorbeeld. Hier is hoe:
detector.detectInImage (textImage) .addOnCompleteListener // Meer code hier
In de luisteraar hebt u toegang tot een lijst met Blok
voorwerpen. Over het algemeen kan elk blok worden beschouwd als een afzonderlijke alinea die in de afbeelding wordt gedetecteerd. Door een kijkje te nemen op de tekst
eigenschappen van alle Blok
objecten, kunt u alle tekst bepalen die is gedetecteerd. De volgende code laat zien hoe je dit doet:
var detectedText = "" it.result.blocks.forEach detectedText + = it.text + "\ n"
Hoe u de gedetecteerde tekst gebruikt, is natuurlijk aan u. Laten we het nu gewoon weergeven via een waarschuwingsdialoogvenster. Met dank aan Anko's alert ()
functie, hiervoor is zeer weinig code vereist.
runOnUiThread alert (detectedText, "Text"). show ()
In de bovenstaande code, de runOnUiThread ()
methode zorgt ervoor dat de alert ()
functie wordt uitgevoerd op de rode draad van de applicatie.
Tot slot, als u eenmaal klaar bent met het gebruik van de detector, moet u eraan denken om de detector te bellen dichtbij()
methode om alle middelen die het bevat vrij te geven.
detector.close ()
Als u de app nu uitvoert, typt u de URL van een afbeelding met veel tekst en drukt u op Tekst knop, zou u de tekstherkenningsservice van ML Kit in actie kunnen zien.
Het lokale model van ML Kit voor tekstherkenning is redelijk nauwkeurig bij de meeste soorten afgedrukte tekst.
Hoewel ze geen gemeenschappelijke interface op hoog niveau delen, hebben de meeste detectorklassen dezelfde methoden. Dat betekent dat het detecteren van gezichten in een afbeelding niet veel verschilt van het herkennen van tekst. Merk echter op dat ML Kit momenteel alleen een lokaal model voor gezichtsdetectie biedt, dat toegankelijk is via de FirebaseVisionFaceDetector
klasse. U kunt een verwijzing naar een exemplaar ervan krijgen met behulp van de FirebaseVision
klasse.
Voeg de volgende code toe aan de detectFaces ()
methode:
val detector = FirebaseVision.getInstance (). visionFaceDetector
Door de detectInImage ()
methode opnieuw uitvoert en er een bitmap naartoe stuurt, kunt u het gezichtsdetectieproces asynchroon starten. Door een OnCompleteListener
instantie gehecht aan de Taak
object het terugkeert, kunt u gemakkelijk weten wanneer het proces voltooid is.
detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable als BitmapDrawable) .bitmap)). addOnCompleteListener // Meer code hier
In de luisteraar hebt u toegang tot een lijst met FirebaseVisionFace
objecten, die de coördinaten bevatten van rechthoeken die de gedetecteerde vlakken omcirkelen. Laten we nu die rechthoeken tekenen voor een kopie van de originele afbeelding die werd verwerkt.
Als u een kopie van de bitmap van de originele afbeelding wilt maken, moet u de bitmap gebruiken kopiëren()
methode zoals hieronder getoond:
var markedBitmap = (image_holder.drawable as BitmapDrawable) .bitmap .copy (Bitmap.Config.ARGB_8888, true)
Vervolgens moet je maken om te kunnen tekenen op de nieuwe bitmap Canvas
en Verf
objecten ervoor. Het gebruik van een enigszins transparante kleur voor de rechthoeken zou ideaal zijn.
val canvas = Canvas (markedBitmap) val paint = Paint (Paint.ANTI_ALIAS_FLAG) paint.color = Color.parseColor ("# 99003399") // semi-transparant blauw
Op dit punt kunt u eenvoudig door de lijst met bladeren FirebaseVisionFace
objecten en gebruik hun BoundingBox
eigenschappen om rechthoeken over de gedetecteerde vlakken te tekenen.
it.result.for canvas.drawRect (it.boundingBox, paint)
Vergeet ten slotte niet de nieuwe bitmap door te geven aan de Figuurweergave
widget als het klaar is.
runOnUiThread image_holder.setImageBitmap (markedBitmap)
Als u de app nu uitvoert, moet u gezichtsdetectie kunnen uitvoeren op elke afbeelding die mensen bevat.
Ik ben er zeker van dat u onder de indruk zult zijn van hoe snel en nauwkeurig de gezichtsdetectiewerkzaamheden van de ML Kit zijn.
Als u labels voor een afbeelding wilt genereren, moet u de lokale modelgebaseerde gebruiken FirebaseVisionLabelDetector
klasse of de cloud gebaseerd op een model FirebaseVisionCloudLabelDetector
klasse. Omdat we in deze zelfstudie alleen lokale modellen hebben gebruikt, laten we nu het cloudmodel gebruiken. Om een verwijzing naar een instantie van de. Te krijgen FirebaseVisionCloudLabelDetector
klasse, moet je opnieuw het FirebaseVision
klasse.
Voeg de volgende code toe aan de generateLabels ()
methode:
val detector = FirebaseVision.getInstance (). visionCloudLabelDetector
Vervolgens, zoals gewoonlijk, belt u de detectInImage ()
methode en wijs een OnCompleteListener
bijvoorbeeld naar de geretourneerde waarde.
detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable als BitmapDrawable) .bitmap)). addOnCompleteListener // Meer code hier
Deze keer heeft u binnen de luisteraar toegang tot een lijst met FirebaseVisionCloudLabel
objecten, elk met een label
eigenschap die een mogelijk label voor de afbeelding bevat. Elk label heeft ook een vertrouwen
eigenschap die hiermee is geassocieerd, en geeft aan hoezeer ML Kit over het label gaat.
De volgende code toont u hoe u door de lijst met labels loopt en een waarschuwingsdialoogvenster genereert met alleen die labels waarvan de betrouwbaarheidsscores meer dan 70% zijn.
var output = "" it.result.forEach if (it.constidence> 0.7) output + = it.label + "\ n" runOnUiThread alert (output, "Labels"). show ()
Ga je gang en voer de app opnieuw uit om te zien welke labels je app genereert voor de afbeeldingen die je ernaar gooit.
Met Firebase ML Kit wil Google machinaal leren zo toegankelijk en mainstream maken als eenvoudigere taken zoals analyse en crashmeldingen. In deze inleidende zelfstudie hebt u geleerd om met enkele van de basis-API's in Android-apps te werken. Je hebt ook geleerd hoe je zowel de cloud als de lokale modellen die het biedt, kunt gebruiken.
Raadpleeg de officiële documentatie voor meer informatie.