Backend di Product Search dell'API Call Vision su Android

1. Prima di iniziare

bd8c01b2f8013c6d.png

Hai visto la demo di Google Lens, dove puoi puntare la fotocamera del tuo telefono verso un oggetto e scoprire dove puoi acquistarlo online? Se vuoi scoprire come aggiungere la stessa funzionalità alla tua app, questo codelab fa per te. Fa parte di un percorso di apprendimento che ti insegna come integrare una funzionalità di ricerca delle immagini dei prodotti in un'app per dispositivi mobili.

In questo codelab, imparerai a chiamare un backend creato con Vision API Product Search da un'app per dispositivi mobili. Questo backend può acquisire un'immagine di query e cercare prodotti visivamente simili da un catalogo dei prodotti.

Puoi scoprire i passaggi rimanenti per la creazione di una funzionalità di ricerca visiva dei prodotti, inclusa la procedura per rilevare e monitorare gli oggetti ML Kit per rilevare gli oggetti nell'immagine query e consentire agli utenti di scegliere il prodotto che vogliono cercare nel percorso di apprendimento.

Cosa imparerai a realizzare

  • In questo codelab, inizierai con l'app Android in grado di rilevare oggetti da un'immagine di input. Scrivi il codice per acquisire l'oggetto selezionato dall'utente, inviarlo al backend di ricerca dei prodotti e visualizzare il risultato di ricerca sullo schermo.
  • Alla fine, dovresti vedere qualcosa di simile all'immagine a destra.

Cosa imparerai a fare:

  • Come chiamare e analizzare la risposta delle API Product Search dell'API Vision da un'app Android

Che cosa ti serve

  • Una versione recente di Android Studio (v4.1.2+)
  • Emulatore di Android Studio o un dispositivo Android fisico
  • Codice di esempio
  • Conoscenza di base dello sviluppo di Android in Kotlin

Questo codelab è incentrato su Product Search dell'API Vision. I concetti e i blocchi di codice non pertinenti non vengono esplorati e sono forniti come copia e incolla.

2. Informazioni sull'API Vision Product Search

Product Search dell'API Vision è una funzionalità di Google Cloud che consente agli utenti di cercare prodotti visivamente simili da un catalogo dei prodotti. I rivenditori possono creare prodotti, ciascuno contenente immagini di riferimento che descrivono visivamente il prodotto da una serie di punti di vista. Puoi quindi aggiungere questi prodotti ai set di prodotti (ad es. il catalogo dei prodotti). Attualmente l'API Vision Product Search supporta le seguenti categorie di prodotti: articoli per la casa, abbigliamento, giocattoli, beni di largo consumo e generali.

Quando gli utenti interrogano il set di prodotti con le proprie immagini, Product Search dell'API Vision applica il machine learning per confrontare il prodotto nell'immagine della query dell'utente con le immagini nel set di prodotti del rivenditore e restituisce un elenco di risultati visivamente e semanticamente simili.

3. Scarica ed esegui l'app iniziale

Scarica il codice

Fai clic sul seguente link per scaricare tutto il codice di questo codelab:

Apri il file ZIP scaricato. Verrà aperta una cartella principale (odml-pathways-main) che conterrà tutte le risorse necessarie. Per questo codelab, avrai bisogno solo delle origini nella sottodirectory product-search/codelab2/android.

La sottodirectory codelab2 nel repository odml-pathways contiene due directory:

  • cartella_studio_android.pngstarter: il codice di avvio sulla quale crei questo codelab.
  • cartella_studio_android.pngfinal: è stato completato il codice per l'app di esempio terminata.

L'app iniziale è quella che hai creato nel codelab su Rilevamento di oggetti nelle immagini per creare una ricerca visiva del prodotto: Android. Utilizza il rilevamento e il monitoraggio degli oggetti ML Kit per rilevare oggetti da un'immagine e mostrarli sullo schermo.

Importare l'app in Android Studio

Innanzitutto importa l'app starter in Android Studio.

Vai ad Android Studio, seleziona Import Project (Gradle, Eclipse ADT, etc.) e scegli la cartella starter dal codice sorgente che hai scaricato in precedenza.

7c0f27882a2698ac.png

Esegui l'app iniziale

