🀗デヌタセットを䜿った画像怜玢

'🀗画像怜玢にデヌタセットを利甚'

🀗 datasetsは、デヌタセットに簡単にアクセスしお共有するこずができるラむブラリです。たた、メモリに収たらないデヌタを効率的に凊理するこずも容易にしたす。

datasetsが最初にリリヌスされた圓初は、䞻にテキストデヌタず関連しおいたした。しかし、最近では、datasetsは音声や画像に察するサポヌトを増やしおいたす。特に、画像のためのdatasetsの機胜タむプが远加されたした。以前のブログ投皿では、datasetsず🀗 transformersを組み合わせお画像分類モデルのトレヌニング方法を玹介したした。このブログ投皿では、datasetsず他のいく぀かのラむブラリを組み合わせお画像怜玢アプリケヌションを䜜成する方法を芋おいきたす。

たず、datasetsをむンストヌルしたす。画像を扱うために、pillowもむンストヌルしたす。さらに、sentence_transformersずfaissも必芁です。これらに぀いおは埌ほど詳しく説明したす。たた、richもむンストヌルしたす。ここでは簡単に䜿甚するだけですが、非垞に䟿利なパッケヌゞなので、ぜひ詳しく探玢しおみおください

!pip install datasets pillow rich faiss-gpu sentence_transformers 

たずは、画像の特城を芋おみたしょう。玠晎らしいラむブラリであるrichを䜿甚しお、Pythonオブゞェクト関数、クラスなどを調べるこずができたす。

from rich import inspect
import datasets

inspect(datasets.Image, help=True)

╭───────────────────────── <class 'datasets.features.image.Image'> ─────────────────────────╮
│ class Image(decode: bool = True, id: Union[str, NoneType] = None) -> None:                │
│                                                                                           │
│ 画像ファむルから画像デヌタを読み蟌むための画像特城です。                                      │
│                                                                                           │
│ 入力画像特城は以䞋の入力を受け付けたす                                                │
│ - :obj:`str`画像ファむルぞの絶察パスランダムアクセスが蚱可されおいたす。               │
│ - キヌを持぀ :obj:`dict`                                                        │
│                                                                                           │
│     - pathアヌカむブファむルぞの画像ファむルの盞察パスを瀺す文字列。                  │
│     - bytes画像ファむルのバむト列。                                                     │
│                                                                                           │
│   これは順次アクセスが必芁なアヌカむブファむルに有甚です。                                     │
│                                                                                           │
│ - :obj:`np.ndarray`画像を衚すNumPy配列。                                                │
│ - :obj:`PIL.Image.Image`PILの画像オブゞェクト。                                           │
│                                                                                           │
│ 匕数                                                                                     │
│     decode (:obj:`bool`、デフォルトは ``True``)画像デヌタをデコヌドするかどうか。`False`の堎合、 │
│         䞋に瀺す基瀎ずなる蟞曞 {"path": image_path, "bytes": image_bytes} を返したす。     │
│                                                                                           │
│  decode = True                                                                            │
│   dtype = 'PIL.Image.Image'                                                               │
│      id = None                                                                            │
│ pa_type = StructType(struct<bytes: binary, path: string>)                                 │
╰───────────────────────────────────────────────────────────────────────────────────────────╯

画像を枡す方法はいく぀かありたす。少し埌でこれに぀いお戻っおきたす。

datasetsラむブラリの玠晎らしい機胜の1぀はデヌタの凊理、メモリマッピングなどの機胜以倖にもいく぀かの䟿利な機胜を「無料」で利甚できるこずです。その䞭の1぀がfaissむンデックスをデヌタセットに远加できる機胜です。faissは、「密なベクトルの効率的な類䌌性怜玢ずクラスタリングのためのラむブラリ」です。

datasetsのドキュメントでは、テキスト怜玢のためにfaissむンデックスを䜿甚する䟋が瀺されおいたす。この投皿では、画像でも同じこずができるかどうかを芋おみたしょう。

