Volevo visualizzare i dati contenuti nei file di test del database MNIST spesso usati come esempi delle rete neurali (vedi esempi di TensorFlow)
il formato file e' IDX descritto in fondo alla pagina sopra linkata
----------------------------------------------------------------------------------------
clear all;
filename = "C:/Users/l.innocenti/Downloads/train-images.idx3-ubyte";
immagini_id = fopen(filename,"r");
immagini = fread(immagini_id,Inf,"uint8");
numero_immagini = immagini(7,1)*256+immagini(8,1);
righe = immagini(9,1)*16777216+immagini(10,1)*65536+immagini(11,1)*256+immagini(12,1)*1
colonne = immagini(13,1)*16777216+immagini(14,1)*65536+immagini(15,1)*256+immagini(16,1)*1
indice_immagine = 1016;
im1 = immagini(17+(indice_immagine*784):17+((indice_immagine+1)*784)-1);
im1_s = reshape(im1,28,28);
imshow(fliplr(rot90(im1_s,-1)),[]); # mostra a scala di grigi
f2 = "C:/Users/l.innocenti/Downloads/train-labels.idx1-ubyte";
f2_id = fopen(f2,"r");
f2 = fread(f2_id,Inf,"uint8");
valore = f2(indice_immagine+9);
Visualizzazione post con etichetta Octave. Mostra tutti i post
Visualizzazione post con etichetta Octave. Mostra tutti i post
venerdì 13 settembre 2019
mercoledì 28 febbraio 2018
USGS Spectral Library Convex Hull con Octave
Questo post e' l'inizio di un lavoro sulle reti neurali applicate a dati iperspettrali (il tema della mia tesi di dottorato)
Per usare una rete neurale e' necessario avere una ottima base dati di training ed ho scelto l'archivio USGS Spectral Library scaricabile liberamente e con dati in formato testuale
Il primo lavoro da fare e' quello di normalizzare gli spettri. Quando ero all'Universita' avevo accesso ad una licenza di Matlab ma adesso devo impiegare Octave, la versione Open Source di Matlab.
Questo metodo e' descritto nell'articolo
Two GUIs-based analysis tool for spectroradiometer data pre-processing
----------------------------------------------------------------------------------
close all
clear all
filename = 's07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF.txt';
fid = fopen (filename, "r");
conta = 0;
nr = 2;
dati = [];
#aggiunge uno zero in testa
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
#legge tutte le righe del file saltando
#la prima ed inserendo il tutto in array
while (!feof(fid))
text_line = fgetl(fid);
#salta la prima riga descrittiva
if (conta > 0)
transi = str2num(text_line);
# salta in valori NULL
if (transi > 0)
dati = [dati;transi];
nr = nr +1;
endif
endif
conta = conta + 1;
endwhile
fclose (fid);
#aggiunge uno zero in coda
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
x = 1:1:nr;
reshape(x,1,nr);
#calcola la convex hull dello spettro
cx = convhull(x,dati);
#rende continua la convex hull
#la convex hull viene calcolata di default
#come una spezzata di segmenti
xq = 1:1:nr;
vq1 = interp1(x(cx),dati(cx),xq);
#divide ogni valore di riflettanza per il corrispondente
#valore della convex hull per ottenere valori normalizzati
dati2 = reshape(dati,1,nr);
normalizzato = dati2./vq1;
#plotta i dati
plot(x(cx),dati(cx),'r-',x,vq1,'b*',x,normalizzato,"g*");
#salvi i dati normalizzati in un file csv
normalizzato = normalizzato(2:nr-1);
#il nome del file normalizzato ha un prefisso "norm_"
filename = ["norm_" filename];
dlmwrite(filename,normalizzato);
Per usare una rete neurale e' necessario avere una ottima base dati di training ed ho scelto l'archivio USGS Spectral Library scaricabile liberamente e con dati in formato testuale
Il primo lavoro da fare e' quello di normalizzare gli spettri. Quando ero all'Universita' avevo accesso ad una licenza di Matlab ma adesso devo impiegare Octave, la versione Open Source di Matlab.
Questo metodo e' descritto nell'articolo
Two GUIs-based analysis tool for spectroradiometer data pre-processing
----------------------------------------------------------------------------------
close all
clear all
filename = 's07HYPRN_Actinolite_HS22.2B_ASDFRb_AREF.txt';
fid = fopen (filename, "r");
conta = 0;
nr = 2;
dati = [];
#aggiunge uno zero in testa
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
#legge tutte le righe del file saltando
#la prima ed inserendo il tutto in array
while (!feof(fid))
text_line = fgetl(fid);
#salta la prima riga descrittiva
if (conta > 0)
transi = str2num(text_line);
# salta in valori NULL
if (transi > 0)
dati = [dati;transi];
nr = nr +1;
endif
endif
conta = conta + 1;
endwhile
fclose (fid);
#aggiunge uno zero in coda
#serve per rendere il calcolo di Convex Hull
#piu' affidabile
dati = [dati;0];
x = 1:1:nr;
reshape(x,1,nr);
#calcola la convex hull dello spettro
cx = convhull(x,dati);
#rende continua la convex hull
#la convex hull viene calcolata di default
#come una spezzata di segmenti
xq = 1:1:nr;
vq1 = interp1(x(cx),dati(cx),xq);
#divide ogni valore di riflettanza per il corrispondente
#valore della convex hull per ottenere valori normalizzati
dati2 = reshape(dati,1,nr);
normalizzato = dati2./vq1;
#plotta i dati
plot(x(cx),dati(cx),'r-',x,vq1,'b*',x,normalizzato,"g*");
#salvi i dati normalizzati in un file csv
normalizzato = normalizzato(2:nr-1);
#il nome del file normalizzato ha un prefisso "norm_"
filename = ["norm_" filename];
dlmwrite(filename,normalizzato);
giovedì 26 novembre 2015
Primi passi con Octave
Durante il dottorato ho avuto il modo di utilizzare (a livello decisamente base) Matlab apprezzandone la sintassi compatta. Purtroppo non ho piu' disponibilita' della licenza universitaria e quindi ho deciso di provare Octave, una versione open source simile a Matlab (anche se chi lavora in modo serio con Matlab mi dice che Octave e' ancora ad anni luce di distanze per alcune funzionalita')
L'aspetto interessante e' che con la versione 3.8 e' stata implementata una GUI simile a Matlab (prima si lavorava praticamente a linea di comando da shell)
Il programma e' stato compilato da sorgenti su Centos 6
Le dipendenze sono
yum install gcc gcc-c++ kernel-devel make mercurial libtool libtool-ltdl-devel libtool-ltdl autoconf cmake lapack-devel \ lapack pcre-devel readline-devel readline fftw-devel glpk-devel suitesparse suitesparse-devel gnuplot libcurl-devel zlib-devel \ flex texlive gperf fltk-devel qhull-devel hdf5-devel gl2ps-devel qrupdate-devel arpack-devel qscintilla-devel llvm-devel qt-devel \ bison ghostscript-devel librsvg2-tools icoutils readline pcre
Dopo la compilazione (un po' lunghina per la verita' ...ma la mia macchina e' un po' vecchiotta) si lancia il programma con
octave --force-gui
Questo e' uno script base su Octave che dovrebbe funzionare senza troppi problemi su Octave
----------------------------------------------------------------------------
clear all
close all
echo off
function rad = radians(degree)
rad = degree .* pi / 180;
end;
function [a,c,dlat,dlon]=haversine(lat1,lon1,lat2,lon2)
dlat = radians(lat2-lat1);
dlon = radians(lon2-lon1);
lat1 = radians(lat1);
lat2 = radians(lat2);
a = (sin(dlat./2)).^2 + cos(lat1) .* cos(lat2) .* (sin(dlon./2)).^2;
c = 2 .* asin(sqrt(a));
#arrayfun(@(x) printf("distance: %.8f m\n",6372800 * x), c);
end;
[volt,lat,lon,quota]=textread("tetto_6_11_ridotto.csv", "%u;%u;%u;%u");
mlat = mean(lat);
mlon = mean(lon);
minlat = min(lat);
maxlat = max(lat);
minlon = min(lon);
maxlon = max(lon);
stdlat = std(lat);
stdlon = std(lon);
[r,c] = size(lat);
fprintf("Media Lat: %d\n",mean(lat));
fprintf("Media Lon: %d\n",mean(lon));
fprintf("Std Lat: %d\n",std(lat));
fprintf("Std Lon: %d\n",std(lon));
fig = figure;
plot(lat,lon);
axis([minlat maxlat minlon maxlon]);
title('Originali')
print(fig,'gps','-dpng');
centro = centroid(lat,lon);
fprintf("Centroide %d %d\n",centro);
#plot(volt)
#print(fig,'volt','-dpng')
disp ("-----------------")
mlat = double(mlat)/10000000.0
mlon = double(mlon)/10000000.0
#fprintf("MLat: %f\n",mlat);
ripuliti = zeros(r,2);
indice = 1;
for n = 1:r
#fprintf("MLat: %f\n",mlat);
#fprintf("MLon: %f\n",mlon);
#fprintf("Lat: %f\n",double(lat(n))/10000000.0);
#fprintf("Lon: %f\n",double(lon(n))/10000000.0);
[a,c,dlat,dlon] = haversine(mlat,mlon,double(lat(n))/10000000.0,double(lon(n))/10000000.0);
#fprintf("Distanza %i :%f\n",n,double(c)*6378160.0);
if (c*6378160.0) < 5.0
ripuliti(indice,1) = double(lat(n))/10000000.0;
ripuliti(indice,2) = double(lon(n))/10000000.0;
indice = indice + 1;
end
end
fig2 = figure;
plot(ripuliti(1:indice-1,1),ripuliti(1:indice-1,2))
axis([double(minlat)/10000000.0 double(maxlat)/10000000.0 double(minlon)/10000000.0 double(maxlon)/10000000.0]);
title("Filtrati")
mflat = mean(ripuliti(1:indice-1,1));
mflon = mean(ripuliti(1:indice-1,2));
devflat = std(ripuliti(1:indice-1,1));
devflon = std(ripuliti(1:indice-1,2));
fprintf("Media Filtrata Lat: %.7f\n",mflat);
fprintf("Media Filtrata Lon: %.7f\n",mflon);
fprintf("DevSt Filtrata Lat: %.7f\n",devflat);
fprintf("DevSt Filtrata Lon: %.7f\n",devflon);
Octave ha un corrispettivo dei toolbox di Matlab, ovvero di pacchetti di estensioni dei comandi che possono essere scaricati, a seconda delle necessita' da Octave Forge
Se per esempio si vuole leggere/scrivere una porta seriale si deve scaricare il pacchetto instrument control in formato tar.gz e si installa con il comando
pkg install instrument-control-0.2.1.tar.gz
Di seguito un semplice esempio per leggere i dati seriali (da Arduino). Per far utilizzare la porta seriale ad un normale utente, quest'ultimo deve essere aggiunto al gruppo dialout (adduser luca dialout)
----------------------------------------------------------------------------
#! /usr/local/bin/octave -qf
pkg load instrument-control
s1 = serial("/dev/ttyACM0");
srl_flush(s1);
get(s1);
set(s1,"baudrate",9600);
set(s1,"bytesize",8);
set(s1,"parity",'N');
set(s1,"stopbits",1);
get(s1);
while true
valore = srl_read(s1,6);
char(valore)
pause(1);
endwhile
srl_close(s1)
Per quanto riguarda la connettivita' con i database la versione attuale si interfaccia solo con PostgreSql mediante il pacchetto database
pkg install database-2.3.2.tar.gz
(deve essere installato il pacchetto devel di postgresql, esempio ripreso da qui. Prima di arrivare ad una connessioni con Postgres c'e' un post da smanettare con la configurazione del server, in particolare con il file pg_hba.conf)
conn = pq_connect (setdbopts ("dbname", "test"));
L'aspetto interessante e' che con la versione 3.8 e' stata implementata una GUI simile a Matlab (prima si lavorava praticamente a linea di comando da shell)
Il programma e' stato compilato da sorgenti su Centos 6
Le dipendenze sono
yum install gcc gcc-c++ kernel-devel make mercurial libtool libtool-ltdl-devel libtool-ltdl autoconf cmake lapack-devel \ lapack pcre-devel readline-devel readline fftw-devel glpk-devel suitesparse suitesparse-devel gnuplot libcurl-devel zlib-devel \ flex texlive gperf fltk-devel qhull-devel hdf5-devel gl2ps-devel qrupdate-devel arpack-devel qscintilla-devel llvm-devel qt-devel \ bison ghostscript-devel librsvg2-tools icoutils readline pcre
Dopo la compilazione (un po' lunghina per la verita' ...ma la mia macchina e' un po' vecchiotta) si lancia il programma con
octave --force-gui
Questo e' uno script base su Octave che dovrebbe funzionare senza troppi problemi su Octave
----------------------------------------------------------------------------
clear all
close all
echo off
function rad = radians(degree)
rad = degree .* pi / 180;
end;
function [a,c,dlat,dlon]=haversine(lat1,lon1,lat2,lon2)
dlat = radians(lat2-lat1);
dlon = radians(lon2-lon1);
lat1 = radians(lat1);
lat2 = radians(lat2);
a = (sin(dlat./2)).^2 + cos(lat1) .* cos(lat2) .* (sin(dlon./2)).^2;
c = 2 .* asin(sqrt(a));
#arrayfun(@(x) printf("distance: %.8f m\n",6372800 * x), c);
end;
[volt,lat,lon,quota]=textread("tetto_6_11_ridotto.csv", "%u;%u;%u;%u");
mlat = mean(lat);
mlon = mean(lon);
minlat = min(lat);
maxlat = max(lat);
minlon = min(lon);
maxlon = max(lon);
stdlat = std(lat);
stdlon = std(lon);
[r,c] = size(lat);
fprintf("Media Lat: %d\n",mean(lat));
fprintf("Media Lon: %d\n",mean(lon));
fprintf("Std Lat: %d\n",std(lat));
fprintf("Std Lon: %d\n",std(lon));
fig = figure;
plot(lat,lon);
axis([minlat maxlat minlon maxlon]);
title('Originali')
print(fig,'gps','-dpng');
centro = centroid(lat,lon);
fprintf("Centroide %d %d\n",centro);
#plot(volt)
#print(fig,'volt','-dpng')
disp ("-----------------")
mlat = double(mlat)/10000000.0
mlon = double(mlon)/10000000.0
#fprintf("MLat: %f\n",mlat);
ripuliti = zeros(r,2);
indice = 1;
for n = 1:r
#fprintf("MLat: %f\n",mlat);
#fprintf("MLon: %f\n",mlon);
#fprintf("Lat: %f\n",double(lat(n))/10000000.0);
#fprintf("Lon: %f\n",double(lon(n))/10000000.0);
[a,c,dlat,dlon] = haversine(mlat,mlon,double(lat(n))/10000000.0,double(lon(n))/10000000.0);
#fprintf("Distanza %i :%f\n",n,double(c)*6378160.0);
if (c*6378160.0) < 5.0
ripuliti(indice,1) = double(lat(n))/10000000.0;
ripuliti(indice,2) = double(lon(n))/10000000.0;
indice = indice + 1;
end
end
fig2 = figure;
plot(ripuliti(1:indice-1,1),ripuliti(1:indice-1,2))
axis([double(minlat)/10000000.0 double(maxlat)/10000000.0 double(minlon)/10000000.0 double(maxlon)/10000000.0]);
title("Filtrati")
mflat = mean(ripuliti(1:indice-1,1));
mflon = mean(ripuliti(1:indice-1,2));
devflat = std(ripuliti(1:indice-1,1));
devflon = std(ripuliti(1:indice-1,2));
fprintf("Media Filtrata Lat: %.7f\n",mflat);
fprintf("Media Filtrata Lon: %.7f\n",mflon);
fprintf("DevSt Filtrata Lat: %.7f\n",devflat);
fprintf("DevSt Filtrata Lon: %.7f\n",devflon);
----------------------------------------------------------------------------
Octave ha un corrispettivo dei toolbox di Matlab, ovvero di pacchetti di estensioni dei comandi che possono essere scaricati, a seconda delle necessita' da Octave Forge
Se per esempio si vuole leggere/scrivere una porta seriale si deve scaricare il pacchetto instrument control in formato tar.gz e si installa con il comando
pkg install instrument-control-0.2.1.tar.gz
Di seguito un semplice esempio per leggere i dati seriali (da Arduino). Per far utilizzare la porta seriale ad un normale utente, quest'ultimo deve essere aggiunto al gruppo dialout (adduser luca dialout)
----------------------------------------------------------------------------
#! /usr/local/bin/octave -qf
pkg load instrument-control
s1 = serial("/dev/ttyACM0");
srl_flush(s1);
get(s1);
set(s1,"baudrate",9600);
set(s1,"bytesize",8);
set(s1,"parity",'N');
set(s1,"stopbits",1);
get(s1);
while true
valore = srl_read(s1,6);
char(valore)
pause(1);
endwhile
srl_close(s1)
----------------------------------------------------------------------------
Per quanto riguarda la connettivita' con i database la versione attuale si interfaccia solo con PostgreSql mediante il pacchetto database
pkg install database-2.3.2.tar.gz
(deve essere installato il pacchetto devel di postgresql, esempio ripreso da qui. Prima di arrivare ad una connessioni con Postgres c'e' un post da smanettare con la configurazione del server, in particolare con il file pg_hba.conf)
----------------------------------------------------------------------------
pkg load databaseconn = pq_connect (setdbopts ("dbname", "test"));
pq_exec_params (conn, "create table testtable (t text, i int2, b bytea);")
pq_exec_params (conn, "insert into testtable values ($1, $2, $3);", {"name1", 1, uint8([2, 4, 5])})
pq_exec_params (conn, "select * from testtable;")
pq_exec_params (conn, "drop table testtable;")
pq_close (conn);
I programmi in Octave possono essere lanciati anche all'esterno dell'ambiente di sviluppo rendendo eseguibile il file .m ed inserendo il testa al file .m la riga
#!/usr/local/bin/octave -qf
----------------------------------------------------------------------------
I programmi in Octave possono essere lanciati anche all'esterno dell'ambiente di sviluppo rendendo eseguibile il file .m ed inserendo il testa al file .m la riga
#!/usr/local/bin/octave -qf
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...