Ora che hai importato il progetto in Android Studio, puoi eseguire l'app per la prima volta. Collega il dispositivo Android tramite USB all'host o Avvia l'emulatore Android Studio, quindi fai clic su Esegui (esegui.png) nella barra degli strumenti di Android Studio.

(Se questo pulsante non è attivo, assicurati di importare solo starter/app/build.gradle, non l'intero repository.)

Ora l'app dovrebbe essere stata avviata sul tuo dispositivo Android. Dispone già della funzionalità di rilevamento degli oggetti: rileva gli articoli di moda dall'immagine e ti mostra dove si trovano. Per confermare, prova a utilizzare le foto preimpostate.

c6102a808fdfcb11.png

Screenshot dell'app in grado di rilevare oggetti in un'immagine

Successivamente, amplierai l'app per inviare gli oggetti rilevati al backend di Product Search dell'API Vision e vedrai i risultati di ricerca sullo schermo.

4. Gestisci la selezione di oggetti

Consenti agli utenti di toccare un oggetto rilevato da selezionare

Ora aggiungerai codice per consentire agli utenti di selezionare un oggetto dall'immagine e iniziare la ricerca dei prodotti. L'app di avvio ha già la capacità di rilevare gli oggetti nell'immagine. È possibile che l'immagine contenga più oggetti o che l'oggetto rilevato occupa solo una piccola parte dell'immagine. Pertanto, è necessario che l'utente tocchi uno degli oggetti rilevati per indicare quale oggetto vuole utilizzare per la ricerca dei prodotti.

9cdfcead6d95a87.png

Uno screenshot degli articoli di moda rilevati dall'immagine

Per mantenere il codelab semplice e incentrato sul machine learning, è stato implementato un codice Android standard nell'app di avvio per aiutarti a rilevare quale oggetto ha toccato l'utente. La visualizzazione che mostra l'immagine nell'attività principale (ObjectDetectorActivity) è in realtà una visualizzazione personalizzata (ImageClickableView) che estende la ImageView predefinita del sistema operativo Android. Implementa alcuni metodi di utilità pratici, tra cui:

  • fun setOnObjectClickListener(listener: ((objectImage: Bitmap) -> Unit)) Si tratta di un callback per ricevere l'immagine ritagliata che contiene solo l'oggetto che l'utente ha toccato. L'immagine ritagliata verrà inviata al backend di ricerca dei prodotti.

Aggiungi codice per gestire un utente che tocca gli oggetti rilevati.

Vai al metodo initViews nella classe ObjectDetectorActivity e aggiungi le seguenti righe alla fine del metodo: (Android Studio ti dirà che non riesce a trovare il metodo startProductImageSearch). Non preoccuparti, lo implementerai un po' più tardi.

// Callback received when the user taps on any of the detected objects.
ivPreview.setOnObjectClickListener { objectImage ->
    startProductImageSearch(objectImage)
}

onObjectClickListener viene chiamato ogni volta che l'utente tocca uno degli oggetti rilevati sullo schermo. Riceve l'immagine ritagliata che contiene solo l'oggetto selezionato. Ad esempio, se l'utente tocca la persona che indossa il vestito a destra, l'ascoltatore verrà attivato con objectImage come indicato di seguito.

9cac8458d0f326e6.png

Un esempio dell'immagine ritagliata trasmessa a onObjectClickListener

Invia l'immagine ritagliata all'attività di ricerca dei prodotti

Ora implementerai la logica dell'invio dell'immagine query al backend di Product Search dell'API Vision in un'attività separata (ProductSearchActivity).

Tutti i componenti dell'interfaccia utente sono stati implementati in anticipo, quindi puoi concentrarti sulla scrittura del codice per comunicare con il backend di ricerca prodotti.

25939f5a13eeb3c3.png

Uno screenshot dei componenti dell'interfaccia utente in ProductSearchActivity

Aggiungi il codice per inviare l'immagine oggetto che l'utente ha selezionato a ProductSearchActivity.

Torna ad Android Studio e aggiungi questo metodo startProductImageSearch alla classe ObjectDetectorActivity:

private fun startProductImageSearch(objectImage: Bitmap) {
    try {
        // Create file based Bitmap. We use PNG to preserve the image quality
        val savedFile = createImageFile(ProductSearchActivity.CROPPED_IMAGE_FILE_NAME)
        objectImage.compress(Bitmap.CompressFormat.PNG, 100, FileOutputStream(savedFile))

        // Start the product search activity (using Vision Product Search API.).
        startActivity(
            Intent(
                    this,
                    ProductSearchActivity::class.java
            ).apply {
                // As the size limit of a bundle is 1MB, we need to save the bitmap to a file
                // and reload it in the other activity to support large query images.
                putExtra(
                    ProductSearchActivity.REQUEST_TARGET_IMAGE_PATH,
                    savedFile.absolutePath
                )
            })
    } catch (e: Exception) {
        // IO Exception, Out Of memory ....
        Toast.makeText(this, e.message, Toast.LENGTH_SHORT).show()
        Log.e(TAG, "Error starting the product image search activity.", e)
    }
}

Lo snippet di codice esegue tre operazioni:

  • Scatta l'immagine ritagliata e la serializza in un file PNG.
  • Avvia l'elemento ProductSearchActivity per eseguire la sequenza di ricerca dei prodotti.
  • Include l'URI dell'immagine ritagliata nell'intent dell'attività di avvio, in modo che ProductSearchActivity possa recuperarla in seguito da utilizzare come immagine della query.

Ci sono alcuni aspetti da tenere presente:

  • La logica per il rilevamento di oggetti e l'esecuzione di query sul backend è stata suddivisa in due attività, in modo da rendere più semplice la comprensione del codelab. Sta a te decidere come implementarli nella tua app.
  • Devi scrivere l'immagine della query in un file e passare l'URI dell'immagine tra le attività perché l'immagine della query può superare il limite di 1 MB di un intent Android.
  • Puoi archiviare l'immagine della query in formato PNG perché è un formato senza perdita di dati.

Recupera l'immagine della query nell'attività di ricerca dei prodotti

In ProductSearchActivity, il codice per recuperare l'immagine della query e visualizzarla sullo schermo è già stato implementato nell'app iniziale.

Vai al metodo onCreate e verifica che questo codice sia già presente:

// Receive the query image and show it on the screen
intent.getStringExtra(REQUEST_TARGET_IMAGE_PATH)?.let { absolutePath ->
    viewBinding.ivQueryImage.setImageBitmap(BitmapFactory.decodeFile(absolutePath))
}

Esegui l'app

Ora fai clic su Esegui ( esegui.png) nella barra degli strumenti di Android Studio.

Al termine del caricamento dell'app, tocca le immagini preimpostate e seleziona uno degli oggetti rilevati.

Verifica che l'immagine ProductSearchActivity venga visualizzata con l'immagine che hai toccato. Il pulsante Cerca non esegue ancora alcuna operazione, ma verrà implementato successivamente.

fed40f81b8b43801.png

Dopo aver toccato uno degli oggetti rilevati, dovresti vedere una schermata simile.

5. Esplora il backend di Product Search

Crea il backend di ricerca di immagini dei prodotti

Questo codelab richiede un backend di ricerca prodotti creato con Product Search di Vision. Puoi scegliere tra due opzioni:

Opzione 1: utilizza il backend demo che è stato implementato per te

Puoi procedere con questo codelab utilizzando il backend di ricerca prodotti che Google ha già implementato per te. Il backend dimostrativo può essere replicato seguendo la guida rapida di Product Search dell'API Vision.

Opzione 2: crea il tuo backend seguendo la guida rapida di Product Search dell'API Vision

Questa opzione è consigliata a coloro che vogliono sapere nel dettaglio come creare un backend di ricerca prodotti per poterne creare uno per il proprio catalogo prodotti in un secondo momento. È necessario disporre di:

  • Un account Google Cloud con fatturazione abilitata. (Puoi utilizzare un account di prova senza costi aggiuntivi).
  • Alcune conoscenze sui concetti di Google Cloud, tra cui progetti, account di servizio e così via.

Per sapere come fare in un secondo momento, consulta il percorso di apprendimento.

Apprendi i concetti importanti

Ti imbatterai in questi concetti quando interagisci con il backend di Product Search:

  • Set di prodotti: un set di prodotti è un semplice contenitore per un gruppo di prodotti. Un catalogo dei prodotti può essere rappresentato come un set di prodotti e i relativi prodotti.
  • Prodotto: dopo aver creato un set di prodotti, puoi crearne di nuovi e aggiungerli al set.
  • Immagini di riferimento: sono immagini contenenti varie visualizzazioni dei tuoi prodotti. Le immagini di riferimento vengono utilizzate per cercare prodotti visivamente simili.
  • Cerca i prodotti: dopo aver creato il tuo set di prodotti e che questo è stato indicizzato, puoi eseguire query sul set di prodotti utilizzando l'API Cloud Vision.

Informazioni sul catalogo dei prodotti preimpostato

Il backend della demo di Product Search utilizzato in questo codelab è stato creato utilizzando Product Search dell'API Vision e un catalogo di prodotti con circa 100 scarpe e abiti eleganti. Ecco alcune immagini del catalogo:

4f1a8507b74ab178.png 79a5fc6c829eca77.png 3528c872f813826e.png

Esempi dal catalogo dei prodotti preimpostato

Chiama il backend della demo di Product Search

Puoi chiamare Product Search dell'API Vision direttamente da un'app per dispositivi mobili configurando una chiave API di Google Cloud e limitando l'accesso alla chiave API alla sola app.

Per semplificare questo codelab, è stato configurato un endpoint proxy che ti consente di accedere al backend della demo senza preoccuparti della chiave API e dell'autenticazione. L'app riceve la richiesta HTTP dall'app per dispositivi mobili, aggiunge la chiave API e inoltra la richiesta al backend di Product Search dell'API Vision. Il proxy riceve la risposta dal backend e la restituisce all'app per dispositivi mobili.

In questo codelab, utilizzerai due API di Vision API Product Search:

6. Implementare il client API

Comprendi il flusso di lavoro della ricerca di prodotti

Segui questo flusso di lavoro per eseguire ricerche dei prodotti con il backend:

Implementare la classe client API

Ora implementerai il codice per chiamare il backend di Product Search in una classe dedicata chiamata ProductSearchAPIClient. Alcuni codici boilerplate sono stati implementati per te nell'app iniziale:

  • class ProductSearchAPIClient: questa classe è attualmente vuota, ma include alcuni metodi da implementare più avanti in questo codelab.
  • fun convertBitmapToBase64(bitmap: Bitmap): converti un'istanza Bitmap nella rappresentazione Base64 da inviare al backend di Product Search
  • fun annotateImage(image: Bitmap): Task<List<ProductSearchResult>>: chiama l'API projects.locations.images.annotate e analizza la risposta.
  • fun fetchReferenceImage(searchResult: ProductSearchResult): Task<ProductSearchResult>: chiama l'API projects.locations.products.referenceImages.get e analizza la risposta.
  • SearchResult.kt: questo file contiene diverse classi di dati per rappresentare i tipi restituiti dal backend di Vision API Product Search.

Configura le configurazioni API

Vai alla classe ProductSearchAPIClient e vedrai alcune configurazioni del backend di Product Search già definite:

// Define the product search backend
// Option 1: Use the demo project that we have already deployed for you
const val VISION_API_URL =
    "https://us-central1-odml-codelabs.cloudfunctions.net/productSearch"
const val VISION_API_KEY = ""
const val VISION_API_PROJECT_ID = "odml-codelabs"
const val VISION_API_LOCATION_ID = "us-east1"
const val VISION_API_PRODUCT_SET_ID = "product_set0"
  • VISION_API_URL è l'endpoint API dell'API Cloud Vision. Per procedere con il backend demo, impostalo sull'endpoint proxy. Tuttavia, se esegui il deployment del tuo backend, dovrai modificarlo nell'endpoint dell'API Cloud Vision. https://vision.googleapis.com/v1.
  • VISION_API_KEY è la chiave API del progetto cloud. Poiché il proxy gestisce già l'autenticazione, puoi lasciare vuoto questo campo.
  • VISION_API_PROJECT_ID è l'ID progetto Cloud. odml-codelabs è il progetto Cloud in cui viene eseguito il deployment del backend demo.
  • VISION_API_LOCATION_ID è la località cloud in cui è stato eseguito il deployment del backend di ricerca prodotti. us-east1 è il luogo in cui abbiamo eseguito il deployment del backend demo.
  • VISION_API_PRODUCT_SET_ID è l'ID del catalogo dei prodotti (noto anche come "set di prodotti" nel termine dell'API Vision) in cui vuoi cercare i prodotti visivamente simili. Puoi avere più cataloghi in un progetto Cloud. product_set0 è il catalogo dei prodotti preimpostato del backend della demo.

