このドキュメントは
Describing and retrieving photos using RDF and HTTP
http://www.w3.org/TR/photo-rdf/
の和訳です。
この文書には和訳上の誤りがありえます。
内容の保証はいたしかねますので、必ずW3C Webサイトの正式版文書を参照して下さい。
このメモは、(RDF)メタデータを付与した(デジタル)写真データの記述と検索に関するプロジェクトについて述べたものである。ここでは、RDFスキーマ、大量の写真にメタデータを素早く付与するためのデータ入力プログラム、写真とメタデータをHTTPで配信する方法、および写真データの記述内容に基づいた検索方式に関するいくつかの提案について述べている。
データ入力プログラムはJavaで実装しており、また、HTTPでイメージデータからRDFメタデータを検索するために専用のJigsawフレームを実装している。RDFスキーマとしてはDublin Coreのスキーマや、テクニカルなデータ用に追加のスキーマも用いている。
我々は既にデモサイトを立ち上げており、サンプルのソースコードがダウンロードできるようになっている。
このシステムは、休日に撮りためた写真だけでなく、さらに大掛かりな写真集にも便利だろう。
このドキュメントは、ディスカッションのためだけに W3C が公開しているメモである。W3C がこのメモを公開することは、W3C やそのチーム、メンバーのいかなる保証を表すものでもない。コメントは著者に送って頂きたい。
本メモは、システムとスキーマを用いた検証を重ねたのちに更新するつもりである。
一連の W3C テクニカルノートと公開文書(ワーキングドラフトやノートを含む)の最新のものは、http://www.w3.org/TR/ で参照できる。
本プロジェクトの目的は、一部には個人的なものであり、また W3C の技術のプロモーションでもある。
個人的理由として、筆者らは膨大な数の写真をため込んでおり、おかげでそれらの中から誰かに見せたい写真を的確に見つけることが困難になっている。それらの写真をデジタル化して
RDF のメタデータを記述することにより、いつでも所望の写真を素早く見つけ出せるようにしたい。
筆者らはまた、RDF スキーマやそれに関する実用システムの具体的な例を挙げ、Web 上でのメタデータの可能性を示すために役立てたいと考えている。これは特に、HTML ドキュメントに対して使われている従来のテキストベースの検索エンジンが、明らかに写真データに対してうまく機能しないためである。また、メタデータによって自動的に写真データの非視覚的な表現が与えられるので、アクセシビリティの向上にも寄与する。
そこで、本プロジェクトでは既存のいくつかの技術(W3C の RDF [RDF], HTTP [HTTP], Jigsaw [Jigsaw] と W3C 外の技術である JPEG [JPEG] や Java [Java])を利用し、それらを組み合わせることで興味深く実用的なアプリケーションの実現を目指している。
photo-RDF システムの構成図。左上:写真をデジタイズし、JPEG 画像として保存。左下:データ入力プログラム(修正が必要な場合の編集も可能)を用いて写真データにメタデータを記入。右:Web からのリクエストに対し、その形式に応じて写真データまたはメタデータを Jigsaw を使って送信。
このシステムは次のような(大半は相互に独立した)部分からなっている。
デジタルカメラによっては既に写真に関する情報を生成するものもあり、スクリプトを使ってその情報を読み込み RDF 形式に変換することもできるだろう。しかし、現バージョンのメタデータ・エディタではそのような情報は扱わない。
RDF データは3種類のスキーマで表現する。うち1つは Dublin Core スキーマで、他の2つは写真に関するテクニカルなデータと被写体の分類情報である。3種類のスキーマを使うのは、単にそれぞれを別々のプロジェクトで使えるようにするためである。なお、データ入力プログラムのユーザに対して実際の RDF 記述は完全に隠ぺいされている。
データ入力プログラムはとてもシンプルである。これは大量の写真に対してメタデータを素早く入力するためのもので、写真は大抵1つまたは少数の連続した組(シリーズ)からなっているという前提で設計されている。そのため、ほとんどの入力フィールドにはデフォルトで前の写真用に入力したデータが記入されており、以前の数枚の写真に対して入力した値も素早く参照できるようになっている。多くの場合、1つの写真から次の写真へはごくわずかなフィールドを書き換えるだけでよく、タイピングの量を最小に押さえられる。
プログラムは Java で書かれているが、ユーザインタフェースは実行時にマシン可読なバージョンのスキーマ(現状では RDF のシンタックスを使わず、同等の情報を持ったデータに変換している)から直接生成している。これにより、RDF のスキーマを変更した場合にもプログラムを変更する必要は無い。
RDF データは JPEG ファイルのコメントブロック( ISO DIS 10918-1 で定義されている "COM" タイプのブロック)に保存される。JPEG 標準規格によれば、コメントブロックには任意のテキストを記入することができる。ただし、そのテキストに対して型を指定する方法はなく、RDF はヒューリスティックスを用いて容易に平文(プレーン・テキスト)と区別することができるという点に頼っている。JPEG では各コメントブロックは 64K までに制限されている。しかし、ブロック数を必要なだけとれるので、テキストはいくらでも追加できる。実のところ、rdfpic プログラムで生成されるテキスト記述はせいぜい数百バイト程度の長さである。
RDF 付きバージョンと画像データのみの両方を既存のブラウザやツールに配信できるようにするには、Content Negotiation を使う方法が最も良い。もちろん、より良い方法でメタデータを検索したり保存できるようにするために、HTTP 拡張のような他の技術を使ってはいけないというわけではない。
Content Negotiation を利用することには2つの利点がある。あらゆるテキストベースのブラウザ(lynx や emacsspeak を使った emacs など)で正しく動作する点と、RDF から title や description などの項目を選んで出力をダイレクトにレンダリングできる点である。また、適切な MIME タイプに対して問い合わせるだけで、RDF クローラを使って写真データの集合から全ての RDF 記述を収集し、知識ベースを構築することもできる。
Jigsaw [Jigsaw] では、1つのフレームを生成し、同じ URI(1つは画像自体を指す)の下で2つの異なるリソースをシミュレートする。それら2つのリソースはそれぞれ HTTP の値(ETags や Content-Length その他)のセットを含み、結果として HTTP の標準的な Content Negotiation を使って送信される。
RDF メタデータはまた、セミコロン(;)の後に指定された MIME タイプ、例えば foo.jpg;application%2Frdf+xml("%2F" は "/" の URL 内でのエスケープ表記)を追加するだけで Content Negotiation なしに直接取り出すこともできる。
さらに、RDF 記述の ETag を HTTP リクエストのヘッダに書けば、PUT メソッドを使ってその RDF 記述の変更も可能である。
メタデータは3つの異なるスキーマに分かれている。
各プロパティはいずれも必須ではない。多くのプロパティに値を入れればそれだけ写真に関する多くのことが記述され、検索も容易になるが、プロパティを定義しないでおいたからといってメタデータが正しく生成されないわけではない。
個々のプロパティ間に依存関係はない。各プロパティには、他のどのプロパティがどんな値を持っているかに関わらず自由に値を書き込むことができる。その値自体も自由だが、常識による制約は例外である。例えば、写真はフィルムが現像された日の後に撮影されることはありえない ...
本システムでは、Dublin Core で定義されているプロパティ全ては使用しない(すなわち、他の人がプロパティを追加することはできるが、我々のメタデータ・エディタでは無視される)。以下に、写真素材に適用した Dublin Core プロパティの解釈を記す。マシン可読なスキーマは付録 B に挙げている。カッコ内のラベルは、rdfpic のユーザインタフェースに表示されるが Dublin Core のプロパティ名とは異なる表記のものである。
テクニカル・スキーマは以下の RDF スキーマ(形式的な定義については付録 B を参照)で定義している。
コンテンツ・スキーマ には、Dublin Core スキーマの "subject" プロパティ内で使うキーワードが含まれる。そのプロパティには、以下のキーワードのうち該当するもの全てを記述しておきたい。各キーワードは次のような意味を持つ。
ここに挙げるものは、本システムの拡張についてのアイディアとして現在検討中のものである。順序は特に関係ない。
既にサンプル用のサーバを立ち上げており、何枚かの写真が載せてある。それらの写真のテキスト表現について問い合わせれば、その写真に関する RDF 記述を返してくれる。すなわち、MIME タイプで image/jpeg または image/* に対する HTTP リクエストであれば写真を、application/rdf+xml または application/* に対してはメタデータを返す。または、写真データの URI の最後に ";application%2Frdf+xml" と付け加えることで、そのままメタデータを参照できる。なお、インデックス・ページは、キャプションと alt 文に対応する写真に埋め込まれた RDF を使い、スクリプトで生成している。
オンラインの写真の数は徐々に増やしていくつもりである。
Jigsaw の拡張と JPEG に関するクラス・ファイルは、Jigsaw 2.0.4 ディストリビューションで公開されている。メタデータエディタの rdfpic は Jigsaw デモ・サイトから入手できる。
見たところ我々のものと非常に類似したシステムが Jane Hunter と Zhimin Zhan によって開発された [HunterZhan] 。しかしこれは PNG 画像フォーマットを採用し、メタデータの表現形式として RDF の代わりに PNG 組み込みのキーワード/値フォーマットを使っている。ただし、彼らはメタデータ・スキーマの定義に RDF を使っている。
IPTC は報道写真画像の内容を記述するために一連のキーワードを用意している。Adobe Photoshop はそれらのサブセットをサポートしている。
JPEG2000 [JPEG2000] 画像圧縮アルゴリズムのために提案された DIG2000 [DIG2000] ファイルフォーマットは、人、場所、出来事、GPS 位置情報、カメラ・タイプなどを記述するための項目を持つ XML ベースのメタデータ・ブロックを含んでいる。項目を追加する拡張も可能である。1998年10月時点のドラフトでは RDF を使用していない。
我々がこのメモを最初に公開し rdfpic プログラムをリリースして(2000年3月)以来、Adobe 社は "Extensible Metadata Platform" [XMP] と呼ばれる同様の技術を開発した。XMP は2001年9月に初めて公表された。XMP では JPEG の COM(コメント)チャンクではなく APP1 チャンクに RDF を書き込み、JPEG ファイル中に現れうる他のデータから XMP を区別し易いように、RDF の先頭に "W5M0MpCehiHzreSzNTczkc9d" という呪文を付加している。我々と同様に、Adobe もバージョン履歴やイメージ操作内容などの記録用として Dublin Core スキーマを推奨し、幾つかの追加スキーマを提供している。
rdfpic メタデータ・エディタの最初のバージョンは、Thierry Kormann(元フランス Bull 社員)によって書かれた。その次のバージョンは Eamon Nerbonne の作である。Colas Nahaboo(彼も元 Bull 社員だ)は有益なアドバイスを与えてくれた。
Janne Saarela(Pro-Solution 社、現在はフィンランドの Profium 社)は、現在の RDF スキーマの元となったオリジナルの RDF スキーマを書いてくれた。また、彼は各スキーマのチェックやレビューも手伝ってくれた。彼のプログラムである SiRPAC は、メタデータ・エディタで生成された実際のメタデータと同じく、スキーマのチェックと可視化に非常に役立った。
以下の3つのスキーマ(Dublin Core, テクニカル, コンテンツ)は、RDF schemas ドラフト仕様 [Schema] で提案されているシンタックスで書かれたマシン可読なスキーマである。
以下のスキーマは Dublin Core 用の最小限の RDF スキーマである。スキーマ名は http://www.w3.org/2000/PhotoRDF/dc-1-0 だが、下記スキーマを見れば分かるように、各プロパティは実際には http://purl.org/dc/elements/1.1/ にある同名の DC プロパティの制約の下で書かれている。ラベルのフランス語訳は、Anne-Marie Vercoustre によるものをベースとしている。
<rdf:RDF
xmlns="http://www.w3.org/TR/1999/PR-rdf-schema-19990303#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
<rdf:Property rdf:ID="title">
<label xml:lang="en">Title</label>
<label xml:lang="fr">Titre</label>
<label xml:lang="nl">Titel</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/title" />
</rdf:Property>
<rdf:Property rdf:ID="creator">
<label xml:lang="en">Author/creator</label>
<label xml:lang="fr">Auteur/cr斬teur</label>
<label xml:lang="nl">Auteur/maker</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/creator" />
</rdf:Property>
<rdf:Property rdf:ID="subject">
<label xml:lang="en">Subject</label>
<label xml:lang="fr">Sujet</label>
<label xml:lang="nl">Onderwerp</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/subject" />
<range rdf:resource="http://www.w3.org/2000/PhotoRDF/content-1-0#Keywords"/>
</rdf:Property>
<rdf:Property rdf:ID="description">
<label xml:lang="en">Description</label>
<label xml:lang="fr">Description</label>
<label xml:lang="nl">Beschrijving</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/description" />
</rdf:Property>
<rdf:Property rdf:ID="publisher">
<label xml:lang="en">Publisher</label>
<label xml:lang="fr">ヅiteur</label>
<label xml:lang="nl">Uitgever</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/publisher" />
</rdf:Property>
<rdf:Property rdf:ID="contributor">
<label xml:lang="en">Contributor</label>
<label xml:lang="fr">Contributeur</label>
<label xml:lang="nl">Medewerker</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/contributor" />
</rdf:Property>
<rdf:Property rdf:ID="date">
<label xml:lang="en">Date</label>
<label xml:lang="fr">Date</label>
<label xml:lang="nl">Date</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/date" />
<!-- use http://www.w3.org/TR/NOTE-datetime
format: YYYY[-MM[-DD[Thh:mm[:ss[.sTZD]]]]]
example: 1999-10-01T17:53
if TZD is omitted the timezone is UTC -->
</rdf:Property>
<rdf:Property rdf:ID="type">
<label xml:lang="en">Resource type</label>
<label xml:lang="fr">Type de ressource</label>
<label xml:lang="en">Categorie</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/type" />
<!-- always "image in PhotoRDF -->
</rdf:Property>
<rdf:Property rdf:ID="format">
<label xml:lang="en">Format</label>
<label xml:lang="fr">Format</label>
<label xml:lang="nl">Formaat</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/format" />
<!-- always "image/jpeg in PhotoRDF -->
</rdf:Property>
<rdf:Property rdf:ID="identifier">
<label xml:lang="en">Number</label>
<label xml:lang="fr">Num屍o</label>
<label xml:lang="nl">Nummer</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/identifier" />
</rdf:Property>
<rdf:Property rdf:ID="source">
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/source" />
<!-- not used in PhotoRDF -->
</rdf:Property>
<rdf:Property rdf:ID="language">
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/language" />
<!-- not used in PhotoRDF -->
</rdf:Property>
<rdf:Property rdf:ID="relation">
<label xml:lang="en">Series</label>
<label xml:lang="fr">S屍ie</label>
<label xml:lang="nl">Serie</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/relation" />
</rdf:Property>
<rdf:Property rdf:ID="coverage">
<label xml:lang="en">Location</label>
<label xml:lang="fr">Endroit</label>
<label xml:lang="nl">Plaats</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/coverage" />
<!-- restricted to spatial coverage in PhotoRDF -->
</rdf:Property>
<rdf:Property rdf:ID="rights">
<label xml:lang="en">Rights</label>
<label xml:lang="fr">Droits</label>
<label xml:lang="nl">Rechten</label>
<subPropertyOf rdf:resource="http://purl.org/dc/elements/1.1/rights" />
</rdf:Property>
</rdf:RDF>
各プロパティの詳細な説明については上記を参照のこと。テクニカル・スキーマのスキーマ名は http://www.w3.org/2000/PhotoRDF/technical-1-0#
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/01/rdf-schema#">
<Class rdf:ID="Technical-data">
<comment xml:lang="en">A class that represents technical
data about a photo</comment>
<comment xml:lang="fr">Une classe qui r姿r市ente
les donn仔s techniques sur une photo</comment>
<comment xml:lang="nl">Een class die de technische
gegevens van een foto representeert.</comment>
</Class>
<rdf:Property rdf:ID="camera">
<label xml:lang="en">Camera</label>
<label xml:lang="fr">Appareil photo</label>
<label xml:lang="nl">Camera</label>
<comment xml:lang="en">Brand and type of camera</comment>
<comment xml:lang="fr">Marque et type de appareil photo</comment>
<comment xml:lang="nl">Cameramerk en -type</comment>
<domain rdf:resource="#Technical-data"/>
</rdf:Property>
<rdf:Property rdf:ID="film">
<label xml:lang="en">Film</label>
<label xml:lang="fr">Pellicule</label>
<label xml:lang="nl">Film</label>
<comment xml:lang="en">Brand and type of film</comment>
<comment xml:lang="fr">Marque et type de pellicule</comment>
<comment xml:lang="nl">Filmmerk en -type</comment>
<domain rdf:resource="#Technical-data"/>
</rdf:Property>
<rdf:Property rdf:ID="lens">
<label xml:lang="en">Lens</label>
<label xml:lang="fr">Objectif</label>
<label xml:lang="nl">Lens</label>
<comment xml:lang="en">Brand and type of lens.</comment>
<comment xml:lang="fr">Marque et type d'objectif.</comment>
<comment xml:lang="nl">Merk en type van de lens.</comment>
<domain rdf:resource="#Technical-data"/>
</rdf:Property>
<rdf:Property rdf:ID="devel-date">
<label xml:lang="en">Development date</label>
<label xml:lang="fr">Date de d思eloppement</label>
<label xml:lang="nl">Ontwikkeldatum</label>
<comment xml:lang="en">Date on which the film was developed.</comment>
<comment xml:lang="fr">Date laquelle la pellicule a 師
developp仔.</comment>
<comment xml:lang="nl">Datum waarop de film is ontwikkeld.</comment>
<domain rdf:resource="#Technical-data"/>
<!-- use http://www.w3.org/TR/NOTE-datetime
format: YYYY[-MM[-DD[Thh:mm[:ss[.sTZD]]]]]
example: 1999-10-01T17:53
if TZD is omitted the timezone is UTC -->
</rdf:Property>
<!-- [more?] -->
</rdf:RDF>
ヒューマン・リーダブルなコメントは省略している。上述のキーワードの説明を参照のこと。コンテンツ・スキーマのスキーマ名は http://www.w3.org/2000/PhotoRDF/content-1-0#
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/01/rdf-schema#"
xmlns:content="">
<!-- "" is the same as "http://www.w3.org/2000/PhotoRDF/content-1-0#" -->
<Class rdf:ID="Keywords">
<comment xml:lang="en">An enumeration of keywords to
describe the subject of photos.</comment>
<comment xml:lang="fr">Une 始um屍ation de mots-clef
pour d残rire le sujet d'une photo.</comment>
<comment xml:lang="nl">Een opsomming van sleutelwoorden
om het onderwerp van foto's te beschrijven.</comment>
</Class>
<content:Keywords rdf:ID="Portrait">
<label xml:lang="en">Portrait</label>
<label xml:lang="fr">Portrait</label>
<label xml:lang="nl">Portret</label>
</content:Keywords>
<content:Keywords rdf:ID="Group-portrait">
<label xml:lang="en">Group portrait</label>
<label xml:lang="fr">Portrait de groupe</label>
<label xml:lang="nl">Groepsportret</label>
</content:Keywords>
<content:Keywords rdf:ID="Landscape">
<label xml:lang="en">Landscape</label>
<label xml:lang="fr">Paysage</label>
<label xml:lang="nl">Landschap</label>
</content:Keywords>
<content:Keywords rdf:ID="Baby">
<label xml:lang="en">Baby</label>
<label xml:lang="fr">B暫</label>
<label xml:lang="nl">Baby</label>
</content:Keywords>
<content:Keywords rdf:ID="Architecture">
<label xml:lang="en">Architecture</label>
<label xml:lang="fr">Architecture</label>
<label xml:lang="nl">Architectuur</label>
</content:Keywords>
<content:Keywords rdf:ID="Wedding">
<label xml:lang="en">Wedding</label>
<label xml:lang="fr">Mariage</label>
<label xml:lang="nl">Trouwerij</label>
</content:Keywords>
<content:Keywords rdf:ID="Macro">
<label xml:lang="en">Macro</label>
<label xml:lang="fr">Macro</label>
<label xml:lang="nl">Macro</label>
</content:Keywords>
<content:Keywords rdf:ID="Graphic">
<label xml:lang="en">Graphic</label>
<label xml:lang="fr">Graphique[?]</label>
<label xml:lang="nl">Grafisch</label>
</content:Keywords>
<content:Keywords rdf:ID="Panorama">
<label xml:lang="en">Panorama</label>
<label xml:lang="fr">Panorama</label>
<label xml:lang="nl">Panorama</label>
</content:Keywords>
<content:Keywords rdf:ID="Animal">
<label xml:lang="en">Animal</label>
<label xml:lang="fr">Animal</label>
<label xml:lang="nl">Dier</label>
</content:Keywords>
</rdf:RDF>
以下は rdfpic で生成され、その後 Jigsaw によって配信される RDF フォーマットのメタデータの例である。
<?xml version='1.0' encoding='ISO-8859-1'?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/TR/1999/PR-rdf-schema-19990303#"
xmlns:s0="http://www.w3.org/2000/PhotoRDF/dc-1-0#"
xmlns:s1="http://www.w3.org/2000/PhotoRDF/technical-1-0#"
xmlns:s2="http://sophia.inria.fr/~enerbonn/rdfpiclang#">
<rdf:Description rdf:about="">
<s0:creator>Bert Bos</s0:creator>
<s0:relation>Marian in the Tarn</s0:relation>
<s0:rights>Bert Bos</s0:rights>
<s0:type>image</s0:type>
<s0:identifier>990621</s0:identifier>
<s0:coverage>Montredon-Labessoni叱ャ (Tarn)</s0:coverage>
<s0:date>1999-06-26</s0:date>
<s1:camera>Canon Eos 5</s1:camera>
<s2:xmllang>en</s2:xmllang>
<s0:title>Marian with sheep</s0:title>
<s0:subject>Landscape, Animal</s0:subject>
<s0:publisher>Bert Bos</s0:publisher>
<s0:description>Marian brings the sheep to the field in the morning. The lamb she carries was born that night.</s0:description>
<s0:format>image/jpeg</s0:format>
</rdf:Description>
</rdf:RDF>