Maison Java javaDidacticiel Recherche de produits basée sur des images à l'aide de Spring Boot, Google Cloud Vertex AI et Gemini Model

Recherche de produits basée sur des images à l'aide de Spring Boot, Google Cloud Vertex AI et Gemini Model

Aug 14, 2024 am 10:35 AM

Introduction

Imaginez que vous faites des achats en ligne et que vous tombez sur un produit que vous aimez mais dont vous ne connaissez pas le nom. Ne serait-il pas génial de télécharger une photo et que l'application la trouve pour vous ?

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Dans cet article, nous allons vous montrer comment créer exactement cela : une fonctionnalité de recherche de produits basée sur des images à l'aide de Spring Boot et de Google Cloud Vertex AI.

Présentation de la fonctionnalité

Cette fonctionnalité permet aux utilisateurs de télécharger une image et de recevoir une liste de produits qui lui correspondent, ce qui rend l'expérience de recherche plus intuitive et visuelle.

La fonctionnalité de recherche de produits basée sur des images exploite Google Cloud Vertex AI pour traiter les images et extraire des mots-clés pertinents. Ces mots-clés sont ensuite utilisés pour rechercher les produits correspondants dans la base de données.

Pile technologique

  • Java 21
  • Botte à ressort 3.2.5
  • PostgreSQL
  • Vertex AI
  • ReactJS

Nous allons parcourir le processus de configuration de cette fonctionnalité étape par étape.

Mise en œuvre étape par étape

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

1. Créez un nouveau projet sur Google Console

Tout d'abord, nous devons créer un nouveau projet sur Google Console pour cela.

Nous devons aller sur https://console.cloud.google.com et créer un nouveau compte si vous en avez déjà un. Si vous en avez un, connectez-vous au compte.

Si vous ajoutez votre compte bancaire, Google Cloud vous proposera un essai gratuit.

Une fois que vous avez créé un compte ou connecté à un compte déjà existant, vous pouvez créer un nouveau projet.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

2. Activer le service Vertex AI

Dans la barre de recherche, nous devons trouver Vertex AI et activer toutes les API recommandées.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Vertex AI est la plate-forme de machine learning (ML) entièrement gérée de Google Cloud, conçue pour simplifier le développement, le déploiement et la gestion des modèles de ML. Il vous permet de créer, former et déployer des modèles ML à grande échelle en fournissant des outils et des services tels qu'AutoML, la formation de modèles personnalisés, le réglage des hyperparamètres et la surveillance des modèles

Gemini 1.5 Flash fait partie de la famille de modèles Gemini de Google, spécialement conçus pour une inférence efficace et hautes performances dans les applications ML. Les modèles Gemini sont une série de modèles d'IA avancés développés par Google, souvent utilisés dans le traitement du langage naturel (NLP), les tâches de vision et d'autres applications basées sur l'IA

Remarque : Pour les autres frameworks, vous pouvez utiliser l'API Gemini directement sur https://aistudio.google.com/app/prompts/new_chat. Utilisez la fonction d'invite de structure car vous pouvez personnaliser votre sortie pour qu'elle corresponde à l'entrée afin d'obtenir de meilleurs résultats.

3. Créez une nouvelle invite qui correspond à votre application

À cette étape, nous devons personnaliser une invite correspondant à votre candidature.

Vertex AI Studio a fourni de nombreux exemples d'invites dans la Galerie d'invites. Nous utilisons un exemple de Texte de l'image en JSON pour extraire les mots-clés liés à l'image du produit.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Mon application est un CarShop, je crée donc une invite comme celle-ci. Mon attente que le modèle me réponde avec une liste de mots clés relatifs à l'image.

Mon invite : Extrayez le nom de la voiture dans un mot-clé de liste et affichez-le en JSON. Si vous ne trouvez aucune information sur la voiture, veuillez afficher la liste vide. Exemple de réponse : ["rolls", "royce", "wraith"]

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Après avoir personnalisé une invite appropriée avec votre application. Maintenant, nous allons explorer comment intégrer l'application Spring Boot.

4. Intégrer à l'application Spring Boot

J'ai créé une application E-commerce sur les voitures. Je veux donc trouver des voitures par l'image.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Tout d'abord, dans le fichier pom.xml, vous devez mettre à jour votre dépendance :

<!-- config version for dependency-->
<properties>
    <spring-cloud-gcp.version>5.1.2</spring-cloud-gcp.version>
    <google-cloud-bom.version>26.32.0</google-cloud-bom.version>
</properties>