7. Chiama l'API Product Search

Esplora il formato della richiesta e della risposta dell'API

Puoi trovare prodotti simili a una determinata immagine passando l'URI Google Cloud Storage di Google Cloud, l'URL web o la stringa codificata in Base64 a Product Search dell'API Vision. In questo codelab, utilizzerai l'opzione di stringa codificata base64, poiché la nostra immagine query esiste solo nel dispositivo dell'utente.

Devi inviare una richiesta POST all'endpoint projects.locations.images.annotate con questo corpo JSON della richiesta:

{
  "requests": [
    {
      "image": {
        "content": {base64-encoded-image}
      },
      "features": [
        {
          "type": "PRODUCT_SEARCH",
          "maxResults": 5
        }
      ],
      "imageContext": {
        "productSearchParams": {
          "productSet": "projects/{project-id}/locations/{location-id}/productSets/{product-set-id}",
          "productCategories": [
               "apparel-v2"
          ],
        }
      }
    }
  ]
}

È necessario specificare alcuni parametri:

  • base-4-encoded-image: la rappresentazione base64 (stringa ASCII) dei dati binari dell'immagine di query.
  • project-id: il tuo ID progetto GCP.
  • location-id: un identificatore di località valido.
  • product-set-id: ID del set di prodotti su cui vuoi eseguire l'operazione.

