Skip to content

Instantly share code, notes, and snippets.

@mewm
Last active March 13, 2018 22:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mewm/d6829e547e5022bb9d8cf7812c37ca56 to your computer and use it in GitHub Desktop.
Save mewm/d6829e547e5022bb9d8cf7812c37ca56 to your computer and use it in GitHub Desktop.
data:image/png;base64,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
from pyquery import PyQuery as pq
import base64
import io as pio
import numpy as np
import skimage
from skimage import data, io, filters
def red_ratio(image):
red_image = image[:, :, 0]
red_pixels = np.count_nonzero(red_image)
return red_pixels / red_image.size
def read_from_base64(encoded_image_uri):
encoded_data = encoded_image_uri.split(',')[1]
raw = base64.b64decode(encoded_data)
return skimage.io.imread(pio.BytesIO(raw))
# directly from base64 url:
image_data = "data:image/png;base64,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"
raw_image = read_from_base64(image_data)
print(red_ratio(raw_image))
# Results
#$ python get_base64.py 0 < 22:50:16
#0
data:image/png;base64,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
# Copyright (c) 2015-2017, NVIDIA CORPORATION. All rights reserved.
from __future__ import absolute_import
import os
import re
import tempfile
import flask
import werkzeug.exceptions
from .forms import GenericImageModelForm
from .job import GenericImageModelJob
from digits.pretrained_model.job import PretrainedModelJob
from digits import extensions, frameworks, utils
from digits.config import config_value
from digits.dataset import GenericDatasetJob, GenericImageDatasetJob
from digits.inference import ImageInferenceJob
from digits.status import Status
from digits.utils import filesystem as fs
from digits.utils import constants
from digits.utils.forms import fill_form_if_cloned, save_form_to_job
from digits.utils.routing import request_wants_json, job_from_request
from digits.webapp import scheduler
#
from pyquery import PyQuery as pq
import base64
import io as pio
import numpy as np
import skimage
from skimage import io
def red_ratio(image):
red_image = image[:, :, 0]
red_pixels = np.count_nonzero(red_image)
return (red_pixels * 1.0) / red_image.size
def read_from_base64(encoded_image_uri):
encoded_data = encoded_image_uri.split(',')[1]
raw = base64.b64decode(encoded_data)
return skimage.io.imread(pio.BytesIO(raw))
blueprint = flask.Blueprint(__name__, __name__)
@blueprint.route('/new', methods=['GET'])
@blueprint.route('/new/<extension_id>', methods=['GET'])
@utils.auth.requires_login
def new(extension_id=None):
"""
Return a form for a new GenericImageModelJob
"""
form = GenericImageModelForm()
form.dataset.choices = get_datasets(extension_id)
form.standard_networks.choices = []
form.previous_networks.choices = get_previous_networks()
form.pretrained_networks.choices = get_pretrained_networks()
prev_network_snapshots = get_previous_network_snapshots()
# Is there a request to clone a job with ?clone=<job_id>
fill_form_if_cloned(form)
return flask.render_template(
'models/images/generic/new.html',
extension_id=extension_id,
extension_title=extensions.data.get_extension(extension_id).get_title() if extension_id else None,
form=form,
frameworks=frameworks.get_frameworks(),
previous_network_snapshots=prev_network_snapshots,
previous_networks_fullinfo=get_previous_networks_fulldetails(),
pretrained_networks_fullinfo=get_pretrained_networks_fulldetails(),
multi_gpu=config_value('caffe')['multi_gpu'],
)
@blueprint.route('<extension_id>.json', methods=['POST'])
@blueprint.route('<extension_id>', methods=['POST'], strict_slashes=False)
@blueprint.route('.json', methods=['POST'])
@blueprint.route('', methods=['POST'], strict_slashes=False)
@utils.auth.requires_login(redirect=False)
def create(extension_id=None):
"""
Create a new GenericImageModelJob
Returns JSON when requested: {job_id,name,status} or {errors:[]}
"""
form = GenericImageModelForm()
form.dataset.choices = get_datasets(extension_id)
form.standard_networks.choices = []
form.previous_networks.choices = get_previous_networks()
form.pretrained_networks.choices = get_pretrained_networks()
prev_network_snapshots = get_previous_network_snapshots()
# Is there a request to clone a job with ?clone=<job_id>
fill_form_if_cloned(form)
if not form.validate_on_submit():
if request_wants_json():
return flask.jsonify({'errors': form.errors}), 400
else:
return flask.render_template(
'models/images/generic/new.html',
extension_id=extension_id,
extension_title=extensions.data.get_extension(extension_id).get_title() if extension_id else None,
form=form,
frameworks=frameworks.get_frameworks(),
previous_network_snapshots=prev_network_snapshots,
previous_networks_fullinfo=get_previous_networks_fulldetails(),
pretrained_networks_fullinfo=get_pretrained_networks_fulldetails(),
multi_gpu=config_value('caffe')['multi_gpu'],
), 400
datasetJob = scheduler.get_job(form.dataset.data)
if not datasetJob:
raise werkzeug.exceptions.BadRequest(
'Unknown dataset job_id "%s"' % form.dataset.data)
# sweeps will be a list of the the permutations of swept fields
# Get swept learning_rate
sweeps = [{'learning_rate': v} for v in form.learning_rate.data]
add_learning_rate = len(form.learning_rate.data) > 1
# Add swept batch_size
sweeps = [dict(s.items() + [('batch_size', bs)]) for bs in form.batch_size.data for s in sweeps[:]]
add_batch_size = len(form.batch_size.data) > 1
n_jobs = len(sweeps)
jobs = []
for sweep in sweeps:
# Populate the form with swept data to be used in saving and
# launching jobs.
form.learning_rate.data = sweep['learning_rate']
form.batch_size.data = sweep['batch_size']
# Augment Job Name
extra = ''
if add_learning_rate:
extra += ' learning_rate:%s' % str(form.learning_rate.data[0])
if add_batch_size:
extra += ' batch_size:%d' % form.batch_size.data[0]
job = None
try:
job = GenericImageModelJob(
username=utils.auth.get_username(),
name=form.model_name.data + extra,
group=form.group_name.data,
dataset_id=datasetJob.id(),
)
# get framework (hard-coded to caffe for now)
fw = frameworks.get_framework_by_id(form.framework.data)
pretrained_model = None
# if form.method.data == 'standard':
if form.method.data == 'previous':
old_job = scheduler.get_job(form.previous_networks.data)
if not old_job:
raise werkzeug.exceptions.BadRequest(
'Job not found: %s' % form.previous_networks.data)
use_same_dataset = (old_job.dataset_id == job.dataset_id)
network = fw.get_network_from_previous(old_job.train_task().network, use_same_dataset)
for choice in form.previous_networks.choices:
if choice[0] == form.previous_networks.data:
epoch = float(flask.request.form['%s-snapshot' % form.previous_networks.data])
if epoch == 0:
pass
elif epoch == -1:
pretrained_model = old_job.train_task().pretrained_model
else:
# verify snapshot exists
pretrained_model = old_job.train_task().get_snapshot(epoch, download=True)
if pretrained_model is None:
raise werkzeug.exceptions.BadRequest(
"For the job %s, selected pretrained_model for epoch %d is invalid!"
% (form.previous_networks.data, epoch))
# the first is the actual file if a list is returned, other should be meta data
if isinstance(pretrained_model, list):
pretrained_model = pretrained_model[0]
if not (os.path.exists(pretrained_model)):
raise werkzeug.exceptions.BadRequest(
"Pretrained_model for the selected epoch doesn't exist. "
"May be deleted by another user/process. "
"Please restart the server to load the correct pretrained_model details.")
# get logical path
pretrained_model = old_job.train_task().get_snapshot(epoch)
break
elif form.method.data == 'pretrained':
pretrained_job = scheduler.get_job(form.pretrained_networks.data)
model_def_path = pretrained_job.get_model_def_path()
weights_path = pretrained_job.get_weights_path()
network = fw.get_network_from_path(model_def_path)
pretrained_model = weights_path
elif form.method.data == 'custom':
network = fw.get_network_from_desc(form.custom_network.data)
pretrained_model = form.custom_network_snapshot.data.strip()
else:
raise werkzeug.exceptions.BadRequest(
'Unrecognized method: "%s"' % form.method.data)
policy = {'policy': form.lr_policy.data}
if form.lr_policy.data == 'fixed':
pass
elif form.lr_policy.data == 'step':
policy['stepsize'] = form.lr_step_size.data
policy['gamma'] = form.lr_step_gamma.data
elif form.lr_policy.data == 'multistep':
policy['stepvalue'] = form.lr_multistep_values.data
policy['gamma'] = form.lr_multistep_gamma.data
elif form.lr_policy.data == 'exp':
policy['gamma'] = form.lr_exp_gamma.data
elif form.lr_policy.data == 'inv':
policy['gamma'] = form.lr_inv_gamma.data
policy['power'] = form.lr_inv_power.data
elif form.lr_policy.data == 'poly':
policy['power'] = form.lr_poly_power.data
elif form.lr_policy.data == 'sigmoid':
policy['stepsize'] = form.lr_sigmoid_step.data
policy['gamma'] = form.lr_sigmoid_gamma.data
else:
raise werkzeug.exceptions.BadRequest(
'Invalid learning rate policy')
if config_value('caffe')['multi_gpu']:
if form.select_gpu_count.data:
gpu_count = form.select_gpu_count.data
selected_gpus = None
else:
selected_gpus = [str(gpu) for gpu in form.select_gpus.data]
gpu_count = None
else:
if form.select_gpu.data == 'next':
gpu_count = 1
selected_gpus = None
else:
selected_gpus = [str(form.select_gpu.data)]
gpu_count = None
# Set up data augmentation structure
data_aug = {}
data_aug['flip'] = form.aug_flip.data
data_aug['quad_rot'] = form.aug_quad_rot.data
data_aug['rot'] = form.aug_rot.data
data_aug['scale'] = form.aug_scale.data
data_aug['noise'] = form.aug_noise.data
data_aug['contrast'] = form.aug_contrast.data
data_aug['whitening'] = form.aug_whitening.data
data_aug['hsv_use'] = form.aug_hsv_use.data
data_aug['hsv_h'] = form.aug_hsv_h.data
data_aug['hsv_s'] = form.aug_hsv_s.data
data_aug['hsv_v'] = form.aug_hsv_v.data
# Python Layer File may be on the server or copied from the client.
fs.copy_python_layer_file(
bool(form.python_layer_from_client.data),
job.dir(),
(flask.request.files[form.python_layer_client_file.name]
if form.python_layer_client_file.name in flask.request.files
else ''), form.python_layer_server_file.data)
job.tasks.append(fw.create_train_task(
job=job,
dataset=datasetJob,
train_epochs=form.train_epochs.data,
snapshot_interval=form.snapshot_interval.data,
learning_rate=form.learning_rate.data[0],
lr_policy=policy,
gpu_count=gpu_count,
selected_gpus=selected_gpus,
batch_size=form.batch_size.data[0],
batch_accumulation=form.batch_accumulation.data,
val_interval=form.val_interval.data,
traces_interval=form.traces_interval.data,
pretrained_model=pretrained_model,
crop_size=form.crop_size.data,
use_mean=form.use_mean.data,
network=network,
random_seed=form.random_seed.data,
solver_type=form.solver_type.data,
rms_decay=form.rms_decay.data,
shuffle=form.shuffle.data,
data_aug=data_aug,
)
)
# Save form data with the job so we can easily clone it later.
save_form_to_job(job, form)
jobs.append(job)
scheduler.add_job(job)
if n_jobs == 1:
if request_wants_json():
return flask.jsonify(job.json_dict())
else:
return flask.redirect(flask.url_for('digits.model.views.show', job_id=job.id()))
except:
if job:
scheduler.delete_job(job)
raise
if request_wants_json():
return flask.jsonify(jobs=[j.json_dict() for j in jobs])
# If there are multiple jobs launched, go to the home page.
return flask.redirect('/')
def show(job, related_jobs=None):
"""
Called from digits.model.views.models_show()
"""
data_extensions = get_data_extensions()
view_extensions = get_view_extensions()
return flask.render_template(
'models/images/generic/show.html',
job=job,
data_extensions=data_extensions,
view_extensions=view_extensions,
related_jobs=related_jobs,
)
@blueprint.route('/timeline_tracing', methods=['GET'])
def timeline_tracing():
"""
Shows timeline trace of a model
"""
job = job_from_request()
return flask.render_template('models/timeline_tracing.html', job=job)
@blueprint.route('/large_graph', methods=['GET'])
def large_graph():
"""
Show the loss/accuracy graph, but bigger
"""
job = job_from_request()
return flask.render_template('models/large_graph.html', job=job)
@blueprint.route('/infer_one.json', methods=['POST'])
@blueprint.route('/infer_one.concentration', methods=['POST'])
@blueprint.route('/infer_one', methods=['POST', 'GET'])
def infer_one():
"""
Infer one image
"""
model_job = job_from_request()
remove_image_path = False
if 'image_path' in flask.request.form and flask.request.form['image_path']:
image_path = flask.request.form['image_path']
elif 'image_file' in flask.request.files and flask.request.files['image_file']:
outfile = tempfile.mkstemp(suffix='.bin')
flask.request.files['image_file'].save(outfile[1])
image_path = outfile[1]
os.close(outfile[0])
remove_image_path = True
else:
raise werkzeug.exceptions.BadRequest('must provide image_path or image_file')
epoch = None
if 'snapshot_epoch' in flask.request.form:
epoch = float(flask.request.form['snapshot_epoch'])
layers = 'none'
if 'show_visualizations' in flask.request.form and flask.request.form['show_visualizations']:
layers = 'all'
if 'dont_resize' in flask.request.form and flask.request.form['dont_resize']:
resize = False
else:
resize = True
# create inference job
inference_job = ImageInferenceJob(
username=utils.auth.get_username(),
name="Infer One Image",
model=model_job,
images=[image_path],
epoch=epoch,
layers=layers,
resize=resize,
)
# schedule tasks
scheduler.add_job(inference_job)
# wait for job to complete
inference_job.wait_completion()
# retrieve inference data
inputs, outputs, model_visualization = inference_job.get_data()
# set return status code
status_code = 500 if inference_job.status == 'E' else 200
# delete job folder and remove from scheduler list
scheduler.delete_job(inference_job)
if remove_image_path:
os.remove(image_path)
if inputs is not None and len(inputs['data']) == 1:
image = utils.image.embed_image_html(inputs['data'][0])
visualizations, header_html, app_begin_html, app_end_html = get_inference_visualizations(
model_job.dataset,
inputs,
outputs)
inference_view_html = visualizations[0]
else:
image = None
inference_view_html = None
header_html = None
app_begin_html = None
app_end_html = None
if flask.request.base_url.endswith('.concentration'):
html = pq(inference_view_html)
base64mask = html("img#image-0").attr("src")
raw_image = read_from_base64(base64mask)
return red_ratio(raw_image)
elif request_wants_json():
return flask.jsonify({'outputs': dict((name, blob.tolist())
for name, blob in outputs.iteritems())}), status_code
else:
return flask.render_template(
'models/images/generic/infer_one.html',
model_job=model_job,
job=inference_job,
image_src=image,
inference_view_html=inference_view_html,
header_html=header_html,
app_begin_html=app_begin_html,
app_end_html=app_end_html,
visualizations=model_visualization,
total_parameters=sum(v['param_count'] for v in model_visualization
if v['vis_type'] == 'Weights'),
), status_code
@blueprint.route('/infer_extension.json', methods=['POST'])
@blueprint.route('/infer_extension', methods=['POST', 'GET'])
def infer_extension():
"""
Perform inference using the data from an extension inference form
"""
model_job = job_from_request()
inference_db_job = None
try:
if 'data_extension_id' in flask.request.form:
data_extension_id = flask.request.form['data_extension_id']
else:
data_extension_id = model_job.dataset.extension_id
# create an inference database
inference_db_job = create_inference_db(model_job, data_extension_id)
db_path = inference_db_job.get_feature_db_path(constants.TEST_DB)
# create database creation job
epoch = None
if 'snapshot_epoch' in flask.request.form:
epoch = float(flask.request.form['snapshot_epoch'])
layers = 'none'
if 'show_visualizations' in flask.request.form and flask.request.form['show_visualizations']:
layers = 'all'
# create inference job
inference_job = ImageInferenceJob(
username=utils.auth.get_username(),
name="Inference",
model=model_job,
images=db_path,
epoch=epoch,
layers=layers,
resize=False,
)
# schedule tasks
scheduler.add_job(inference_job)
# wait for job to complete
inference_job.wait_completion()
finally:
if inference_db_job:
scheduler.delete_job(inference_db_job)
# retrieve inference data
inputs, outputs, model_visualization = inference_job.get_data()
# set return status code
status_code = 500 if inference_job.status == 'E' else 200
# delete job folder and remove from scheduler list
scheduler.delete_job(inference_job)
if outputs is not None and len(outputs) < 1:
# an error occurred
outputs = None
if inputs is not None:
keys = [str(idx) for idx in inputs['ids']]
inference_views_html, header_html, app_begin_html, app_end_html = get_inference_visualizations(
model_job.dataset,
inputs,
outputs)
else:
inference_views_html = None
header_html = None
keys = None
app_begin_html = None
app_end_html = None
if request_wants_json():
result = {}
for i, key in enumerate(keys):
result[key] = dict((name, blob[i].tolist()) for name, blob in outputs.iteritems())
return flask.jsonify({'outputs': result}), status_code
else:
return flask.render_template(
'models/images/generic/infer_extension.html',
model_job=model_job,
job=inference_job,
keys=keys,
inference_views_html=inference_views_html,
header_html=header_html,
app_begin_html=app_begin_html,
app_end_html=app_end_html,
visualizations=model_visualization,
total_parameters=sum(v['param_count'] for v in model_visualization
if v['vis_type'] == 'Weights'),
), status_code
@blueprint.route('/infer_db.json', methods=['POST'])
@blueprint.route('/infer_db', methods=['POST', 'GET'])
def infer_db():
"""
Infer a database
"""
model_job = job_from_request()
if 'db_path' not in flask.request.form or flask.request.form['db_path'] is None:
raise werkzeug.exceptions.BadRequest('db_path is a required field')
db_path = flask.request.form['db_path']
if not os.path.exists(db_path):
raise werkzeug.exceptions.BadRequest('DB "%s" does not exit' % db_path)
epoch = None
if 'snapshot_epoch' in flask.request.form:
epoch = float(flask.request.form['snapshot_epoch'])
if 'dont_resize' in flask.request.form and flask.request.form['dont_resize']:
resize = False
else:
resize = True
# create inference job
inference_job = ImageInferenceJob(
username=utils.auth.get_username(),
name="Infer Many Images",
model=model_job,
images=db_path,
epoch=epoch,
layers='none',
resize=resize,
)
# schedule tasks
scheduler.add_job(inference_job)
# wait for job to complete
inference_job.wait_completion()
# retrieve inference data
inputs, outputs, _ = inference_job.get_data()
# set return status code
status_code = 500 if inference_job.status == 'E' else 200
# delete job folder and remove from scheduler list
scheduler.delete_job(inference_job)
if outputs is not None and len(outputs) < 1:
# an error occurred
outputs = None
if inputs is not None:
keys = [str(idx) for idx in inputs['ids']]
inference_views_html, header_html, app_begin_html, app_end_html = get_inference_visualizations(
model_job.dataset,
inputs,
outputs)
else:
inference_views_html = None
header_html = None
keys = None
app_begin_html = None
app_end_html = None
if request_wants_json():
result = {}
for i, key in enumerate(keys):
result[key] = dict((name, blob[i].tolist()) for name, blob in outputs.iteritems())
return flask.jsonify({'outputs': result}), status_code
else:
return flask.render_template(
'models/images/generic/infer_db.html',
model_job=model_job,
job=inference_job,
keys=keys,
inference_views_html=inference_views_html,
header_html=header_html,
app_begin_html=app_begin_html,
app_end_html=app_end_html,
), status_code
@blueprint.route('/infer_many.json', methods=['POST'])
@blueprint.route('/infer_many', methods=['POST', 'GET'])
def infer_many():
"""
Infer many images
"""
model_job = job_from_request()
image_list = flask.request.files.get('image_list')
if not image_list:
raise werkzeug.exceptions.BadRequest('image_list is a required field')
if 'image_folder' in flask.request.form and flask.request.form['image_folder'].strip():
image_folder = flask.request.form['image_folder']
if not os.path.exists(image_folder):
raise werkzeug.exceptions.BadRequest('image_folder "%s" does not exit' % image_folder)
else:
image_folder = None
if 'num_test_images' in flask.request.form and flask.request.form['num_test_images'].strip():
num_test_images = int(flask.request.form['num_test_images'])
else:
num_test_images = None
epoch = None
if 'snapshot_epoch' in flask.request.form:
epoch = float(flask.request.form['snapshot_epoch'])
if 'dont_resize' in flask.request.form and flask.request.form['dont_resize']:
resize = False
else:
resize = True
paths = []
for line in image_list.readlines():
line = line.strip()
if not line:
continue
path = None
# might contain a numerical label at the end
match = re.match(r'(.*\S)\s+\d+$', line)
if match:
path = match.group(1)
else:
path = line
if not utils.is_url(path) and image_folder and not os.path.isabs(path):
path = os.path.join(image_folder, path)
paths.append(path)
if num_test_images is not None and len(paths) >= num_test_images:
break
# create inference job
inference_job = ImageInferenceJob(
username=utils.auth.get_username(),
name="Infer Many Images",
model=model_job,
images=paths,
epoch=epoch,
layers='none',
resize=resize,
)
# schedule tasks
scheduler.add_job(inference_job)
# wait for job to complete
inference_job.wait_completion()
# retrieve inference data
inputs, outputs, _ = inference_job.get_data()
# set return status code
status_code = 500 if inference_job.status == 'E' else 200
# delete job folder and remove from scheduler list
scheduler.delete_job(inference_job)
if outputs is not None and len(outputs) < 1:
# an error occurred
outputs = None
if inputs is not None:
paths = [paths[idx] for idx in inputs['ids']]
inference_views_html, header_html, app_begin_html, app_end_html = get_inference_visualizations(
model_job.dataset,
inputs,
outputs)
else:
inference_views_html = None
header_html = None
app_begin_html = None
app_end_html = None
if request_wants_json():
result = {}
for i, path in enumerate(paths):
result[path] = dict((name, blob[i].tolist()) for name, blob in outputs.iteritems())
return flask.jsonify({'outputs': result}), status_code
else:
return flask.render_template(
'models/images/generic/infer_many.html',
model_job=model_job,
job=inference_job,
paths=paths,
inference_views_html=inference_views_html,
header_html=header_html,
app_begin_html=app_begin_html,
app_end_html=app_end_html,
), status_code
def create_inference_db(model_job, data_extension_id):
# create instance of extension class
extension_class = extensions.data.get_extension(data_extension_id)
if hasattr(model_job.dataset, 'extension_userdata'):
extension_userdata = model_job.dataset.extension_userdata
else:
extension_userdata = {}
extension_userdata.update({'is_inference_db': True})
extension = extension_class(**extension_userdata)
extension_form = extension.get_inference_form()
extension_form_valid = extension_form.validate_on_submit()
if not extension_form_valid:
errors = extension_form.errors.copy()
raise werkzeug.exceptions.BadRequest(repr(errors))
extension.userdata.update(extension_form.data)
# create job
job = GenericDatasetJob(
username=utils.auth.get_username(),
name='Inference dataset',
group=None,
backend='lmdb',
feature_encoding='none',
label_encoding='none',
batch_size=1,
num_threads=1,
force_same_shape=0,
extension_id=data_extension_id,
extension_userdata=extension.get_user_data(),
)
# schedule tasks and wait for job to complete
scheduler.add_job(job)
job.wait_completion()
# check for errors
if job.status != Status.DONE:
msg = ""
for task in job.tasks:
if task.exception:
msg = msg + task.exception
if task.traceback:
msg = msg + task.exception
raise RuntimeError(msg)
return job
def get_datasets(extension_id):
if extension_id:
jobs = [j for j in scheduler.jobs.values()
if isinstance(j, GenericDatasetJob) and
j.extension_id == extension_id and (j.status.is_running() or j.status == Status.DONE)]
else:
jobs = [j for j in scheduler.jobs.values()
if (isinstance(j, GenericImageDatasetJob) or isinstance(j, GenericDatasetJob)) and
(j.status.is_running() or j.status == Status.DONE)]
return [(j.id(), j.name())
for j in sorted(jobs, cmp=lambda x, y: cmp(y.id(), x.id()))]
def get_inference_visualizations(dataset, inputs, outputs):
# get extension ID from form and retrieve extension class
if 'view_extension_id' in flask.request.form:
view_extension_id = flask.request.form['view_extension_id']
extension_class = extensions.view.get_extension(view_extension_id)
if extension_class is None:
raise ValueError("Unknown extension '%s'" % view_extension_id)
else:
# no view extension specified, use default
extension_class = extensions.view.get_default_extension()
extension_form = extension_class.get_config_form()
# validate form
extension_form_valid = extension_form.validate_on_submit()
if not extension_form_valid:
raise ValueError("Extension form validation failed with %s" % repr(extension_form.errors))
# create instance of extension class
extension = extension_class(dataset, **extension_form.data)
visualizations = []
# process data
n = len(inputs['ids'])
for idx in xrange(n):
input_id = inputs['ids'][idx]
input_data = inputs['data'][idx]
output_data = {key: outputs[key][idx] for key in outputs}
data = extension.process_data(
input_id,
input_data,
output_data)
template, context = extension.get_view_template(data)
visualizations.append(
flask.render_template_string(template, **context))
# get header
template, context = extension.get_header_template()
header = flask.render_template_string(template, **context) if template else None
app_begin, app_end = extension.get_ng_templates()
return visualizations, header, app_begin, app_end
def get_previous_networks():
return [(j.id(), j.name()) for j in sorted(
[j for j in scheduler.jobs.values() if isinstance(j, GenericImageModelJob)],
cmp=lambda x, y: cmp(y.id(), x.id())
)
]
def get_previous_networks_fulldetails():
return [(j) for j in sorted(
[j for j in scheduler.jobs.values() if isinstance(j, GenericImageModelJob)],
cmp=lambda x, y: cmp(y.id(), x.id())
)
]
def get_previous_network_snapshots():
prev_network_snapshots = []
for job_id, _ in get_previous_networks():
job = scheduler.get_job(job_id)
e = [(0, 'None')] + [(epoch, 'Epoch #%s' % epoch)
for _, epoch in reversed(job.train_task().snapshots)]
if job.train_task().pretrained_model:
e.insert(0, (-1, 'Previous pretrained model'))
prev_network_snapshots.append(e)
return prev_network_snapshots
def get_pretrained_networks():
return [(j.id(), j.name()) for j in sorted(
[j for j in scheduler.jobs.values() if isinstance(j, PretrainedModelJob)],
cmp=lambda x, y: cmp(y.id(), x.id())
)
]
def get_pretrained_networks_fulldetails():
return [(j) for j in sorted(
[j for j in scheduler.jobs.values() if isinstance(j, PretrainedModelJob)],
cmp=lambda x, y: cmp(y.id(), x.id())
)
]
def get_data_extensions():
"""
return all enabled data extensions
"""
data_extensions = {"all-default": "Default"}
all_extensions = extensions.data.get_extensions()
for extension in all_extensions:
data_extensions[extension.get_id()] = extension.get_title()
return data_extensions
def get_view_extensions():
"""
return all enabled view extensions
"""
view_extensions = {}
all_extensions = extensions.view.get_extensions()
for extension in all_extensions:
view_extensions[extension.get_id()] = extension.get_title()
return view_extensions
@MadsBuus
Copy link

MadsBuus commented Mar 13, 2018

import base64
import io as pio
import numpy as np
import skimage
from skimage import data, io, filters

def red_ratio(image):
    red_image = image[:,:,0]
    red_pixels = np.count_nonzero(red_image)
    return red_pixels / red_image.size

def read_from_base64(encoded_image_uri):
    encoded_data = encoded_image_uri.split(',')[1]
    raw = base64.b64decode(encoded_data)
    return skimage.io.imread(pio.BytesIO(raw))

# examples:

# directly from base64 url:
# image_data = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAXU...'
raw_image = read_from_base64(image_data)
print(red_ratio(raw_image))

#from png file
file_image = skimage.io.imread("test2.png")
print(red_ratio(file_image))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment