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.

2_🍄_Dataset.py 5.0 KiB

2 days ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #INIT
  2. from init import *
  3. st.set_page_config(page_title="Dataset", page_icon="🍄")
  4. st.write(r"""<style>.stAppDeployButton { display: none; }</style>""", unsafe_allow_html=True) # Hide Deploy button
  5. data_dir = '../../dataset'
  6. dfNames = pd.read_csv("../../notebooks/mushroom_observer/dataset-mushroom-observer/names.csv", sep="\t")
  7. def get_class_names(data_dir):
  8. dataset = ImageFolder(root=data_dir)
  9. class_names = dataset.classes
  10. return class_names
  11. def openClasGallery(class_name):
  12. st.session_state.classGallryOpened = class_name
  13. def showAllClasses():
  14. class_names = get_class_names(data_dir)
  15. total_img = 0
  16. container = st.container(border=True)
  17. col1, col2, col3 ,col4, col5 = container.columns(5)
  18. cols = [col1, col2, col3 ,col4, col5 ]
  19. i = 0
  20. for class_name in class_names:
  21. class_container = cols[i%5].container(border=True)
  22. i = i + 1
  23. image_folder = data_dir + '/' + class_name
  24. files = os.listdir(image_folder)
  25. image_files = [f for f in files if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
  26. total_img = total_img + len(image_files)
  27. class_container.write(dfNames[dfNames.id == int(class_name)].text_name.values[0])
  28. if image_files:
  29. first_image_file = image_files[0]
  30. first_image_path = os.path.join(image_folder, first_image_file)
  31. class_container.image(first_image_path)
  32. class_container.button("Voir "+str(len(image_files)) + ' images', key= "button_detail_" + class_name, on_click=openClasGallery, args=[class_name])
  33. st.write("Nombre d'images total : ", int(total_img))
  34. st.write("Nombre de classes : ", len(class_names))
  35. mean_by_class = round(total_img / len(class_names))
  36. st.write("Moyenne d'image par classe : ", mean_by_class)
  37. def showClassImages():
  38. class_name = st.session_state.classGallryOpened
  39. class_container = st.container(border=True)
  40. classData = {}
  41. image_folder = data_dir + '/' + class_name
  42. files = os.listdir(image_folder)
  43. image_files = [f for f in files if f.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.bmp'))]
  44. name = dfNames[dfNames.id == int(class_name)].text_name.values[0] + ' (' + str(len(image_files)) + ' images)'
  45. class_container.write(name)
  46. class_container.button("Retour", key= "button_detail_" + class_name, on_click=openClasGallery, args=[False])
  47. col1, col2, col3 ,col4 ,col5 = class_container.columns(5)
  48. cols = [col1, col2, col3 ,col4 ,col5]
  49. for i in range (0, len(image_files)):
  50. first_image_file = image_files[i]
  51. first_image_path = os.path.join(image_folder, first_image_file)
  52. cols[i%5].image(first_image_path)
  53. def showDataset():
  54. if 'classGallryOpened' not in st.session_state:
  55. st.session_state.classGallryOpened = False
  56. if st.session_state.classGallryOpened == False:
  57. showAllClasses()
  58. else:
  59. showClassImages()
  60. # SIDEBAR
  61. # BODY
  62. colored_header(
  63. label="Dataset",
  64. description="Jeu de données final utilisé",
  65. color_name="red-70",
  66. )
  67. st.markdown("""
  68. ## Exploration du jeu de données
  69. """
  70. )
  71. showDataset()
  72. st.divider()
  73. st.markdown("""
  74. ## Pré-traitement des données
  75. Nous développons un second outil pour sélectionner manuellement et précisément un encadrement sur certaines photos :
  76. """
  77. )
  78. st.video("../../src/features/manual_picture_bbox_selector/mpbs_demo.mp4")
  79. st.markdown("""
  80. Le jeu de données est ensuite divisé en 3 jeux de données pour assurer l'entraînement, la validation et le test de nos modèles.
  81. Finalement, nous réalisons une étape de ré-échantillonnage afin d'augmenter le volume de données d'entraînement et de combler la faible quantité de données en notre possession.
  82. La méthodologie de Data Augmentation utilisé permet d'enrichir les échantillons à partir des images existantes, augmentant ainsi la robustesse et la capacité de généralisation de nos modèles.
  83. La quantité d'images générée varie d'un modèle à l'autre, cependant, nous utilisons globalement des paramètres en communs :
  84. """
  85. )
  86. code_DA = """
  87. # Configuration des paramètres pour l'augmentation des images
  88. data_augmentation = tf.keras.Sequential([
  89. layers.Rescaling(1./255), # Mise à l'échelle
  90. layers.RandomFlip("horizontal_and_vertical"), # Flip
  91. layers.RandomRotation(0.2), # Rotation
  92. layers.RandomZoom((-0.2, 0.2)), # Zoom
  93. layers.RandomTranslation(0.2, 0.2), # Translation
  94. layers.RandomBrightness(factor= [-.001, .001]), # Ajustement de la luminosité
  95. layers.RandomContrast(factor= .4), # Ajustement du contraste
  96. ])
  97. """
  98. st.code(code_DA, language="Python")
  99. st.image("../img/images_augmentees.png", caption="Exemple d'images enrichies générées depuis une unique image source, avec la classe ImageDataGenerator de Keras.")
  100. st.divider()
  101. st.image("../img/Layers_structure_rapport2_v2.png", caption="Schématisation de la méthodologie de travail appliquée")