Poiché il tuo catalogo dei prodotti contiene solo immagini di scarpe e abiti, specifica il valore productCategories come apparel-v2. v2 significa che utilizziamo la versione 2 del modello di machine learning per la ricerca di prodotti di abbigliamento.

Se la richiesta ha esito positivo, il server restituisce un codice di stato HTTP 200 OK e la risposta in formato JSON. Il file JSON della risposta include i due tipi di risultati che seguono:

  • productSearchResults: contiene un elenco di prodotti corrispondenti per l'intera immagine.
  • productGroupedResults: contiene le coordinate del riquadro di delimitazione e gli elementi corrispondenti per ogni prodotto identificato nell'immagine.

Poiché il prodotto è già stato ritagliato dall'immagine originale, analizzi i risultati nell'elenco productSearchResults.

Ecco alcuni campi importanti nell'oggetto dei risultati di ricerca:

  • product.name: l'identificatore univoco di un prodotto nel formato projects/{project-id}/locations/{location-id}/products/{product_id}
  • product.score: valore che indica quanto il risultato di ricerca è simile all'immagine della query. Valori più alti indicano una maggiore somiglianza.
  • product.image: l'identificatore univoco dell'immagine di riferimento di un prodotto nel formato projects/{project-id}/locations/{location-id}/products/{product_id}/referenceImages/{image_id}. Dovrai inviare un'altra richiesta API a projects.locations.products.referenceImages.get per ottenere l'URL di questa immagine di riferimento in modo che venga visualizzata sullo schermo.
  • product.labels: un elenco di tag predefiniti del prodotto. Ciò è utile se vuoi filtrare i risultati di ricerca per visualizzare solo una categoria di abbigliamento, come gli abiti.

Converti l'immagine della query in base64

Devi convertire l'immagine della query nella rappresentazione della stringa base64 e collegarla al corpo JSON della richiesta.

Vai al corso ProductSearchAPIClient, trova il metodo convertBitmapToBase64 vuoto e sostituiscilo con questa implementazione:

private fun convertBitmapToBase64(bitmap: Bitmap): String {
    val byteArrayOutputStream = ByteArrayOutputStream()
    bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream)
    val byteArray: ByteArray = byteArrayOutputStream.toByteArray()
    return Base64.encodeToString(byteArray, Base64.DEFAULT)
}

Implementare la chiamata API

Quindi, crea una richiesta API Product Search e inviala al backend. Userai Volley per effettuare la richiesta API e restituire il risultato utilizzando l'API Tasks.

Torna al corso ProductSearchAPIClient, trova il metodo annotateImage vuoto e sostituiscilo con questa implementazione:

fun annotateImage(image: Bitmap): Task<List<ProductSearchResult>> {
    // Initialization to use the Task API
    val apiSource = TaskCompletionSource<List<ProductSearchResult>>()
    val apiTask = apiSource.task

    // Convert the query image to its Base64 representation to call the Product Search API.
    val base64: String = convertBitmapToBase64(image)

    // Craft the request body JSON.
    val requestJson = """
        {
          "requests": [
            {
              "image": {
                "content": """".trimIndent() + base64 + """"
              },
              "features": [
                {
                  "type": "PRODUCT_SEARCH",
                  "maxResults": $VISION_API_PRODUCT_MAX_RESULT
                }
              ],
              "imageContext": {
                "productSearchParams": {
                  "productSet": "projects/${VISION_API_PROJECT_ID}/locations/${VISION_API_LOCATION_ID}/productSets/${VISION_API_PRODUCT_SET_ID}",
                  "productCategories": [
                       "apparel-v2"
                     ]
                }
              }
            }
          ]
        }
    """.trimIndent()

    // Add a new request to the queue
    requestQueue.add(object :
        JsonObjectRequest(
            Method.POST,
            "$VISION_API_URL/images:annotate?key=$VISION_API_KEY",
            JSONObject(requestJson),
            { response ->
                // Parse the API JSON response to a list of ProductSearchResult object/
                val productList = apiResponseToObject(response)

                // Return the list.
                apiSource.setResult(productList)
            },
            // Return the error
            { error -> apiSource.setException(error) }
        ) {
        override fun getBodyContentType() = "application/json"
    }.apply {
        setShouldCache(false)
    })

    return apiTask
}

