ChatGPT & Reverse Engineering

Intelligenza artificiale
Dati e metodo
Ricavare i valori di un grafico da un’immagine con un LLM: come far lavorare in gruppo modello, OCR e Python.
Autore/Autrice

Paolo Volterra

Data di Pubblicazione

14 dicembre 2024

Reverse Engineering with AI

“Ehi, umano, mi sai dire quanto potrebbe valere la prima barra di questo grafico?”

Provate a fare la stessa cosa con un #LLM dandogli l’immagine e chiedendogli di rispondere: non ci riuscirà, a meno che…

Lavorare in gruppo

Come risolvere un problema, facilissimo per noi bipedi?

Vi risparmio i tentativi autonomi che ha fatto ChatGPT; per chi è curioso, vi mando il link del thread

La soluzione è: lavorare insieme

Dandogli dei suggerimenti, lui ha applicato technicality, #AI compresa, che mi avrebbero occupato tempo e voglia

Lo studio mi serviva per sperimentare un approccio collaborativo: io suggerivo e lui eseguiva

ChatGPT diventa così uno spaventoso boost per le mie capacità

Contemporaneamente ho visto applicare soluzioni software a cui non avrei pensato o che non conoscevo

Come dire: ho lavorato con un collega molto esperto.

Col vantaggio che non sbuffa, non ha altre priorità, ti capisce anche se dai istruzioni astruse, non polemizza, non si ammala, non va in ferie (un mio autoritratto?!?!!?….)

Il bello è che mi ha fatto il riepilogo dei passaggi con tanto di script formattati in #markdown e immagini; il tutto pronto per la stampa!

Alla fine del lavoro, mi sono sentito in colpa: io ero esausto e lui invece continuava a dare ulteriore disponibilità. Un masochista

Lo ringrazio scrivendo questo articolo

1. Obiettivo

— Estrazione delle altezze delle 15 barre dal grafico.
 — Riostruzione del grafico.
 — Verifica dell’accuratezza con dati forniti successivamente dal file Excel originario.

Perchè fare tutto questo?

Tutto parte da una constatazione: in un mondo #datadriven le informazioni dovrebbero essere proposte/condivise non solo in modo destrutturato (testo, grafico) ma anche in un formato machine readable.

Un grafico in genere viene visto come un “disegno” e non come una sintesi emotiva di un lavoro complesso sottostante.

Condividere non solo il grafico ma ache il dato facillita un approccio collaborativo e la possibilità di ulteriore astrazione: “Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela ciascuno. Ma se tu hai un’idea, ed io ho un’idea, e ce le scambiamo, allora abbiamo entrambi due idee.”

immagine realizzata con Python da un xls

Ho costruito l’immagine utilizzando un semplice foglio excel, che alla fine ho dato a ChatGPT per fare le verifiche con quello che aveva ipotizzato

Librerie Python Utilizzate

import cv2
import numpy as np
import matplotlib.pyplot as plt
from pytesseract import pytesseract
import pandas as pd

2. Elaborazione dell’immagine

2.1. Edge Detection
Per identificare i contorni delle barre e delle linee:

# Edge Detection
edges_detected = cv2.Canny(gray_original, threshold1=50, threshold2=150)
plt.imshow(edges_detected, cmap='gray')
plt.title("Edge Detection")
plt.axis("off")
plt.show()

Edge_Detection

2.2. Contours Detection

Ho individuato i contorni delle barre per estrarre posizione, altezza e larghezza:

contours_detected, _ = cv2.findContours(edges_detected, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image_with_contours = original_image.copy()
cv2.drawContours(image_with_contours, contours_detected, -1, (0, 255, 0), 2)
plt.imshow(cv2.cvtColor(image_with_contours, cv2.COLOR_BGR2RGB))
plt.title("Contours of Detected Bars")
plt.axis("off")
plt.show()

Contours Detection

3. Estrazione delle Informazioni dal Grafico

3.1. OCR per Etichette degli Assi
Utilizzo dell’OCR per identificare i valori sugli assi X e Y:

oimage_path = pytesseract.image_to_string(original_image, config=' - psm 6')
# Etichette Asse Y: [80, 60, 40, 20, 0]
# Etichette Asse X: [0.0, 0.5, 1.0, 1.5, 2.0, 2.5]

3.2. Normalizzazione delle Coordinate

I contorni delle barre vengono proiettati sugli assi per calcolare altezza e posizione:

def interpolate_y_value(pixel, y_pixels, y_values):
 return np.interp(pixel, y_pixels, y_values)
bar_y_values = [interpolate_y_value(top, y_axis_pixel_positions, y_axis_values) for top in bar_tops]

Risultato (Tabella Normalizzata)

| Barra | Pixel Top | Valore Y |
| — — — | — — — — — | — — — — |
| 1 | 50 | 80 |
| 2 | 150 | 60 |
| … | … | … |

4. Ricostruzione del Grafico

4.1. Generazione del Grafico Ricostruito
Costruzione di un grafico basato sui dati estratti:

plt.bar(bar_positions, reconstructed_heights, width=(x_bins[1] - x_bins[0]), color='teal', alpha=0.7, edgecolor='black')
plt.title("Grafico Ricostruito")
plt.xlabel("X")
plt.ylabel("Y")
plt.grid(axis='y', linestyle=' - ', alpha=0.7)
plt.show()

Risultato

immagine approssimativa realizzata da ChatGPT

5. Verifica con i Dati Excel

Utilizzo dei valori della colonna “NOMINALE” del cluster “Investimenti Sostenibili 4.0” del file xls per costruire un istogramma:

frequencies_hist, bin_edges_hist = np.histogram(nominale_cluster_data, bins=15)
frequencies_hist_scaled = (frequencies_hist / max(frequencies_hist)) * 80

Tabella delle Frequenze (Scalate)
| Intervallo | Frequenza |
| — — — — — — | — — — — — -|
| 0–10000 | 56.55 |
| 10000–20000| 62.76 |
| … | … |

5.2. Confronto tra Grafico e Excel

Confronto dei valori delle barre ricostruite con quelli calcolati dai dati Excel:

absolute_errors = [abs(original - adjusted) for original, adjusted in zip(original_graph_y_values, final_15_heights_adjusted)]
percentage_errors = [(abs(original - adjusted) / original) * 100 if original != 0 else 0 for original, adjusted in zip(original_graph_y_values, final_15_heights_adjusted)]

Tabella degli Errori
| Barra | Originale | Calcolato | Errore Assoluto | Errore Percentuale |
| — — — -| — — — — — -| — — — — — -| — — — — — — — — -| — — — — — — — — — — |
| 1 | 56 | 56.55 | 0.55 | 0.99% |
| 2 | 60 | 62.76 | 2.76 | 4.60% |
| … | … | … | … | … |

5.3. Errore Totale

  • Errore Assoluto Totale: 12.79
  • Errore Percentuale Totale: 2.81%

6. Conclusione

Il processo ha dimostrato un alto grado di accuratezza:
- Errore Percentuale Totale: 2.81% indica un risultato molto vicino ai dati originali.
- La combinazione di OCR, rilevamento contorni e normalizzazione ha permesso di ricostruire fedelmente i dati del grafico.

Affidabilità
- Punti di Forza: Il metodo è stato verificato sia visivamente sia con i dati Excel.
- Limitazioni: La qualità dell’immagine e la precisione dell’OCR potrebbero influire sui risultati.

Con ulteriori miglioramenti, il metodo può essere applicato a grafici complessi o a immagini con qualità variabile.

Metti like se ti è piaciuta questa condivisione!


Pubblicato in origine su Medium il 14 dicembre 2024.

Torna in cima

Vedi anche