Jaka reprezentacja Haskella jest zalecana dla 2D, nieboxowanych tablic pikseli z milionami pikseli?

Chcę rozwiązać problemy z przetwarzaniem obrazów w Haskell. Pracuję zarówno z obrazami bitowymi (bitmapami), jak i kolorowymi z milionami pikseli. Mam kilka pytań:

  1. Na jakiej podstawie wybrać pomiędzy Vector.Unboxed a UArray? Obie są nieboxowanymi tablicami, ale abstrakcja Vector wydaje się mocno reklamowana, zwłaszcza wokół fuzji pętli. Czy Vector zawsze jest lepiej? Jeśli nie, Kiedy powinienem użyć jakiej reprezentacji?

  2. Do zdjęć kolorowych I będzie chciał przechowywać potrójne 16-bitowe liczby całkowite lub potrójne liczby zmiennoprzecinkowe o pojedynczej precyzji. Czy w tym celu Vector lub UArray jest łatwiejszy w użyciu? Bardziej wydajny?

  3. W przypadku obrazów bitowych będę musiał przechowywać tylko 1 bit na piksel. Czy istnieje predefiniowany typ danych, który może mi pomóc, pakując wiele pikseli w słowo, Czy jestem zdany na siebie?

  4. Wreszcie, moje tablice są dwuwymiarowe. Przypuszczam, że mógłbym poradzić sobie z dodatkową iniekcją narzuconą przez reprezentacja jako "tablica tablic" (lub wektor wektorów), ale wolałbym abstrakcję, która ma obsługę mapowania indeksów. Czy ktoś może polecić coś ze standardowej biblioteki lub z Hackage ' u?

Jestem programistą funkcjonalnym i nie mam potrzeby mutacji: -)

Author: Norman Ramsey, 2011-05-15

4 answers

Dla tablic wielowymiarowych, aktualną najlepszą opcją w Haskell, moim zdaniem, jest repa.

Repa zapewnia wysoką wydajność, regularne, wielowymiarowe, kształt polimorficznych równoległych macierzy. Wszystkie dane liczbowe są przechowywane bez pudełka. Funkcje pisane za pomocą kombinatorów Repa są automatycznie równoległe pod warunkiem, że podczas uruchamiania programu podasz +RTS-Nwhatever w wierszu poleceń.

Ostatnio został użyty do jakiegoś obrazu problemy z przetwarzaniem:

Zacząłem pisać tutorial na temat korzystania z repa, co jest dobrym miejscem na początek, jeśli znasz już tablice Haskella lub bibliotekę wektorową. Kluczowym etapem jest użycie typów kształtów zamiast prostych typów indeksów, aby zająć się indeksami wielowymiarowymi (a nawet szablonami).

The repa-io pakiet zawiera wsparcie dla czytania i pisania .pliki obrazów bmp, choć potrzebna jest obsługa większej liczby formatów.

Odpowiadając na twoje konkretne pytania, oto grafika, z dyskusją:


Wszystkie trzy UArray, Vector i Repa obsługują unboxing. Vector i Repa mają bogate, elastyczne API, ale UArray nie. Uarray i Repa mają wielowymiarowe indeksowanie, ale Vector Nie. Wszystkie mają wsparcie Dla bit-packingu, chociaż Vector i Repa mają pewne zastrzeżenia w tym zakresie. Vector I Repa współdziałają z danymi i kodem C, ale UArray nie. Tylko Repa obsługuje szablony.


na jakiej podstawie wybrać Wektor.Unboxed i UArray?

Mają w przybliżeniu taką samą reprezentację podstawową, jednak podstawową różnicą jest szerokość API do pracy z wektorami: mają prawie wszystkie operacje, które normalnie kojarzysz z listami( z fuzją opartą na optymalizacji), podczas gdy UArray nie mają prawie żadnego API.

W przypadku obrazów kolorowych będę chciał przechowywać potrójne 16-bitowe liczby całkowite lub potrójne liczby zmiennoprzecinkowe o pojedynczej precyzji.

UArray ma lepszą obsługę danych wielowymiarowych, ponieważ może używać dowolnych typów danych do indeksowania. Chociaż jest to możliwe w Vector (pisząc instancję UA dla Twojego elementu Typ), nie jest głównym celem Vector -- zamiast tego, to jest miejsce, w którym Repa wchodzi, dzięki czemu bardzo łatwo jest używać niestandardowych typów danych przechowywanych w efektywny sposób, dzięki indeksowaniu shape.

W Repa, twoja trójka spodenek będzie miała typ:

Array DIM3 Word16
To jest tablica 3D Word16s.]}

W przypadku obrazów bitowych będę musiał przechowywać tylko 1 bit na piksel.

UArrays pack Bools as bits, Vector uses the instance for Bool which do bit packing, zamiast tego używając reprezentacji opartej na Word8. Howver, łatwo jest napisać implementację bit-packing dla wektorów -- oto jedna , z (przestarzałej) biblioteki uvectora. Pod maską, Repa używa Vectors, więc myślę, że dziedziczy, że biblioteki wyborów reprezentacji.

czy istnieje predefiniowany typ danych, który może mi pomóc, pakując wiele pikseli w słowo

Można używać istniejących instancji dla dowolnej biblioteki, dla różnych typy słów, ale może być konieczne napisanie kilku pomocników przy użyciu danych.Bity do zwijania i rozwijania spakowanych danych.

W końcu moje tablice są dwuwymiarowe

Uarray i Repa wspierają wydajne tablice wielowymiarowe. Repa ma również bogaty interfejs do tego celu. Vector na własną rękę nie.


Ważne wzmianki:

  • hmatrix , niestandardowy typ tablicy z rozbudowanymi powiązaniami z pakietami algebry liniowej. Należy stosować typy vector lub repa.
  • W 1996 roku, po raz pierwszy w historii, w 1997 roku, w Polsce, w 1998 roku, w Polsce, w 1999 roku, w Polsce, w 1999 roku, w Polsce, w 1999 roku, w Polsce i na świecie]}
  • [107]}tablica chalkboard, Biblioteka Andy ' ego Gilla do manipulowania obrazami 2D
  • codec-image-devil , odczyt i zapis różnych formatów obrazów do UArray
 89
Author: Don Stewart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-17 02:20:55

Kiedyś przejrzałem ważne dla mnie funkcje bibliotek Haskell array i skompilowałem tabelę porównawczą (tylko arkusz kalkulacyjny: bezpośredni link). Postaram się odpowiedzieć.

Na jakiej podstawie wybrać Wektor.Unboxed i UArray? Obie są nieboskłonowymi tablicami, ale abstrakcja wektorowa wydaje się mocno reklamowana, zwłaszcza wokół fuzji pętli. Czy Vector zawsze jest lepszy? Jeśli nie, to Kiedy powinienem użyć jakiej reprezentacji?

UArray może być preferowane od wektora, jeśli potrzebne są tablice dwuwymiarowe lub wielowymiarowe. Ale Vector ma ładniejsze API do manipulowania wektorami. Ogólnie Rzecz Biorąc, Vector Nie nadaje się do symulacji tablic wielowymiarowych.

Wektor.Unboxed nie może być używany ze strategiami równoległymi. Podejrzewam, że UArray nie może być również używany, ale przynajmniej bardzo łatwo jest przełączyć się z Uarray na Boxed Array i sprawdzić, czy korzyści z równoległości przewyższają koszty boksu.

Dla kolorowych obrazków I będzie chciał przechowywać potrójne 16-bitowe liczby całkowite lub potrójne liczby zmiennoprzecinkowe o pojedynczej precyzji. Czy w tym celu, Vector lub UArray jest łatwiejszy w użyciu? Bardziej wydajny?

Próbowałem używać tablic do reprezentowania obrazów (choć potrzebowałem tylko obrazów w skali szarości). Dla kolorowych obrazów użyłem Biblioteki Codec-Image-DevIL do odczytu / zapisu obrazów (powiązania z biblioteką DevIL), dla obrazów w skali szarości użyłem biblioteki pgm (czysty Haskell).

Moim głównym problemem z Array było to, że dostarcza tylko random access storage, ale nie dostarcza wielu sposobów budowania algorytmów tablicowych ani nie zawiera gotowych do użycia bibliotek procedur tablicowych (nie łączy się z bibliotekami algebry liniowej, nie pozwala na wyrażanie splotów, FFT i innych przekształceń).

Prawie za każdym razem, gdy nowa tablica musi być zbudowana z istniejącej, musi być skonstruowana pośrednia lista wartości (jak w mnożenie macierzy z łagodnego wprowadzenia). Koszt tablicy konstrukcja często przewyższa zalety szybszego losowego dostępu, do tego stopnia, że reprezentacja oparta na liście jest szybsza w niektórych moich przypadkach użycia.

STUArray mógłby mi pomóc, ale nie lubiłem walczyć z tajemniczymi błędami typu i wysiłkami koniecznymi do napisania kodu polimorficznego za pomocą STUArray .

Problem z tablicami polega więc na tym, że nie nadają się one dobrze do obliczeń numerycznych. Dane Hmatrix.Spakowane.Wektor i dane.Spakowane.Matrix są pod tym względem lepsze, ponieważ pochodzą one wraz z solidną biblioteką matrix (Uwaga: licencja GPL). Pod względem wydajności, przy mnożeniu macierzy, hmatrix był wystarczająco szybki ( tylko nieco wolniejszy niż Octave), ale bardzo głodny pamięci (zużywał kilka razy więcej niż Python/SciPy).