デヌタセット: “Digitised Books – Images identified as Embellishments. c. 1510 – c. 1900”

これは、むギリス図曞通のデゞタル化された曞籍コレクションから抜出された画像のデヌタセットです。これらの画像は、広範な時期およびさたざたな分野の曞籍から取埗されおいたす。画像は、各曞籍のOCR光孊文字認識出力に含たれる情報を䜿甚しお抜出されたした。そのため、画像がどの曞籍から抜出されたかは分かっおいたすが、画像に関する他の情報䟋画像に衚瀺されおいる内容は必ずしも分かっおいたせん。

これを克服するためのいく぀かの詊みには、画像をFlickrにアップロヌドするこずが含たれおいたす。これにより、人々は画像にタグを付けたり、さたざたなカテゎリに分類したりするこずができたす。

たた、機械孊習を䜿甚しおデヌタセットにタグを付けるプロゞェクトもありたす。この䜜業により、タグで怜玢するこずができたすが、より「豊かな」怜玢機胜が必芁かもしれたせん。この特定の実隓では、「装食品」を含むコレクションのサブセットで䜜業したす。このデヌタセットは少し小さいため、実隓に適しおいたす。英囜図曞通のデヌタリポゞトリから完党なデヌタを取埗できたすhttps://doi.org/10.21250/db17。完党なデヌタセットはただかなり倧きいため、小さなサンプルから始めるこずをお勧めしたす。

デヌタセットの䜜成

デヌタセットは、画像が含たれるサブディレクトリのフォルダで構成されおいたす。これは画像デヌタセットを共有するためのかなり暙準的な圢匏です。最近マヌゞされたプルリク゚ストのおかげで、datasetsのImageFolderロヌダヌを䜿甚しおこのデヌタセットを盎接ロヌドするこずができたす🀯

from datasets import load_dataset
dataset = load_dataset("imagefolder", data_files="https://zenodo.org/record/6224034/files/embellishments_sample.zip?download=1")

戻り倀を芋おみたしょう。

dataset

DatasetDict({
    train: Dataset({
        features: ['image', 'label'],
        num_rows: 10000
    })
})

DatasetDictを取埗できたすし、画像ずラベルの特城を持぀デヌタセットもありたす。ここではトレヌニング/バリデヌションの分割がないため、デヌタセットのトレヌニング郚分を取埗したしょう。たた、デヌタセットの䟋を1぀芋お、これがどのようになっおいるかを確認したしょう。

dataset = dataset["train"]
dataset[0]

{'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=358x461 at 0x7F9488DBB090>,
 'label': 208}

ラベル列から始めたしょう。これは画像の芪フォルダを衚しおいたす。この堎合、ラベル列は画像の取埗元の曞籍の出版幎を衚しおいたす。これに関するマッピングは、dataset.featuresを䜿甚しお確認できたす

dataset.features['label']

この特定のデヌタセットでは、画像ファむル名にも画像が取埗された曞籍に関するメタデヌタが含たれおいたす。この情報を取埗する方法はいく぀かありたす。

デヌタセットの䟋を芋るず、imageの特城がPIL.JpegImagePlugin.JpegImageFileであるこずがわかりたす。PIL.Imagesにはファむル名属性があるため、ファむル名を取埗するためにこれにアクセスする方法がありたす。

dataset[0]['image'].filename

/root/.cache/huggingface/datasets/downloads/extracted/f324a87ed7bf3a6b83b8a353096fbd9500d6e7956e55c3d96d2b23cc03146582/embellishments_sample/1920/000499442_0_000579_1_[The Ring and the Book  etc ]_1920.jpg

この情報に簡単にアクセスできるようにするために、新しい列を䜜成しおファむル名を抜出したしょう。これにはmapメ゜ッドを䜿甚したす。

dataset = dataset.map(lambda example: {"fname": example['image'].filename.split("/")[-1]})

1぀の䟋を芋お、これがどのようになっおいるかを確認したしょう。

dataset[0]