Mostrare il risultato di ricerca nell'interfaccia utente

Il codice API in ProductSearchAPIClient è pronto. Torna all'attività ProductSearchActivity per implementare il codice dell'interfaccia utente.

L'attività ha già del codice boilerplate che attiva il metodo searchByImage(queryImage: Bitmap). Aggiungi codice per chiamare il backend e mostrare i risultati sulla UI in questo metodo attualmente vuoto.

apiClient.annotateImage(queryImage)
    .addOnSuccessListener { showSearchResult(it) }
    .addOnFailureListener { error ->
        Log.e(TAG, "Error calling Vision API Product Search.", error)
        showErrorResponse(error.localizedMessage)
    }

Il metodo showSearchResult contiene del codice boilerplate che analizza la risposta dell'API e li mostra sullo schermo.

Esegui

Ora fai clic su Esegui (esegui.png) nella barra degli strumenti di Android Studio. Dopo il caricamento dell'app, tocca le immagini preimpostate, seleziona un oggetto rilevato, tocca il pulsante Cerca e visualizza i risultati restituiti dal backend. Verrà visualizzata un'intestazione simile alla seguente:

bb5e7c27c283a2fe.png

Screenshot della schermata dei risultati di ricerca dei prodotti

Il backend restituisce già un elenco di prodotti visivamente simili dal catalogo dei prodotti preimpostato. Tuttavia, puoi vedere che l'immagine del prodotto è ancora vuota. Questo perché l'endpoint projects.locations.images.annotate restituisce solo ID immagine del prodotto come projects/odml-codelabs/locations/us-east1/products/product_id77/referenceImages/image77. Dovrai effettuare un'altra chiamata API all'endpoint projects.locations.products.referenceImages.get e recuperare l'URL di questa immagine di riferimento per mostrarla sullo schermo.

8. Acquisire le immagini di riferimento del prodotto

Esplora il formato della richiesta e della risposta dell'API

Invia una richiesta HTTP GET con un corpo della richiesta vuoto all'endpoint projects.locations.products.referenceImages.get per recuperare gli URI delle immagini del prodotto restituite dall'endpoint di ricerca.

La richiesta HTTP ha il seguente aspetto:

GET $VISION_API_URL/projects/odml-codelabs/locations/us-east1/products/product_id77/referenceImages/image77?key=$VISION_API_KEY

Se la richiesta ha esito positivo, il server restituisce un codice di stato HTTP 200 OK e la risposta in formato JSON come segue:

{
  "name":"projects/odml-codelabs/locations/us-east1/products/product_id77/referenceImages/image77",
  "uri":"gs://cloud-ai-vision-data/product-search-tutorial/images/46991e7370ba11e8a1bbd20059124800.jpg"
}
  • name: l'identificatore dell'immagine di riferimento
  • uri: l'URI dell'immagine su Google Cloud Storage (GCS).

