HenriqueBraz commited on
Commit
5fbcec5
·
verified ·
1 Parent(s): 9f48351

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +257 -86
app.py CHANGED
@@ -124,7 +124,8 @@ def load_models():
124
  )
125
 
126
  # Modelos generativos
127
- models['text_to_image'] = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",
 
128
  torch_dtype=torch.float16,
129
  use_safetensors=True,
130
  safety_checker=None,
@@ -159,12 +160,10 @@ def validate_image_file(file: UploadedFile) -> bool:
159
  def process_audio_file(audio_file):
160
  """Processa arquivo de áudio para o formato correto"""
161
  try:
162
- # Criar arquivo temporário para processamento
163
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(audio_file.name)[1]) as tmp_file:
164
  tmp_file.write(audio_file.read())
165
  tmp_file_path = tmp_file.name
166
 
167
- # Carregar áudio com librosa
168
  audio_array, sample_rate = librosa.load(tmp_file_path, sr=16000)
169
  os.unlink(tmp_file_path)
170
 
@@ -244,6 +243,151 @@ def display_results(result, model_key):
244
  st.subheader("🎨 Imagem Gerada")
245
  st.image(result[0], caption="Imagem gerada a partir do texto")
246
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  def main():
248
  st.title("🤖 Aplicação de IA Multi-Modal Avançada")
249
  st.markdown("---")
@@ -256,94 +400,121 @@ def main():
256
  st.error("Falha crítica ao carregar os modelos. Verifique os logs para mais detalhes.")
257
  return
258
 
259
- # Sidebar para seleção de modelo
260
- st.sidebar.title("⚙️ Configurações")
261
- model_categories = {
262
- "📝 Processamento de Texto": [
263
- ("Análise de Sentimento", "sentiment_analysis"),
264
- ("Classificação de Texto", "text_classification"),
265
- ("Resumo de Texto", "summarization"),
266
- ("Perguntas e Respostas", "question_answering"),
267
- ("Tradução (EN→PT)", "translation"),
268
- ("Reconhecimento de Entidades", "ner"),
269
- ("Geração de Texto", "text_generation")
270
- ],
271
- "🖼️ Processamento de Imagem": [
272
- ("Classificação de Imagem", "image_classification"),
273
- ("Detecção de Objetos", "object_detection"),
274
- ("Segmentação de Imagem", "image_segmentation"),
275
- ("Reconhecimento Facial", "facial_recognition")
276
- ],
277
- "🎵 Processamento de Áudio": [
278
- ("Transcrição de Áudio", "speech_to_text"),
279
- ("Classificação de Emoções", "audio_classification")
280
- ],
281
- " Modelos Generativos": [
282
- ("Texto para Imagem", "text_to_image")
283
- ]
284
- }
285
-
286
- selected_category = st.sidebar.selectbox(
287
- "Categoria",
288
- list(model_categories.keys()),
289
- index=0
290
- )
291
-
292
- selected_model = st.sidebar.selectbox(
293
- "Modelo",
294
- [name for name, key in model_categories[selected_category]],
295
- format_func=lambda x: x,
296
- index=0
297
- )
298
-
299
- # Obter chave do modelo selecionado
300
- model_key = next(key for name, key in model_categories[selected_category] if name == selected_model)
301
-
302
- # Interface principal
303
- st.header(f"{selected_model}")
304
-
305
- # Accordion para informações do modelo
306
- with st.expander("ℹ️ Sobre este modelo"):
307
- model_info = {
308
- 'sentiment_analysis': "Analisa o sentimento expresso em um texto (positivo/negativo/neutro)",
309
- 'text_classification': "Classifica textos em categorias pré-definidas",
310
- 'summarization': "Gera um resumo conciso de um texto longo",
311
- 'question_answering': "Responde perguntas baseadas em um contexto fornecido",
312
- 'translation': "Traduz texto de inglês para português",
313
- 'ner': "Identifica e classifica entidades nomeadas (pessoas, lugares, organizações)",
314
- 'text_generation': "Gera texto criativo continuando a partir de um prompt",
315
- 'image_classification': "Identifica objetos e cenas em imagens",
316
- 'object_detection': "Detecta e localiza múltiplos objetos em uma imagem",
317
- 'image_segmentation': "Segmenta diferentes elementos em uma imagem",
318
- 'facial_recognition': "Reconhece características faciais e emoções",
319
- 'speech_to_text': "Transcreve fala em texto",
320
- 'audio_classification': "Classifica emoções em arquivos de áudio",
321
- 'text_to_image': "Gera imagens a partir de descrições textuais"
322
  }