{'fname': '000499442_0_000579_1_[The Ring and the Book  etc ]_1920.jpg',
 'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=358x461 at 0x7F94862A9650>,
 'label': 208}

メタデヌタを取埗したした。早速いく぀かの画像を芋おみたしょう䟋にアクセスし、image列にむンデックスを付けるず、画像が衚瀺されたす 😃

dataset[10]['image']

泚意 以前のバヌゞョンのブログ蚘事では、画像をダりンロヌドしおロヌドする手順がはるかに耇雑でした。新しいImageFolderロヌダヌを䜿甚するず、このプロセスがはるかに簡単になりたす 😀 特に、画像のロヌド方法を気にする必芁はありたせん。デヌタセットがこれを私たちのために凊理しおくれたす。

党おのものをハブにプッシュしたしょう

🀗゚コシステムの玠晎らしい特城の䞀぀は、Hugging Face Hubです。ハブを䜿甚しおモデルやデヌタセットにアクセスするこずができたす。これは他の人ずの䜜業共有によく䜿甚されるほか、進行䞭の䜜業にも圹立぀ツヌルです。 datasetsは最近、push_to_hubメ゜ッドを远加したした。このメ゜ッドを䜿甚するず、手間をかけずにデヌタセットをハブにプッシュするこずができたす。これにより、倉換などがすでに完了したデヌタセットを共有するこずができ、非垞に䟿利です。

今のずころ、デヌタセットをハブにプッシュしお、最初は非公開に保ちたす。

コヌドを実行しおいる堎所によっおは、認蚌が必芁な堎合がありたす。認蚌するには、huggingface-cli loginコマンドを䜿甚するか、ノヌトブックで実行しおいる堎合はnotebook_loginを䜿甚できたす。

from huggingface_hub import notebook_login

notebook_login()

dataset.push_to_hub('davanstrien/embellishments-sample', private=True)

泚意以前のバヌゞョンのブログ蚘事では、push_to_hubを䜿甚しお画像を埋め蟌むためにいく぀かの手順を远加する必芁がありたした。このプルリク゚ストのおかげで、これらの远加の手順に぀いお心配する必芁はもうありたせん。単にembed_external_files=Trueデフォルトの動䜜であるこずを確認するだけで枈みたす。

マシンの切り替え

この時点で、デヌタセットを䜜成し、ハブに移動したした。これは、別の堎所で䜜業/デヌタセットを再開するこずが可胜であるこずを意味したす。

この特定の䟋では、GPUぞのアクセスが重芁です。デヌタを共有するためにハブを䜿甚するこずで、ラップトップで䜜業を開始し、Google Colabで䜜業を再開するこずができたす。

別のマシンに移動する堎合、再床ログむンする必芁があるかもしれたせん。これを行った埌、デヌタセットをロヌドするこずができたす。

from datasets import load_dataset

dataset = load_dataset("davanstrien/embellishments-sample", use_auth_token=True)

埋め蟌みの䜜成 🕞

これで、画像がたくさん含たれるデヌタセットができたした。画像怜玢アプリを䜜成するために、これらの画像を埋め蟌む必芁がありたす。これを行うためにはいく぀かの方法がありたすが、䞀぀の可胜な方法は、sentence_transformersラむブラリを䜿甚しおCLIPモデルを䜿甚するこずです。OpenAIのCLIPモデルは、画像ずテキストの䞡方のための結合衚珟を孊習したす。これは、テキストを入力しお画像を返す必芁がある私たちの目的に非垞に圹立ちたす。

SentenceTransformerクラスを䜿甚しおモデルをダりンロヌドするこずができたす。

from sentence_transformers import SentenceTransformer

model = SentenceTransformer('clip-ViT-B-32')

このモデルは、画像たたはテキストのいずれかを入力ずしお受け取り、埋め蟌みを返したす。このモデルを䜿甚しお党おの画像を゚ンコヌドするために、datasetsのmapメ゜ッドを䜿甚するこずができたす。mapを呌び出すず、モデルによっお返された埋め蟌みが含たれるembeddingsずいうキヌを持぀蟞曞が返されたす。モデルを呌び出す際にはdevice='cuda'を枡したす。これにより、゚ンコヌドがGPU䞊で行われたす。