Le immagini di riferimento del backend di ricerca demo del prodotto sono state configurate in modo da disporre dell'autorizzazione di lettura pubblica. Pertanto, puoi convertire facilmente l'URI GCS in un URL HTTP e visualizzarlo nell'interfaccia utente dell'app. Devi solo sostituire il prefisso gs:// con https://storage.googleapis.com/.

Implementare la chiamata API

Quindi, crea una richiesta API Product Search e inviala al backend. Userai Volley e l'API Task in modo simile alla chiamata API Product Search.

Torna al corso ProductSearchAPIClient, trova il metodo fetchReferenceImage vuoto e sostituiscilo con questa implementazione:

private fun fetchReferenceImage(searchResult: ProductSearchResult): Task<ProductSearchResult> {
    // Initialization to use the Task API
    val apiSource = TaskCompletionSource<ProductSearchResult>()
    val apiTask = apiSource.task

    // Craft the API request to get details about the reference image of the product
    val stringRequest = object : StringRequest(
        Method.GET,
        "$VISION_API_URL/${searchResult.imageId}?key=$VISION_API_KEY",
        { response ->
            val responseJson = JSONObject(response)
            val gcsUri = responseJson.getString("uri")

            // Convert the GCS URL to its HTTPS representation
            val httpUri = gcsUri.replace("gs://", "https://storage.googleapis.com/")

            // Save the HTTPS URL to the search result object
            searchResult.imageUri = httpUri

            // Invoke the listener to continue with processing the API response (eg. show on UI)
            apiSource.setResult(searchResult)
        },
        { error -> apiSource.setException(error) }
    ) {

        override fun getBodyContentType(): String {
            return "application/json; charset=utf-8"
        }
    }
    Log.d(ProductSearchActivity.TAG, "Sending API request.")

    // Add the request to the RequestQueue.
    requestQueue.add(stringRequest)

    return apiTask
}

Questo metodo prevede un oggetto searchResult: ProductSearchResult restituito dall'endpoint di ricerca dei prodotti e la seguente procedura:

  1. Chiama l'endpoint dell'immagine di riferimento per ottenere l'URI GCS dell'immagine di riferimento.
  2. Converte l'URI GCS in un URL HTTP.
  3. Aggiorna la proprietà httpUri dell'oggetto searchResult con questo URL HTTP.

Collega le due richieste API

Torna a annotateImage e modificalo per ottenere tutte le immagini HTTP di riferimento prima di restituire l'elenco ProductSearchResult al chiamante.

Trova questa riga:

// Return the list.
apiSource.setResult(productList)

Quindi sostituiscila con questa implementazione:

// Loop through the product list and create tasks to load reference images.
// We will call the projects.locations.products.referenceImages.get endpoint
// for each product.
val fetchReferenceImageTasks = productList.map { fetchReferenceImage(it) }

// When all reference image fetches have completed,
// return the ProductSearchResult list
Tasks.whenAllComplete(fetchReferenceImageTasks)
    // Return the list of ProductSearchResult with product images' HTTP URLs.
    .addOnSuccessListener { apiSource.setResult(productList) }
    // An error occurred so returns it to the caller.
    .addOnFailureListener { apiSource.setException(it) }

Il codice boilerplate per visualizzare le immagini di riferimento sullo schermo è già implementato nel corso dell'app ProductSearchAdapter, quindi puoi eseguire nuovamente l'app.

Esegui

Ora fai clic su Esegui ( esegui.png) nella barra degli strumenti di Android Studio. Una volta caricata l'app, tocca le immagini preimpostate, seleziona un oggetto rilevato e tocca il pulsante Cerca per visualizzare i risultati della ricerca, questa volta con le immagini del prodotto.

I risultati della ricerca di prodotto sono significativi?

25939f5a13eeb3c3.png

9. Complimenti!

Hai imparato a chiamare un backend di Product Search dell'API Vision per aggiungere la funzionalità di ricerca immagini del prodotto alla tua app Android. È tutto ciò che ti serve per iniziare a lavorare.

Mentre procedi, puoi creare il tuo backend con il catalogo dei tuoi prodotti. Dai un'occhiata al codelab successivo nel percorso di apprendimento Product Image Search per scoprire come creare il tuo backend e configurare la chiave API per chiamarla da un'app per dispositivi mobili.

Cosa abbiamo trattato

  • Come chiamare il backend di Product Search dell'API Vision da un'app Android

Passaggi successivi

Scopri di più