ZTV
Zakład Telewizji
Pracownia mediów cyfrowych
Instrukcja do ćwiczenia: Deskryptory MPEG-7 z wykorzystaniem serwisów
sieciowych
Przedmiot: Techniki Internetu (TINE)
Andrzej Buchowicz, Grzegorz Galiński, Krystian Ignasiak, Grzegorz Pastuszak
Warszawa, kwiecień 2010
Zakład Telewizji
Instytut Radioelektroniki
Wydział Elektroniki i Technik Informacyjnych
Politechnika Warszawska
2
Wprowadzenie
We wprowadzeniu znajduje się krótki opis pojęć ważnych dla zrozumienia dalszej części instrukcji
oraz zadań do wykonania. Celem ćwiczenia jest prezentacja możliwości szybkiego tworzenia aplikacji
korzystających z koncepcji serwisów sieciowych oraz ilustracja tych możliwości przykładowym
wyszukiwaniem obrazów w multimedialnej bazie danych na podstawie wzorca.
Serwis sieciowy
Serwis sieciowy (usługa sieciowa, ang. web service) jest komponentem programistycznym o
określonej funkcjonalności. Usługa jest jednocześnie niezależna od platformy sprzętowo-
programowej na której jest zaimplementowana oraz niezależna od samej implementacji. Serwis
sieciowy jest komponentem, który zwykle jest używany do budowy rozproszonych systemów
informatycznych, wykorzystujących Internet do komunikacji pomiędzy modułami aplikacji. Moduły
systemu komunikują się pomiędzy sobą wykorzystując standardowe protokoły komunikacyjne oraz
standardowe formaty danych.
Do wymiany informacji pomiędzy modułami najczęściej wykorzystywany jest język XML, konkretnie
jego aplikacja SOAP (Simple Object Access Protocol). Komunikaty SOAP przesyłane są najczęściej
protokołem HTTP ze względu na jego rozpowszechnienie oraz to, że dane przesyłane tym protokołem
zwykle nie są blokowane przez zapory sieciowe. Korzystanie z usługi przypomina zdalne wywołanie
funkcji, tj. przekazanie nazwy funkcji do wywołania, przekazanie oczekiwanych przez funkcję
parametrów (o określonych typach) oraz odebranie rezultatu działania funkcji (także określonego
typu). Definicja serwisu zawiera właśnie nazwy i typy realizowanych funkcji oraz listę argumentów
funkcji. Definicję serwisu wyraża się także w aplikacji XML – języku WSDL (Web Services Definition
Language).
Takie podejście do budowy aplikacji rozproszonych ma wiele zalet: możliwość budowy usług przez
niezależne firmy/organizacje, otwartość rozwiązań, korzystanie z dowolnych narzędzi
programistycznych oraz integracja systemu informatycznego na poziomie danych a nie na poziomie
kodu.
W trakcie zajęć będzie używany serwis sieciowy obliczający niektóre deskryptory MPEG-7. Serwis ten
jest zlokalizowany na komputerze o nazwie tiger.ire.pw.edu.pl. Z punktu widzenia serwisu kluczowa
jest jego definicja, przedstawiona w postaci pliku w języku WSDL. Opis serwisu obliczającego
deskryptory MPEG-7 można znaleźć pod adresem:
http://tiger.ire.pw.edu.pl:8080/pbz-mpeg7-pbz-mpeg7EJB/XmDao?wsdl
Poniżej zamieszczono pełny tekst definicji przykładowego serwisu w języku WSDL.
1<?xml version="1.0" encoding="utf-8"?>
2<definitions name="MPEG7-XM" targetNamespace="http://ejb.mpeg7.pbz/" xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ejb.mpeg7.pbz/" xmlns:xsd="http://www.w3.org/2001/XML
3 <types>
4 <xs:schema targetNamespace="http://ejb.mpeg7.pbz/" version="1.0" xmlns:tns="http://ejb.mpeg7.pbz/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
5 <xs:element name="calculateDescriptor" type="tns:calculateDescriptor" />
6 <xs:element name="calculateDescriptorResponse" type="tns:calculateDescriptorResponse" />
7 <xs:element name="calculateDistance" type="tns:calculateDistance" />
8 <xs:element name="calculateDistanceResponse" type="tns:calculateDistanceResponse" />
9 <xs:element name="getImageDescriptor" type="tns:getImageDescriptor" />
10 <xs:element name="getImageDescriptorResponse" type="tns:getImageDescriptorResponse" />
11 <xs:element name="getImageId" type="tns:getImageId" />
12 <xs:element name="getImageIdResponse" type="tns:getImageIdResponse" />
13 <xs:element name="getImageUrl" type="tns:getImageUrl" />
14 <xs:element name="getImageUrlResponse" type="tns:getImageUrlResponse" />
15 <xs:element name="getNumImages" type="tns:getNumImages" />
16 <xs:element name="getNumImagesResponse" type="tns:getNumImagesResponse" />
17 <xs:element name="registerImage" type="tns:registerImage" />
18 <xs:element name="registerImageResponse" type="tns:registerImageResponse" />
3
19 <xs:element name="searchImages" type="tns:searchImages" />
20 <xs:element name="searchImagesResponse" type="tns:searchImagesResponse" />
21 <xs:complexType name="calculateDistance">
22 <xs:sequence>
23 <xs:element minOccurs="0" name="arg0" type="xs:string" />
24 <xs:element minOccurs="0" name="arg1" type="xs:string" />
25 <xs:element name="arg2" type="xs:int" />
26 </xs:sequence>
27 </xs:complexType>
28 <xs:complexType name="calculateDistanceResponse">
29 <xs:sequence>
30 <xs:element name="return" type="xs:double" />
31 </xs:sequence>
32 </xs:complexType>
33 <xs:complexType name="calculateDescriptor">
34 <xs:sequence>
35 <xs:element minOccurs="0" name="arg0" type="xs:string" />
36 <xs:element name="arg1" type="xs:int" />
37 </xs:sequence>
38 </xs:complexType>
39 <xs:complexType name="calculateDescriptorResponse">
40 <xs:sequence>
41 <xs:element minOccurs="0" name="return" type="xs:string" />
42 </xs:sequence>
43 </xs:complexType>
44 <xs:complexType name="getImageDescriptor">
45 <xs:sequence>
46 <xs:element name="arg0" type="xs:int" />
47 <xs:element name="arg1" type="xs:int" />
48 </xs:sequence>
49 </xs:complexType>
50 <xs:complexType name="getImageDescriptorResponse">
51 <xs:sequence>
52 <xs:element minOccurs="0" name="return" type="xs:string" />
53 </xs:sequence>
54 </xs:complexType>
55 <xs:complexType name="getImageId">
56 <xs:sequence>
57 <xs:element minOccurs="0" name="arg0" type="xs:string" />
58 </xs:sequence>
59 </xs:complexType>
60 <xs:complexType name="getImageIdResponse">
61 <xs:sequence>
62 <xs:element name="return" type="xs:int" />
63 </xs:sequence>
64 </xs:complexType>
65 <xs:complexType name="getImageUrl">
66 <xs:sequence>
67 <xs:element name="arg0" type="xs:int" />
68 </xs:sequence>
69 </xs:complexType>
70 <xs:complexType name="getImageUrlResponse">
71 <xs:sequence>
72 <xs:element minOccurs="0" name="return" type="xs:string" />
73 </xs:sequence>
74 </xs:complexType>
75 <xs:complexType name="getNumImages">
76 <xs:sequence />
77 </xs:complexType>
78 <xs:complexType name="getNumImagesResponse">
79 <xs:sequence>
80 <xs:element name="return" type="xs:int" />
81 </xs:sequence>
82 </xs:complexType>
83 <xs:complexType name="registerImage">
84 <xs:sequence>
85 <xs:element minOccurs="0" name="arg0" type="xs:string" />
86 </xs:sequence>
87 </xs:complexType>
88 <xs:complexType name="registerImageResponse">
89 <xs:sequence>
90 <xs:element name="return" type="xs:int" />
91 </xs:sequence>
92 </xs:complexType>
93 <xs:complexType name="searchImages">
94 <xs:sequence>
95 <xs:element minOccurs="0" name="arg0" type="xs:string" />
96 <xs:element name="arg1" type="xs:int" />
97 <xs:element name="arg2" type="xs:int" />
98 </xs:sequence>
99 </xs:complexType>
100 <xs:complexType name="searchImagesResponse">
101 <xs:sequence>
102 <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="xs:string" />
103 </xs:sequence>
104 </xs:complexType>
105 </xs:schema>
106 </types>
107 <message name="XmDao_registerImageResponse">
108 <part element="tns:registerImageResponse" name="registerImageResponse"></part>
109 </message>
110 <message name="XmDao_getImageDescriptorResponse">
111 <part element="tns:getImageDescriptorResponse" name="getImageDescriptorResponse"></part>
112 </message>
113 <message name="XmDao_getImageId">
114 <part element="tns:getImageId" name="getImageId"></part>
115 </message>
116 <message name="XmDao_getImageUrlResponse">
117 <part element="tns:getImageUrlResponse" name="getImageUrlResponse"></part>
118 </message>
119 <message name="XmDao_registerImage">
120 <part element="tns:registerImage" name="registerImage"></part>
4
121 </message>
122 <message name="XmDao_calculateDistanceResponse">
123 <part element="tns:calculateDistanceResponse" name="calculateDistanceResponse"></part>
124 </message>
125 <message name="XmDao_searchImagesResponse">
126 <part element="tns:searchImagesResponse" name="searchImagesResponse"></part>
127 </message>
128 <message name="XmDao_searchImages">
129 <part element="tns:searchImages" name="searchImages"></part>
130 </message>
131 <message name="XmDao_calculateDistance">
132 <part element="tns:calculateDistance" name="calculateDistance"></part>
133 </message>
134 <message name="XmDao_getImageIdResponse">
135 <part element="tns:getImageIdResponse" name="getImageIdResponse"></part>
136 </message>
137 <message name="XmDao_calculateDescriptorResponse">
138 <part element="tns:calculateDescriptorResponse" name="calculateDescriptorResponse"></part>
139 </message>
140 <message name="XmDao_calculateDescriptor">
141 <part element="tns:calculateDescriptor" name="calculateDescriptor"></part>
142 </message>
143 <message name="XmDao_getImageDescriptor">
144 <part element="tns:getImageDescriptor" name="getImageDescriptor"></part>
145 </message>
146 <message name="XmDao_getNumImages">
147 <part element="tns:getNumImages" name="getNumImages"></part>
148 </message>
149 <message name="XmDao_getNumImagesResponse">
150 <part element="tns:getNumImagesResponse" name="getNumImagesResponse"></part>
151 </message>
152 <message name="XmDao_getImageUrl">
153 <part element="tns:getImageUrl" name="getImageUrl"></part>
154 </message>
155 <portType name="XmDao">
156 <operation name="calculateDescriptor" parameterOrder="calculateDescriptor">
157 <input message="tns:XmDao_calculateDescriptor"></input>
158 <output message="tns:XmDao_calculateDescriptorResponse"></output>
159 </operation>
160 <operation name="calculateDistance" parameterOrder="calculateDistance">
161 <input message="tns:XmDao_calculateDistance"></input>
162 <output message="tns:XmDao_calculateDistanceResponse"></output>
163 </operation>
164 <operation name="getImageDescriptor" parameterOrder="getImageDescriptor">
165 <input message="tns:XmDao_getImageDescriptor"></input>
166 <output message="tns:XmDao_getImageDescriptorResponse"></output>
167 </operation>
168 <operation name="getImageId" parameterOrder="getImageId">
169 <input message="tns:XmDao_getImageId"></input>
170 <output message="tns:XmDao_getImageIdResponse"></output>
171 </operation>
172 <operation name="getImageUrl" parameterOrder="getImageUrl">
173 <input message="tns:XmDao_getImageUrl"></input>
174 <output message="tns:XmDao_getImageUrlResponse"></output>
175 </operation>
176 <operation name="getNumImages" parameterOrder="getNumImages">
177 <input message="tns:XmDao_getNumImages"></input>
178 <output message="tns:XmDao_getNumImagesResponse"></output>
179 </operation>
180 <operation name="registerImage" parameterOrder="registerImage">
181 <input message="tns:XmDao_registerImage"></input>
182 <output message="tns:XmDao_registerImageResponse"></output>
183 </operation>
184 <operation name="searchImages" parameterOrder="searchImages">
185 <input message="tns:XmDao_searchImages"></input>
186 <output message="tns:XmDao_searchImagesResponse"></output>
187 </operation>
188 </portType>
189 <binding name="XmDaoBinding" type="tns:XmDao">
190 <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
191 <operation name="calculateDescriptor">
192 <soap:operation soapAction="" />
193 <input>
194 <soap:body use="literal" />
195 </input>
196 <output>
197 <soap:body use="literal" />
198 </output>
199 </operation>
200 <operation name="calculateDistance">
201 <soap:operation soapAction="" />
202 <input>
203 <soap:body use="literal" />
204 </input>
205 <output>
206 <soap:body use="literal" />
207 </output>
208 </operation>
209 <operation name="getImageDescriptor">
210 <soap:operation soapAction="" />
211 <input>
212 <soap:body use="literal" />
213 </input>
214 <output>
215 <soap:body use="literal" />
216 </output>
217 </operation>
218 <operation name="getImageId">
219 <soap:operation soapAction="" />
220 <input>
221 <soap:body use="literal" />
222 </input>
5
223 <output>
224 <soap:body use="literal" />
225 </output>
226 </operation>
227 <operation name="getImageUrl">
228 <soap:operation soapAction="" />
229 <input>
230 <soap:body use="literal" />
231 </input>
232 <output>
233 <soap:body use="literal" />
234 </output>
235 </operation>
236 <operation name="getNumImages">
237 <soap:operation soapAction="" />
238 <input>
239 <soap:body use="literal" />
240 </input>
241 <output>
242 <soap:body use="literal" />
243 </output>
244 </operation>
245 <operation name="registerImage">
246 <soap:operation soapAction="" />
247 <input>
248 <soap:body use="literal" />
249 </input>
250 <output>
251 <soap:body use="literal" />
252 </output>
253 </operation>
254 <operation name="searchImages">
255 <soap:operation soapAction="" />
256 <input>
257 <soap:body use="literal" />
258 </input>
259 <output>
260 <soap:body use="literal" />
261 </output>
262 </operation>
263 </binding>
264 <service name="MPEG7-XM">
265 <port binding="tns:XmDaoBinding" name="MPEG7-XM_Port">
266 <soap:address location="http://turtle2.zoo.ire.pw.edu.pl:8080/pbz-mpeg7-pbz-mpeg7EJB/XmDao" />
267 </port>
268 </service>
269</definitions>
W uproszczeniu, plik ten definiuje serwis poprzez wyspecyfikowanie typów danych przesyłanych
pomiędzy elementami oprogramowania (linie 3-106), komunikatów (linie 107-154), operacji
składających się z sekwencji komunikatów (linie 155-188), powiązania pomiędzy operacjami a
wywołaniami protokołu SOAP (linie 189-263) i wreszcie podanie tzw. punktu końcowego, czyli
adresu, pod którym dostępny jest cały serwis (linie 264-268).
Przykładowo w linii 156 definiuje się operację obliczania deskryptora
calculateDescriptor
,
która składa się przesłania komunikatu wejściowego (komunikat wysyła klient serwisu do serwera, na
którym zainstalowany jest serwis) o nazwie
XmDao_calculateDescriptor
oraz komunikatu
wyjściowego o nazwie
XmDao_calculateDescriptorResponse
. Oba te komunikaty są
zdefiniowane wcześniej w linii 140
XmDao_calculateDescriptor
i w linii 137
XmDao_calculateDescriptorResponse
. W podobny sposób zdefiniowane są pozostałe
operacje udostępniane przez serwis, np. obliczenie odległości pomiędzy obrazami gdy kryterium jest
funkcja podobieństwa danego deskryptora, pobrania URL wskazującego położenie obrazu czy też
pobrania liczby wszystkich obrazów zarejestrowanych w bazie serwisu.
Należy zwrócić uwagę, że w linii 266 automatycznie wygenerowany plik opisu serwisu zawiera
odwołanie do komputera, na którym zainstalowano serwer aplikacyjny (w tym przypadku JBoss), a na
nim rozmieszczono całe oprogramowanie serwisu obliczającego deskryptory MPEG-7. Jest to
definicja tzw. punktu końcowego serwisu. Dokument WSDL może zawierać wiele punktów
końcowych. Klienty serwisu mogą korzystać z dowolnego punktu końcowego.
Bardzo ważne jest to, że opis serwisu jest generowany w sposób automatyczny – co jest
charakterystyczne dla tej metodyki tworzenia oprogramowania rozproszonego. Po
6
zaimplementowaniu metod obliczających deskryptory (po zaimplementowaniu metod serwisu w
ogólności) rozmieszcza się serwis na serwerze aplikacyjnym z jednoczesnym, automatycznym
wygenerowaniem dokumentu WSDL opisującego funkcjonalność i możliwości serwisu. Dokument
WSDL jest potrzebny do tego by przygotować (również w sposób automatyczny) szkielet
oprogramowania klienckiego korzystającego z serwisu.
Deskryptory
Deskryptor wg słownika języka polskiego to „słowo lub grupa słów, które razem z innymi opisują treść
tekstu na potrzeby katalogów lub systemów wyszukiwania informacji”. W multimediach przyjmuje
się, że deskryptor to pewna struktura danych, która opisuje inną, zwykle większą strukturę danych,
będącą obiektem multimedialnym (obrazem cyfrowym, nagraniem muzycznym, sekwencją wideo
itp.).
Użycie deskryptorów danych multimedialnych odpowiada rosnącej potrzebie indeksowania tych
danych, ze względu na zalewającą nas każdego dnia ich ilość. Można już mówić o powodzi
informacyjnej związanej z łatwością produkcji i dystrybucji multimediów. Coraz większy problem
stanowi filtrowanie (odrzucanie) informacji niepotrzebnej lub powtarzającej się.
Informacja o treści innej informacji (multimedialnej w tym przypadku) może być rozpatrywana na
niskim i wysokim poziomie. Cechy niskopoziomowe to te, które nie mają wartości semantycznej, ale
za to możliwa jest ich automatyczna ekstrakcja, zaś cechy wysokopoziomowe związane są z ludzką
percepcją treści i typowo wymagają ekstrakcji manualnej lub co najwyżej półautomatycznej.
Deskryptory powinny być ogólne, tj. powinny być niezależne od opisywanych treści, jakkolwiek
buduje się także deskryptory przeznaczone wyłącznie dla specyficznych obiektów multimedialnych,
np. deskryptory rozpoznawania twarzy lub deskryptory kształtu. Ogólność deskryptorów dotyczy
także niezależności od zastosowania deskryptora w konkretnej aplikacji. Ważną cechą deskryptorów
jest także efektywność w sensie wyszukiwania i filtrowania informacji. Dąży się także do tego, by
deskryptory był upakowane, w sensie ich małego rozmiaru oraz niezależne od operacji, którym mogą
być poddawane dane multimedialne (skalowanie, obrót, artefakty wynikające z kompresji danych
itd.).
Dla danych multimedialnych opracowano międzynarodowy standard ekstrakcji (obliczania)
metadanych – jest to standard MPEG-7 [1, 2, 3, 4]. Zawiera on definicję języka opisu metadanych,
DDL (Description Definition Language), definicję opisu metadanych, czyli definicję deskryptorów, DS
(Description Schemes, Descriptors) oraz definicję relacji pomiędzy deskryptorami. Deskryptory MPEG-
7 dzielą się na:
•
ogólne: data/czas, komentarze, informacje o autorach, podział na ujęcia/obiekty, …
•
wizualne: kolor, tekstura, kształt, ruch, …
•
audio: widmo, melodia, …
Serwis sieciowy używany w trakcie zajęć implementuje zestaw deskryptorów związanych z kolorami
w obrazie. Są to w szczególności DominantColor, ScalableColor, ColorLayout, ColorStructure,
CTBrowsing.
Poniżej przestawiono graficznie intuicje związane z budową wybranych deskryptorów MPEG-7.
7
Wybrane deskryptory MPEG-7
Deskryptor koloru dominującego, DominantColor
Ten deskryptor reprezentuje do 8 dominujących kolorów w obrazie, każdy z kolorów reprezentowany
jest przez indeks kwantyzacji oraz, opcjonalnie, przez wariancję wartości kolorów w klastrze (tylko
informacjo o tym czy wariancja jest niska czy wysoka). Deskryptor koloru dominującego znajduje te
kolory, które najczęściej pojawiają się w obrazie, w przeciwieństwie do deskryptorów bazujących na
histogramach, które obliczają tylko wagę danego koloru w obrazie.
Skalowalny histogram kolorów, ScalableColor
Deskryptor ten oblicza się przez znalezienie 256-komórkowego histogramu kolorów w przestrzeni
HSV (Hue Saturation Value), a następnie nieliniowemu skwantowaniu wartości histogramu do 4
bitów, wykonaniu transformacji Haara skwantowanych wartości i wreszcie braniu pod uwagę
wszystkich 256 współczynników transformaty lub też mniejszej ich liczby (128, 64, 32, 16). Sam
deskryptor przestawiany jest jako wektor wybranej liczby współczynników. Liczba współczynników to
właśnie „skalowanie” deskryptora. Deskryptor ten nie ma intuicyjnej reprezentacji graficznej, jednak
dość dobrze odzwierciedla udział kolorów w obrazie.
Deskryptor struktury koloru, ColorStructure
Ten deskryptor to także odpowiednio obliczany histogram kolorów, jednak bierze się pod uwagę
strukturę rozmieszczenia pikseli danego koloru. Tu uzyskuje się lepsze opisanie przestrzennego
rozmieszczenia poszczególnych kolorów w obrazie.
Deskryptor rozkładu kolorów w obrazie, ColorLayout
Ten deskryptor opisuje ogólny rozkład kolorów w obrazie.
8
Deskryptor TextureBrowsing
Opisuje podstawowe cechy tekstury: skalę, kierunkowość (dwa kierunki dominujące) i regularność.
Deskryptor kształtu, RegionShape
Transformata ART – przedstawienie regionu jako ważonej sumy regionów bazowych. Idea takiego
przedstawienia podobna jest do opisu funkcji przez transformatę DCT lub DFT. Przykładowe kształty,
które można opisać przy pomocy transformaty ART Znajdują się na rysunku poniżej.
Części rzeczywiste regionów bazowych transformaty ART podane są na poniższym rysunku.
Przebieg ćwiczenia
Ćwiczenie jest prowadzone z wykorzystaniem standardowego komputera PC, z dostępem do
Internetu. Logowanie do komputerów laboratoryjnych wymaga podania nazwy użytkownika
(student) i hasła (student). Z prac przeprowadzonych w trakcie ćwiczeń należy przygotować
sprawozdanie – w laboratorium zainstalowany jest pakiet OpenOffice. Sprawozdanie (w formie
dokumentu PDF) należy przysłać pocztą elektroniczną na adres podany przez prowadzącego.
Do sprawozdania: wpisz numer komputera, na którym pracowałeś wykonując zadania
laboratoryjne.
9
Wykorzystanie aplikacji klienta serwisu sieciowego (gruby klient)
Aplikacja klienta jest napisana w Javie. Do działania wymagane jest środowisko uruchomieniowe Javy
(Java Runtime). To właśnie to wymagane środowisko powoduje, że mówimy o tym kliencie gruby. Bez
środowiska uruchomieniowego nie da się uruchomić tego oprogramowania.
Rysunek 1 Uproszczona architektura aplikacji klienta serwisu sieciowego
Gruby klient korzysta z serwisu sieciowego w taki sposób, że wywołuje bezpośrednio metody
udostępniane przez serwis. Architekturę tego rozwiązania w sposób uproszczony przedstawia
Rysunek 1.
Rysunek 2 Okno grubego klienta serwisu tuż po uruchomieniu
Kod wynikowy aplikacji klienta znajduje się w pliku archiwum o nazwie XmWsClient.jar w katalogu
\\Ant\TINE
w sieci laboratorium. Plik należy skopiować na lokalny dysk przed uruchomieniem. Po
uruchomieniu pojawia się okno programu (Rysunek 2), które jest podzielone jest na dwa obszary –
ich funkcje zostaną przedstawione w dalszej części. Program tego klienta serwisu pozwala na
wyszukiwanie obrazów z bazy danych serwisu podobnych do obrazu, który przedstawi użytkownik.
Podobieństwo jest obliczane w sensie odległości pomiędzy deskryptorami implementowanymi przez
serwis i obliczanymi przez serwis. Wyboru deskryptora dokonuje się przez menu Options -> Search
options.
Rysunek 3 Okno wyboru deskryptora i liczby spodziewanych obrazów podobnych
10
Po wybraniu tej opcji menu pojawia się okno dialogowe (Rysunek 3), w którym można wybrać jeden z
czterech udostępnianych przez tego klienta deskryptorów, a implementowanych przez serwis. W
polu number of results można wybrać liczbę podobnych obrazów zwracanych przez serwis w trakcie
wyszukiwania (parametr N).
Menu Images ma dwie opcje. Pierwsza, Get number of images, powoduje wysłanie zapytania do
serwisu o liczbę obrazów przechowywanych w bazie danych serwisu. Serwis zwraca tę liczbę, a
program klienta wyświetla ją w oknie dialogowym.
Do sprawozdania: podaj liczbę obrazów przechowywanych w bazie.
Druga opcja menu Images, Find similar images, stanowi najważniejsze użycie serwisu. Po wybraniu
tej opcji pojawia się okno dialogowe, w którym należy podać prawidłowy URL do obrazu, dla którego
chcemy znaleźć podobne obrazy w sensie wybranego wcześniej deskryptora. Program wyśle podany
lokalizator obrazu przykładowego do serwisu. Serwis obliczy dla tego obrazu deskryptor, następnie
zwróci listę lokalizatorów obrazów zarejestrowanych w bazie serwisu, które są najbliższe w sensie
wybranego deskryptora do wskazanego obrazu.
W pliku
\\Ant\TINE\listaURL.txt
znajduje się lista lokalizatorów obrazów, które należy używać do
testów w trakcie zajęć.
Po podaniu lokalizatora obrazu stanowiącego przykład, program łączy się z serwisem w celu
obliczenia wybranego deskryptora dla tego przykładu. Kolejnym krokiem jest wysłanie zapytania do
serwisu, które zwróci N obrazów, które są najbliższe przykładu w sensie wybranego deskryptora.
Wyniki (=N najbliższych obrazów) prezentowane są w postaci samoorganizującej się mapy (SOM, Self-
organizing Map, [5, 6, 7]). W skrócie, mapa iteracyjnie rozmieszcza obrazy na płaszczyźnie tak, by
obrazy gromadziły się według jakiejś cechy, w tym przypadku według odległości do przykładu.
Rysunek 4 przedstawia wygląd okna klienta po wyszukaniu 400 (parametr N) najbliższych obrazów do
obrazu
http://tiger.ire.pw.edu.pl/pbz/images/img00868_s3.jpg
, który wyświetlany jest w lewym
górnym rogu okna. Najbliższe obrazy prezentowane są w postaci miniaturek w dolnej części okna.
Najechanie kursorem myszy na miniaturkę powoduje wyświetlenie wskazanego obrazu obok obrazu
stanowiącego zapytanie, po jego prawej stronie, wraz z jego lokalizatorem i odległością pomiędzy
deskryptorami obliczonymi dla obrazu przykładowego i wskazanego myszą.
11
Rysunek 4 Przykładowy wygląd okna grubego klienta po wyszukaniu najbliższych obrazów
Najechanie kursorem myszy na miniaturkę powoduje wyświetlenie wskazanego obrazu obok obrazu
stanowiącego zapytanie, po jego prawej stronie, wraz z jego lokalizatorem i odległością pomiędzy
deskryptorami dla obrazu przykładowego i znalezionego w bazie.
Zadanie 1. Dla dwóch plików obrazowych wskazanych przez prowadzącego znaleźć najbliższe
obrazy (przy N=5), przepisać do sprawozdania nazwę czterech plików odnalezionych (czterech a nie
pięciu, gdyż jeden z odnalezionych plików będzie wzorcem) jako najbliższe przez klienta wraz z
odległością pomiędzy deskryptorami przykładu i odnalezionego obrazu. Powtórzyć to dla wszystkich
czterech deskryptorów dostępnych w grubym kliencie.
Zadanie 2. Znaleźć przykładowy obraz w Internecie. Powtórzyć Zadanie 1 dla znalezionego
obrazu. Do sprawozdania wpisać także URL obrazu przykładowego.
12
Wykorzystanie interfejsu przeglądarkowego do serwisu (cienki klient)
W tym przypadku uproszczoną architekturę rozwiązania przestawia Rysunek 5.
Rysunek 5 Uproszczona architektura rozwiązania z interfejsem przeglądarkowym do serwisu
Aplikacja klienta jest także napisana w Javie, lecz w tym przypadku działa po stronie serwera aplikacji,
przygotowując interfejs, który jest prezentowany w przeglądarce internetowej. Przeglądarka może
być traktowana w tym przypadku jako cienki klient. Dla tego zastosowania użytkownik końcowy
używa oprogramowania ogólnego przeznaczenia jakim jest przeglądarka internetowa. Aby skorzystać
z aplikacji nie trzeba instalować żadnego oprogramowania dodatkowego, w szczególności nie jest
wymagane środowisko uruchomieniowe Javy, które było wymagane w poprzednim przypadku.
Wystarczy sama przeglądarka internetowa. W kontekście architektur aplikacji rozproszonych
przeglądarka należy do tzw. warstwy prezentacji całego systemu.
Aplikacja dostępna jest pod adresem
http://tiger.ire.pw.edu.pl:8080/pbz-mpeg7Web/
. Interfejs
aplikacji jest bardzo prosty – składa się z listy odnośników do stron umożliwiających wywołanie
poszczególnych metod serwisu (Rysunek 6).
Rysunek 6 Interfejs dostępu do serwisu w przeglądarce
13
Zadanie 3. Z głównej strony aplikacji wybrać link calculteDescriptor – link ten prowadzi do
formularza służącego do obliczania konkretnych deskryptorów. Podając lokalizatory obrazów użytych
w poprzednich zadaniach obliczyć wszystkie dostępne deskryptory i skopiować je do sprawozdania.
Zadanie 4. Z głównej strony aplikacji wybrać link searchImages – jest to odpowiednik funkcji
wyszukiwania obrazów podobnych, oferowanej w grubym kliencie. Znaleźć przykładowy obraz w
Internecie i wyszukać dla niego podobne obrazy w bazie wybierając wszystkie dostępne deskryptory
oraz podając niewielką liczbę poszukiwanych obrazów (nie więcej niż pięć). Do sprawozdania
skopiować zrzuty z ekranu dla jednego z deskryptorów.
Własny klient serwisu
Przy pomocy środowiska uruchomieniowego Eclipse można w łatwy sposób przygotować klienta
serwisu bazując na jego definicji WSDL.
Środowisko Eclipse jest zintegrowanym środowiskiem programistycznym ogólnego przeznaczenia. W
zależności od zainstalowanych wtyczek (plugins) może służyć do tworzenia aplikacji z użyciem
różnych języków programowania (Java, PHP, C/C++ itd.). W szczególności środowisko Eclipse zostanie
wykorzystane do stworzenia aplikacji korzystającej z serwisu obliczającego deskryptory.
Przykład. Tworzenie prostego klienta serwisu (należy wykonać poniższe kroki jako przygotowanie do
kolejnego zadania).
Uruchomić Eclipse. W trakcie uruchamiania środowisko pyta o miejsce przechowywania projektów
(w ogólności plikowych zasobów projektu). Należy zaakceptować propozycję lub wskazać wymaganą
lokalizację tzw. przestrzeni roboczej (workspace). Środowisko w wersji zainstalowanej w
laboratorium oferuje możliwość tworzenia aplikacji w języku Java w wersji standardowej i w wersji
Enterprise Edition (J2EE). Eclipse umożliwia przełączanie pomiędzy widokami specjalnie
przeznaczonymi do tworzenia aplikacji w wybranej wersji Javy lub innych narzędzi (perspektywy).
Wyboru perspektywy dokonuje się przyciskami w prawym górnym rogu okna (Java, Java EE –
Rysunek 7). W dalszej części zakłada się wybranie perspektywy Java EE.
Rysunek 7 Przyciski wyboru perspektywy w środowisku Eclipse
Uruchamianie aplikacji tworzonych w technologii Java EE zawsze odbywa się z udziałem serwera
aplikacyjnego. Taki serwer musi być także zarejestrowany w Eclipse. Na potrzeby ćwiczenia
wystarczający jest uproszczony serwer aplikacyjny wbudowany w samo środowisko Eclipse. Należy
upewnić się, że serwer jest zarejestrowany w zakładce Servers w dolnej części okna, Rysunek 8. W
przypadku jego braku należy kliknąć prawym przyciskiem myszy wewnątrz zakładki Servers, wybrać
14
New, wybrać Server, następnie w oknie dialogowym definiowania nowego serwera rozwinąć element
Basic i zaznaczyć J2EE Preview w liście tego elementu oraz kliknąć Finish. Spowoduje to
zarejestrowanie uproszczonego serwera aplikacyjnego służącego do testowania tworzonych aplikacji.
Rysunek 8 Zakładka Servers i zarejestrowany w środowisku uproszczony serwer J2EE
Kolejnym krokiem jest utworzenie projektu dla naszego klienta. Należy kliknąć prawym przyciskiem
myszy w zakładce Project Explorer w lewej części okna, wybrać New, wybrać Other. Następnie w
oknie dialogowym definiowania nowego projektu rozwinąć element Web Services i zaznaczyć Web
Service Client w liście tego elementu oraz kliknąć Next. Kolejno, w polu Service Definition należy
wskazać URL do pliku WSDL z definicją serwisu sieciowego. W naszym przypadku jest to
http://tiger.ire.pw.edu.pl:8080/pbz-mpeg7-pbz-mpeg7EJB/XmDao?wsdl
. Pozostałe elementy okna
dialogowego należy pozostawić bez modyfikacji i kliknąć Finish (Rysunek 9). Spowoduje to
automatycznie wygenerowanie klas obiektów pośredniczących w wywołaniach metod serwisu.
Rysunek 9 Okno definiowania klienta serwisu sieciowego
Zakładka Project Explorer w lewej części okna przedstawia wszystkie elementy nowo
wygenerowanego projektu. Rysunek 10 przedstawia interfejs XmDao, w którym znajdują się
deklaracje metod udostępnianych przez serwis sieciowy. Nasz klient będzie mógł wywoływać każdą z
tych metod w celu skorzystania z serwisu.
15
Rysunek 10 Interfejs XmDao definiujący serwis sieciowy w wygenerowanym kliencie
Kolejnym krokiem jest utworzenie pakietu języka Java przechowującego kod źródłowy klienta. W tym
celu klikamy prawym przyciskiem myszy na elemencie Java Resources: src, wybieramy New,
wybieramy Package, w oknie dialogowym w polu Name wpisujemy nazwę naszego pakietu, np. tine,
klikamy Finish (jako nazwę pakietu należy wpisać swoje nazwisko dla łatwiejszej identyfikacji). Dalej
tworzymy klasę klienta. W tym celu na nowoutworzonym pakiecie tine klikamy prawym przyciskiem
myszy i wybieramy New, wybieramy Class, w oknie dialogowym w polu Name wpisujemy nazwę klasy
klienta, np. KlientTestowy, klikamy Finish.
Następnie, przed nagłówkiem klasy, należy dopisać zdania import wskazujące kompilatorowi Javy
nazwy pakietów, z których będzie korzystać klasa klienta:
Dopisujemy także funkcję
main
, od której rozpocznie się wykonywanie kodu klienta:
import
java.rmi.*;
import
pbz.mpeg7.ejb.*;
import
javax.xml.rpc.*;
16
Ostatecznie kod źródłowy klasy testowego klienta przyjmuje postać jak poniżej:
W pierwszej linii funkcji
main
(
MPEG7XM xm =
new
MPEG7XMLocator();
) tworzony jest obiekt
lokalizatora serwisu sieciowego. Obiekt ten reprezentuje ogólnie każdy serwis zdefiniowany
przytaczanym już opisem serwisu w języku WSDL. Obiekt ten posłuży do uzyskania dostępu do
obiektu reprezentującego konkretną realizację (instancję, instance) serwisu sieciowego przy pomocy
metody
getMPEG7XM_Port()
, wywołanej w pierwszej linii bloku
try
. Druga linia w bloku
try
(
int
numImages = xmDao.getNumImages();
) jest już zdalnym wywołaniem metody serwisu, która
zwraca liczbę obrazów zarejestrowanych w bazie danych. Liczba ta po pobraniu z serwisu jest
wyświetlania w konsoli klienta.
Rysunek 11 przedstawia widok okna Eclipse po uruchomieniu klienta testowego. Uruchomienie
następuje przez wybranie przycisku
na pasku narzędzi. Przy pierwszym naciśnięciu przycisku
uruchamiania wybieramy sposób uruchomienia klienta: mamy do wyboru opcje Run on Server i Java
Application, wybieramy Java Application, klikamy Ok. Należy zwrócić uwagę, że uruchomienie klienta
może trwać kilka sekund co spowodowane jest koniecznością zaangażowania całego aparatu
serwisów sieciowych, zarówno po stronie klienta jak i po stronie serwera. Pomyślne uruchomienie
kończy się wypisaniem na konsoli klienta liczby obrazków zarejestrowanych w bazie serwisu.
package
tine;
import
java.rmi.*;
import
pbz.mpeg7.ejb.*;
import
javax.xml.rpc.*;
public
class
KlientTestowy {
public
static
void
main(String[] args) {
MPEG7XM xm =
new
MPEG7XMLocator();
try
{
XmDao xmDao = xm.getMPEG7XM_Port();
int
numImages = xmDao.getNumImages();
System.
out
.println(
"num images="
+ numImages);
}
catch
(ServiceException se) {
se.printStackTrace();
}
catch
(RemoteException re) {
re.printStackTrace();
}
}
}
public
static
void
main(String[] args) {
MPEG7XM xm =
new
MPEG7XMLocator();
try
{
XmDao xmDao = xm.getMPEG7XM_Port();
int
numImages = xmDao.getNumImages();
System.
out
.println(
"num images="
+ numImages);
}
catch
(ServiceException se) {
se.printStackTrace();
}
catch
(RemoteException re) {
re.printStackTrace();
}
}
17
Rysunek 11 Uruchomienie klienta testowego
Wspomniany już interfejs XmDao definiuje wszystkie metody zdalne, które udostępnia serwis
sieciowy. Poniżej przedstawiono skrócony opis wybranych metod implementowanych przez serwis
sieciowy.
java.lang.String calculateDescriptor(java.lang.String arg0,
int
arg1)
Metoda ta oblicza deskryptor dla obrazka reprezentowanego przez podany URL (pierwszy argument
arg0). Drugi argument (arg1) jest numerem deskryptora, który ma zostać obliczony wg poniższej
tabeli. Zwracana dokument XML deskryptora w postaci ciągu znaków.
Nazwa deskryptora
numer
DominantColor
1
ScalableColor
2
ColorLayout
3
ColorStructure
4
ColorTemperatureBrowsing
5
java.lang.String getImageDescriptor(
int
arg0,
int
arg1)
Metoda ta pobiera obliczony wcześniej deskryptor z bazy serwisu. Pierwszy argument reprezentuje
identyfikator obrazu w bazie (prawidłowe identyfikatory zostaną podane przez prowadzącego), drugi
argument to numer deskryptora zgodnie z wcześniej podaną numeracją typów deskryptorów.
java.lang.String getImageUrl(
int
arg0)
Metoda zwraca URL obrazu zarejestrowanego w bazie serwisu. Argument metody to identyfikator
obrazu w bazie serwisu.
18
int
getNumImages()
Metoda zwraca liczbę obrazów zarejestrowanych w bazie serwisu.
java.lang.String[] searchImages(java.lang.String arg0,
int
arg1,
int
arg2)
Metoda dokonuje wyszukiwania obrazów podobnych. Pierwszy argument jest lokalizatorem obrazu,
dla którego chcemy wyszukać obrazy podobne w bazie serwisu. Drugi argument to numer
deskryptora, który zostanie użyty do porównań pomiędzy obrazami. Trzeci argument to liczba
obrazów podobnych, które chcemy wyszukać w bazie (argument ten odpowiada parametrowi N
stosowanym w opisie grubego klienta). Metoda zwraca tablicę ciągów znaków, które reprezentują
lokalizatory obrazów podobnych wg zadanych parametrów.
Zadanie 5. Na podstawie przykładowego klienta przygotować program własnego klienta,
wywołującego wybraną metodę serwisu z przedstawionych powyżej (oprócz
getNumImages()
). Do
sprawozdania skopiować kod źródłowy klasy klienta oraz parametry przekazane metodzie oraz
rezultaty jej działania.
Literatura uzupełniająca
[1] Information Technology – Multimedia Content Description Interface, ISO/IEC IS 15938.
[2] B.S. Manjunath., P. Salembier, T. Sikora (eds), Introduction to MPEG-7, Wiley, 2002.
[3] Information Technology – Multimedia Content Description Interface – Part 6: Reference Software,
FDIS, ISO/IEC J1/SC 29 w4475.
[4] Information technology – Multimedia content description interface – Part 6: Reference software,
AMENDMENT 1: Reference software extensions, FDAM, ISO/IEC J1/SC29 w6511.
[5] T. Kohonen, The Self-Organizing Map (SOM),
http://www.cis.hut.fi/projects/somtoolbox/theory/somalgorithm.shtml
[6] T. Kohonen, Self-Organizing Maps, 3rd ed., Springer, 2001.
[7] T. Germano, Self Organizing Maps, http://davis.wpi.edu/~matt/courses/soms/