Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème mise en place API

meise en place d'une API sur Hugging Face mais erreur

Sujet résolu
    31 janvier 2024 à 15:24:36

    Je suis en train de mettre en place une API python sur hugging face que je dois avoir finis pour ce soir mais j'ai constament un message d'erreur. J'ai passé des heures à essayer de le résoudre mais suis maintenant désespéré.

    Mon espace est accessible en tapant sur ce lien: https://huggingface.co/spaces/altrastorique/BirdsAi_API

    Voici le code de mon fichier principale app.py

    import gradio as gr
    from tensorflow.keras.preprocessing.image import ImageDataGenerator
    from tensorflow.keras.models import load_model
    import pandas as pd
    import numpy as np
    
    dataCsv = pd.read_csv('birds.csv')
    
    from tensorflow.keras.preprocessing import image
    
    def display_image_and_prediction(Oiseau):
        model = load_model('mon_modele')
        generator = np.load('test_data.npy')
    
        Oiseau = Oiseau.resize((224, 224))
        img_array = image.img_to_array(img)
        img_array = np.expand_dims(img_array, axis=0)
        img_array /= 255.0
        
        prediction = model.predict(img_array)
        predicted_class = np.argmax(prediction)
        predicted_class_name = generator[predicted_class]
        scientificName = dataCsv.loc[dataCsv["labels"]==predicted_class_name,"scientific name"].iloc[0]#récupération du nom scientifique de cette oiseau
    
        return predicted_class, scientificName
    
    iface = gr.Interface(fn=display_image_and_prediction, inputs="image", outputs=["text","text"])
    iface.launch(share=True)

    Ce code récupère une image, la redimensionne et la normalise et puis applique mon model d'IA dessu. A la fin il récupère le nom scientifique équivalent grâce à birds.csv. Le fichier test_data devrait en réalliter s'appeler index.

    Voci le code d'une version précédente ou nous avions utiliser Flask.

    from flask import Flask, render_template, request, jsonify
    from tensorflow.keras.models import load_model
    import pandas as pd
    import base64
    from io import BytesIO
    from PIL import Image
    import numpy as np
    
    app = Flask(__name__)
    with app.app_context():
        model = load_model('mon_modele')
    @app.route('/', methods=['GET'])
    def index():
        if request.method == "GET":
            return render_template('index.html')
    
    
    @app.route('/handleImage', methods=['POST'])
    def handleImage():
        if request.method == "POST":
    
            data = request.get_json()
            image_data = data.get('image')
            jpeg_base64_data = image_data
            jpeg_base64_data = jpeg_base64_data.replace("data:image/jpeg;base64,", "")
            # Convertir la base64 en bytes
            jpeg_bytes = base64.b64decode(jpeg_base64_data)
    
            # Charger l'image depuis les bytes
            image = Image.open(BytesIO(jpeg_bytes))
            target_size = (224, 224)
            image = image.resize(target_size)
            img_array = np.array(image)
            img_array = np.expand_dims(img_array, axis=0)
            img_array = img_array / 255.0  # Normaliser l'image
    
            dataCsv = pd.read_csv('birds.csv')
            test_data = np.load('test_data.npy')
    
            def display_image_and_prediction(model, img_array):
                prediction = model.predict(img_array)
                predicted_class = np.argmax(prediction)
                predicted_class_name = test_data[predicted_class];  # Nom de l'oiseau
                print("Nom de l'oiseau :", predicted_class_name)
    
                scientificName = dataCsv.loc[dataCsv["labels"] == predicted_class_name, "scientific name"].iloc[0]  # Récupération du nom scientifique de cet oiseau
                print("Nom scientifique :", scientificName)
                return predicted_class_name, scientificName
    
            predicted_class_name, scientificName = display_image_and_prediction(model, img_array)
            result = {'result': predicted_class_name, 'sname':scientificName}
            return jsonify(result)
    
    
    @app.route('/documentation')
    def documentation():
        return render_template('documentation.html')
    
    
    if __name__ == "__main__":
        app.run(host='0.0.0.0', port=81)

    Merci énormément pour vos retours, c'est la première API que je mets en place.


    -
    Edité par altrastorique 31 janvier 2024 à 17:01:27

    • Partager sur Facebook
    • Partager sur Twitter
      31 janvier 2024 à 15:30:38

      Je suis en train de mettre en place une API python sur hugging face que je dois avoir finis pour ce soir mais j'ai constament un message d'erreur.

      C'est l'info là plus importante et vous ne là mettez pas !

      Surtout que vos codes ne sont pas testables, nous avons pas de fichiers csv et npy à disposition.

      -
      Edité par fred1599 31 janvier 2024 à 15:34:46

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        31 janvier 2024 à 15:37:27

        L'espace est accessible sur ce lien: https://huggingface.co/spaces/altrastorique/BirdsAi_API/tree/main

        -
        Edité par altrastorique 31 janvier 2024 à 15:38:22

        • Partager sur Facebook
        • Partager sur Twitter
          31 janvier 2024 à 15:58:00

          altrastorique a écrit:

          L'espace est accessible sur ce lien: https://huggingface.co/spaces/altrastorique/BirdsAi_API/tree/main

          Sans le message d'erreur, est-on supposé lire votre code pour deviner ce qui ne va pas? ou bien essayer de le faire tourner et risquer de rencontrer des erreurs sans rapport avec celle que vous cherchez à comprendre? On va juste perdre son temps (et vous ne serez pas plus avancé).

          • Partager sur Facebook
          • Partager sur Twitter
            31 janvier 2024 à 16:08:41

            Mais justement, comment faire pour avoir des messages d'erreurs. Hugging face ne m'en donne aucun.

            Merci beaucoup

            • Partager sur Facebook
            • Partager sur Twitter
              31 janvier 2024 à 16:24:01

              Pourtant tu as dit explicitement dans ton 1er post que tu as toujours le même message d'erreur, ce qui veut dire que tu en vois .... mais tu nous ne l'a pas donné. Donc tu as un message ou pas en vrai ?
              • Partager sur Facebook
              • Partager sur Twitter
                31 janvier 2024 à 16:35:41

                Excusez moi pour la confusion. Hugging Face propose d'executer en ligne l'API dans l'onglet App, accessible dupuis le lien suivant:https://huggingface.co/spaces/altrastorique/BirdsAi_API. Mais le seul problème ai(je vous laisse essayer) que lorsque vous mettez une image il y a seulement écris ERROR sur les outputs sans plus d'indications. Et je n'ai rien trouvé sur comment réussir à obtenir ce message d'erreur plus précis qui nous aiderais, d'ou mes difficultés.

                Merci beaucoup

                -
                Edité par altrastorique 31 janvier 2024 à 16:36:16

                • Partager sur Facebook
                • Partager sur Twitter
                  31 janvier 2024 à 16:55:48

                  bon, j'ai regardé un peu, quand on regarde les exemples qui ont une image en entrée, il est passé gr.Image(..) en input de gr.interface, en passant le mot clé "image" on utilise les paramètres par défaut, soit ici, l'image est récupéré par défaut via numpy, or ce n'est pas ce que ta fonction attend, me semble-t-il. => https://www.gradio.app/docs/image

                  -
                  Edité par umfred 31 janvier 2024 à 16:57:10

                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 janvier 2024 à 16:58:10

                    Salut,

                    Dans app.py, tu as :

                    model = load_model('mon_modele')

                    et dans ton arborescence tu as mon_modele/mon_modele/

                    Est-ce normal ??

                    -
                    Edité par Garkam 31 janvier 2024 à 16:58:37

                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 janvier 2024 à 17:09:05

                      +1 @Garkam,

                      bizarre qu'une erreur ne soit pas générée pour cela

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                        31 janvier 2024 à 18:03:25

                        Merci beaucoup.

                        J'ai fait la réctification en mettant

                        	
                        model = load_model('mon_modele/mon_modele')

                        et il charge maintenant plus longtemps avant de se cracher ce qui doit signifier que c'était bel et bien une erreur. En ce qui concerne l'entrée de gr.interface j'ai réctifié le code en mettant:

                        import gradio as gr
                        from tensorflow.keras.preprocessing.image import ImageDataGenerator
                        from tensorflow.keras.models import load_model
                        import pandas as pd
                        import numpy as np
                        
                        
                        from tensorflow.keras.preprocessing import image
                        
                        def display_image_and_prediction(Oiseau):
                            model = load_model('mon_modele/mon_modele')
                            generator = np.load('test_data.npy')
                            dataCsv = pd.read_csv('birds.csv')
                        
                            Oiseau_resized= np.resize(Oiseau,(224, 224))
                            #img_array = image.img_to_array(img)
                            #img_array = np.array(Oiseau_resized)
                            img_array = np.expand_dims(Oiseau_resized, axis=0)
                            img_array /= 255.0
                            
                            prediction = model.predict(img_array)
                            predicted_class = np.argmax(prediction)
                            predicted_class_name = generator[predicted_class]
                            scientificName = dataCsv.loc[dataCsv["labels"]==predicted_class_name,"scientific name"].iloc[0]#récupération du nom scientifique de cette oiseau
                        
                            return predicted_class, scientificName
                        
                        iface = gr.Interface(fn=display_image_and_prediction, inputs="image", outputs=["text","text"])
                        iface.launch()

                        Mais celà ne marche toujours pas. J'essaye d'utiliser Docker pour l'executer localement afin d'avoir un message d'erreur.

                        Merci pour votre aide :)


                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 janvier 2024 à 18:17:52

                          Mais celà ne marche toujours pas.

                          Pour quelque chose d'urgent, vous lâchez vite le bébé !

                          ça ne marche pas ne définit pas ce qui se passe, pas de message d'erreur ?

                          si vous n'avez pas de message d'erreur, qu'attend t-on comme résultat ?

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                            31 janvier 2024 à 18:57:40

                            fred1599 a écrit:

                            Mais celà ne marche toujours pas.

                            Pour quelque chose d'urgent, vous lâchez vite le bébé !

                            ça ne marche pas ne définit pas ce qui se passe, pas de message d'erreur ?

                            si vous n'avez pas de message d'erreur, qu'attend t-on comme résultat ?


                            En fait d'après ce que je peux comprendre, le resultat c'est le nom scientifique de l'oiseau contenu dans l'image.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              31 janvier 2024 à 18:59:49

                              Oui,il renvoie deux éléments en sortie: Le nom anglais de l'oiseau et son nom scientifique.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                31 janvier 2024 à 19:45:11

                                La voilà ton erreur :

                                File "/home/user/app/app.py", line 19, in display_image_and_prediction
                                    img_array /= 255.0
                                numpy.core._exceptions._UFuncOutputCastingError: Cannot cast ufunc 'divide' output from dtype('float64') to dtype('uint8')



                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 février 2024 à 20:26:10

                                  Merci beaucoup, et désolé pour ma réponse tardive.

                                  Merci beaucoup @Garkam

                                  J'ai modifié mon code de la façon suivante

                                  import gradio as gr
                                  from tensorflow.keras.preprocessing.image import ImageDataGenerator
                                  from tensorflow.keras.models import load_model
                                  import pandas as pd
                                  import numpy as np
                                  
                                  
                                  from tensorflow.keras.preprocessing import image
                                  
                                  def display_image_and_prediction(Oiseau):
                                      model = load_model('mon_modele/mon_modele')
                                      generator = np.load('test_data.npy')
                                      dataCsv = pd.read_csv('birds.csv')
                                  
                                      Oiseau_resized= np.resize(Oiseau,(224, 224))
                                      #img_array = image.img_to_array(img)
                                      #img_array = np.array(Oiseau_resized)
                                      img_array = np.expand_dims(Oiseau_resized, axis=0)
                                      img_array = img_array.astype('float32') / 255.0
                                      
                                      prediction = model.predict(img_array)
                                      predicted_class = np.argmax(prediction)
                                      predicted_class_name = generator[predicted_class]
                                      scientificName = dataCsv.loc[dataCsv["labels"]==predicted_class_name,"scientific name"].iloc[0]#récupération du nom scientifique de cette oiseau
                                  
                                      return predicted_class, scientificName
                                  
                                  iface = gr.Interface(fn=display_image_and_prediction, inputs="image", outputs=["text","text"])
                                  iface.launch()

                                  Mais celà ne marche toujours pas. Je commence à désespérer.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    2 février 2024 à 2:26:14

                                    Salut,

                                    J'ai modifier le code pour qu'il fonctionne, mais j'ai dû utiliser openCV pour redimensionner  l'array.

                                    Code:

                                    import gradio as gr
                                    from tensorflow.keras.models import load_model
                                    import pandas as pd
                                    import numpy as np
                                    import cv2
                                    
                                    dataCsv = pd.read_csv('birds.csv')
                                    
                                    def display_image_and_prediction(bird):
                                        model = load_model('mon_modele/mon_modele')
                                        generator = np.load('test_data.npy')
                                    
                                        bird_array_resized = cv2.resize(bird,(224, 224), 3)
                                        bird_array = np.expand_dims(bird_array_resized.astype('float32') / 255.0, axis=0)
                                        prediction = model.predict(bird_array)
                                        
                                        predicted_class = np.argmax(prediction)
                                        predicted_class_name = generator[predicted_class]
                                    
                                        scientificName = dataCsv.loc[dataCsv["labels"]==predicted_class_name,"scientific name"].iloc[0]#récupération du nom scientifique de cette oiseau
                                    
                                        return predicted_class_name, scientificName
                                    
                                    iface = gr.Interface(fn=display_image_and_prediction, inputs="image", outputs=["text","text"])
                                    iface.launch(share=True)



                                    J'ai essayé avec :

                                    img_resize = np.resize(bird, (224, 224, 3))

                                    ça ne plante pas mais le résultat est faussé, car np.resize() n'utilise pas la même méthode d'interpolation que cv2.resize().

                                    Il est aussi possible qu'avec PIL, ça puisse le faire, à tester.

                                    Edit : une version avec PIL

                                    import gradio as gr
                                    from tensorflow.keras.models import load_model
                                    import pandas as pd
                                    import numpy as np
                                    
                                    
                                    dataCsv = pd.read_csv('birds.csv')
                                    
                                    def display_image_and_prediction(bird):
                                    
                                        model = load_model('mon_modele/mon_modele')
                                        generator = np.load('test_data.npy')
                                    
                                        resized_image = bird.resize((224, 224))
                                        preprocessed_image = np.array(resized_image).astype('float32') / 255.0
                                    
                                        prediction = model.predict(np.expand_dims(preprocessed_image, axis=0))
                                        predicted_class = np.argmax(prediction)
                                        predicted_class_name = generator[predicted_class]
                                    
                                        scientific_name = dataCsv.loc[dataCsv["labels"] == predicted_class_name, "scientific name"].iloc[0]
                                        return predicted_class_name, scientific_name
                                    
                                    text_box1 = gr.Textbox(label="Name of bird")
                                    text_box2 = gr.Textbox(label="Scientific name")
                                    
                                    iface = gr.Interface(display_image_and_prediction, gr.Image(type="pil"), outputs=[text_box1, text_box2])
                                    iface.launch(share=True)



                                    -
                                    Edité par Garkam 2 février 2024 à 17:38:39

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      3 février 2024 à 18:48:24

                                      Merci beaucoup @Garkam :D

                                      Tout marche très bien à présent. J'ai utilisé la version avec PIL



                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        3 février 2024 à 23:28:19

                                        altrastorique a écrit:

                                        Tout marche très bien à présent. J'ai utilisé la version avec PIL

                                        Bah non à l'adresse https://huggingface.co/spaces/altrastorique/BirdsAi_API/tree/main, tu utilises la version openCV.

                                        -
                                        Edité par Garkam 3 février 2024 à 23:28:43

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          7 février 2024 à 20:13:05

                                          J'ai créé un deuxième espace dans lequel j'ai mit la version PIL pour être sûr de ne rien perdre. Voici le lien:https://huggingface.co/spaces/altrastorique/BirdsAI_APIV2
                                          • Partager sur Facebook
                                          • Partager sur Twitter

                                          Problème mise en place API

                                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                          • Editeur
                                          • Markdown