Spaces:
Runtime error
Runtime error
| import gradio as gr | |
| import subprocess | |
| from PIL import Image | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| from itertools import product | |
| import numpy as np | |
| from sklearn.preprocessing import MinMaxScaler | |
| import os | |
| import time | |
| import pdb | |
| def preprocess_images(input_type): | |
| k = 2 | |
| batch_size = 8 | |
| img_dir = 'Dataset' | |
| data_folder = 'Agrilife_Dataset_Clean' | |
| dataset_subfolder_paths = {} | |
| dataset_img_files = {} | |
| for (_, dirnames, _) in os.walk(img_dir): | |
| for dirname in dirnames: | |
| if 'Recording' in dirname: | |
| dataset_name = os.path.basename(os.path.dirname(os.path.join(img_dir, dirname, 'TIFF'))) # Extract dataset name | |
| subdir_path = os.path.join(img_dir, dirname, 'TIFF') # Path to the 'TIFF' subdirectory | |
| master_folders = [folder for folder in os.listdir(subdir_path) if folder.startswith('MASTER')] | |
| slave_folders = [folder for folder in os.listdir(subdir_path) if folder.startswith('SLAVE')] | |
| use_master = bool(master_folders) | |
| use_slave = bool(slave_folders) | |
| # Create subfolders for the current dataset | |
| subfolder_paths = create_dataset_folders(dataset_name, use_master or use_slave) | |
| if subfolder_paths: | |
| print("Folders created successfully for dataset:", dataset_name) | |
| print("Subfolder paths:") | |
| for path in subfolder_paths: | |
| print(path) | |
| # Store the subfolder paths for the current dataset | |
| dataset_subfolder_paths[dataset_name] = subfolder_paths | |
| # Determine the folder to read images from (MASTER or SLAVE) | |
| read_folder = master_folders[0] if use_master else slave_folders[0] | |
| subdir_path = os.path.join(subdir_path, read_folder) | |
| # Read images and append to img_files for the current dataset | |
| img_files_dataset = [] | |
| if os.path.exists(subdir_path): | |
| for _, _, filenames in os.walk(subdir_path): | |
| for file in filenames: | |
| img_path = os.path.join(subdir_path, file) | |
| img_files_dataset.append(img_path) | |
| # Store the img_files for the current dataset | |
| dataset_img_files[dataset_name] = img_files_dataset | |
| print("Images appended and saved to subfolders successfully!") | |
| # Process and save images for each dataset | |
| for dataset_name, img_files_dataset in dataset_img_files.items(): | |
| subfolder_paths = dataset_subfolder_paths[dataset_name] | |
| visual_subfolder, analysis_subfolder, preprocess_subfolder, segmented_subfolder, stitched_subfolder, dataframe = subfolder_paths | |
| # Read CSV and filter out images of interest | |
| img_indices = np.arange(len(img_files_dataset)) | |
| ############################ | |
| if input_type == "Run Preprocessing": | |
| channel_names = ['Red (660 nm)', 'Green (580 nm)','Red Edge (730 nm)', 'NIR (820 nm)'] | |
| for img_index in img_indices: | |
| img_path = img_files_dataset[img_index] | |
| title = os.path.splitext(os.path.basename(img_path))[0] | |
| im = Image.open(img_path) | |
| # Divide image into 4 equal parts (separate channels) | |
| img_size = im.size[0] // 2 | |
| img_slices = tile(im, d=img_size) | |
| # Visualize each slice (optional, remove if not needed) | |
| fig, axs = plt.subplots(1, 4) | |
| i = 0 | |
| scaler = MinMaxScaler(feature_range=(0, 1)) | |
| img_stack = np.zeros((img_size, img_size, len(img_slices))) | |
| for box_coords in img_slices: | |
| # Grab image based on box_coords | |
| temp_img = np.array(im.crop(box_coords)) | |
| # Normalize and save to composite image | |
| scaler.fit(temp_img) | |
| temp_img = scaler.transform(temp_img) | |
| img_stack[:, :, i] = temp_img | |
| i += 1 | |
| # Grab each channel and stack to be R-G-NR-RE | |
| red = np.expand_dims(img_stack[:, :, 1], axis=-1) | |
| green = np.expand_dims(img_stack[:, :, 0], axis=-1) | |
| red_edge = np.expand_dims(img_stack[:, :, 2], axis=-1) | |
| NIR = np.expand_dims(img_stack[:, :, -1], axis=-1) | |
| composite_img = np.concatenate((green, red_edge, red), axis=-1) * 255 | |
| gray_img, binary = CCA_Preprocess(composite_img, preprocess_subfolder, | |
| title.replace('/', '_'), title, k=k) | |
| preprocessed_img = np.repeat(np.expand_dims(binary, axis=-1), 3, axis=-1) * composite_img | |
| # Perform Min-Max normalization | |
| # normalized_img = (composite_img - composite_img.min()) / (composite_img.max() - composite_img.min()) | |
| # normalized_img *= 255 | |
| # normalized_img = normalized_img.astype(np.uint8) | |
| # Save image for processing with all channels (for algorithms) | |
| save_img = Image.fromarray(np.uint8(preprocessed_img)) | |
| save_img.save(os.path.join(analysis_subfolder, '{}.png'.format(title.replace('/', '_')))) | |
| # Redo visualization with mask (find more efficient way for this) | |
| for channel in range(0, composite_img.shape[-1]): | |
| # Visualize (optional, remove if not needed) | |
| axs[channel].imshow(composite_img[:, :, channel] * binary, cmap='BuGn') | |
| axs[channel].axis('off') | |
| axs[channel].set_title(channel_names[channel], fontsize=10) | |
| # Save Visual (optional, remove if not needed) | |
| plt.suptitle(title) | |
| plt.tight_layout() | |
| fig.savefig(os.path.join(visual_subfolder, '{}.png'.format(title.replace('/', '_')))) | |
| # Close figures (optional, remove if not needed) | |
| plt.close('all') | |
| print('Finished processing Image {} of {}'.format(img_index + 1, len(img_indices))) | |
| # Define the input and output interfaces using Gradio | |
| iface = gr.Interface( | |
| fn=image_processing, | |
| inputs=[gr.components.Dropdown(["Run Preprocessing", "Run Image Stitching", "Run Image Segmentation", "Run Image Stats"], label="Choose the operation to be performed")], | |
| title = "Agrilife Automated Phenotyping", | |
| description = "Select processing steps and run the script.") | |
| iface.launch() | |