Grazie a TensorFlow Mobile e TensorFlow Lite, l'incorporamento e l'utilizzo di modelli profondi all'interno di applicazioni Android è diventato molto semplice. Tuttavia, progettare e addestrare i modelli richiede ancora un sacco di abilità, tempo e impegno, per non parlare della potenza di calcolo. Per questo motivo, molti sviluppatori occasionali non sono entusiasti di aggiungere funzionalità di apprendimento automatico alle proprie app. Con il kit Firebase ML, Google spera di cambiarlo.
Firebase ML Kit è una libreria che ti consente di utilizzare facilmente e con un codice minimo una varietà di modelli profondi precisi e altamente precisi nelle tue app Android. La maggior parte dei modelli che offre sono disponibili sia a livello locale che su Google Cloud.
Attualmente, i modelli sono limitati solo alle attività legate alla visione del computer, come il riconoscimento ottico dei caratteri, la scansione dei codici a barre e il rilevamento degli oggetti.
In questo tutorial, ti mostrerò come aggiungere Firebase ML Kit a un progetto Android Studio e utilizzare alcune delle sue API di base.
Prima di procedere, assicurati di avere accesso a quanto segue:
Per abilitare i servizi Firebase per la tua app, devi creare un progetto Firebase per essa. Quindi accedi alla console Firebase e, nella schermata di benvenuto, premi il pulsante Aggiungi progetto pulsante.
Nella finestra di dialogo che si apre, dai al progetto un nome facile da ricordare e premi il tasto Crea un progetto pulsante.
Dopo alcuni secondi, dovresti vedere una notifica che ti informa che il nuovo progetto è pronto. premi il Continua pulsante per procedere.
Nella schermata successiva, vai al Sviluppare sezione e fare clic sul Kit ML link per vedere tutti i servizi offerti dal kit ML.
In questo tutorial, utilizzeremo tre servizi: riconoscimento del testo, rilevamento dei volti e etichettatura delle immagini. Non è necessario prendere provvedimenti per abilitarli esplicitamente se si intende lavorare solo con i modelli locali forniti con ML Kit. In questo tutorial, però, utilizzeremo sia i modelli locali che quelli basati su cloud. Quindi clicca sul Utilizzo dell'API cloud link successivo.
Verrai indirizzato alla console di Google Cloud, dove puoi semplicemente premere il tasto Abilitare pulsante mostrato nella sezione API di Cloud Vision per attivare i modelli basati su cloud. Nota, tuttavia, che ciò funzionerà solo se la fatturazione è abilitata per il tuo account Google Cloud.
Prima di iniziare a utilizzare le API del kit Firebase ML, è necessario stabilire una connessione tra il progetto Android Studio e il progetto Firebase creato nel passaggio precedente. Per fare ciò, apri il pannello Assistente Firebase andando a Strumenti> Firebase.
L'Assistente Firebase non ha attualmente alcun supporto per ML Kit. Tuttavia, utilizzandolo per aggiungere Firebase Analytics, è comunque possibile evitare di stabilire manualmente la connessione. Pertanto, espandere il analitica sezione, fare clic su Registra un evento di Analytics collegamento e premere il Connetti a Firebase pulsante.
Nella finestra di dialogo che si apre, assicurati di selezionare il Scegli un progetto Firebase o Google esistente opzione e scegli il progetto Firebase che hai creato.
premi il Connetti a Firebase pulsante successivo. A questo punto, l'Assistente scaricherà automaticamente a google-services.json file, contenente le chiavi API e gli ID progetto e aggiungerlo al App
modulo.
Dopo che la connessione è stata stabilita correttamente, assicurati di aver premuto il tasto Aggiungi Analytics alla tua app pulsante per aggiungere varie dipendenze core Firebase al tuo App
modulo di build.gradle file.
Quindi, per aggiungere effettivamente la libreria ML Kit, apri il build.gradle file e digitare quanto segue implementazione
dipendenze:
implementazione 'com.google.firebase: firebase-ml-vision: 16.0.0' implementazione 'com.google.firebase: firebase-ml-vision-image-label-model: 15.0.0'
Per semplificare il processo di download delle immagini da Internet e visualizzarle nella tua app, ti suggerisco di aggiungere anche una dipendenza per la libreria Picasso.
implementazione 'com.squareup.picasso: picasso: 2.5.2'
Inoltre, aggiungi Anko come dipendenza per assicurarti che il tuo codice Kotlin sia conciso e intuitivo.
implementazione 'org.jetbrains.anko: anko-commons: 0.10.5'
Per impostazione predefinita, i modelli locali di Firebase ML Kit vengono automaticamente scaricati sui dispositivi degli utenti solo quando necessario. Se si desidera che vengano scaricati non appena viene installata l'app, tuttavia, aggiungere il seguente codice al file AndroidManifest.xml file:
In questa esercitazione creeremo un'app che consente agli utenti di digitare URL di immagini ed eseguire operazioni di riconoscimento del testo, rilevamento volti e etichettatura delle immagini su di essi. Pertanto, il layout dell'app deve avere un Modifica il testo
widget, in cui gli utenti possono digitare gli URL e tre Pulsante
widget, che consentono loro di scegliere l'operazione che vogliono eseguire.
Facoltativamente, puoi includere un ImageView
widget per visualizzare le immagini.
Se posizioni tutti i widget di cui sopra utilizzando a RelativeLayout
widget, il tuo file XML di layout dovrebbe essere così:
Ecco una rappresentazione più visiva del layout:
Nell'XML sopra, potresti aver notato che ogni pulsante ha un al clic
attributo che punta a un metodo di gestione eventi su clic. Questi metodi non esistono ancora, quindi creali ora all'interno della tua attività.
divertimento recognitiveText (v: View) // To do fun detectFaces (v: View) // To do fun generateLabels (v: View) // To do
Quando l'utente preme il Fatto chiave dopo aver digitato l'URL di un'immagine nel file Modifica il testo
widget, la nostra app deve scaricare l'immagine e visualizzarla all'interno del ImageView
widget di.
Per rilevare azioni eseguite sulla tastiera virtuale dell'utente, associare un OnEditorActionListener
oggetto con il Modifica il testo
widget di. All'interno dell'ascoltatore, dopo aver confermato che il IME_ACTION_DONE
l'azione è stata eseguita, puoi semplicemente chiamare Picasso caricare()
e in()
metodi per caricare e visualizzare l'immagine rispettivamente.
Di conseguenza, aggiungi il seguente codice all'interno di onCreate ()
metodo della tua attività:
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 ha classi di rivelatore separate per tutte le varie operazioni di riconoscimento delle immagini che offre. Per riconoscere il testo, è necessario utilizzare il FirebaseVisionTextDetector
classe, che dipende da un modello locale, o usa il FirebaseVisionCloudTextDetector
classe, che dipende da un modello basato su cloud. Per ora, usiamo il primo. È molto più veloce, ma può gestire solo il testo scritto nell'alfabeto latino.
Un rilevatore ML Kit si aspetta che il suo input sia sotto forma di a FirebaseVisionImage
oggetto. Per creare un tale oggetto, tutto ciò che devi fare è chiamare il fromBitmap ()
metodo di utilità del FirebaseVisionImage
classe e passare una bitmap ad esso. Il seguente codice, che deve essere aggiunto al recognizeText ()
gestore di eventi che abbiamo creato in precedenza, mostra come convertire l'immagine che viene visualizzata nel layout ImageView
widget in una bitmap e quindi creare a FirebaseVisionImage
oggetto fuori di esso:
val textImage = FirebaseVisionImage.fromBitmap ((image_holder.drawable as BitmapDrawable) .bitmap)
Quindi, per ottenere un riferimento a a FirebaseVisionTextDetector
oggetto, è necessario utilizzare a FirebaseVision
esempio.
val detector = FirebaseVision.getInstance (). visionTextDetector
È ora possibile avviare il processo di riconoscimento del testo chiamando il detectInImage ()
metodo e passando il FirebaseVisionImage
obiettare ad esso. Poiché il metodo viene eseguito in modo asincrono, restituisce a Compito
oggetto. Di conseguenza, per essere in grado di elaborare il risultato quando è disponibile, è necessario allegare un OnCompleteListener
istanza ad esso. Ecco come:
detector.detectInImage (textImage) .addOnCompleteListener // Altro codice qui
All'interno dell'ascoltatore, avrai accesso a un elenco di Bloccare
oggetti. In generale, ogni blocco può essere pensato come un paragrafo separato rilevato nell'immagine. Dando un'occhiata al testo
proprietà di tutto il Bloccare
oggetti, è possibile determinare tutto il testo che è stato rilevato. Il seguente codice mostra come farlo:
var detectedText = "" it.result.blocks.forEach detectedText + = it.text + "\ n"
Il modo in cui utilizzi il testo rilevato dipende naturalmente da te. Per ora, mostriamolo usando una finestra di avviso. Grazie ad Anko's mettere in guardia()
funzione, questo richiede pochissimo codice.
runOnUiThread alert (detectedText, "Text"). show ()
Nel codice sopra, il runOnUiThread ()
metodo assicura che il mettere in guardia()
la funzione viene eseguita sul thread principale dell'applicazione.
Infine, una volta che hai finito di usare il rilevatore, devi ricordarti di chiamarlo vicino()
metodo per rilasciare tutte le risorse che contiene.
detector.close ()
Se esegui l'app ora, digita l'URL di un'immagine contenente molto testo e premi il tasto Testo pulsante, dovresti essere in grado di vedere il servizio di riconoscimento del testo di ML Kit in azione.
Il modello locale di ML Kit per il riconoscimento del testo è ragionevolmente accurato con la maggior parte dei tipi di testo stampato.
Anche se non condividono alcuna interfaccia comune di alto livello, la maggior parte delle classi di rivelatori ha metodi identici. Ciò significa che rilevare i volti in un'immagine non è troppo diverso dal riconoscere il testo. Tuttavia, si noti che ML Kit attualmente offre solo un modello locale per il rilevamento dei volti, a cui si può accedere usando il FirebaseVisionFaceDetector
classe. È possibile ottenere un riferimento a un'istanza di esso utilizzando il FirebaseVision
classe.
Aggiungi il seguente codice al detectFaces ()
metodo:
val detector = FirebaseVision.getInstance (). visionFaceDetector
Chiamando il detectInImage ()
di nuovo e passando una bitmap, è possibile avviare il processo di rilevamento dei volti in modo asincrono. Usando un OnCompleteListener
istanza allegata al Compito
oggetto restituisce, è possibile sapere facilmente quando il processo è completo.
detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable as BitmapDrawable) .bitmap)). addOnCompleteListener // Altro codice qui
All'interno dell'ascoltatore, avrai accesso a un elenco di FirebaseVisionFace
oggetti, che contengono le coordinate dei rettangoli che circoscrivono le facce rilevate. Ora disegniamo quei rettangoli su una copia dell'immagine originale che è stata elaborata.
Per creare una copia della bitmap dell'immagine originale, è necessario utilizzarne la copia()
metodo come mostrato di seguito:
var markedBitmap = (image_holder.drawable as BitmapDrawable) .bitmap .copy (Bitmap.Config.ARGB_8888, true)
Successivamente, per essere in grado di disegnare sulla nuova bitmap, è necessario creare Tela
e Dipingere
oggetti per questo. L'uso di un colore leggermente trasparente per i rettangoli sarebbe l'ideale.
val canvas = Canvas (markedBitmap) val paint = Paint (Paint.ANTI_ALIAS_FLAG) paint.color = Color.parseColor ("# 99003399") // semitrasparente blu
A questo punto, puoi semplicemente scorrere l'elenco di FirebaseVisionFace
oggetti e usa i loro rettangolo di selezione
proprietà per disegnare rettangoli sulle facce rilevate.
it.result.forOgni canvas.drawRect (it.boundingBox, paint)
Infine, non dimenticare di passare la nuova bitmap al ImageView
widget una volta pronto.
runOnUiThread image_holder.setImageBitmap (markedBitmap)
Se esegui l'app ora, dovresti essere in grado di eseguire il rilevamento del volto su qualsiasi immagine che contiene persone.
Sono certo che rimarrai colpito dalla rapidità e precisione delle operazioni di rilevamento del volto di ML Kit.
Per generare etichette per un'immagine, è necessario utilizzare il modello locale FirebaseVisionLabelDetector
classe o basato sul modello cloud FirebaseVisionCloudLabelDetector
classe. Poiché in questo tutorial abbiamo utilizzato solo modelli locali, ora utilizziamo il modello cloud. Per ottenere un riferimento a un'istanza di FirebaseVisionCloudLabelDetector
classe, è necessario utilizzare nuovamente il FirebaseVision
classe.
Aggiungi il seguente codice al generateLabels ()
metodo:
val detector = FirebaseVision.getInstance (). visionCloudLabelDetector
Successivamente, come al solito, chiama il detectInImage ()
metodo e assegnare un OnCompleteListener
istanza al suo valore di ritorno.
detector.detectInImage (FirebaseVisionImage.fromBitmap ((image_holder.drawable as BitmapDrawable) .bitmap)). addOnCompleteListener // Altro codice qui
Questa volta, all'interno del listener, avrai accesso a un elenco di FirebaseVisionCloudLabel
oggetti, ognuno dei quali ha un etichetta
proprietà contenente un'etichetta potenziale per l'immagine. Ogni etichetta ha anche un fiducia
proprietà associate, specificando in che modo ML Kit riguarda l'etichetta.
Il codice seguente mostra come scorrere l'elenco delle etichette e generare una finestra di avviso che mostra solo le etichette i cui punteggi di confidenza sono superiori al 70%.
var output = "" it.result.forEach if (it.confidence> 0.7) output + = it.label + "\ n" runOnUiThread alert (output, "Labels"). show ()
Vai avanti e avvia l'app di nuovo per vedere quali etichette genera la tua app per le immagini che passi.
Con il kit Firebase ML, Google vuole rendere l'apprendimento automatico accessibile e mainstream come attività più semplici come l'analisi e la segnalazione degli arresti anomali. In questo tutorial introduttivo, hai imparato come lavorare con alcune delle sue API di base nelle app Android. Hai anche imparato a utilizzare sia il cloud che i modelli locali che offre.
Per saperne di più, fare riferimento alla documentazione ufficiale.