You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4_🤗_HuggingFace.py 6.3 KiB

2 days ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. #INIT
  2. from init import *
  3. st.set_page_config(page_title="HuggingFace", page_icon="🤗")
  4. st.write(r"""<style>.stAppDeployButton { display: none; }</style>""", unsafe_allow_html=True) # Hide Deploy button
  5. # SIDEBAR
  6. st.sidebar.title("Modèle utilisé")
  7. st.sidebar.markdown("""
  8. Mushrooms image detection ViT par dima806.
  9. Partagé sous licence apache-2.0 le 15/04/2024.
  10. """)
  11. st.sidebar.write(
  12. f"""
  13. {mention(
  14. label="Détail du modèle sur HuggingFace",
  15. icon="🤗",
  16. url="https://huggingface.co/dima806/mushrooms_image_detection",
  17. write=False
  18. )}
  19. {mention(
  20. label="Détail du Dataset utilisé sur Kaggle",
  21. icon="🗃️",
  22. url="https://www.kaggle.com/datasets/thehir0/mushroom-species",
  23. write=False
  24. )}
  25. """,
  26. unsafe_allow_html=True,
  27. )
  28. # BODY
  29. colored_header(
  30. label="HuggingFace",
  31. description="Utilisation d'un modèle communautaire",
  32. color_name="red-70",
  33. )
  34. st.markdown("""
  35. Nous expérimentons l'utilisation d'un modèle communautaire de classification pré-entraîné sur **100 espèces** de champignons russe.
  36. Ce modèle, partagé par [Dmytro Iakubovskyi](https://huggingface.co/dima806), est entraîné sur **233480** images et se base sur l'architecture **Vision Transformer (ViT)** *(85.9M de paramètres)*.
  37. """)
  38. # Importer le modèle
  39. processor = AutoImageProcessor.from_pretrained("dima806/mushrooms_image_detection")
  40. model = AutoModelForImageClassification.from_pretrained("dima806/mushrooms_image_detection")
  41. with st.expander("Afficher l'architecture du modèle"):
  42. st.code(model)
  43. st.subheader("Rapport de classification")
  44. def metrics():
  45. col1, col2, col3, col4 = st.columns(4)
  46. col1.metric(label="Exactitude", value=0.899)
  47. col2.metric(label="Precision", value=0.905)
  48. col3.metric(label="Recall", value=0.899)
  49. col4.metric(label="F1-score", value=0.896)
  50. style_metric_cards()
  51. metrics()
  52. with st.expander("Afficher la matrice de confusion"):
  53. st.image("https://cdn-uploads.huggingface.co/production/uploads/6449300e3adf50d864095b90/_tfRCaKBzs3rx82PT2xX2.png", caption="Basé sur plus de 50 000 photos prises en Russie")
  54. st.subheader("Liste des 100 espèces utilisées pour l'entraînement")
  55. dict_labels = {'Urnula craterium': 0, 'Leccinum albostipitatum': 1, 'Lactarius deliciosus': 2, 'Clitocybe nebularis': 3, 'Hypholoma fasciculare': 4, 'Lactarius torminosus': 5, 'Lycoperdon perlatum': 6, 'Verpa bohemica': 7, 'Schizophyllum commune': 8, 'Leccinum aurantiacum': 9, 'Phellinus igniarius': 10, 'Suillus luteus': 11, 'Coltricia perennis': 12, 'Cetraria islandica': 13, 'Amanita muscaria': 14, 'Pholiota aurivella': 15, 'Trichaptum biforme': 16, 'Artomyces pyxidatus': 17, 'Calocera viscosa': 18, 'Sarcosoma globosum': 19, 'Evernia prunastri': 20, 'Laetiporus sulphureus': 21, 'Lobaria pulmonaria': 22, 'Bjerkandera adusta': 23, 'Vulpicida pinastri': 24, 'Imleria badia': 25, 'Evernia mesomorpha': 26, 'Physcia adscendens': 27, 'Coprinellus micaceus': 28, 'Armillaria borealis': 29, 'Trametes ochracea': 30, 'Cantharellus cibarius': 31, 'Pseudevernia furfuracea': 32, 'Tremella mesenterica': 33, 'Gyromitra infula': 34, 'Leccinum versipelle': 35, 'Mutinus ravenelii': 36, 'Pholiota squarrosa': 37, 'Amanita rubescens': 38, 'Amanita pantherina': 39, 'Sarcoscypha austriaca': 40, 'Boletus edulis': 41, 'Coprinus comatus': 42, 'Merulius tremellosus': 43, 'Stropharia aeruginosa': 44, 'Cladonia fimbriata': 45, 'Suillus grevillei': 46, 'Apioperdon pyriforme': 47, 'Cerioporus squamosus': 48, 'Leccinum scabrum': 49, 'Rhytisma acerinum': 50, 'Hypholoma lateritium': 51, 'Flammulina velutipes': 52, 'Tricholomopsis rutilans': 53, 'Coprinopsis atramentaria': 54, 'Trametes versicolor': 55, 'Graphis scripta': 56, 'Ganoderma applanatum': 57, 'Phellinus tremulae': 58, 'Peltigera aphthosa': 59, 'Parmelia sulcata': 60, 'Fomitopsis betulina': 61, 'Pleurotus pulmonarius': 62, 'Fomitopsis pinicola': 63, 'Daedaleopsis confragosa': 64, 'Hericium coralloides': 65, 'Trametes hirsuta': 66, 'Coprinellus disseminatus': 67, 'Kuehneromyces mutabilis': 68, 'Pleurotus ostreatus': 69, 'Phlebia radiata': 70, 'Boletus reticulatus': 71, 'Phallus impudicus': 72, 'Macrolepiota procera': 73, 'Fomes fomentarius': 74, 'Suillus granulatus': 75, 'Gyromitra esculenta': 76, 'Xanthoria parietina': 77, 'Nectria cinnabarina': 78, 'Sarcomyxa serotina': 79, 'Inonotus obliquus': 80, 'Panellus stipticus': 81, 'Hypogymnia physodes': 82, 'Hygrophoropsis aurantiaca': 83, 'Cladonia rangiferina': 84, 'Platismatia glauca': 85, 'Calycina citrina': 86, 'Cladonia stellaris': 87, 'Amanita citrina': 88, 'Lepista nuda': 89, 'Gyromitra gigas': 90, 'Crucibulum laeve': 91, 'Daedaleopsis tricolor': 92, 'Stereum hirsutum': 93, 'Paxillus involutus': 94, 'Lactarius turpis': 95, 'Chlorociboria aeruginascens': 96, 'Chondrostereum purpureum': 97, 'Phaeophyscia orbicularis': 98, 'Peltigera praetextata': 99}
  56. df_labels = pd.DataFrame.from_dict(dict_labels, orient='index', columns=['ID'])
  57. col1, col2 = st.columns(2)
  58. col1.dataframe(df_labels, use_container_width=False)
  59. col2.image("https://storage.googleapis.com/kaggle-datasets-images/3708144/6427080/8e3f306869ae228d793494929eb27499/dataset-cover.png", caption="Basé sur plus de 50 000 photos prises en Russie")
  60. # Prediction
  61. st.divider()
  62. st.subheader("Test de prédiction")
  63. uploaded_file = st.file_uploader("Choisissez une photo pour exécuter le modèle. L'espèce doit appartenir à l'une des classes entraînés.", type=["jpg", "jpeg", "png"])
  64. if uploaded_file is not None:
  65. st.markdown("""
  66. # 🦾 Exécution !
  67. """)
  68. def champi_predict_dima806_mid(img):
  69. image = PIL.Image.open(img)
  70. inputs = processor(image, return_tensors="pt")
  71. outputs = model(**inputs)
  72. logits = outputs.logits
  73. predicted_class_index = logits.argmax(-1).item()
  74. return predicted_class_index
  75. def champi_label(dict_labels, class_index):
  76. for cle, valeur in dict_labels.items():
  77. if valeur == class_index:
  78. return cle
  79. return None
  80. prediction = champi_predict_dima806_mid(uploaded_file)
  81. # Afficher la prédiction
  82. st.info("Résultat de la prédiction : \n\n"+"🔎 ID : "+str(prediction)+" \n\n 🍄 NAME : "+champi_label(dict_labels, prediction).upper())
  83. st.link_button("🔗 Consulter sur Wikipédia", "https://fr.wikipedia.org/w/index.php?search="+champi_label(dict_labels, prediction))
  84. st.image(uploaded_file)