323
- st.info(model_info.get(model_key, "Informações detalhadas sobre este modelo."))
324
-
325
- # Processamento baseado no tipo de modelo
326
- try:
327
- if model_key in ['sentiment_analysis', 'text_classification', 'summarization',
328
- 'translation', 'text_generation', 'ner']:
329
- handle_text_models(models, model_key, selected_model)
330
 
331
- elif model_key == 'question_answering':
332
- handle_qa_model(models, model_key)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
333
 
334
- elif model_key in ['image_classification', 'object_detection',
335
- 'image_segmentation', 'facial_recognition']:
336
- handle_image_models(models, model_key, selected_model)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
337
 
338
- elif model_key in ['speech_to_text', 'audio_classification']:
339
- handle_audio_models(models, model_key)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
340
 
341
- elif model_key == 'text_to_image':
342
- handle_generative_models(models, model_key)
 
343
 
344
- except Exception as e:
345
- st.error(f"Erro inesperado durante a execução: {str(e)}")
346
- logging.exception("Erro durante a execução do modelo")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
 
348
  def handle_text_models(models, model_key, model_name):
349
  """Manipula modelos de texto"""
@@ -373,7 +544,7 @@ def handle_text_models(models, model_key, model_name):
373
  try:
374
  if model_key == 'ner':
375
  result = models[model_key](input_text)
376
- elif model_key== 'text_generation':
377
  result = models[model_key](
378
  input_text,
379
  max_new_tokens=advanced_params.get('max_length', 100),
 
124
  )
125
 
126
  # Modelos generativos
127
+ models['text_to_image'] = StableDiffusionPipeline.from_pretrained(
128
+ "runwayml/stable-diffusion-v1-5",
129
  torch_dtype=torch.float16,
130
  use_safetensors=True,
131
  safety_checker=None,
 
160
  def process_audio_file(audio_file):
161
  """Processa arquivo de áudio para o formato correto"""
162
  try:
 
163
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(audio_file.name)[1]) as tmp_file:
164
  tmp_file.write(audio_file.read())
165
  tmp_file_path = tmp_file.name
166
 
 
167
  audio_array, sample_rate = librosa.load(tmp_file_path, sr=16000)
168
  os.unlink(tmp_file_path)
169
 
 
243
  st.subheader("🎨 Imagem Gerada")
244
  st.image(result[0], caption="Imagem gerada a partir do texto")
245
 
