Wise-Vision-2 / inference.py
raj999's picture
Create inference.py
5777b00 verified
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)