background image

 

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 

 

 

 

background image

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" /> 

background image

 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> 

background image

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> 

background image

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 

background image

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 SchemesDescriptors) 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, ScalableColorColorLayoutColorStructure

CTBrowsing

Poniżej przestawiono graficznie intuicje związane z budową wybranych deskryptorów MPEG-7.  

background image

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. 

 

background image

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. 

background image

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 

background image

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 ImagesFind 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 (SOMSelf-

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ą. 

background image

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. 

background image

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 

background image

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 (JavaJava 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ć 

background image

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. 

background image

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.*; 

background image

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(); 

 

 

background image

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  

ScalableColor 

ColorLayout 

ColorStructure 

ColorTemperatureBrowsing 

 

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. 

background image

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/