Archief - [PROG][JAVA] Afbeeldingsverwerking

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

killgore

Legacy Member
Hallo

Ik moet momenteel in java nogal intensieve operaties doen op afbeeldingen.

Korte situatieschets:
We krijgen een afbeelding binnen via een netwerkconnectie (om deze reden in jpeg). Deze wordt momenteel ingelezen via ImageIO.read() van jpeg->bufferedImage.

In ons algoritme wordt hieruit dan van een aantal lijnen de Y-component (luminantie) gehaald, hierop wordt een detectiealgoritme uitgevoerd (dat vrij snel gaat).
Daarna wordt uit die originele BufferedImage een specifiek stuk uitgeknipt die weer door een algoritme wordt gestuurd die informatie haalt uit dat stuk afbeelding.

Dit werkte vrij goed voor de resoluties waarmee we momenteel werken (iets van: alles gaat onder de seconde). Nu echter zou dit veel vlotter moeten om meerdere requests tegelijkertijd aan te kunnen (en iets van een 500ms is dan niet aanvaardbaar). Na verscheidene optimalisaties ben ik tot de conclusie gekomen dat onze voornaamste vertraging in de afbeeldingsoperaties zit. Zo neemt dat eerste detectiealgoritme op mijn pc gemiddeld een 75ms in beslag, waarvan 65ms gaan naar een loop die de luminantiecomponenten berekent uit de buffered image. fyi: ligt niet aan float-operaties, maar aan de getRGB() functies.
Analoog voor het 2e algoritme wordt ongeveer 4/5e van de tijd verspild aan het clippen & knippen van de juiste data.

Als oplossing hadden we verscheidene ideeën:
1) Alles omzetten naar C++ -> gewoon de tijd niet voor momenteel. Voor iemand begint te zagen: dit had je onmiddellijk in C++ moeten doen, we hadden goede redenen het niet te doen :). Zelfs van in het begin was het duidelijk dat dit puur in C++ doen gewoon niet haalbaar was met de gegeven tijdslimiet. Bepaalde bibliotheken die we gebruiken in java zijn niet beschikbaar en gewoon niet op een week te herschrijven in C/C++.
2) Bepaalde operaties in C++ uitvoeren -> De afbeeldingsverwerkingsoperaties (en eventueel zware algoritmen) in c++ laten gebeuren. Hier zit ik met het probleem dat ik geen idee heb hoe je pakweg een BufferedImage object aanspreekt vanuit C++. ik heb al zitten prutsen met javah, maar veel hielp me dat niet voor native jre klasses. Het voornaamste is dat ik eigenlijk rechtstreeks aan rgb-data zou kunnen, want een copy van de rgb-array in java zelf duurt véél te lang. In c++ zou ik dan mijn afbeeldingsoperaties véél sneller kunnen uitvoeren met behulp van libs (en assembler) die gebruik maken van multimedia extensies van IA32 processoren (spijtig genoeg geen GPU beschikbaar).
3) Zoeken naar geoptimaliseerde java image libraries, het zou me sterk verbazen moesten deze niet bestaan, maar ik vind niet direct iets deftig op internet. Dit zou voor ons de optimale oplossing zijn. Deze mogen gerust beperkt zijn tot IA32-compatible machines.

Een bijkomende vraag: een volgende stap is dat we geen jpeg maar mpeg ontvangen, waarbij deze operatie bv. bij elk I-frame moet worden uitgevoerd. Zelfde vraag ivm snelheid hiervoor.

In de hoop dat er toch iemand hiervan iets weet.

Bavo aka Joske

Legacy Member
Het is zeker en vast CPU intensief. Als je alle standaard optimalisaties hebt gedaan (juiste datatypes, snelste algoritmes) is je enige optie meer CPU te voorzien, liefst meerdere cores zodat je threads kan assignen per taak. Dat is makkelijk in java, maar misschien geen optie. In het ergste geval kan je zelfs grid-computing gaan overwegen zoals gridgain, en het gedistribueerd aanpakken (als de overhead niet groter is dan de deeltaak tenminste).