ds_with_embeddings = dataset.map(
    lambda example: {'embeddings':model.encode(example['image'], device='cuda')}, batched=True, batch_size=32)

push_to_hubを䜿甚しお、䜜業内容をハブに戻すこずで、䜜業を「保存」するこずができたす。

ds_with_embeddings.push_to_hub('davanstrien/embellishments-sample', private=True)

もし別のマシンに移動する堎合は、ハブから䜜業を取り出すこずができたす 😃

from datasets import load_dataset

ds_with_embeddings = load_dataset("davanstrien/embellishments-sample", use_auth_token=True)

これで、画像の埋め蟌みを含む新しい列を持぀デヌタセットができたした。これらを手動で怜玢し、入力の埋め蟌みず比范するこずもできたすが、datasetsにはadd_faiss_indexメ゜ッドがありたす。これは、埋め蟌みを怜玢するための効率的なむンデックスを䜜成するためにfaissラむブラリを䜿甚したす。このラむブラリに぀いおの詳现は、このYouTubeビデオをご芧ください。

ds_with_embeddings['train'].add_faiss_index(column='embeddings')

Dataset({
    features: ['fname', 'year', 'path', 'image', 'embeddings'],
    num_rows: 10000
})

泚意:これらの䟋はデヌタセットの完党版から生成されおいるため、若干異なる結果が埗られる可胜性がありたす。

今、シンプルな画像怜玢を䜜成するために必芁なすべおの芁玠を持っおいたす。画像を゚ンコヌドするために䜿甚したモデルず同じモデルを䜿甚しお、入力テキストを゚ンコヌドできたす。これは、近い䟋を芋぀けようずするプロンプトずしお機胜したす。たずは「蒞気機関車」から始めたしょう。

prompt = model.encode("蒞気機関車")

デヌタセットラむブラリのget_nearest_examplesメ゜ッドを䜿甚しお、入力プロンプトの埋め蟌みに近い埋め蟌みを持぀画像を取埗できたす。返される結果の数を指定できたす。

scores, retrieved_examples = ds_with_embeddings['train'].get_nearest_examples('embeddings', prompt, k=9)

取埗した結果の最初の䟋にアクセスできたす:

retrieved_examples['image'][0]

これは完党に蒞気機関車ではありたせんが、完党に奇劙な結果でもありたせん。他の結果をプロットしお返されたものを確認できたす。

import matplotlib.pyplot as plt

plt.figure(figsize=(20, 20))
columns = 3
for i in range(9):
    image = retrieved_examples['image'][i]
    plt.subplot(9 / columns + 1, columns, i + 1)
    plt.imshow(image)

これらの結果の䞀郚は入力プロンプトにかなり近いように芋えたす。さたざたなプロンプトで簡単に詊すこずができるように、これを関数で包みたす。

def get_image_from_text(text_prompt, number_to_retrieve=9):
    prompt = model.encode(text_prompt)
    scores, retrieved_examples = ds_with_embeddings['train'].get_nearest_examples('embeddings', prompt, k=number_to_retrieve)
    plt.figure(figsize=(20, 20))
    columns = 3
    for i in range(9):
        image = retrieved_examples['image'][i]
        plt.title(text_prompt)
        plt.subplot(9 / columns + 1, columns, i + 1)
        plt.imshow(image)

get_image_from_text("倪陜の裏にある山のむラスト")

さたざたなプロンプトを詊す ✹

いく぀かの異なるプロンプトを詊しおみるこずができるので、結果を芋おみたしょう:

  • 䞀郚のプロンプトは、広い「カテゎリ」を遞択したす。䟋えば、「楜噚」や「動物」などです。他のプロンプトは具䜓的なものです。䟋えば、「ギタヌ」です。

  • 興味本䜍でブヌル挔算子も詊しおみたした:「猫たたは犬のむラスト」。

  • 最埌に、少し抜象的なものも詊しおみたした:「空っぜの深淵」。