Istnieje również biblioteka blas dla macierzy, ale nie opiera się na GHC7.

Nie miałem jeszcze dużego doświadczenia z Repa i nie rozumiem dobrze kodu repa. Z tego co widzę ma bardzo ograniczony zakres gotowych używać algorytmów macierzowych i macierzowych napisanych na nim, ale przynajmniej możliwe jest wyrażenie ważnych algorytmów za pomocą biblioteki. Na przykład, istnieją już procedury dla mnożenia macierzy i dla splotu w repa-algorytmach. Niestety, wydaje się, że obecnie jest ograniczony do jąder 7×7 (dla mnie to za mało, ale powinno wystarczyć do wielu zastosowań).

Nie próbowałem wiązań Haskell OpenCV. Powinny być szybkie, ponieważ OpenCV jest naprawdę szybko, ale nie jestem pewien, czy wiązania są kompletne i wystarczająco dobre, aby mogły być użytkowe. Ponadto OpenCV ze swej natury jest bardzo imperatywny, pełen destrukcyjnych aktualizacji. Przypuszczam, że trudno jest zaprojektować ładny i wydajny interfejs funkcjonalny na nim. Jeśli ktoś idzie w sposób OpenCV, prawdopodobnie używa reprezentacji obrazu OpenCV wszędzie i używa procedur OpenCV do manipulowania nimi.

Dla obrazów bitowych będę musiał przechowywać tylko 1 bit na piksel. Czy istnieje predefiniowany typ danych, który czy możesz mi pomóc, pakując wiele pikseli w słowo, Czy jestem zdany na siebie?

Z tego co wiem, Unboxed arrays of Bools zajmują się pakowaniem i rozpakowywaniem wektorów bitowych. Pamiętam, że patrzyłem na implementację tablic Boolów w innych bibliotekach i nie widziałem tego gdzie indziej.

Wreszcie, moje tablice są dwuwymiarowe. Przypuszczam, że mógłbym poradzić sobie z dodatkowym indrection narzuconym przez reprezentację jako "tablica tablic" (lub wektor wektorów), ale wolałbym abstrakcja z obsługą mapowania indeksów. Czy ktoś może polecić coś ze standardowej biblioteki lub z Hackage ' u?

Poza wektorami (i listami prostymi), wszystkie inne biblioteki tablic mogą reprezentować tablice dwuwymiarowe lub macierze. Przypuszczam, że unikają nieprzejednanej iniekcji.

 17
Author: sastanin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-16 13:23:26

Chociaż nie jest to dokładnie odpowiedź na twoje pytanie i nie jest nawet haskell jako taki, polecam spojrzeć na CVlub CV-combinators biblioteki w hackage. Wiążą one wiele dość przydatnych operatorów przetwarzania obrazu i wizji z biblioteki opencv i sprawiają, że praca z problemami wizyjnymi maszyny jest znacznie szybsza.

Byłoby świetnie, gdyby ktoś wymyślił, jak repa lub jakaś taka biblioteka tablic może być używana bezpośrednio z opencv.

 5
Author: aleator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-16 17:11:20

Oto nowa Biblioteka przetwarzania obrazów Haskell , która może obsłużyć wszystkie zadania i wiele więcej. Obecnie używa pakietów Repa i Vector dla bazowych reprezentacji, które w konsekwencji dziedziczą fuzję, obliczenia równoległe, mutację i większość innych gadżetów, które pochodzą z tych bibliotek. Zapewnia łatwy w użyciu interfejs, który jest naturalny do manipulacji obrazem:

  • indeksowanie 2D i nieboxowane piksele z dowolnymi precyzja (Double, Float, Word16, itd..)
  • wszystkie niezbędne funkcje jak map, fold, zipWith, traverse ...
  • obsługa różnych przestrzeni kolorów: RGB, HSI, skala szarości, Bi-tonalne, złożone, itp.
  • wspólna funkcjonalność przetwarzania obrazu:
    • Morfologia binarna
    • splot
    • Interpolacja
    • transformata Fouriera
    • Wykres histogramu
    • itd.
  • możliwość traktowania pikseli i obrazów jako zwykłych liczby.
  • odczytywanie i zapisywanie popularnych formatów obrazów za pomocą juicypixels biblioteka

Co najważniejsze, jest to czysta biblioteka Haskella, więc nie zależy od żadnych zewnętrznych programów. Jest również wysoce rozszerzalny, można wprowadzić nowe przestrzenie kolorów i reprezentacje obrazu.

Jedna rzecz, której nie robi, to pakowanie wielu pikseli binarnych w Word, zamiast tego używa Word na piksel binarny, być może w przyszłości...

 0
Author: Alexey Kuleshevich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-17 07:25:53