29. 12. 2002

Geometrické modelování

Závěrečná zpráva


Téma: Systém pro tvorbu MPEG-7 popisu

Řešitel: Pavel Halabala

Odboní konzultanti: Martin Klíma, Zdeněk Mikovec


Zadání

Je dána X3D/VRML/SVG scéna s MPEG-7 sémantickým popisem. Navrhněte a implementujte systém umožňující tvorbu a editaci sémantického popisu 3D/2D scény (VRML/X3D/SVG) ve formátu MPEG-7. Při práci bude možno interagovat s objekty ve scéně (označování objektů, skupin objektů) a provádět okamžitou editaci sémantického poipisu. A naopak bude možno interagovat s objekty v sémantickém popisu a tak vybírat objety ve scéně.

Analýza formátu MPEG-7

MPEG-7 standard ("Multimedia Content Description Interface") je určen pro popis multimediálního obsahu v různých multimedionálních prostředích. Tato úloha je výzvou, danou širokým spektrem požadavků a cílových multimediálních aplikací a velkým počtem audiovizuálních vlastností. Pro dosažení tohoto cíle se MPEG-7 snaží standardizovat:

Standard je rozdělen do 7 částí:

  1. Systémy: Architektura standardu, nástroje potřebné pro přípravu MPEG-7. Popisy pro efektivní přenos a ukládání dat a pro umožnění synchonizace mezi obsahem a popisy. Také nástroje vztahující se ke správě a ochráně intelektuálního vlastnictví.
  2. Jazyk pro definici popisu (DDL)
  3. Obraz: Nástroje pro popis obrazu (Ds a DSs)
  4. Zvuk: Nástroje pro popis zvuku (Ds a DSs)
  5. Multimetdiální popisná schémata: Všeobecné popisné nástroje
  6. Software: Softwarová implementace důležitých částí MPEG-7
  7. Přizpůsobivost: Způsoby testování přizpůsobivosti implementace MPEG-7

Nástroje pro popis sémantických relací

Jde o popis relací mezi:
Hierarchie sémantických relací

Relace objekt - objekt (ObjectObjectRelation DS)

Jde o popis binární relace mezi dvěma objekty. Zdrojový atribut (source), cílový atribut (target) a argumenty relace musí odkazovat na popis Object DS nebo na uzel popisu Graph DS odkazující na popis Object DS.
Přehled relací mezi objekty
Název Relace Inverzní Relace Definice Popis příkladu Příklad
componentOf hasComponentOf Pokud (objekt A componentOf objekt B), pak objekt A je samostatnou částí objektu B a je separovatelný z celku. Objekt A je komponentou objektu B. Objekt "kolo" je komponentou objektu "auto". <ObjectObjectRelation name="componentOf" source="#kolo" target="#auto"/>
memberOf hasMemberOf Pokud (objekt A memberOf objekt B), pak objekt A je členem objektu B. Objekt "hráč" je členem objektu "tým" <ObjektObjectRelation name="memberOf" source="#hráč" target="#tým"/>
substanceOf hasSubstanceOf Pokud (objekt A substanceOf objekt B), pak objekt A je neseparovatelnou součástí objektu B. Objekt A je obsahem objektu B. Objekt "gin" je obsahem objektu "martini".
Objekt "papír" obsahuje objekt "celulósa".
<ObjektObjectRelation name="substanceOf" source="#gin" target="#martini"/>
<ObjektObjectRelation name="hasSubstanceOf" source="#papír" target="#celulósa"/>

Relace objekt - událost (ObjectEventRelation DS)

Jde o popis binární relace mezi objektem a událostí. Zdrojový atribut (source), cílový atribut (target) a argumenty relace musí odkazovat na popis Object DS nebo Event DS nebo na uzel popisu Graph DS odkazující na popis Object DS nebo Event DS.
Přehled relací mezi objekty a událostmi
Název Relace Inverzní Relace Definice Popis příkladu Příklad
agentOf hasAgentOf Pokud (objekt A agentOf událost B), pak objekt A, (záměrně, svou vůlí) vykoná nebo způsobí událost B. Objekt A je strůjcem události B. Při popisu "Bob dává knihu Alici", objekt "Bob" je strůjcem události "dávat" <ObjektEventRelation name="agentOf" source="#Bob" target="#dávat"/>
patientOf hasPatientOf Pokud (objekt A patientOf událost B), pak stav objektu A je ovlivněn událostí B. Objekt A je předmětem události B. V předchozím příkladě objekt "kniha" je předmětem události "dávat".
Při popisu "Kuře zemřelo", objekt "kuře" je předmětem události "zemřít".
<ObjektEventRelation name="patientOf" source="#kniha" target="#dávat"/>
<ObjektEventRelation name="patientOf" source="#kuře" target="#zemřít"/>
experiencerOf hasExperiencerOf Pokud (objekt A experiencerOf událost B), pak objekt A vnímá nebo pociťuje popud nebo vjem v události B. Objekt A je pasivním účastníkem události B. Objekt A pociťuje/vnímá/prožívá událost B. Při popisu "John nenávidí pizzu", pociťuje objekt "John" událost "nenávidět".
Při popisu "kluk vidí psa", vnímá objekt "kluk" událost "vidět".
Naopak při popisu "John sleduje film" je objekt "John" strůjcem (agentOf) události "sledovat".
<ObjektEventRelation name="experiencerOf" source="#John" target="#nenávidět"/>
<ObjektEventRelation name="experiencerOf" source="#kluk" target="#vidět"/>
<ObjektEventRelation name="agentOf" source="#John" target="#sledovat"/>
stimulusOf hasStimulusOf Pokud (objekt A stimulusOf událost B), pak objekt A je pociťován/vnímán/prožíván objektem C, který je účastníkem relace (objekt C experiencerOf událost B). Objekt A je popudem události B. Při popisu "Kluk vidí psa" je objekt "pes" popudem události "vidět". <ObjektEventRelation name="stimulusOf" source="#pes" target="#vidět"/>
causerOf hasCauserOf Pokud (objekt A causerOf událost B), pak objekt A vykonává událost B, ale není strůjcem (agentOf), tzn. nejedná úmyslně, svou vůlí. Objekt A je vykonavatelem události B. Při popisu "Blesk uhodil do stromu" je objekt "blesk" vykonavatelem události "uhodit". <ObjektEventRelation name="causerOf" source="#blesk" target="#uhodit"/>
locationOf hasLocationOf Pokud (objekt A locationOf událost B), pak objekt A je místo, kde se odehrává událost B. Objekt A je místem události B. Při popisu "Alice dostává na ulici květinu." je objekt "ulice" místem události "dostat". <ObjektEventRelation name="locationOf" source="#ulice" target="#dostat"/>
sourceOf hasSourceOf Pokud (objekt A sourceOf událost B), pak objekt A je výchozím bodem pohybu v události B. Objekt A je zdrojem události B. Při popisu "John zvedl krabici z podlahy na stůl" je objekt "podlaha" zdrojem události "zvednout". <ObjektEventRelation name="sourceOf" source="#podlaha" target="#zvednout"/>
destinationOf hasDestinationOf Pokud (objekt A destinationOf událost B), pak objekt A cílovým bodem pohybu v události B. Objekt A je cílem události B. Při popisu "Alice dostala květiny" je objekt "Alice" cílem události "dostat".
Při popisu "Alice odjela z Kalifornie do Toronta" je objekt "Toronto" cílem události "odjet".
<ObjektEventRelation name="destinationOf" source="#Alice" target="#dostat"/>
<ObjektEventRelation name="destinationOf" source="#Toronto" target="#odjet"/>
beneficaryOf hasBeneficaryOf Pokud (objekt A beneficaryOf událost B), pak objekt A je objekt, kvůli kterému se vykonává akce v události B. Objekt A má prospěch z události B. Při popisu "John upekl pro Alici koláč" má objekt "Alice" prospěch z události "upéct". <ObjektEventRelation name="beneficaryOf" source="#Alice" target="#upéct"/>
themeOf hasThemeOf Pokud (objekt A themeOf událost B), ak objekt A vystupuje v/je námětem události B, ale není jí nijak ovlivněn. Objekt A je tématem události B. Při popisu "kluk vypráví o psovi" je objekt "pes" tématem události "vyprávět". <ObjektEventRelation name="themeOf" source="#pes" target="#vyprávět"/>
resultOf causeOf Pokud (objekt A resultOf událost B), pak objekt A je výsledným objektem, plynoucím z události B. Objekt A je výsledkem události B. Při popisu "John upekl koláč" je objekt "koláč" výsledkem události "upéct". <ObjektEventRelation name="resultOf" source="#koláč" target="#upéct"/>
instrumentOf hasInstrumentOf Pokud (objekt A instrumentOf událost B), pak objekt A je použit strůjcem události B. Objekt A je nástrojem události B. Při popisu "Alice krájí nožem salám" je objekt "nůž" nástrojem události "krájet". <ObjektEventRelation name="instrumentOf" source="#nůž" target="#krájet"/>
pathOf hasPathOf Pokud (objekt A pathOf událost B), pak objekt A je trasa, po které se entita pohybuje při události B. Objekt A je cestou události B. Při popisu "Vlak jede po kolejích" je objekt "kolej" cestou události "jet". <ObjektEventRelation name="pathOf" source="#kolej" target="#jet"/>
accompanierOf hasAccompanierOf Pokud (objekt A accompanierOf událost B), pak se objekt A spoluúčastní události B, ale není jejím strůjcem. Objekt A je průvodcem události B. Při popisu "John cestoval s Alicí do Francie" je objekt "Alice" je průvodcem události "cestovat". <ObjektEventRelation name="accompanierOf" source="#Alice" target="#cestovat"/>

Implementace

Nyní se dostávám k samotné implementaci systému. Vstupem programu bude "nějaká" scéna, pro kterou chceme zkonstruovat MPEG-7 popis podle výše uvedených definicí. Nejprve je třeba si ujasnit, které vlastnosti MPEG-7 popisu má program podporovat. Z relací objekt-objekt se jeví jako vhodná relace componentOf. Ostatní dvě se hodí spíš pro scény, kde je třeba popsat hlubší sémantický význam složení objektů. Podobně to vypadá i u relace událost-objekt. Potřebujeme popsat, že mezi dvěma objekty existuje jakési spojení, například, že jeden sousedí s druhým. Tomuto spojení můžeme opět přiřadit různé významy podle předchozích definicí. My si opět vybereme jen jeden (resp. dva) typy, protože zatím potřebujeme pouze definovat, že spojení existuje. Vybereme proto relace sourceOf a destinationOf, které nám umožňují rovněž popsat směr spojení (např. z jednoho objektu se dostaneme do druhého, ale ne naopak).

Jak bude vypadat samotný program? Zřejmě potřebujeme jedno okno se scénou a druhé s příslušným MPEG-7 popisem. Otázkou je, jaký nástroj použijeme pro prohlížení scén. Vytvořit dokonalý prohlížeč není smyslem této semestrální práce, omezíme se tedy na již hotové a volně dostupné produkty, ze kterých se pokusíme vybrat pro nás nejvýhodnější. Omezil jsem se pouze na výběr mezi rozhraním EAI a knihovnou J3D.

Použití EAI (External Authoring Interface) versus knihovny J3D.

Platforma Javy je objektově orientovaný systém uživatelem definovaných a standardních tříd, které umožňují aplikacím být přeloženy a spuštěny v různých systémech a prostředích. Tyto aplikace mohou být zabudovány v jiných prostředích (jako např. HTML prohlížeč) nebo běžet jako samostatné komponenty na celé škále počítačových systémů. EAI funguje jako množina tříd umožňujících přístup k jedné nebo více VRML scénám v daném prostředí.

Po konzultaci s odbornými poradci jsem od této možnosti opustil. Více se mi líbila možnost mít vše v jednom, proto jsem se rozhodl použít knihovnu J3D. Tato volba má i své nevýhody. Můj program se částečně komplikuje, protože je nutné přidat VRML parser a komponentu prohlížeče 3D scén. Na druhou stranu má toto řešení nesporné výhody. Knihovna J3D totiž umožňuje zobrazovat 3D scény přímo v okně javovské aplikace. Program lze postavit tak, aby bylo možné na místě prohlížeče použít libovolnou třídu, která bude implementovat předem definované rozhraní a tím dosáhnout snadného rozšíření. Lze tak například jednoduše vytvořit MPEG-7 editor pro libovolný multimediální formát a ne jen ten, který podporuje rozhraní EAI. Možností rozšíření může být například formát SVG pro dvojrozměrné scény nebo jakýkoli jiný smysluplný formát. Přitom rozhraní, které je třeba implementovat prohlížečem není nikterak složité, což jsem zjistil po následné analýze.

