Téma: Systém pro tvorbu MPEG-7 popisu
Řešitel: Pavel Halabala
Odboní konzultanti: Martin Klíma, Zdeněk Mikovec
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í:

| 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"/> |
| 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"/> |
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.
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.
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.
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í:





