modelProblems / app.py
temp-9384289
latest models
360e2a9
raw
history blame contribute delete
No virus
10.9 kB
# notes https://huggingface.co/spaces/Joeythemonster/Text-To-image-AllModels/blob/main/app.py
from diffusers import StableDiffusionPipeline
from diffusers import DiffusionPipeline
import torch
import time
import matplotlib.pyplot as plt
import tensorflow as tf
import os
import sys
import requests
from image_similarity_measures.evaluate import evaluation
from PIL import Image
from huggingface_hub import from_pretrained_keras
from math import sqrt, ceil
import numpy as np
from transformers import pipeline
import pandas as pd
import gradio as gr
import base64
modelieo=[
'nathanReitinger/MNIST-diffusion',
'nathanReitinger/MNIST-diffusion-oneImage',
'nathanReitinger/MNIST-diffusion-threeHundredImages',
'nathanReitinger/MNIST-diffusion-threeThousandImages',
'nathanReitinger/MNIST-GAN',
'nathanReitinger/MNIST-GAN-noDropout',
'nathanReitinger/FASHION-diffusion',
'nathanReitinger/FASHION-diffusion-oneImage',
]
def get_sims(gen_filepath, gen_label, file_path, hunting_time_limit, data_type):
if data_type == 'mnist':
(train_images, train_labels), (_, _) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
train_images = (train_images - 127.5) / 127.5 # Normalize the images to [-1, 1]
else:
(train_images, train_labels), (_, _) = tf.keras.datasets.fashion_mnist.load_data()
train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
train_images = (train_images - 127.5) / 127.5 # Normalize the images to [-1, 1]
print("how long to hunt", hunting_time_limit)
if hunting_time_limit == None:
hunting_time_limit = 2
train_label_mapping = {
0: 'T - shirt / top',
1: 'Trouser',
2: 'Pullover',
3: 'Dress',
4: 'Coat',
5: 'Sandal',
6: 'Shirt',
7: 'Sneaker',
8: 'Bag',
9: 'Ankle boot'
}
lowest_score = 10000
lowest_image = None
lowest_image_path = ''
start = time.time()
for i in range(len(train_labels)):
if data_type == 'fashion':
label_option = train_label_mapping[train_labels[i]]
else:
label_option = train_labels[i]
# print(data_type, i, label_option, gen_label)
if label_option == gen_label:
print('match on types!')
###
# get a real image (of correct number)
###
# print(i)
to_check = train_images[i]
fig = plt.figure(figsize=(1, 1))
plt.subplot(1, 1, 0+1)
plt.imshow(to_check, cmap='gray')
plt.axis('off')
plt.savefig(file_path + 'real_deal.png')
plt.close()
# baseline = evaluation(org_img_path='results/real_deal.png', pred_img_path='results/real_deal.png', metrics=["rmse", "psnr"])
# print("---")
###
# check how close that real training data is to generated number
###
results = evaluation(org_img_path=file_path + 'real_deal.png', pred_img_path=file_path+'generated_image.png', metrics=["rmse", "psnr"])
if results['rmse'] < lowest_score:
lowest_score = results['rmse']
lowest_image = to_check
to_save = train_images[i]
fig = plt.figure(figsize=(1, 1))
plt.subplot(1, 1, 0+1)
plt.imshow(to_save, cmap='gray')
plt.axis('off')
plt.savefig(file_path + 'keeper.png')
plt.close()
lowest_image_path = file_path + 'keeper.png'
print(lowest_score, str(round( ((i/len(train_labels)) * 100),2 )) + '%')
now = time.time()
if now-start > hunting_time_limit:
print(str(now-start) + "s")
return [lowest_image_path, lowest_score]
return [lowest_image_path, lowest_score]
def digit_recognition(filename, data_type):
if data_type == 'mnist':
# API_URL = "https://api-inference.huggingface.co/models/farleyknight/mnist-digit-classification-2022-09-04"
# special_string = '-h-f-_-RT-U-J-E-M-Pb-GC-c-i-v-sji-bMsQmxuh-x-h-C-W-B-F-W-z-Gv-'
# is_escaped = special_string.replace("-", '')
# bear = "Bearer " + is_escaped
# headers = {"Authorization": bear}
# # get a prediction on what number this is
# def query(filename):
# with open(filename, "rb") as f:
# data = f.read()
# response = requests.post(API_URL, headers=headers, data=data)
# return response.json()
# # use latest model to generate a new image, return path
# ret = False
# output = None
# while ret == False:
# output = query(filename + 'generated_image.png')
# if 'error' in output:
# time.sleep(10)
# ret = False
# else:
# ret = True
# slower than inferenceAPI, but no tokens needed
pipe = pipeline("image-classification", model="farleyknight/mnist-digit-classification-2022-09-04")
output = pipe(filename + 'generated_image.png')
print(output)
this_label_for_this_image = int(output[0]['label'])
else:
pipe = pipeline("image-classification", model="nathanReitinger/FASHION-vision")
output = pipe(filename + 'generated_image.png')
this_label_for_this_image = output[0]['label']
print(output)
print(this_label_for_this_image)
print(output, this_label_for_this_image)
return {'full': output, 'number': this_label_for_this_image}
def get_other(original_image, hunting_time_limit, data_type):
RANDO = str(time.time())
file_path = 'tester/' + 'generation' + "/" + RANDO + '/'
os.makedirs(file_path)
fig = plt.figure(figsize=(1, 1))
plt.subplot(1, 1, 0+1)
plt.imshow(original_image, cmap='gray')
plt.axis('off')
plt.savefig(file_path + 'generated_image.png')
plt.close()
print('[+] done saving generation')
print("[-] what digit is this")
print(data_type)
# sys.exit()
ret = digit_recognition(file_path, data_type)
print(ret['full'])
print(ret['number'])
print("[+]", ret['number'])
print("[-] show some most similar numbers")
if ret["full"][0]['score'] <= 0.90:
print("[!] error in image recognition, likely to not find a similar score")
return (file_path + 'generated_image.png', ['error.png', -1])
# sys.exit()
gen_filepath = file_path + 'generated_image.png'
gen_label = ret['number']
ret_sims = get_sims(gen_filepath, gen_label, file_path, hunting_time_limit, data_type)
print(ret_sims)
print("[+] done sims")
# get the file-Path
return (file_path + 'generated_image.png', ret_sims)
def generate_and_save_images(model):
noise_dim = 100
num_examples_to_generate = 1
seed = tf.random.normal([num_examples_to_generate, noise_dim])
# print(seed)
n_samples = 1
# Notice `training` is set to False.
# This is so all layers run in inference mode (batchnorm).
examples = model(seed, training=False)
examples = examples * 255.0
size = ceil(sqrt(n_samples))
digit_images = np.zeros((28*size, 28*size), dtype=float)
n = 0
for i in range(size):
for j in range(size):
if n == n_samples:
break
digit_images[i* 28 : (i+1)*28, j*28 : (j+1)*28] = examples[n, :, :, 0]
n += 1
digit_images = (digit_images/127.5) -1
return digit_images
def TextToImage(Prompt,inference_steps, model):
model_id = model
if 'GAN' in model_id:
print("--> GAN <--")
model = from_pretrained_keras(model)
image = generate_and_save_images(model)
else:
print("--> DIFFUSION <--")
pipe = DiffusionPipeline.from_pretrained(model_id)
the_randomness = int(str(time.time())[-1])
print('seed', the_randomness)
image = pipe(generator= torch.manual_seed(the_randomness), num_inference_steps=inference_steps).images[0]
prompt = Prompt
print(prompt)
hunting_time_limit = None
if prompt.isnumeric():
hunting_time_limit = abs(int(prompt))
if 'FASHION' in model_id:
data_type = 'fashion'
if 'MNIST' in model_id:
data_type = 'mnist'
original_image, other_images = get_other(image, hunting_time_limit, data_type=data_type)
the_file = other_images[0]
the_rmse = other_images[1]
ai_gen = Image.open(open(original_image, 'rb'))
training_data = Image.open(open(the_file, 'rb'))
another_one = (training_data, "Training Data (RMSE: " + str(round(the_rmse,5) ) + ")")
return [ai_gen, another_one]
df = pd.DataFrame({
"Model" : ['MNIST-diffusion', 'MNIST-diffusion-oneImage', 'MNIST-diffusion-threeHundredImages', 'MNIST-diffusion-threeThousandImages', 'MNIST-GAN', 'MNIST-GAN-noDropout', 'FASHION-diffuion-oneImage', 'FASHION-diffusion'],
"Class (Architecture)" : ['UNet2DModel', 'UNet2DModel', 'UNet2DModel', 'UNet2DModel', 'Sequential', 'Sequential', 'UNet2DModel', 'UNet2DModel'],
"Dataset Examples" : [60000, 1, 300, 3000, 60000, 60000, 1, 60000],
"Notes" : ['similar architecture as Stable Diffusion, different training data', 'toy model, purposed to store protected content', 'testing toy model with slightly larger dataset', 'testing toy model with even more data', 'GANs are not as likely to store protected content', 'less dropout, more copying?', 'same diffusion, different data (more variance in data)','larger diffusion training data, on FASHION dataset']
})
# Applying style to highlight the maximum value in each row
styler = df#.style.highlight_max(color = 'lightgreen', axis = 0)
with gr.Blocks() as app:
interface = gr.Interface(fn=TextToImage,
inputs=[gr.Textbox(show_label=True, label='How many seconds to hunt for copies?',), gr.Slider(1, 1000, label='Inference Steps (leave unchanged for default, best is 1000 but it is slow!)', value=10, step=1), gr.Dropdown(modelieo)],
outputs=gr.Gallery(label="Generated image", show_label=True, elem_id="gallery", columns=[2], rows=[1], object_fit="contain", height="auto"),
# css="#output_image{width: 256px !important; height: 256px !important;}",
title='Unconditional Image Generation',
)
gr.HTML(
"<hr>"
"<h1><center>Do machine learing models store protected content?</center></h1>" +
"<p><center><span style='color: red;'>Enter a time to hunt for copies (seconds), select a model, and hit submit!</center></p>" +
"<p><center><strong>These image generation models will give you a 'bespoke' generation ❤ of an <a href='https://paperswithcode.com/dataset/mnist'>MNIST hand-drawn digit</a> or the <a href='https://www.tensorflow.org/datasets/catalog/fashion_mnist'>fashion dataset</a></p> " +
"<p><center>then the program will search in training data (for <i>n</i> seconds) to find similar images: <a href='https://medium.com/@mygreatlearning/rmse-what-does-it-mean-2d446c0b1d0e'>RMSE</a>, lower is more similar</p>" +
"<p><a href='https://nathanreitinger.umiacs.io'>@nathanReitinger</a></p>"
)
gr.Dataframe(styler)
app.queue().launch()
# interface.launch(share=True)