Spaces:
Sleeping
Sleeping
File size: 16,415 Bytes
3fde113 783df49 3fde113 a17e48f 783df49 a17e48f 783df49 e8483ce 9aab6a2 030bcf4 4083e28 9aab6a2 393770d 9aab6a2 cf19404 393770d a17e48f 393770d 3fde113 e0ab7f1 3daae96 9261560 a17e48f 9261560 a17e48f 9261560 a17e48f 9261560 a17e48f 9261560 a17e48f 3fde113 a17e48f 3fde113 a17e48f cf19404 9aab6a2 cf19404 9aab6a2 ed4a174 7168ed6 ed4a174 9aab6a2 0cece18 9aab6a2 7168ed6 76e8490 4083e28 a17e48f 4083e28 a17e48f 16cc8a8 f87fc7c 7168ed6 f293b15 4083e28 f87fc7c 4083e28 3bf57af 9aab6a2 4083e28 9aab6a2 4083e28 f87fc7c 4083e28 de3ab4f 9aab6a2 de3ab4f 7168ed6 de3ab4f 93495fe de3ab4f 3fde113 9aab6a2 8879568 9aab6a2 76e8490 9aab6a2 76e8490 8879568 4083e28 9aab6a2 f87fc7c 4083e28 14138ac 4083e28 f41a82a a17e48f 33a475f a17e48f f41a82a 3fde113 5101b3b bf69658 a17e48f bc333a8 5101b3b 53c7bc2 a17e48f bf69658 5101b3b a17e48f f41a82a |
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 |
import gradio as gr
import torch
import theme
theme = theme.Theme()
from huggingface_hub import from_pretrained_keras
from tensorflow.keras.applications import EfficientNetB0
import tensorflow as tf
from tensorflow import keras
from PIL import Image
from pydantic.v1 import BaseModel, Field
import shutil
import tenacity
#langchain
from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.prompts import PromptTemplate
from langchain.chains import RetrievalQA
from langchain.prompts import ChatPromptTemplate
from langchain.schema import StrOutputParser
from langchain.schema.runnable import Runnable
from langchain.schema.runnable.config import RunnableConfig
from langchain.chains import (
LLMChain, ConversationalRetrievalChain)
from langchain.vectorstores import Chroma
from langchain.memory import ConversationBufferMemory
from langchain.chains import LLMChain
from langchain.prompts.chat import ChatPromptTemplate, SystemMessagePromptTemplate
from langchain.prompts import SystemMessagePromptTemplate, HumanMessagePromptTemplate, ChatPromptTemplate, MessagesPlaceholder
from langchain.output_parsers import PydanticOutputParser
from langchain_community.llms import HuggingFaceHub
from langchain_community.document_loaders import WebBaseLoader
from fake_useragent import UserAgent
custom_title = "<span style='color: rgb(243, 239, 224);'>Green Greta</span>"
# Cell 1: Image Classification Model
model1 = from_pretrained_keras("rocioadlc/efficientnetB0_trash")
# Define class labels
class_labels = ['cardboard', 'glass', 'metal', 'paper', 'plastic', 'trash']
# Function to predict image label and score
def predict_image(input):
# Resize the image to the size expected by the model and convert to numpy array
image_array = tf.keras.preprocessing.image.img_to_array(input.resize((244, 224))) # Cambiar el orden de las dimensiones
# Normalize the image
image_array = tf.keras.applications.efficientnet.preprocess_input(image_array)
# Expand the dimensions to create a batch
image_array = tf.expand_dims(image_array, 0)
# Predict using the model
predictions = model1.predict(image_array)
category_scores = {}
for i, class_label in enumerate(class_labels):
category_scores[class_label] = predictions[0][i].item()
return category_scores
image_gradio_app = gr.Interface(
fn=predict_image,
inputs=gr.Image(label="Image", sources=['upload', 'webcam'], type="pil"),
outputs=[gr.Label(label="Result")],
title=custom_title,
theme=theme
)
# Cell 2: ChatBot Model
# Generate a random user agent
user_agent = UserAgent().random
header_template = {"User-Agent": user_agent}
# Create the loader with the headers
loader = WebBaseLoader(
web_paths=[
"https://www.epa.gov/recycle/frequent-questions-recycling",
"https://www.whitehorsedc.gov.uk/vale-of-white-horse-district-council/recycling-rubbish-and-waste/lets-get-real-about-recycling/",
"https://www.teimas.com/blog/13-preguntas-y-respuestas-sobre-la-ley-de-residuos-07-2022",
"https://www.molok.com/es/blog/gestion-de-residuos-solidos-urbanos-rsu-10-dudas-comunes",
"https://espanol.epa.gov/espanol/el-reciclaje#valelapena",
"https://espanol.epa.gov/espanol/preguntas-frecuentes-sobre-reciclado-de-plastico-y-elaboracion-de-abono-vegetal",
"https://espanol.epa.gov/espanol/consejo-del-dia-como-reciclo-mis",
"https://espanol.epa.gov/espanol/recursos-para-reciclar-dispositivos-electronicos",
"https://www.epa.gov/recycle/electronics-donation-and-recycling",
"https://reducereutilizarecicla.org/que-es-el-reciclaje/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/contenedor-amarillo/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/contenedor-azul/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/contenedor-verde/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/contenedor-marron-organico/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/contenedor-gris-restos/",
"https://reducereutilizarecicla.org/contenedores-de-reciclaje/punto-limpio/",
"https://reducereutilizarecicla.org/donde-tirar-auriculares/",
"https://reducereutilizarecicla.org/donde-tirar-sartenes/",
"https://reducereutilizarecicla.org/donde-tirar-aceite-usado/",
"https://reducereutilizarecicla.org/como-se-reciclan-los-envases-tipo-brik/",
"https://reducereutilizarecicla.org/los-envases-del-verano/",
"https://reducereutilizarecicla.org/donde-tirar-radiografias/",
"https://reducereutilizarecicla.org/envases-ecologicos/",
"https://reducereutilizarecicla.org/donde-tirar-los-restos-de-pintura/",
"https://reducereutilizarecicla.org/valorizacion-de-residuos/",
"https://reducereutilizarecicla.org/como-reciclar-pilas/",
"https://reducereutilizarecicla.org/como-reciclar-capsulas-de-cafe/",
"https://reducereutilizarecicla.org/reciclando-cd/",
"https://reducereutilizarecicla.org/donde-tirar-neumaticos/",
"https://reducereutilizarecicla.org/como-reciclar-una-canasta-de-mimbre/",
"https://reducereutilizarecicla.org/como-funciona-el-contenedor-amarillo/",
"https://reducereutilizarecicla.org/donde-se-tiran-los-vapers/",
"https://reducereutilizarecicla.org/cuanto-tarda-una-bolsa-biodegradable-en-degradarse/",
"https://reducereutilizarecicla.org/donde-se-reciclan-los-juguetes/",
"https://reducereutilizarecicla.org/objetos-que-se-pueden-reutilizar/",
"https://reducereutilizarecicla.org/la-parafina-se-puede-reutilizar/",
"https://reducereutilizarecicla.org/planta-de-reciclaje-de-papel/",
"https://reducereutilizarecicla.org/como-saber-si-un-envase-es-reciclable/",
"https://reducereutilizarecicla.org/reutilizar-vasos-de-vela/",
"https://reducereutilizarecicla.org/bolsas-frio-calor/",
"https://reducereutilizarecicla.org/reciclar-y-reutilizar-materiales-de-construccion/",
"https://reducereutilizarecicla.org/que-es-exactamente-el-pet/",
"https://reducereutilizarecicla.org/tipos-de-reciclaje/",
"https://reducereutilizarecicla.org/que-hacer-con-palets-reciclados/",
"https://reducereutilizarecicla.org/vertederos-controlados/",
"https://reducereutilizarecicla.org/donde-tirar-escombros/",
"https://reducereutilizarecicla.org/como-reciclar-los-residuos-de-ps-poliestireno/",
"https://reducereutilizarecicla.org/tirar-la-basura-sin-bolsas/",
"https://reducereutilizarecicla.org/tirar-el-palo-de-la-fregona/",
"https://reducereutilizarecicla.org/la-mejor-manera-de-reciclar-una-pala-de-padel/",
"https://reducereutilizarecicla.org/sabes-donde-tirar-las-llantas-viejas-de-un-coche/",
"https://reducereutilizarecicla.org/sabes-donde-tirar-el-arbol-de-navidad/",
"https://reducereutilizarecicla.org/clavos-tornillos-herramientas-donde-tirar-hierro/",
"https://reducereutilizarecicla.org/donde-tirar-un-secador-de-pelo-contenedor-o-punto-limpio/",
"https://reducereutilizarecicla.org/donde-tirar-electrodomesticos/",
"https://reducereutilizarecicla.org/donde-puedo-tirar-ramas-de-arboles/",
"https://reducereutilizarecicla.org/donde-tirar-escombros/",
"https://reducereutilizarecicla.org/donde-se-tira-el-muerdago-quemado/",
"https://reducereutilizarecicla.org/sandalias-caucho-reciclado-neumaticos/",
"https://reducereutilizarecicla.org/ideas-para-reciclar-aspas-de-ventilador-de-techo/",
"https://reducereutilizarecicla.org/reciclar-sacos-dormir/",
"https://reducereutilizarecicla.org/reciclar-sillas-playa/",
"https://reducereutilizarecicla.org/donde-tirar-antipolillas/",
"https://reducereutilizarecicla.org/que-hacer-con-los-juguetes-viejos/",
"https://reducereutilizarecicla.org/como-utilizar-las-mascarillas-y-el-gel-hidroalcoholico-en-la-playa/",
"https://reducereutilizarecicla.org/ideas-para-reciclar-un-ventilador-de-pie/",
"https://reducereutilizarecicla.org/donde-tirar-gasoil/",
"https://reducereutilizarecicla.org/donde-puedo-tirar-basura-electronica/",
"https://reducereutilizarecicla.org/donde-tirar-agujas/",
"https://reducereutilizarecicla.org/donde-tirar-residuos-peligrosos/",
"https://reducereutilizarecicla.org/donde-tirar-los-cables/",
"https://reducereutilizarecicla.org/donde-tirar-bicicletas/",
"https://reducereutilizarecicla.org/donde-tirar-maletas/",
"https://reducereutilizarecicla.org/como-reciclar-una-pantalla/",
"https://reducereutilizarecicla.org/donde-tirar-ropa-usada/"
],
header_template=header_template
)
data=loader.load()
# split documents
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1024,
chunk_overlap=150,
length_function=len
)
docs = text_splitter.split_documents(data)
# define embedding
embeddings = HuggingFaceEmbeddings(model_name='thenlper/gte-small')
# create vector database from data
persist_directory = 'docs/chroma/'
# Remove old database files if any
shutil.rmtree(persist_directory, ignore_errors=True)
vectordb = Chroma.from_documents(
documents=docs,
embedding=embeddings,
persist_directory=persist_directory
)
# define retriever
retriever = vectordb.as_retriever(search_kwargs={"k": 2}, search_type="mmr")
class FinalAnswer(BaseModel):
question: str = Field()
answer: str = Field()
# Assuming you have a parser for the FinalAnswer class
parser = PydanticOutputParser(pydantic_object=FinalAnswer)
template = """
Your name is Greta and you are a recycling chatbot with the objective to anwer questions from user in English or Spanish /
Has sido diseñado y creado por el Grupo 1 del Máster en Data Science & Big Data de la promoción 2023/2024 de la Universidad Complutense de Madrid. Este grupo está fromado por Rocío, María Guillermo, Alejandra, Paloma y Álvaro /
Use the following pieces of context to answer the question /
If the question is English answer in English /
If the question is Spanish answer in Spanish /
Do not mention the word context when you answer a question /
Answer the question fully and provide as much relevant detail as possible. Do not cut your response short /
Context: {context}
User: {question}
{format_instructions}
"""
# Create the chat prompt templates
sys_prompt = SystemMessagePromptTemplate.from_template(template)
qa_prompt = ChatPromptTemplate(
messages=[
sys_prompt,
HumanMessagePromptTemplate.from_template("{question}")],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
llm = HuggingFaceHub(
repo_id="mistralai/Mixtral-8x7B-Instruct-v0.1",
task="text-generation",
model_kwargs={
"max_new_tokens": 2000,
"top_k": 30,
"temperature": 0.1,
"repetition_penalty": 1.03
},
)
qa_chain = ConversationalRetrievalChain.from_llm(
llm = llm,
memory = ConversationBufferMemory(llm=llm, memory_key="chat_history", input_key='question', output_key='output'),
retriever = retriever,
verbose = True,
combine_docs_chain_kwargs={'prompt': qa_prompt},
get_chat_history = lambda h : h,
rephrase_question = False,
output_key = 'output',
)
def chat_interface(question,history):
result = qa_chain.invoke({'question': question})
output_string = result['output']
# Find the index of the last occurrence of "answer": in the string
answer_index = output_string.rfind('"answer":')
# Extract the substring starting from the "answer": index
answer_part = output_string[answer_index + len('"answer":'):].strip()
# Find the next occurrence of a double quote to get the start of the answer value
quote_index = answer_part.find('"')
# Extract the answer value between double quotes
answer_value = answer_part[quote_index + 1:answer_part.find('"', quote_index + 1)]
return answer_value
chatbot_gradio_app = gr.ChatInterface(
fn=chat_interface,
title=custom_title
)
# Banner tab
banner_tab_content = """
<div style="background-color: #d3e3c3; text-align: center; padding: 20px; display: flex; flex-direction: column; align-items: center;">
<img src="https://huggingface.co/spaces/ALVHB95/TFM_DataScience_APP/resolve/main/front_4.jpg" alt="Banner Image" style="width: 50%; max-width: 500px; margin: 0 auto;">
<h1 style="font-size: 24px; color: #4e6339; margin-top: 20px;">¡Bienvenido a nuestro clasificador de imágenes y chatbot para un reciclaje más inteligente!♻️</h1>
<p style="font-size: 16px; color: #4e6339; text-align: justify;">¿Alguna vez te has preguntado si puedes reciclar un objeto en particular? ¿O te has sentido abrumado por la cantidad de residuos que generas y no sabes cómo manejarlos de manera más sostenible? ¡Estás en el lugar correcto!</p>
<p style="font-size: 16px; color: #4e6339; text-align: justify;">Nuestra plataforma combina la potencia de la inteligencia artificial con la comodidad de un chatbot para brindarte respuestas rápidas y precisas sobre qué objetos son reciclables y cómo hacerlo de la manera más eficiente.</p>
<p style="font-size: 16px; text-align:center;"><strong><span style="color: #4e6339;">¿Cómo usarlo?</span></strong></p>
<ul style="list-style-type: disc; text-align: justify; margin-top: 20px; padding-left: 20px;">
<li style="font-size: 16px; color: #4e6339;"><strong><span style="color: #4e6339;">Green Greta Image Classification:</span></strong> Ve a la pestaña Greta Image Classification y simplemente carga una foto del objeto que quieras reciclar, y nuestro modelo de identificará de qué se trata🕵️♂️ para que puedas desecharlo adecuadamente.</li>
<li style="font-size: 16px; color: #4e6339;"><strong><span style="color: #4e6339;">Green Greta Chat:</span></strong> ¿Tienes preguntas sobre reciclaje, materiales específicos o prácticas sostenibles? ¡Pregunta a nuestro chatbot en la pestaña Green Greta Chat!📝 Está aquí para responder todas tus preguntas y ayudarte a tomar decisiones más informadas sobre tu reciclaje.</li>
</ul>
<h1 style="font-size: 24px; color: #4e6339; margin-top: 20px;">Welcome to our image classifier and chatbot for smarter recycling!♻️</h1>
<p style="font-size: 16px; color: #4e6339; text-align: justify;">Have you ever wondered if you can recycle a particular object? Or felt overwhelmed by the amount of waste you generate and don't know how to handle it more sustainably? You're in the right place!</p>
<p style="font-size: 16px; color: #4e6339; text-align: justify;">Our platform combines the power of artificial intelligence with the convenience of a chatbot to provide you with quick and accurate answers about which objects are recyclable and how to do it most efficiently.</p>
<p style="font-size: 16px; text-align:center;"><strong><span style="color: #4e6339;">How to use it?</span></strong>
<ul style="list-style-type: disc; text-align: justify; margin-top: 20px; padding-left: 20px;">
<li style="font-size: 16px; color: #4e6339;"><strong><span style="color: #4e6339;">Green Greta Image Classification:</span></strong> Go to the Greta Image Classification tab and simply upload a photo of the object you want to recycle, and our model will identify what it is🕵️♂️ so you can dispose of it properly.</li>
<li style="font-size: 16px; color: #4e6339;"><strong><span style="color: #4e6339;">Green Greta Chat:</span></strong> Have questions about recycling, specific materials, or sustainable practices? Ask our chatbot in the Green Greta Chat tab!📝 It's here to answer all your questions and help you make more informed decisions about your recycling.</li>
</ul>
</div>
"""
banner_tab = gr.Markdown(banner_tab_content)
# Combine interfaces into a single app
app = gr.TabbedInterface(
[banner_tab, image_gradio_app, chatbot_gradio_app],
tab_names=["Welcome to Green Greta", "Green Greta Image Classification", "Green Greta Chat"],
theme=theme
)
app.queue()
app.launch() |