Python + numpy. Cum salvez un ndarray?


(Stanciu Bogdan Mircea) #1

Folosesc python si OpenCv pentru a analiza imagini în scopul de a identifica anumite obiecte. Pentru un obiect identificat voi primi un ndarray de forma (128,)

numpy.ndarray.shape -> (128,)

Nu cunosc bine domeniul, dar înteleg că am de a face cu o matrice(vector?) formată din 128 de rânduri:

[-0.13324779  0.07699916  0.07388478 -0.03598456 -0.11201403  0.03763866
 -0.07290583 -0.10213859  0.17338049 -0.07507262  0.22797929  0.02942928
 -0.23947586  0.01548999 -0.06016192  0.14306621 -0.23936415 -0.13146186
  0.01669888 -0.01902436  0.08149804 -0.00718571  0.09238464  0.06476595
 -0.20146593 -0.37633407 -0.08514702 -0.05497275 -0.05519069 -0.07563933
  0.04161645  0.02059933 -0.26140714  0.06852563  0.01000789  0.13962367
 -0.08136955 -0.08200281  0.17668757  0.03513168 -0.223764   -0.03431484
  0.13936588  0.19361517  0.20583454  0.02077176  0.03106816 -0.07553929
  0.09798267 -0.3187331   0.14926629  0.19402091  0.04103468  0.09346163
  0.09235281 -0.19481149 -0.02653584  0.1082996  -0.13947827  0.07656634
  0.04024382  0.00443063 -0.00491191 -0.05225209  0.16886911  0.15809382
 -0.14269416 -0.16937719  0.14667892 -0.17205396 -0.05616717  0.12774628
 -0.11233569 -0.30332905 -0.29071301  0.04263771  0.37713093  0.13436104
 -0.10171229  0.05541117 -0.0539664  -0.07524069 -0.03920137  0.15930758
  0.02460042  0.07106307 -0.10303017  0.07339792  0.20273802 -0.02029669
 -0.01961578  0.32428858 -0.01745746 -0.02127901  0.0350596   0.14803565
 -0.11483158  0.00374436 -0.1931953  -0.06647938 -0.04224826 -0.03227504
 -0.05786083  0.04293956 -0.19867441  0.13072301 -0.02097246 -0.06899048
 -0.06300285 -0.04557617 -0.14343169 -0.03020197  0.12214635 -0.34466234
  0.21299002  0.15590993  0.03748224  0.20569445  0.07591719  0.09331071
  0.06357895 -0.0814479  -0.09284329 -0.05525764 -0.04040729 -0.02342326
 -0.02322666  0.0456584 ]

Toată minunea asta vreau să o salvez astfel încât mai multe programe (clienți) să o poată citi.
Am încercat să salvez într-o bază de date într-un tabel de forma:

id ndarray obs
1 [0.5 1.5 -0.2 …] obs1
2 [0.1 0.3 0.2 …] obs2

, sperând că InnoDB mă va scuti de problema conexiunilor concurente și cu avantajele: câmpuri de observație + tabele relaționale pentru completări ulterioare.

Deci ndarray-ul trebuie encodat, scris în tabel iar la citire decodat. Mă cam împotmolesc aici, sunt metode mai bune de a salva un asemenea array?


(Horia Coman) #2

Bizar. La ce fel de imagini de astepti? Poate au fost aplatizate din w x h in w*h x 1? Desi 128 nu ar permite decat imagini de genul 8x16 sau 8x8x2, care-s cam mici pentru orice aplicatie.

shape ar trebui sa fie ceva de forma (64, 64) pentru o imagine grayscale de 64x64 de exemplu, sau (32,32,3) pentru o imagine color RGB/LAB etc. Setul complet de date ar putea sa fie atunci (64, 64, 1000) sau (32, 32, 3, 1000) de exemplu.

Cat despre serializare, poti folosi dumps ca sa obti un pickle al obiectului pe care poti sa-l folosesti apoi intr-o coloana varbinary in baza de date. Numpy mai are si save, dar pare folosibil pentru matricea intreaga, nu cate o observatie deodata.


(Stanciu Bogdan Mircea) #3

Array-ul nu reprezintă o imagine, ci rezultatul unei funcții de interpretare/clasificare a imaginii respective. Am incercat cred save, dar aveam probleme la returnarea din baza de date (cum ai zis și tu, se plângea de shape). Am sa incerc metoda cu varbinary