246
+ def get_use_cases():
247
+ """Retorna os casos de uso para cada modelo"""
248
+ return {
249
+ 'sentiment_analysis': {
250
+ 'title': "Análise de Sentimento",
251
+ 'description': "Analisa o sentimento (positivo, negativo, neutro) em comentários, avaliações ou postagens de clientes em redes sociais.",
252
+ 'example': "Uma empresa de varejo monitora menções da marca no Twitter/X, identificando feedback negativo para responder proativamente ou destacando comentários positivos em campanhas de marketing.",
253
+ 'benefit': "Melhoria na gestão de reputação online e resposta rápida a crises de imagem.",
254
+ 'demo_input': "A entrega foi super rápida, adorei!",
255
+ 'demo_type': 'text'
256
+ },
257
+ 'text_classification': {
258
+ 'title': "Classificação de Texto",
259
+ 'description': "Classifica e-mails recebidos como positivos ou negativos para priorizar respostas ou identificar reclamações.",
260
+ 'example': "Um call center categoriza e-mails de clientes, direcionando mensagens negativas para equipes de suporte prioritário.",
261
+ 'benefit': "Otimização do tempo da equipe de atendimento e melhoria na experiência do cliente.",
262
+ 'demo_input': "Estou insatisfeito com o produto",
263
+ 'demo_type': 'text'
264
+ },
265
+ 'summarization': {
266
+ 'title': "Resumo de Texto",
267
+ 'description': "Gera resumos concisos de documentos longos, como relatórios financeiros ou atas de reuniões.",
268
+ 'example': "Uma consultoria financeira resume relatórios anuais de empresas em poucos parágrafos para facilitar a análise de investidores.",
269
+ 'benefit': "Economia de tempo na leitura de documentos extensos e tomada de decisão mais rápida.",
270
+ 'demo_input': "A empresa XYZ reportou um crescimento de 15% no último trimestre, impulsionado por novas parcerias estratégicas e expansão no mercado asiático. No entanto, desafios logísticos aumentaram os custos operacionais em 5%. A diretoria planeja investir em automação para mitigar esses custos no próximo ano.",
271
+ 'demo_type': 'text'
272
+ },
273
+ 'question_answering': {
274
+ 'title': "Perguntas e Respostas",
275
+ 'description': "Responde perguntas específicas com base em manuais, FAQs ou documentos internos.",
276
+ 'example': "Um chatbot de suporte técnico responde perguntas como 'Como configurar o produto X?' extraindo respostas diretamente do manual do produto.",
277
+ 'benefit': "Redução do tempo de suporte e maior autonomia para os usuários finais.",
278
+ 'demo_input': {
279
+ 'context': "O produto X tem garantia de 2 anos e pode ser configurado via aplicativo móvel em 5 minutos.",
280
+ 'question': "Qual é o tempo de garantia do produto X?"
281
+ },
282
+ 'demo_type': 'qa'
283
+ },
284
+ 'translation': {
285
+ 'title': "Tradução (EN→PT)",
286
+ 'description': "Traduz conteúdo de marketing, manuais ou comunicações de inglês para português.",
287
+ 'example': "Uma empresa de software traduz descrições de produtos para lançar no mercado brasileiro.",
288
+ 'benefit': "Expansão de mercado com conteúdo adaptado e redução de custos com tradutores humanos.",
289
+ 'demo_input': "Our product ensures high performance",
290
+ 'demo_type': 'text'
291
+ },
292
+ 'ner': {
293
+ 'title': "Reconhecimento de Entidades",
294
+ 'description': "Identifica entidades como nomes de pessoas, organizações e locais em contratos ou documentos legais.",
295
+ 'example': "Um escritório de advocacia extrai automaticamente nomes de partes envolvidas em contratos, agilizando revisões.",
296
+ 'benefit': "Redução de erros manuais e maior eficiência na análise de documentos.",
297
+ 'demo_input': "Microsoft assinou um contrato com a empresa XYZ em Nova York.",
298
+ 'demo_type': 'text'
299
+ },
300
+ 'text_generation': {
301
+ 'title': "Geração de Texto",
302
+ 'description': "Gera textos criativos para campanhas de marketing, postagens em redes sociais ou roteiros.",
303
+ 'example': "Uma agência de publicidade cria slogans ou descrições de produtos a partir de prompts iniciais.",
304
+ 'benefit': "Aceleração do processo criativo e geração de ideias inovadoras.",
305
+ 'demo_input': "Um futuro onde a tecnologia conecta todos",
306
+ 'demo_type': 'text'
307
+ },
308
+ 'image_classification': {
309
+ 'title': "Classificação de Imagem",
310
+ 'description': "Identifica defeitos ou classifica produtos em linhas de produção com base em imagens.",
311
+ 'example': "Uma fábrica de eletrônicos classifica imagens de circuitos como 'Defeituoso' ou 'Aprovado' para controle de qualidade.",
312
+ 'benefit': "Redução de erros humanos e aumento da eficiência na inspeção.",
313
+ 'demo_input': None, # Imagens não podem ser pré-carregadas diretamente no código
314
+ 'demo_type': 'image'
315
+ },
316
+ 'object_detection': {
317
+ 'title': "Detecção de Objetos",
318
+ 'description': "Detecta objetos como pessoas, veículos ou itens em imagens de câmeras de segurança.",
319
+ 'example': "Um sistema de segurança identifica veículos em um estacionamento para monitoramento automático.",
320
+ 'benefit': "Maior segurança e automação de processos de monitoramento.",
321
+ 'demo_input': None,
322
+ 'demo_type': 'image'
323
+ },
324
+ 'image_segmentation': {
325
+ 'title': "Segmentação de Imagem",
326
+ 'description': "Segmenta diferentes partes de uma imagem, como órgãos em exames médicos.",
327
+ 'example': "Um hospital segmenta tumores em imagens de ressonância magnética, facilitando diagnósticos.",
328
+ 'benefit': "Apoio a diagnósticos médicos com maior precisão e rapidez.",
329
+ 'demo_input': None,
330
+ 'demo_type': 'image'
331
+ },
332
+ 'facial_recognition': {
333
+ 'title': "Reconhecimento Facial",
334
+ 'description': "Identifica emoções faciais em vídeos ou fotos de clientes em lojas ou eventos.",
335
+ 'example': "Uma loja de varejo analisa expressões faciais de clientes para avaliar a satisfação durante interações com produtos.",
336
+ 'benefit': "Melhoria na experiência do cliente com base em dados emocionais.",
337
+ 'demo_input': None,
338
+ 'demo_type': 'image'
339
+ },
340
+ 'speech_to_text': {
341
+ 'title': "Transcrição de Áudio",
342
+ 'description': "Converte gravações de reuniões ou entrevistas em texto para documentação.",
343
+ 'example': "Uma empresa transcreve automaticamente reuniões para criar atas ou resumos.",
344
+ 'benefit': "Economia de tempo na documentação e maior acessibilidade de conteúdo.",
345
+ 'demo_input': None,
346
+ 'demo_type': 'audio'
347
+ },
348
+ 'audio_classification': {
349
+ 'title': "Classificação de Áudio",
350
+ 'description': "Classifica emoções em chamadas de suporte para avaliar a qualidade do atendimento.",
351
+ 'example': "Um call center analisa chamadas para identificar emoções como 'Frustração' ou 'Satisfação' dos clientes.",
352
+ 'benefit': "Melhoria na formação de equipes e na experiência do cliente.",
353
+ 'demo_input': None,
354
+ 'demo_type': 'audio'
355
+ },
356
+ 'text_to_image': {
357
+ 'title': "Texto para Imagem",
358
+ 'description': "Gera imagens personalizadas a partir de descrições textuais para campanhas publicitárias ou design de produtos.",
359
+ 'example': "Uma agência de design cria mockups de produtos com base em prompts como 'Um smartphone futurista em um fundo azul neon'.",
360
+ 'benefit': "Redução de custos com designers gráficos e maior agilidade na criação de conteúdo visual.",
361
+ 'demo_input': "Uma paisagem tropical ao pôr do sol",
362
+ 'demo_type': 'text'
363
+ }
364
+ }
365
+
366
+ def handle_use_case_demo(models, use_case_key, use_case):
367
+ """Executa a demonstração de um caso de uso com entrada pré-definida"""
368
+ if use_case['demo_input'] is None:
369
+ st.warning("⚠️ Demonstração não disponível. Este modelo requer upload de imagem ou áudio.")
370
+ return
371
+
372
+ st.subheader("📊 Demonstração")
373
+ try:
374
+ if use_case['demo_type'] == 'text':
375
+ with st.spinner("Processando demonstração..."):
376
+ result = models[use_case_key](use_case['demo_input'])
377
+ display_results(result, use_case_key)
378
+ elif use_case['demo_type'] == 'qa':
379
+ with st.spinner("Processando demonstração..."):
380
+ result = models[use_case_key](
381
+ question=use_case['demo_input']['question'],
382
+ context=use_case['demo_input']['context']
383
+ )
384
+ st.success("🔍 Resposta encontrada:")
385
+ st.markdown(f"**Resposta:** {result['answer']}")
386
+ st.markdown(f"**Confiança:** {result['score']:.2%}")
387
+ except Exception as e:
388
+ st.error(f"Erro ao executar demonstração: {str(e)}")
389
+ logging.error(f"Erro na demonstração do caso de uso {use_case_key}: {e}")
390
+
391
  def main():