Použité knihovny

Pro načítání a zobrazování 3D scén jsem použil knihovnu CyberVRML, která spolupracuje se standartní knihovnou javy J3D. Jediným nedostatkem knihovny CyberVRML je rychlost (nebo spíš pomalost). U rozsáhlejších scén by toto mohlo způsobovat dosti značné problémy.

Pro načítání MPEG-7 popisu jsem použil XML parser Xerces (přesněji implementaci sady rozhraní SAX), který by měl fungovat přesně podle standartu. Ukládání do formátu XML jsem vyřešil pomocí vlastní jednoduché třídy XMLSaver.

Vizualizace MPEG-7 popisu

Způsob vizualizace MPEG-7 popisu a interakce s prohlížečem je hlavním úkolem této semestrální práce.

Vizualizace vztahu componentOf

Vizualizace spojení dvou objektů, tedy vztahů sourceOf a destinationOf

Interakce s prohlížečem

Proto, abychom mohli popsat scénu, potřebujeme nějakým způsobem vybírat v ní obsažené objekty a naopak objekty, které označíme v okně s MPEG-7 popisem, chceme vidět zvýrazněné ve scéně.

Nabízí se několik řešení:

Protože jsem si vybral toto téma pro svou dimplomovou práci, volím poslední možnost. Strukturu programu popisuje následující graf:

Popis rozhraní:

Příklad komunikace mezi objekty ukazuje následující graf:


První část ukazuje co se děje, pokud uživatel klikne na nějaký objekt ve scéně:
  1. Třída prohlížeče zavolá metodu u sebe zaregistrovaného objektu implementující rozhraní PickListener. Vybraný objekt ale neoznačuje, označení se provádí až když prohlížeč dostane zprávu selectionPerformed od jádra.
  2. Jádro provede překlad jména objektu, které obdržel od prohlížeče na obecný objekt MPEG-7 popisu a opět zavolá PickListener, což je v tomto případě metoda třídy vizualizující MPEG-7 popis.
  3. Vizualizační komponenta zpracuje obdrženou událost. Může například označit daný uzel v grafu a poslat zprávu jádru, které implementuje rozhraní SelectionListener, že byl označený objekt. To naznačuje druhá akce.
Druhá část ukazuje co se bude dít, pokud uživatel zvolí objekt v MPEG-7 popisu (ať už přímo nebo kliknutím na objekt v prohlížeči):
  1. Třída dotyčné vizualizační komponenty pošle zprávu objektu, který se u ní zaregistroval jako SelectionListener, že byl označen objekt (nebo několik objektů). V mém případě je tímto objektem jádro.
  2. Jádro provede překlad objektu MPEG-7 popisu na definici v prohlížeči a zavolá metodu prohlížeče selectionPerformed.
  3. Prohlížeč označí vybraný objekt (pole objektů)

Práce s MPEG7 editorem

Spuštění


Ukázka programu

Hlavní menu:

Popis prohlížeče:

Vizualizace mpeg-7 popisu

Vizualizaci mpeg-7 popisu obstarávají 2 komponenty:

Komponenta ComponentOf

Všechny akce spojené s tvorbou relace componentOf obstarává místní nabídka, která se aktivuje stiskem pravého tlačítka myši. Akce se vztahují k právě označenému uzlu ve stromě. Obsahuje 3 volby:

Komponenta Connections

Testování

Tvorba MPEG-7 popisu

Nejprve je třeba mít k dispozici scénu, pro kterou budeme tvořit popis. Jsou podporovány formáty VRML a S3D (formát S3D ještě nebyl vyzkoušen, takže nemusí fungovat správně). Všechny objekty, které mají být součástí popisu, musí být označeny unikátním identifikátorem. Předpokládejme tedy, že máme scénu čtyřpokojového bytu (viz. soubor byt.wrl) a chceme vytvořit jeho mpeg-7 popis:

Editace hotového MPEG-7 popisu.

Předpokládejme, že máme na disku uloženou scénu a její mpeg-7 popis, který chceme změnit.