<!-- In your dependencyManagement, please add 2 dependencies below -->
<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>spring-cloud-gcp-dependencies</artifactId>
          <version>${spring-cloud-gcp.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>

      <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>libraries-bom</artifactId>
          <version>${google-cloud-bom.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
  </dependencies>
</dependencyManagement>

<!-- In your tab dependencies, please add the dependency below -->
<dependencies>
  <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
  </dependency>
</dependencies>
Copier après la connexion

Après avoir effectué la configuration dans le fichier pom.xml, vous créez une classe de configuration GeminiConfig.java

  • MODEL_NAME : « gemini-1.5-flash »
  • LOCALISATION : « Votre localisation lors du montage du projet »
  • PROJECT_ID : « votre identifiant de projet »

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

import com.google.cloud.vertexai.VertexAI;
import com.google.cloud.vertexai.generativeai.GenerativeModel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration(proxyBeanMethods = false)
public class GeminiConfig {

    private static final String MODEL_NAME = "gemini-1.5-flash";
    private static final String LOCATION = "asia-southeast1";
    private static final String PROJECT_ID = "yasmini";

    @Bean
    public VertexAI vertexAI() {
        return new VertexAI(PROJECT_ID, LOCATION);
    }

    @Bean
    public GenerativeModel getModel(VertexAI vertexAI) {
        return new GenerativeModel(MODEL_NAME, vertexAI);
    }
}
Copier après la connexion

Deuxièmement, créez les couches Service, Contrôleur pour implémenter la fonction de recherche de voiture. Créez un service de classe.

Étant donné que l'API Gemini répond au format markdown, nous devons créer une fonction pour aider à la conversion en JSON, et à partir de JSON, nous convertirons en chaîne de liste en Java.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.cloud.vertexai.api.Content;
import com.google.cloud.vertexai.api.GenerateContentResponse;
import com.google.cloud.vertexai.api.Part;
import com.google.cloud.vertexai.generativeai.*;
import com.learning.yasminishop.common.entity.Product;
import com.learning.yasminishop.common.exception.AppException;
import com.learning.yasminishop.common.exception.ErrorCode;
import com.learning.yasminishop.product.ProductRepository;
import com.learning.yasminishop.product.dto.response.ProductResponse;
import com.learning.yasminishop.product.mapper.ProductMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;

@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class YasMiniAIService {

    private final GenerativeModel generativeModel;
    private final ProductRepository productRepository;

    private final ProductMapper productMapper;


    public List<ProductResponse> findCarByImage(MultipartFile file){
        try {
            var prompt = "Extract the name car to a list keyword and output them in JSON. If you don't find any information about the car, please output the list empty.\nExample response: [\"rolls\", \"royce\", \"wraith\"]";
            var content = this.generativeModel.generateContent(
                    ContentMaker.fromMultiModalData(
                            PartMaker.fromMimeTypeAndData(Objects.requireNonNull(file.getContentType()), file.getBytes()),
                            prompt
                    )
            );

            String jsonContent = ResponseHandler.getText(content);
            log.info("Extracted keywords from image: {}", jsonContent);
            List<String> keywords = convertJsonToList(jsonContent).stream()
                    .map(String::toLowerCase)
                    .toList();

            Set<Product> results = new HashSet<>();
            for (String keyword : keywords) {
                List<Product> products = productRepository.searchByKeyword(keyword);
                results.addAll(products);
            }

            return results.stream()
                    .map(productMapper::toProductResponse)
                    .toList();

        } catch (Exception e) {
            log.error("Error finding car by image", e);
            return List.of();
        }
    }

    private List<String> convertJsonToList(String markdown) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        String parseJson = markdown;
        if(markdown.contains("```

json")){
            parseJson = extractJsonFromMarkdown(markdown);
        }
        return objectMapper.readValue(parseJson, List.class);
    }

    private String extractJsonFromMarkdown(String markdown) {
        return markdown.replace("

```json\n", "").replace("\n```

", "");
    }
}


Copier après la connexion

Nous devons créer une classe de contrôleur pour créer un point de terminaison pour le front-end


import com.learning.yasminishop.product.dto.response.ProductResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequestMapping("/ai")
@RequiredArgsConstructor
@Slf4j
public class YasMiniAIController {

    private final YasMiniAIService yasMiniAIService;


    @PostMapping
    public List<ProductResponse> findCar(@RequestParam("file") MultipartFile file) {

        var response = yasMiniAIService.findCarByImage(file);
        return response;
    }
}



Copier après la connexion

5. Étape IMPORTANT : Connectez-vous à Google Cloud avec Google Cloud CLI

L'application Spring Boot ne peut pas vérifier qui vous êtes et ne peut pas vous permettre d'accepter la ressource dans Google Cloud.

Nous devons donc nous connecter à Google et fournir une autorisation.

5.1 Nous devons d'abord installer GCloud CLI sur votre machine

Tutoriel de lien : https://cloud.google.com/sdk/docs/install
Vérifiez le lien ci-dessus et installez-le sur votre machine

5.2 Connexion

  1. Ouvrez votre terminal au niveau du projet (vous devez vous connecter au projet)
  2. Type : connexion d'authentification gcloud
  3. Entrez et vous verrez les fenêtres qui vous permettent de vous connecter

gcloud auth login


Copier après la connexion

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Remarque : Une fois connecté, les informations d'identification sont enregistrées dans le package Google Maven et vous n'avez pas besoin de vous reconnecter lorsque vous redémarrez l'application Spring Boot.

Conclusion

Donc, ceux-ci sont implémentés ci-dessus en fonction de mon projet E-commerce, vous pouvez modifier la correspondance avec votre projet et votre framework. Dans d'autres frameworks, pas Spring Boot (NestJs, ..), vous pouvez utiliser https://aistudio.google.com/app/prompts/new_chat. et vous n'avez pas besoin de créer un nouveau compte Google Cloud.

Vous pouvez vérifier la mise en œuvre détaillée sur mon dépôt :

Backend : https://github.com/duongminhhieu/YasMiniShop
Front-end : https://github.com/duongminhhieu/YasMini-Frontend

Bon apprentissage !!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1670
14
Tutoriel PHP
1274
29
Tutoriel C#
1256
24
Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Le logiciel de sécurité de l'entreprise entraîne-t-il l'exécution de l'application? Comment dépanner et le résoudre? Apr 19, 2025 pm 04:51 PM

Dépannage et solutions au logiciel de sécurité de l'entreprise qui fait que certaines applications ne fonctionnent pas correctement. De nombreuses entreprises déploieront des logiciels de sécurité afin d'assurer la sécurité des réseaux internes. ...

Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Comment convertir les noms en nombres pour implémenter le tri et maintenir la cohérence en groupes? Apr 19, 2025 pm 11:30 PM

Solutions pour convertir les noms en nombres pour implémenter le tri dans de nombreux scénarios d'applications, les utilisateurs peuvent avoir besoin de trier en groupe, en particulier en un ...

Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Comment simplifier les problèmes de cartographie des champs dans l'amarrage du système à l'aide de mapstruct? Apr 19, 2025 pm 06:21 PM

Le traitement de la cartographie des champs dans l'amarrage du système rencontre souvent un problème difficile lors de l'exécution d'amarrage du système: comment cartographier efficacement les champs d'interface du système a ...

Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Comment obtenir élégamment des noms de variables de classe d'entité pour créer des conditions de requête de base de données? Apr 19, 2025 pm 11:42 PM

Lorsque vous utilisez MyBatis-Plus ou d'autres cadres ORM pour les opérations de base de données, il est souvent nécessaire de construire des conditions de requête en fonction du nom d'attribut de la classe d'entité. Si vous manuellement à chaque fois ...

Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Comment Intellij Idea identifie-t-elle le numéro de port d'un projet de démarrage de printemps sans publier un journal? Apr 19, 2025 pm 11:45 PM

Commencez le printemps à l'aide de la version IntelliJideaultimate ...

Comment convertir en toute sécurité les objets Java en tableaux? Comment convertir en toute sécurité les objets Java en tableaux? Apr 19, 2025 pm 11:33 PM

Conversion des objets et des tableaux Java: Discussion approfondie des risques et des méthodes correctes de la conversion de type de distribution De nombreux débutants Java rencontreront la conversion d'un objet en un tableau ...

Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Plateforme de commerce électronique SKU et conception de la base de données SPU: comment prendre en compte à la fois les attributs définis par l'utilisateur et les produits sans attribution? Apr 19, 2025 pm 11:27 PM

Explication détaillée de la conception des tables SKU et SPU sur les plates-formes de commerce électronique Cet article discutera des problèmes de conception de la base de données de SKU et SPU dans les plateformes de commerce électronique, en particulier comment gérer les ventes définies par l'utilisateur ...

Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Comment utiliser la solution Redis Cache pour réaliser efficacement les exigences de la liste de classement des produits? Apr 19, 2025 pm 11:36 PM

Comment la solution de mise en cache Redis réalise-t-elle les exigences de la liste de classement des produits? Pendant le processus de développement, nous devons souvent faire face aux exigences des classements, comme l'affichage d'un ...

See all articles