Spaces:
Sleeping
Sleeping
Commit ·
7f1f398
0
Parent(s):
ver1
Browse files- README.md +16 -0
- app.py +72 -0
- requirements.txt +3 -0
README.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# GTM-Scope
|
| 2 |
+
|
| 3 |
+
## Descrição
|
| 4 |
+
GTM-Scope é uma ferramenta interativa que permite aos usuários carregar arquivos .tm e .zip para extrair informações sobre modelos de aprendizado de máquina treinados no Google Teachable Machine.
|
| 5 |
+
|
| 6 |
+
## Como Usar
|
| 7 |
+
- Carregue um arquivo .tm para obter informações básicas do modelo.
|
| 8 |
+
- Carregue um arquivo .zip correspondente para obter informações detalhadas do modelo, incluindo a estrutura do modelo e o tamanho dos pesos.
|
| 9 |
+
- Você pode carregar ambos os arquivos para obter um conjunto completo de informações.
|
| 10 |
+
|
| 11 |
+
## Informações Adicionais
|
| 12 |
+
Este projeto foi desenvolvido para facilitar a análise e o entendimento de modelos de aprendizado de máquina. Para sugestões ou contribuições, sinta-se à vontade para entrar em contato.
|
| 13 |
+
|
| 14 |
+
---
|
| 15 |
+
|
| 16 |
+
Desenvolvido por [Ramon Mayor Martins]
|
app.py
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
import zipfile
|
| 3 |
+
import json
|
| 4 |
+
import pandas as pd
|
| 5 |
+
from tensorflow.keras.models import model_from_json
|
| 6 |
+
from collections import Counter
|
| 7 |
+
|
| 8 |
+
def extract_zip_info(zip_path):
|
| 9 |
+
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
|
| 10 |
+
file_list = zip_ref.namelist()
|
| 11 |
+
metadata = model_json = None
|
| 12 |
+
weights_file = None
|
| 13 |
+
|
| 14 |
+
for file in file_list:
|
| 15 |
+
if 'metadata.json' in file:
|
| 16 |
+
with zip_ref.open(file) as f:
|
| 17 |
+
metadata = json.load(f)
|
| 18 |
+
elif 'model.json' in file:
|
| 19 |
+
with zip_ref.open(file) as f:
|
| 20 |
+
model_json = json.load(f)
|
| 21 |
+
elif 'model.weights.bin' in file:
|
| 22 |
+
weights_file = file
|
| 23 |
+
|
| 24 |
+
if model_json:
|
| 25 |
+
model_topology_json = model_json['modelTopology']
|
| 26 |
+
model_json_string = json.dumps(model_topology_json)
|
| 27 |
+
model = model_from_json(model_json_string)
|
| 28 |
+
summary = {'layer_counts': Counter()}
|
| 29 |
+
extract_layer_info(model_topology_json['config']['layers'], summary)
|
| 30 |
+
layer_counts_text = ', '.join([f'{k}: {v}' for k, v in summary['layer_counts'].items()])
|
| 31 |
+
else:
|
| 32 |
+
layer_counts_text = "Modelo não encontrado"
|
| 33 |
+
|
| 34 |
+
weights_info = {'size_bytes': zip_ref.getinfo(weights_file).file_size} if weights_file else {'size_bytes': 'Não encontrado'}
|
| 35 |
+
|
| 36 |
+
return {
|
| 37 |
+
'metadata': metadata if metadata else 'Metadados não encontrados',
|
| 38 |
+
'model_summary': layer_counts_text,
|
| 39 |
+
'weights_info': weights_info
|
| 40 |
+
}
|
| 41 |
+
|
| 42 |
+
|
| 43 |
+
def extract_layer_info(layers, summary):
|
| 44 |
+
for layer in layers:
|
| 45 |
+
class_name = layer['class_name']
|
| 46 |
+
summary['layer_counts'][class_name] += 1
|
| 47 |
+
if class_name in ['Sequential', 'Model']:
|
| 48 |
+
sub_layers = layer['config']['layers']
|
| 49 |
+
extract_layer_info(sub_layers, summary)
|
| 50 |
+
|
| 51 |
+
def analyze_files(tm_file, zip_file):
|
| 52 |
+
results = {}
|
| 53 |
+
if tm_file is not None:
|
| 54 |
+
tm_info = extract_tm_info(tm_file.name)
|
| 55 |
+
results['tm_info'] = tm_info
|
| 56 |
+
if zip_file is not None:
|
| 57 |
+
zip_info = extract_zip_info(zip_file.name)
|
| 58 |
+
results['zip_info'] = zip_info
|
| 59 |
+
return pd.DataFrame([results]).to_html(escape=False)
|
| 60 |
+
|
| 61 |
+
iface = gr.Interface(
|
| 62 |
+
fn=analyze_files,
|
| 63 |
+
inputs=[
|
| 64 |
+
gr.File(label="Upload .tm File"),
|
| 65 |
+
gr.File(label="Upload .zip File")
|
| 66 |
+
],
|
| 67 |
+
outputs=gr.HTML(),
|
| 68 |
+
title="GTM-Scope",
|
| 69 |
+
description="Upload a .tm or .zip file to extract its information."
|
| 70 |
+
)
|
| 71 |
+
|
| 72 |
+
iface.launch(debug=True)
|
requirements.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio
|
| 2 |
+
pandas
|
| 3 |
+
tensorflow
|