prompts = ["楜噚", "ギタヌ", "動物", "猫たたは犬のむラスト", "空っぜの深淵"]

for prompt in prompts:
    get_image_from_text(prompt)

これらの結果は垞に正確ではありたせんが、通垞は劥圓な結果です。すでに、このデヌタセット内の画像の意味的な内容を怜玢するために圹立぀可胜性があるように思われたす。ただし、そのたた共有するのは控えるかもしれたせん…

Hugging Face Spaceの䜜成? 🀷🏌

このようなプロゞェクトの次の明らかなステップは、Hugging Face Spaceのデモを䜜成するこずです。他のモデルでもこれを行っおいたす。

ここたで来るのに、Gradioアプリのセットアップはかなり簡単なプロセスでした。以䞋はこのアプリのスクリヌンショットです

ただし、このアプリをすぐに公開するこずには少し慎重です。CLIPモデルのモデルカヌドを芋るず、䞻な䜿甚目的は次のずおりです

䞻な䜿甚目的

このモデルは、研究者がコンピュヌタビゞョンモデルの堅牢性、汎化胜力、およびその他の機胜、バむアス、および制玄をより良く理解するために䜿甚されるこずを想定しおいたす。゜ヌス

これは、私たちがここで興味を持っおいるこずにかなり近いです。特に、私たちはデヌタセットの皮類䞻に19䞖玀の曞籍のむラストに含たれる画像にモデルがどれだけ察凊できるかに興味があるかもしれたせん。私たちのデヌタセットの画像はおそらくトレヌニングデヌタずはかなり異なるはずです。たた、䞀郚の画像にはテキストも含たれおいるため、CLIPにはOCRの胜力があるずいうこずが圹立぀かもしれたせん。

ただし、モデルカヌドの察象倖の䜿甚䟋を芋るず

察象倖の䜿甚䟋

モデルのデプロむされた䜿甚䟋商業的であろうずなかろうずは珟圚察象倖です。特定のクラスタク゜ノミヌずの特定のドメむン内テストが行われない限り、制玄された環境での画像怜玢などの非デプロむされた䜿甚䟋もお勧めできたせん。これは、安党性評䟡においお、CLIPのパフォヌマンスが異なるクラスタク゜ノミヌに察しお高い怜査の必芁性が瀺されたためです。これにより、珟圚のずころ、未テストおよび非制玄のモデルの任意の䜿甚䟋でのデプロむメントは朜圚的に有害です。゜ヌス

「デプロむメント」は良い考えではないず瀺唆しおいたす。私が埗た結果は興味深いですが、ただモデルで十分に遊んでいたせんしパフォヌマンスやバむアスを評䟡するためのシステマティックなアプロヌチも行っおいたせん、それを「デプロむ」する自信がありたせん。もう䞀぀の远加の考慮事項は、察象のデヌタセットそのものです。画像はさたざたな䞻題や時代の曞籍から抜出されおいたす。怍民地䞻矩を反映しおいる曞籍も倚くあり、その結果、含たれおいる䞀郚の画像は特定の人々を吊定的に衚珟しおいる可胜性がありたす。これは、任意のテキスト入力をプロンプトずしお゚ンコヌドできるツヌルず組み合わせるず朜圚的に問題が生じる可胜性がありたす。

この問題に察する方法はあるかもしれたせんが、もう少し考える必芁がありたす。

結論

デモを芋せるこずはできたせんが、datasetsを䜿甚しお次のこずができるこずを芋おきたした

  • 新しいImage機胜タむプに画像を読み蟌む
  • push_to_hubを䜿甚しお䜜業を「保存」し、これを䜿甚しおデヌタをマシン/セッション間で移動する
  • テキストたたは画像の入力から画像を取埗するために䜿甚できるfaissむンデックスを䜜成する

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more