from deepforest import main from deepforest import get_data import matplotlib.pyplot as plt from predict import extract_features, predict_similarity, compare_features, extract_features_cp import os import streamlit as st model = main.deepforest() model.use_release() # quit() # print(img.head()) import pandas as pd from PIL import Image def split_image_from_dataframe(dataframe, panoramic_image, output_folder_name): """ Splits an image into multiple images based on coordinates provided in a dataframe. Parameters: dataframe (pd.DataFrame): DataFrame containing image path and coordinates. """ cropped_images_info = [] cropped_image_paths = [] for i, row in dataframe.iterrows(): image_path = row['image_path'] left, top, right, bottom = row['xmin'], row['ymin'], row['xmax'], row['ymax'] image = Image.open(panoramic_image) cropped_image = image.crop((left, top, right, bottom)) cropped_image_dict = { f'image': cropped_image, f'position': (left, top, right, bottom) } cropped_images_info.append(cropped_image_dict) cropped_image_paths.append(f'{output_folder_name}/cropped_image_{i}.png') cropped_image.save(f'{output_folder_name}/cropped_image_{i}.png') # Save each cropped image dataframe['cropped_image_path'] = cropped_image_paths return cropped_images_info # print(images_list) # quit() # Load images from folder def extract_treespecies_features(folder_path): image_files = [os.path.join(folder_path, f) for f in os.listdir(folder_path) if f.endswith(('png', 'jpg', 'jpeg', '.JPG'))] species_feature_list = [{"feature": extract_features(file), "file_name": file} for file in image_files] return species_feature_list # print(species_feature_list[:2]) def perform_inference(images_list, species_feature_list): for idx, item in enumerate(images_list): image = item["image"] feature_cp = extract_features_cp(image) for idx, species in enumerate(species_feature_list): euclidean_dist, cos_sim = compare_features(feature_cp, species["feature"]) # print(f'Euclidean Distance: {euclidean_dist}') # print(f'Cosine Similarity: {cos_sim}') # Predict similarity is_similar = predict_similarity(feature_cp, species["feature"], threshold=0.8) # print(species) # print(f'Are the images similar? {"Yes" if is_similar else "No"}') result = "Yes" if is_similar else "No" if result == "Yes": item[f"result_{idx}"] = result item[f"file_name_{idx}"] = species["file_name"] return images_list if __name__ == '__main__': pan_image = "D:/Downloads/image/plant_images/plant_images/drone_igapo_flooded_forest/DJI_20240504124024_0037_D.JPG" sample_image_path = get_data(pan_image) # img = model.predict_image(path=sample_image_path, return_plot=False) # from PIL import Image # print(img) img_df = "" # img_actual = model.predict_image(path=sample_image_path, return_plot=True, color=(0, 165, 255), thickness=9) img_actual = model.predict_tile(raster_path=sample_image_path, return_plot=True, patch_size=100,patch_overlap=0.25) # im = Image.open('Foto.jpg') # im.save('Foto.png') #predict_image returns plot in BlueGreenRed (opencv style), but matplotlib likes RedGreenBlue, switch the channel order. Many functions in deepforest will automatically perform this flip for you and give a warning. plt.imshow(img_actual[:,:,::-1]) # plt.show(img[:,:,::-1]) plt.savefig("cropped_test3/panoramic_2.png") quit() images_list = split_image_from_dataframe(img_df, pan_image) folder_path = 'D:/Downloads/image/plant_images/plant_images/drone_igapo_flooded_forest/identified_species' species_feature_list = extract_treespecies_features() final_result = perform_inference(images_list, species_feature_list) print(final_result)