File size: 4,527 Bytes
d86998c
 
 
 
 
 
b480bf5
 
d86998c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b480bf5
 
d86998c
 
b480bf5
d86998c
 
 
 
 
b480bf5
 
d86998c
 
 
 
 
 
 
 
 
 
 
b480bf5
 
d86998c
b480bf5
d86998c
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
## 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)