Mam obraz zapisany jako tablica 2d numpy (prawdopodobnie multi-d).Funkcja Numpy View Reshape Without Copy (2d ruchome/przesuwne okno, kroki, zamaskowane struktury pamięci)
mogę się widok na tej tablicy, która odzwierciedla 2d okno przesuwne, ale kiedy zmienią się tak, że każdy wiersz jest spłaszczony okno (wiersze są okna, kolumna jest piksel w tym oknie) python tworzy pełną kopię . Robi to, ponieważ używam typowej sztuczki krokowej, a nowy kształt nie jest ciągły w pamięci.
Potrzebuję tego, ponieważ przechodzę całe duże obrazy do klasyfikatora sklearn, który akceptuje matryce 2d, gdzie nie ma procedury partii/częściowego dopasowania, a pełna rozszerzona kopia jest zbyt duża dla pamięci.
Moje pytanie: Czy istnieje sposób na wykonanie tej czynności bez wykonania pełnej kopii widoku?
Wierzę, że odpowiedź będzie albo (1) coś o krokach albo numpy zarządzania pamięcią, które przeoczyłem, albo (2) jakiejś maskowanej struktury pamięci dla Pythona, która może emulować tablicę numpy nawet do zewnętrznego pakietu jak sklearn, który obejmuje cyton.
To zadanie polegające na przeszkoleniu ruchomych okien obrazu 2d w pamięci jest powszechne, ale jedyną próbą, którą znam, aby bezpośrednio objaśnić poprawki, jest projekt Vigra (http://ukoethe.github.io/vigra/).
Dzięki za pomoc.
>>> A=np.arange(9).reshape(3,3)
>>> print A
[[0 1 2]
[3 4 5]
[6 7 8]]
>>> xstep=1;ystep=1; xsize=2; ysize=2
>>> window_view = np.lib.stride_tricks.as_strided(A, ((A.shape[0] - xsize + 1)/xstep, (A.shape[1] - ysize + 1)/ystep, xsize, ysize),
... (A.strides[0] * xstep, A.strides[1] * ystep, A.strides[0], A.strides[1]))
>>> print window_view
[[[[0 1]
[3 4]]
[[1 2]
[4 5]]]
[[[3 4]
[6 7]]
[[4 5]
[7 8]]]]
>>>
>>> np.may_share_memory(A,window_view)
True
>>> B=window_view.reshape(-1,xsize*ysize)
>>> np.may_share_memory(A,B)
False
myślę, że to jest niemożliwe, nawet Ci zdać 'as_strided' tablicę do klasyfikatora sklearn, myślę, że większość (jeśli nie wszystkie) klasyfikatory skopiują twoje dane, jeśli nie są ciągłe. – HYRY
Tak, jestem prawie pewien, że nie da się tego zrobić. Przepraszam. Jeśli znajdziesz sposób, daj mi znać;) Ponadto: bezpośrednie wprowadzanie obrazu może nie być dobrym pomysłem, a funkcje obliczeniowe mogą rozwiązać Twój problem. –
Zdecydowanie wykluczyć numer (1), "sklearn.feature_extraction.image.extract_patches" daje dokładnie ten widok, o którym mówisz, a jego zmiana na pewno spowoduje wykonanie kopii zgodnie z zasadami numpy. Czy na pewno potrzebujesz wszystkich poprawek wielu obrazów naraz? Możesz zajrzeć do algorytmów online/bating dla dowolnego celu. Spróbuj na przykład 'SGDClassifier'. – eickenberg