dbuscombe's picture
v1
b480bf5
## Daniel Buscombe, Marda Science LLC 2023
# This file contains many functions originally from Doodleverse https://github.com/Doodleverse programs
import gradio as gr
import numpy as np
import sys, json, os
import pandas as pd
sys.path.insert(1, 'app_files'+os.sep+'src')
from sedinet_eval import *
###===================================================
def estimate_siso_simo_1image(vars, im, greyscale,
dropout, weights_path): # numclass, name, mode, res_folder,
# batch_size, ):#, scale): #
"""
This function uses a sedinet model for continuous prediction on 1 image
"""
SM = make_sedinet_siso_simo(vars, greyscale, dropout)
SM.load_weights(weights_path)
# im = Image.open(image).convert('LA')
#im = im.resize((IM_HEIGHT, IM_HEIGHT))
im = Image.fromarray(im)
im = np.array(im)[:,:,0]
nx,ny = np.shape(im)
if (nx!=IM_HEIGHT) or (ny!=IM_HEIGHT):
im = im[int(nx/2)-int(IM_HEIGHT/2):int(nx/2)+int(IM_HEIGHT/2), int(ny/2)-int(IM_HEIGHT/2):int(ny/2)+int(IM_HEIGHT/2)]
if DO_STANDARDIZE==True:
im = do_standardize(im)
else:
im = np.array(im) / 255.0
result = SM.predict(np.expand_dims(np.expand_dims(im, axis=2), axis=0))
result = [float(r[0]) for r in result]
return result
###===================================================
def grainsize(input_img, dims=(1024, 1024)):
configfile = 'weights/config_usace_combined2021_2022_v12.json'
weights_path = 'weights/sandsnap_merged_1024_modelrevOct2022_v12_simo_batch10_im1024_9vars_mse_noaug.hdf5'
# load the user configs
with open(os.getcwd()+os.sep+configfile) as f:
config = json.load(f)
###===================================================
dropout = config["dropout"]
greyscale = config['greyscale']
try:
greyscale = config['greyscale']
except:
greyscale = 'true'
#output variables
vars = [k for k in config.keys() if not np.any([k.startswith('base'), k.startswith('MAX_LR'),
k.startswith('MIN_LR'), k.startswith('DO_AUG'), k.startswith('SHALLOW'),
k.startswith('res_folder'), k.startswith('train_csvfile'), k.startswith('csvfile'),
k.startswith('test_csvfile'), k.startswith('name'), k.startswith('val_csvfile'),
k.startswith('greyscale'), k.startswith('aux_in'),
k.startswith('dropout'), k.startswith('N'),k.startswith('scale'),
k.startswith('numclass')])]
vars = sorted(vars)
#this relates to 'mimo' and 'miso' modes that are planned for the future but not currently implemented
auxin = [k for k in config.keys() if k.startswith('aux_in')]
if len(auxin) > 0:
auxin = config[auxin[0]] ##at least for now, just one 'auxilliary' (numerical/categorical) input in addition to imagery
if len(vars) ==1:
mode = 'miso'
elif len(vars) >1:
mode = 'mimo'
else:
if len(vars) ==1:
mode = 'siso'
elif len(vars) >1:
mode = 'simo'
print("Mode: %s" % (mode))
result = estimate_siso_simo_1image(vars, input_img, greyscale,
dropout, weights_path)
result_str = [str(i)[:5] for i in result]
result = np.array(result)
print(result)
plt.clf()
plt.plot(np.hstack((result[:3], result[4:])),[10,16,25,50,65,75,84,90], 'k-o')
plt.xlabel('Grain size (pixels)')
plt.ylabel('Percent finer')
plt.savefig("psd.png", dpi=300, bbox_inches="tight")
return 'mean grain size = %f pixels' % (result[4]), '90th percentile grain size = %f pixels' % (result[-1]), plt, pd.DataFrame(data=result_str, index=['10','16','25','50','mean','65','75','84','90']).transpose(),
title = "SandSnap/SediNet Model Demo- Measure grain size from image of sand!"
description = "Allows upload of imagery and download of grain size statistics. Statistics are unscaled (i.e. in pixels)"
examples = [
['examples/IMG_20210922_170908944_cropped.jpg'],
['examples/20210208_172834_cropped.jpg'],
['examples/20220101_165359_cropped.jpg']
]
inp = gr.Image()
out1 = gr.Plot(type='matplotlib')
out2 = gr.Dataframe(label='Summary statistics', headers=['10','16','25','50','mean','65','75','84','90'], type='pandas')
Segapp = gr.Interface(grainsize, inp, ["text", "text", out1, out2], title = title, description = description, examples=examples)
#, allow_flagging='manual', flagging_options=["bad", "ok", "good", "perfect"], flagging_dir="flagged")
Segapp.launch(enable_queue=True)