Minstens Java2D en JAI goed bestuderen dat je zeker bent dat je de snelste API gebruikt.
Puur qua algoritmische rekenkracht doet Java weinig onder voor C++, al heeft het wel wat warm-up rondes nodig voor de optimale JIT te bereiken.

Je gata uiteindelijk zoveel mogelijk Object-operaties willen vermijden. Get RGB klinkt al gevaarljk.

MilM

Legacy Member
Een project van Wilfried Philips ? :p

Kunt ge eventueel niet gewoon het algoritme op minder lijnen toepassen of zitten jullie al op de limiet van het aanvaardbare ? (afhankelijk van de grootte van objecten dat je wil detecteren)

killgore

Legacy Member
Bavo aka Joske zei:
Het is zeker en vast CPU intensief. Als je alle standaard optimalisaties hebt gedaan (juiste datatypes, snelste algoritmes) is je enige optie meer CPU te voorzien, liefst meerdere cores zodat je threads kan assignen per taak. Dat is makkelijk in java, maar misschien geen optie. In het ergste geval kan je zelfs grid-computing gaan overwegen zoals gridgain, en het gedistribueerd aanpakken (als de overhead niet groter is dan de deeltaak tenminste).

Minstens Java2D en JAI goed bestuderen dat je zeker bent dat je de snelste API gebruikt.
Puur qua algoritmische rekenkracht doet Java weinig onder voor C++, al heeft het wel wat warm-up rondes nodig voor de optimale JIT te bereiken.

Je gata uiteindelijk zoveel mogelijk Object-operaties willen vermijden. Get RGB klinkt al gevaarljk.

wel, ivm beste api's weet ik het dus nog niet zeker en daar knelt het schoentje. Momenteel gebruik ik awt (=Java2D) en dat is gewoon niet snel gneoeg. @runtime voor gewone code is java snel genoeg (ik denk niet dat we ons algoritme sneller krijgen in c++). Het zijn puur die afbeeldingsoperaties die ik sterk moet kunnen versnellen atm.
Zeg mij eens wat ik anders moet doen dan getRGB()? Ik moet immers pixeloperaties uitvoeren. Het ultieme zou zijn moest hij mij gewoon zeer braaf een referentie naar zijn interne RGB array geven, maar dat wilt ie nergens :(.
Owja, en natuurlijk houdt ik #objecten en kopieën minimaal.

Maar ik ben ondertussen idd ook op JAI beland, thx vo tip :). Hopelijk vind ik hier wat beters.

edit: heb je toevallig geen JAI tutorials :p?

MilM zei:
Een project van Wilfried Philips ? :p

Kunt ge eventueel niet gewoon het algoritme op minder lijnen toepassen of zitten jullie al op de limiet van het aanvaardbare ? (afhankelijk van de grootte van objecten dat je wil detecteren)

nope, we zitten bij intec :p, is voor onze bachelorproef ;). En detectie zelf zit aan minimum idd, zoals gezegd is dat algoritme eigenlijk méér dan snel genoeg.

Anyway, allebei al bedankt.

Bavo aka Joske

Legacy Member
killgore zei:
Maar ik ben ondertussen idd ook op JAI beland, thx vo tip :). Hopelijk vind ik hier wat beters.

Ik zag bij de JAI API LookupTables staan, wat een snelle rechtreekse toegang lijkt tot de onderliggende data.
Moet wel zeggen dat JAI dood lijkt, en nooit echt goed is gedocumenteerd. Heb alvast zelf niet veel zinnige info gevonden buiten de API zelf.

killgore

Legacy Member
Bavo aka Joske zei:
Ik zag bij de JAI API LookupTables staan, wat een snelle rechtreekse toegang lijkt tot de onderliggende data.
Moet wel zeggen dat JAI dood lijkt, en nooit echt goed is gedocumenteerd. Heb alvast zelf niet veel zinnige info gevonden buiten de API zelf.

Ik heb ondertussen al wat tutorials, vanavond proberen doorgronden, morgen eens implementeren en hopen op superieure snelheidswinst :unsure:.

Ze hebben toch platform-native builds, wat suggereert dat ze wat performance kunnen halen uit platformspecifieke processorinstructies.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan