MarcioDias's picture
Novo teste Launch
0b40521 verified
#!/usr/bin/env python
# coding: utf-8
import gradio as gr
from gradio import components
import pandas as pd
import numpy as np
import gradio as gr
from gradio import components
import onnxruntime as ort
print(gr.__version__)
print(ort.__version__)
stoi = {'\n': 0, ' ': 1, '!': 2, '"': 3, '#': 4, '$': 5, '%': 6, '&': 7, "'": 8, '(': 9, ')': 10, '*': 11, '+': 12, ',': 13, '-': 14, '.': 15, '/': 16, '0': 17, '1': 18, '2': 19, '3': 20, '4': 21, '5': 22, '6': 23, '7': 24, '8': 25, '9': 26, ':': 27, ';': 28, '<': 29, '=': 30, '>': 31, '?': 32, '@': 33, 'A': 34, 'B': 35, 'C': 36, 'D': 37, 'E': 38, 'F': 39, 'G': 40, 'H': 41, 'I': 42, 'J': 43, 'K': 44, 'L': 45, 'M': 46, 'N': 47, 'O': 48, 'P': 49, 'Q': 50, 'R': 51, 'S': 52, 'T': 53, 'U': 54, 'V': 55, 'W': 56, 'X': 57, 'Y': 58, 'Z': 59, '[': 60, '\\': 61, ']': 62, '^': 63, '_': 64, '`': 65, 'a': 66, 'b': 67, 'c': 68, 'd': 69, 'e': 70, 'f': 71, 'g': 72, 'h': 73, 'i': 74, 'j': 75, 'k': 76, 'l': 77, 'm': 78, 'n': 79, 'o': 80, 'p': 81, 'q': 82, 'r': 83, 's': 84, 't': 85, 'u': 86, 'v': 87, 'w': 88, 'x': 89, 'y': 90, 'z': 91, '{': 92, '|': 93, '}': 94, '~': 95, '\x7f': 96, '\x81': 97, '\x8d': 98, '\x8f': 99, '\x90': 100, '\x9d': 101, '\xa0': 102, '¡': 103, '¢': 104, '£': 105, '¥': 106, '§': 107, '©': 108, 'ª': 109, '«': 110, '¬': 111, '\xad': 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}
itos = {0: '\n', 1: ' ', 2: '!', 3: '"', 4: '#', 5: '$', 6: '%', 7: '&', 8: "'", 9: '(', 10: ')', 11: '*', 12: '+', 13: ',', 14: '-', 15: '.', 16: '/', 17: '0', 18: '1', 19: '2', 20: '3', 21: '4', 22: '5', 23: '6', 24: '7', 25: '8', 26: '9', 27: ':', 28: ';', 29: '<', 30: '=', 31: '>', 32: '?', 33: '@', 34: 'A', 35: 'B', 36: 'C', 37: 'D', 38: 'E', 39: 'F', 40: 'G', 41: 'H', 42: 'I', 43: 'J', 44: 'K', 45: 'L', 46: 'M', 47: 'N', 48: 'O', 49: 'P', 50: 'Q', 51: 'R', 52: 'S', 53: 'T', 54: 'U', 55: 'V', 56: 'W', 57: 'X', 58: 'Y', 59: 'Z', 60: '[', 61: '\\', 62: ']', 63: '^', 64: '_', 65: '`', 66: 'a', 67: 'b', 68: 'c', 69: 'd', 70: 'e', 71: 'f', 72: 'g', 73: 'h', 74: 'i', 75: 'j', 76: 'k', 77: 'l', 78: 'm', 79: 'n', 80: 'o', 81: 'p', 82: 'q', 83: 'r', 84: 's', 85: 't', 86: 'u', 87: 'v', 88: 'w', 89: 'x', 90: 'y', 91: 'z', 92: '{', 93: '|', 94: '}', 95: '~', 96: '\x7f', 97: '\x81', 98: '\x8d', 99: '\x8f', 100: '\x90', 101: '\x9d', 102: '\xa0', 103: '¡', 104: '¢', 105: '£', 106: '¥', 107: '§', 108: '©', 109: 'ª', 110: '«', 111: '¬', 112: '\xad', 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: '™'}
encode = lambda s: [stoi.get(c,1) for c in s] # encoder: take a string, output a list of integers
decode = lambda l: ''.join([itos[i] for i in l]) # decoder: take a list of integers, output a string
len(stoi)
ncm_table = pd.read_csv("https://raw.githubusercontent.com/mfilipak/AFRAC_IA/main/DATASET/TABELA_NCM.CSV", index_col="CODIGO")
valid_ncms = sorted(ncm_table[ncm_table.index > 1000000].index)
ncmst = np.array(valid_ncms)
ncmst = ncmst.reshape([-1,1])
def tokenizer(texts, max_length=120):
# Supondo um tokenizador custom que gera tokens como lista de ints
encoded = [encode(t)[:max_length] for t in texts]
#padded = [seq + [0]*(max_length - len(seq)) for seq in encoded]
#return padded
return encoded
# Carregar sessão ONNX
session = ort.InferenceSession("ncm_inference.onnx")
input_name = session.get_inputs()[0].name
def PredictNCM(txt):
print(txt)
x = [txt]
X = tokenizer(x)
X = np.array(X, dtype=np.int64)
# Inferência ONNX
pred = session.run(None, {input_name: X})[0][0] # shape: (B, 19)
aux = np.argsort(pred)[::-1][:5]
return {str(valid_ncms[i]):float(pred[i]) for i in aux}, ncm_table.loc[valid_ncms[aux[0]],"DESCRICAO"]
#demo = gr.Interface(fn=PredictNCM, outputs=[components.Label(label="NCMs"), components.Textbox(label="Descrição do NCM")], title='AFRAC NOTA CERTA V2',
# inputs=components.Textbox(label="DESCRIÇÃO"),
# examples=["Coca-Cola PET 2l","Pepsi 500ml", "Guaraná Antarctica 2l", "Ração Bocão Premium","Mentos Kiss Morango", "Bombom Sonho de Valsa"])
#demo.launch()
def mostra_descricao(evt: gr.SelectData):
ncm = evt.value # valor clicado, como string
try:
desc = ncm_table.loc[int(ncm), "DESCRICAO"]
except:
desc = "Descrição não encontrada."
return f"{ncm} - {desc}"
# Interface
with gr.Blocks(theme=gr.themes.Soft()) as demo:
gr.Markdown("# 🧾 AFRAC NOTA CERTA V2")
gr.Markdown("Preencha a descrição de um produto e obtenha a previsão dos **códigos NCM mais prováveis**.")
with gr.Row():
entrada = gr.Textbox(label="📝 DESCRIÇÃO", placeholder="Ex: Coca-Cola PET 2l", lines=1)
with gr.Row():
btn_submit = gr.Button("🔍 Prever NCM", variant="primary")
btn_clear = gr.Button("🧹 Limpar")
with gr.Row():
saida_ncm = gr.Label(label="🔢 NCMs Prováveis")
saida_descricao = gr.Textbox(label="📖 Descrição do NCM")
# Conectar evento de clique
saida_ncm.select(fn=mostra_descricao, outputs=saida_descricao)
exemplos = gr.Examples(["Coca-Cola PET 2l", "Pepsi 500ml", "Guaraná Antarctica 2l",
"Ração Bocão Premium", "Mentos Kiss Morango", "Bombom Sonho de Valsa"],
inputs=entrada)
btn_submit.click(PredictNCM, entrada, [saida_ncm, saida_descricao])
btn_clear.click(lambda: ("", "", ""), outputs=[entrada, saida_ncm, saida_descricao])
#display(demo.launch(share=True)) #Para rodar no Jupyter
demo.launch(share=True)