392
  st.title("🤖 Aplicação de IA Multi-Modal Avançada")
393
  st.markdown("---")
 
400
  st.error("Falha crítica ao carregar os modelos. Verifique os logs para mais detalhes.")
401
  return
402
 
403
+ # Abas para navegação
404
+ tab1, tab2 = st.tabs(["Explorar Modelos", "Casos de Uso"])
405
+
406
+ with tab1:
407
+ # Sidebar para seleção de modelo
408
+ st.sidebar.title("⚙️ Configurações")
409
+ model_categories = {
410
+ "📝 Processamento de Texto": [
411
+ ("Análise de Sentimento", "sentiment_analysis"),
412
+ ("Classificação de Texto", "text_classification"),
413
+ ("Resumo de Texto", "summarization"),
414
+ ("Perguntas e Respostas", "question_answering"),
415
+ ("Tradução (EN→PT)", "translation"),
416
+ ("Reconhecimento de Entidades", "ner"),
417
+ ("Geração de Texto", "text_generation")
418
+ ],
419
+ "🖼️ Processamento de Imagem": [
420
+ ("Classificação de Imagem", "image_classification"),
421
+ ("Detecção de Objetos", "object_detection"),
422
+ ("Segmentação de Imagem", "image_segmentation"),
423
+ ("Reconhecimento Facial", "facial_recognition")
424
+ ],
425
+ "🎵 Processamento de Áudio": [
426
+ ("Transcrição de Áudio", "speech_to_text"),
427
+ ("Classificação de Emoções", "audio_classification")
428
+ ],
429
+ "✨ Modelos Generativos": [
430
+ ("Texto para Imagem", "text_to_image")
431
+ ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
432
  }
 
 
 
 
 
 
 
433
 
434
+ selected_category = st.sidebar.selectbox(
435
+ "Categoria",
436
+ list(model_categories.keys()),
437
+ index=0
438
+ )
439
+
440
+ selected_model = st.sidebar.selectbox(
441
+ "Modelo",
442
+ [name for name, key in model_categories[selected_category]],
443
+ format_func=lambda x: x,
444
+ index=0
445
+ )
446
+
447
+ # Obter chave do modelo selecionado
448
+ model_key = next(key for name, key in model_categories[selected_category] if name == selected_model)
449
+
450
+ # Interface principal
451
+ st.header(f"{selected_model}")
452
 
453
+ # Accordion para informações do modelo
454
+ with st.expander("ℹ️ Sobre este modelo"):
455
+ model_info = {
456
+ 'sentiment_analysis': "Analisa o sentimento expresso em um texto (positivo/negativo/neutro).",
457
+ 'text_classification': "Classifica textos em categorias pré-definidas.",
458
+ 'summarization': "Gera um resumo conciso de um texto longo.",
459
+ 'question_answering': "Responde perguntas baseadas em um contexto fornecido.",
460
+ 'translation': "Traduz texto de inglês para português.",
461
+ 'ner': "Identifica e classifica entidades nomeadas (pessoas, lugares, organizações).",
462
+ 'text_generation': "Gera texto criativo continuando a partir de um prompt.",
463
+ 'image_classification': "Identifica objetos e cenas em imagens.",
464
+ 'object_detection': "Detecta e localiza múltiplos objetos em uma imagem.",
465
+ 'image_segmentation': "Segmenta diferentes elementos em uma imagem.",
466
+ 'facial_recognition': "Reconhece características faciais e emoções.",
467
+ 'speech_to_text': "Transcreve fala em texto.",
468
+ 'audio_classification': "Classifica emoções em arquivos de áudio.",
469
+ 'text_to_image': "Gera imagens a partir de descrições textuais."
470
+ }
471
+ st.info(model_info.get(model_key, "Informações detalhadas sobre este modelo."))
472
 
473
+ # Processamento baseado no tipo de modelo
474
+ try:
475
+ if model_key in ['sentiment_analysis', 'text_classification', 'summarization',
476
+ 'translation', 'text_generation', 'ner']:
477
+ handle_text_models(models, model_key, selected_model)
478
+
479
+ elif model_key == 'question_answering':
480
+ handle_qa_model(models, model_key)
481
+
482
+ elif model_key in ['image_classification', 'object_detection',
483
+ 'image_segmentation', 'facial_recognition']:
484
+ handle_image_models(models, model_key, selected_model)
485
+
486
+ elif model_key in ['speech_to_text', 'audio_classification']:
487
+ handle_audio_models(models, model_key)
488
+
489
+ elif model_key == 'text_to_image':
490
+ handle_generative_models(models, model_key)
491
 
492
+ except Exception as e:
493
+ st.error(f"Erro inesperado durante a execução: {str(e)}")
494
+ logging.exception("Erro durante a execução do modelo")
495
 
496
+ with tab2:
497
+ st.header("Casos de Uso")
498
+ st.markdown("Explore casos práticos de aplicação dos modelos para resolver problemas reais.")
499
+
500
+ use_cases = get_use_cases()
501
+ selected_use_case = st.selectbox(
502
+ "Selecione um caso de uso",
503
+ list(use_cases.keys()),
504
+ format_func=lambda x: use_cases[x]['title']
505
+ )
506
+
507
+ use_case = use_cases[selected_use_case]
508
+
509
+ st.subheader(use_case['title'])
510
+ with st.expander("ℹ️ Detalhes do Caso de Uso"):
511
+ st.markdown(f"**Descrição**: {use_case['description']}")
512
+ st.markdown(f"**Exemplo Prático**: {use_case['example']}")
513
+ st.markdown(f"**Benefício**: {use_case['benefit']}")
514
+
515
+ if use_case['demo_input'] is not None:
516
+ if st.button("🚀 Executar Demonstração", key=f"demo_{selected_use_case}"):
517
+ handle_use_case_demo(models, selected_use_case, use_case)
518
 
519
  def handle_text_models(models, model_key, model_name):
520
  """Manipula modelos de texto"""
 
544
  try:
545
  if model_key == 'ner':
546
  result = models[model_key](input_text)
547
+ elif model_key == 'text_generation':
548
  result = models[model_key](
549
  input_text,
550
  max_new_tokens=advanced_params.get('max_length', 100),