ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
RSS English
TEI/XMLファイルを縦書きPDFに変換する方法の1例

TEI/XMLファイルを縦書きPDFに変換する方法の1例

概要 TEI/XMLファイルを縦書きPDFに変換する方法について、その1例を備忘録として残します。 以下のノートブックで、「校異源氏物語」を対象としたプログラムをお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/TEI_XMLファイルを縦書きPDFに変換する.ipynb 変換の流れ 今回は、Quartoを使用しています。 https://quarto.org/ インストールの方法は以下を参考にしてください。 https://quarto.org/docs/get-started/ TEI/XML -> qmd まずTEI/XMLファイルの内容をqmdファイルに変換します。以下は、変換スクリプトのサンプルです。 from bs4 import BeautifulSoup soup = BeautifulSoup(open(file,'r'), "xml") elements = soup.findChildren(text=True, recursive=True) import os id = os.path.splitext(os.path.basename(file))[0] title = soup.find("title").text author = soup.find("author").text elements = soup.find("body").find("p").findChildren() text = "" for e in elements: if e.name == "pb": text += "\n" if e.name == "seg": text += e.text + " \n" opath = f"data/{id}.qmd" os.makedirs(os.path.dirname(opath), exist_ok=True) text = f"""--- title: "{title}" author: "{author}" format: docx: reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx --- {text.strip()} """ with open(opath, "w") as f: f.write(text) 以下がqmdファイルの例です。 --- title: "校異源氏物語・きりつぼ" author: "池田亀鑑" format: docx: reference-doc: /content/kouigenjimonogatari/tools/genji-doc-style.docx --- いつれの御時にか女御更衣あまたさふらひ給けるなかにいとやむことなきゝは にはあらぬかすくれて時めき給ありけりはしめより我はと思あかり給へる御方 〱めさましきものにおとしめそねみ給おなしほとそれより下らうの更衣たち はましてやすからすあさゆふの宮つかへにつけても人の心をのみうこかしうら みをおふつもりにやありけむいとあつしくなりゆきもの心ほそけにさとかちな るをいよ〱あかすあはれなる物におもほして人のそしりをもえはゝからせ給 はす世のためしにもなりぬへき御もてなし也かんたちめうへ人なともあいなく めをそはめつゝいとまはゆき人の御おほえなりもろこしにもかゝることのおこ りにこそ世もみたれあしかりけれとやう〱あめのしたにもあちきなう人のも てなやみくさになりて楊貴妃のためしもひきいてつへくなりゆくにいとはした なきことおほかれとかたしけなき御心はへのたくひなきをたのみにてましらひ 給ちゝの大納言はなくなりてはゝ北の方なんいにしへの人のよしあるにておや うちくしさしあたりて世のおほえはなやかなる御方〱にもいたうおとらすな にことのきしきをももてなしたまひけれととりたてゝはか〱しきうしろみし なけれは事ある時はなをより所なく心ほそけ也さきの世にも御ちきりやふかか qmd -> Word(docx) 次に、qmdファイルをwordファイルに変換します。この時、事前に用意した縦書きのwordテンプレートを参照することで、マークダウン形式のテキストを縦書きのwordファイルに変換します。 ...

選択したテキストに対するポップアップを表示するnpmパッケージを試作しました。

選択したテキストに対するポップアップを表示するnpmパッケージを試作しました。

ウェブサイトで選択したテキストに対するポップアップを表示するnpmパッケージを試作しました。 npm https://www.npmjs.com/package/@nakamura196/text-popup ソースコード https://github.com/nakamura196/text-popup デモページ https://nakamura196.github.io/text-popup/ 開発にあたっては、以下の記事を参考にしています。 https://zenn.dev/nino_cast/articles/98a0a87f58026f ウェブサイトに以下の2行を追加することでお試しいただけます。 <script src="https://cdn.jsdelivr.net/npm/@nakamura196/text-popup/dist/main.min.js"></script> <script>textPopup();</script> npmライブラリの開発および公開の参考になりましたら幸いです。

IIIFアイコンのドラッグ&ドロップ対応について

IIIFアイコンのドラッグ&ドロップ対応について

背景 IIIF(International Image Interoperability Framework )のアイコン(具体的には、IIIFのマニフェストURL)は、多くのIIIF対応ビューアにおいて、ドラッグ&ドロップによるロードに対応しています。 ただし、以下のモジュールによって表示するIIIFアイコンについては、ドラッグ&ドロップができない、というフィードバックをいただきました。 https://github.com/omeka-j/Omeka-S-module-IiifViewers この原因について、以下のページなどを参考に調査しました。 https://zimeon.github.io/iiif-dragndrop/ その結果、以下のようなHTMLの記述が必要なことがわかりました。 <a href="default_target?manifest=manifest_URI&canvas=canvas_URI"> <img src="iiif-dragndrop-100px.png" alt="IIIF Drag-n-drop"/> </a> 上記のパターンに合致していないことが、上述したモジュールでドラッグ&ドロップができない不具合の原因でした。 この記事では、この対応方法について記述します。 対応方法 具体的には、以下のマニフェストURLを例とします。 マニフェストURLの例: https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest そして、これまでは以下のように、aタグのhref属性に、IIIFマニフェストのURLのみを与えていました。 <a href="https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest" title="IIIFマニフェスト" target="_blank"> <img style="height: 24px" src="https://omekas.aws.ldas.jp/sandbox/files/asset/iiifviewers632bf7d736e3b.svg"> </a> 上記を以下のように修正する必要がありました。 <a href="https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest?manifest=https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest" title="IIIFマニフェスト" target="_blank"> <img style="height: 24px" src="https://omekas.aws.ldas.jp/sandbox/files/asset/iiifviewers632bf7d736e3b.svg"> </a> アイコンをクリックした際に、マニフェストをダウンロードできる挙動は同じですが、後者では、他のIIIF対応ビューアへのドラッグ&ドロップに対応できます。 href属性にマニフェストURLを2回記述する点が少し冗長ですが、Universal ViewerやIIIF Curation Viewerでも同様の記述がなされていました。 このように?manifest=manifest_URIの部分がロードに使用されることが多いことから、その前のdefault_targetの部分は影響しないことが多いこともわかりました。 そのため、IIIFアイコンだけでなく、以下のようなURLが付与されることが多いUniversal ViewerやIIIF Curation ViewerのURLおよびアイコンについても、他のIIIFビューアにドラッグ&ドロップできることが確認できました。(恥ずかしながら、これまではdefault_targetの部分がIIIFマニフェストのURLである必要があると思っていました。) UV: https://universalviewer.io/examples/uv/uv.html#?manifest=https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest ICV: http://codh.rois.ac.jp/software/iiif-curation-viewer/demo/?manifest=https://omekas.aws.ldas.jp/sandbox/iiif/2/2/manifest まとめ IIIFアイコン(IIIFのマニフェストURL)をサイトに設置する際の、ドラッグ&ドロップへの対応のお役に立てば幸いです。

[備忘録] maptilerのlightおよびdarkテーマ

[備忘録] maptilerのlightおよびdarkテーマ

シンプルな地図を探していたところ、maptilerにたどり着きました。 https://www.maptiler.com/ 具体的には、以下のBasic Lightや、 https://www.maptiler.com/maps/#784b0675-dce5-4a4f-b16c-0d8e06442314//vector/3/-122.45/37.79 以下のBasic Darkがよさそうでした。 https://www.maptiler.com/maps/#74f0e2cf-0dc3-46ba-98ed-c2395d4c71e2//vector/3/-122.45/37.79 ただ、上記の地図をMy Cloudのページからの使用を試みたところ、なかなか見つけることができませんでした。 結果的には、それぞれ以下のURLからたどり着くことができました。 テーマ URL Basic Light https://cloud.maptiler.com/maps/positron/ Basic Dark https://cloud.maptiler.com/maps/darkmatter/ 同様のことでお困りの方の参考になりましたら幸いです。

Swagger UIのデモで初期表示するspecificationをgetパラメータで指定する

Swagger UIのデモで初期表示するspecificationをgetパラメータで指定する

Swagger UIのデモが以下で公開されています。 https://petstore.swagger.io/ 上記のURLに対して、?url=(jsonやyamlファイルへのURL)を指定することで、初期表示するspecificationを指定することができました。 ここでは、以下の公開されている例を対象とします。 https://github.com/OAI/OpenAPI-Specification 例えば、以下のように指定することができます。 https://petstore.swagger.io/?url=https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/examples/v3.0/api-with-examples.yaml specificationを他者と共有する際の参考になりましたら幸いです。

Omeka S IIIF ServerのIIIFマニフェスト(version 2)の出力内容

Omeka S IIIF ServerのIIIFマニフェスト(version 2)の出力内容

概要 Omeka SでIIIFマニフェストを配信するためのモジュールとして、IIIF Serverがあります。 https://github.com/Daniel-KM/Omeka-S-module-IiifServer 本記事では、このIIIFマニフェスト(特に、IIIF Presentation API version 2)の出力内容について確認します。 例 以下、https://shared.ldas.jp/omeka-sというURLで公開しているOmeka Sにおいて、IDtest-111のアイテムに関するIIIFマニフェストの例です。 { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/manifest", "@type": "sc:Manifest", "label": "Sample Item", "thumbnail": { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0001.tif/full/!200,200/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "width": 200, "height": 200 }, "license": "https://shared.ldas.jp/omeka-s/s/test/page/reuse", "attribution": "サンプル機関", "related": { "@id": "https://shared.ldas.jp/omeka-s", "format": "text/html" }, "seeAlso": { "@id": "https://shared.ldas.jp/omeka-s/api/items/1270", "format": "application/ld+json" }, "metadata": [ { "label": "Title", "value": "Sample Item" }, { "label": "Identifier", "value": "test-111" } ], "sequences": [ { "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/sequence/normal", "@type": "sc:Sequence", "label": "Current Page Order", "viewingDirection": "left-to-right", "canvases": [ { "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/canvas/p1", "@type": "sc:Canvas", "label": "1", "thumbnail": { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0001.tif/full/!200,200/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "width": 200, "height": 200 }, "width": 6401, "height": 4810, "images": [ { "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/annotation/p0001-image", "@type": "oa:Annotation", "motivation": "sc:painting", "resource": { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0001.tif/full/full/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "width": 6401, "height": 4810, "service": { "@context": "http://iiif.io/api/image/2/context.json", "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0001.tif", "profile": "http://iiif.io/api/image/2/level1.json" } }, "on": "https://shared.ldas.jp/omeka-s/iiif/test-111/canvas/p1" } ] }, { "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/canvas/p2", "@type": "sc:Canvas", "label": "2枚目", "thumbnail": { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0002.tif/full/!200,200/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "width": 200, "height": 200 }, "width": 6401, "height": 4810, "images": [ { "@id": "https://shared.ldas.jp/omeka-s/iiif/test-111/annotation/p0002-image", "@type": "oa:Annotation", "motivation": "sc:painting", "resource": { "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0002.tif/full/full/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "width": 6401, "height": 4810, "service": { "@context": "http://iiif.io/api/image/2/context.json", "@id": "https://iiif.dl.itc.u-tokyo.ac.jp/iiif/kunshujou/A00_6010/001/001_0002.tif", "profile": "http://iiif.io/api/image/2/level1.json" } }, "on": "https://shared.ldas.jp/omeka-s/iiif/test-111/canvas/p2" } ], "metadata": [ { "label": "Title", "value": "2枚目" } ] } ] } ] } 以下、それぞれのタイプについて説明します。 ...

BeautifulSoupでxml:id属性を与える方法

BeautifulSoupでxml:id属性を与える方法

BeautifulSoupでxml:id属性を与える方法の備忘録です。 以下の方法ではエラーが発生してしまいます。 from bs4 import BeautifulSoup soup = BeautifulSoup(features="xml") soup.append(soup.new_tag("p", abc="xyz", xml:id="abc")) print(soup) 以下のように記述すると正しく実行できました。 from bs4 import BeautifulSoup soup = BeautifulSoup(features="xml") soup.append(soup.new_tag("p", **{"abc": "xyz", "xml:id":"aiu"})) print(soup) Google Colabの実行例は以下です。 https://github.com/nakamura196/ndl_ocr/blob/main/BeautifulSoupでxml_id属性を与える方法.ipynb 参考になりましたら幸いです。

[Omeka S]Bulk Importの不具合対応(ソースコードからのインストール方法を含む)

[Omeka S]Bulk Importの不具合対応(ソースコードからのインストール方法を含む)

概要 Omeka Sでのデータ一括登録を行うためのモジュールの一つであるBulk Importについて、2022年8月21日現在の最新版であるver.3.3.33.4において不具合が含まれるようです。 具体的には以下のissueで、mediaの一括登録時に不具合が生じます。 https://gitlab.com/Daniel-KM/Omeka-S-module-BulkImport/-/issues/11 この不具合について、以下のcommitで既に対応済みです。 https://github.com/Daniel-KM/Omeka-S-module-BulkImport/commit/7d568a97f08459e22e7c5fbaa8163b17ab4ba805 しかし、本日時点において、まだRelease版は公開されていないため、ソースコードからのインストールを行う必要があります。 ソースコードからのインストール 以下の記事も参考にしてください。 ここでは、改めてインストール方法を説明します。 ソースコードのダウンロード Omeka Sのmodulesディレクトリに移動して、ソースコードをダウンロードします。必要に応じて、ダウンロード済みのBulkImport関連ファイルおよびフォルダを削除します。 cd modules rm -rf BulkImport* git clone https://github.com/Daniel-KM/Omeka-S-module-BulkImport.git BulkImport composer 次にcomposer installを行います。 cd BulkImport composer install --no-dev 以下のように、composerが見つからない場合があります。 composer: Command not found. 簡単な対応方法として、以下を実行します。 curl -sS https://getcomposer.org/installer | php php composer.phar install --no-dev 上記により、モジュールのインストールは完了です。 Omeka Sの管理画面での操作 モジュールのアップグレード ブラウザから、管理画面のModules一覧ページにアクセスします。 http://xxx.xyz/omeka-s/admin/module この一覧からBulk Importを確認し、「Upgrade」ボタンが表示されている場合には、アップグレードしてください。 Import時の注意 基本的な操作方法に変更はありませんが、以下のStart import画面において、「Identifier to use for linked resources or update」の変更が必要な場合があります。 以下のmetada.csvおよびimage.csvを使用することを想定します。 https://gist.github.com/nakamura196/fa50591426c43eec319e71bfdb8b6460 以下、登録画面です。 ...

コマンドラインから virtuoso を手動で再起動または停止する方法

コマンドラインから virtuoso を手動で再起動または停止する方法

コマンドラインから virtuoso を手動で再起動または停止する方法です。 以下の記事を参考にしています。 https://stackoverflow.com/questions/42575039/how-to-manually-restart-or-stop-virtuoso-from-commandline 以下のようにするのがよいようです。 isql {host}:{port} {UID} {PWD} EXEC=shutdown 具体例は以下です。 isql localhost:1111 dba dba EXEC=shutdown 以下のようにisqlがnot foundの場合、パスを変更して実行します。 isql localhost:1111 dba dba EXEC=shutdown bash: isql: command not found find / -name isql /usr/local/bin/isql /root/virtuoso-opensource/binsrc/tests/isql /usr/local/bin/isql localhost:1111 dba dba EXEC=shutdown 参考になりましたら幸いです。

VGG16を用いた類似画像検索

VGG16を用いた類似画像検索

以下の記事に関連して、VGG16を用いた類似画像検索を行うノートブックを作成しました。 ノートブックは以下です。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/[vgg16]_Image_Similarity_Search_in_PyTorch.ipynb 「ランタイム」 > 「すべてのセルを実行」 で動作を確認することができます。 参考になりましたら幸いです。

オートエンコーダ(自己符号化器)を用いた類似画像検索

オートエンコーダ(自己符号化器)を用いた類似画像検索

以下の記事を参考に、オートエンコーダ(自己符号化器)による類似画像検索を行うノートブックを作成しました。 https://medium.com/pytorch/image-similarity-search-in-pytorch-1a744cf3469 ノートブックは以下です。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/Image_Similarity_Search_in_PyTorch.ipynb 「ランタイム」 > 「すべてのセルを実行」 で動作を確認することができます。 参考になりましたら幸いです。

[RDF] URIにアクセスしたらSnorqlの画面にリダイレクトさせる設定

[RDF] URIにアクセスしたらSnorqlの画面にリダイレクトさせる設定

以下の記事の続編です。 ジャパンサーチのRDFストアを参考として、https://xxx.abc/data/123などのURLにアクセスしたら、https://xxx.abc/?describe=https://xxx.abc/data/123にリダイレクトさせる設定の備忘録です。 ジャパンサーチの例 https://jpsearch.go.jp/entity/chname/葛飾北斎 -> https://jpsearch.go.jp/rdf/sparql/easy/?describe=https://jpsearch.go.jp/entity/chname/葛飾北斎 以下のようなconfファイルを作成し、適切な場所(例:/etc/httpd/conf.d/)に配置します。 RewriteEngine on RewriteCond %{HTTP_ACCEPT} .*text/html RewriteRule ^/((data|entity)/.*) https://xxx.abc/?describe=https://xxx.abc/$1 [L,R=303] その後、apacheを再起動します。 systemctl restart httpd これにより、snorqlの画面にリダイレクトさせることができます。

Hugging Face SpacesでJSONを返却する

Hugging Face SpacesでJSONを返却する

以前、Hugging Face SpacesとYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリの構築を行いました。 今回は上記のアプリを一部変更して、以下の差分に示すように、JSON出力を追加しました。 https://huggingface.co/spaces/nakamura196/yolov5-ndl-layout/commit/4d48b95ce080edd28d68fba2b5b33cc17b9b9ecb#d2h-120906 これにより、以下のノートブックのように、返却結果を利用した処理が可能になりました。 https://github.com/nakamura196/ndl_ocr/blob/main/GradioのAPIを用いた物体検出例.ipynb 他により良い方法があるかと思いますが、参考になりましたら幸いです。

AWS EC2を用いたVirtuoso RDFストアの構築

AWS EC2を用いたVirtuoso RDFストアの構築

はじめに AWS EC2を用いたVirtuoso RDFストアの構築に関する備忘録です。独自ドメイン設定、HTTPS接続、Snorqlの設置、までを行います。 本記事以外にも、Virtuoso構築に関する有益な記事が多数存在しています。参考にしてください。 https://midoriit.com/2014/04/rdfストア環境構築virtuoso編1.html https://qiita.com/mirkohm/items/30991fec120541888acd https://zenn.dev/ningensei848/articles/virtuoso_on_gcp_faster_with_cos 前提 ACM Certificateは作成済みとします。以下の記事などを参考にしてください。 https://dev.classmethod.jp/articles/specification-elb-setting/#toc-3 EC2 まずEC2のインスタンスを作成します。 Amazon Linuxを選択し、インスタンスタイプはt2.microとしました。 ネットワーク設定については、「セキュリティグループを作成する」を選択し、「HTTPSトラフィックを許可する」と「HTTPトラフィックを許可する」の両方にチェックを入れます(以下の図では、後者にのみチェックが入っている状態ですのでご注意ください)。 インスタンスの状態が「実行中」になったら、画面右上の「接続」ボタンを押して、サーバに接続します。 接続後、以下を実行して、apacheサーバを立ち上げておきます。 sudo yum install httpd -y cd /var/www/html sudo vi index.html <p>test</p> sudo systemctl start httpd sudo systemctl enable httpd ELB作成 「ロードバランシング」の「ターゲットグループ」を選択します。 「Create target group」から、[Basic configuration]で「Instances」を選択して、あとは下図のように設定します。「VPC」は先ほど立ち上げたEC2インスタンスと同じものを選択しています。 「Register targets」の画面において、画面上部でインスタンスを選択して、「Include as pending below」ボタンをクリックします。すると、下図のように、選択したインスタンスが画面下部に移動します。 その後、「Create」ボタンを押します。 次に、「ロードバランサー」から「ロードバランサーの作成」を行います。 「Create Application Load Balancer」を選択し、以下のように「Network mapping」で複数のサブネットを選択します。 次がポイントですが、「Security groups」において、選択済みの「default」を削除して、先にEC2インスタンスの作成時に作成したセキュリティグループ「lanch-wizard-XX」など選択します。 また、「Listeners and routing」は、「HTTPS」を選択して、「Forward to」に先ほど作成したターゲットグループを選択してください。 ...

Virtuoso RDFストアに対して、curlおよびpythonを用いてRDFファイルを登録・削除する方法

Virtuoso RDFストアに対して、curlおよびpythonを用いてRDFファイルを登録・削除する方法

概要 Virtuoso RDFストアに対して、curlおよびpythonを用いてRDFファイルを登録・削除する方法の備忘録です。 以下を参考にしています。 https://vos.openlinksw.com/owiki/wiki/VOS/VirtRDFInsert#HTTP PUT curl 上記のページの通りです。まず、登録用のサンプルデータとして、myfoaf.rdfを作成します。 <rdf:RDF xmlns:foaf="http://xmlns.com/foaf/0.1/"> <foaf:Person rdf:about="http://www.example.com/people/中村覚"> <foaf:name>中村覚</foaf:name> </foaf:Person> </rdf:RDF> 次に以下のコマンドを実行します。 curl -T ${filename1} ${endpoint}/DAV/home/${user}/rdf_sink/${filename2} -u ${user}:${passwd} 具定例は以下です。 curl -T myfoaf.rdf http://localhost:8890/DAV/home/dba/rdf_sink/myfoaf.rdf -u dba:dba python 実行例は以下です。以下では、rdflibを用いて、RDFファイルの作成から行なっています。またactionをdeleteに設定することで、削除を行うことができます。 import requests from rdflib import Graph, URIRef, Literal from rdflib.namespace import FOAF filename = "myfoaf.rdf" endpoint = "http://locahost:8890" user = "dba" passwd = "dba" action = "create" # action = "delete" ##### # RDFデータの作成 g = Graph() s = URIRef("http://example.org/people/中村覚") name = Literal("中村覚") g.add((s, FOAF.name, name)) # ファイルへの保存 g.serialize(destination=filename, format="xml") data = open(filename,'r', encoding='utf-8') data = data.read().encode() # 登録 url = f"{endpoint}/DAV/home/{user}/rdf_sink/{filename}" if action == "create": response = requests.put(url, data=data, auth=(user, passwd)) elif action == "delete": response = requests.delete(url, auth=(user, passwd)) print(response.status_code) まとめ 他にも方法があると思いますが、参考になりましたら幸いです。 ...

Hugging Face SpacesとYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリの構築

Hugging Face SpacesとYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリの構築

概要 Hugging Face Spacesと、以下の記事で紹介したYOLOv5モデル(NDL-DocLデータセットで学習済み)を使った推論アプリを作成しました。 以下のURLからお試しいただけます。 https://huggingface.co/spaces/nakamura196/yolov5-ndl-layout また以下のURLからソースコードや学習済みモデルをダウンロードすることができます。同様のアプリケーションを開発される際の参考になれば幸いです。 https://huggingface.co/spaces/nakamura196/yolov5-ndl-layout なお、アプリケーションの開発には、以下のSpaceを参考にしています。 https://huggingface.co/spaces/pytorch/YOLOv5 使い方 画像をアップロードするか、Examplesから画像を選択してご利用いただけます。以下のように認識結果を確認することができます。 APIの利用 APIの利用方法に関するノートブックを作成しました。こちらも参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/gradioのAPI利用.ipynb

Elasticsearch 上のデータをローカルにダンプする

Elasticsearch 上のデータをローカルにダンプする

Elasticsearch 上のデータをローカルにダンプするにあたり、elasticsearch-dumpを使用しました。その備忘録です。 https://github.com/elasticsearch-dump/elasticsearch-dump 以下のように、vオプションを使用することで、コンテナ上で作ったファイルがホストの方に残ります。limitオプションなどは任意です。 docker run -v [ホストディレクトリの絶対パス]:[コンテナの絶対パス] --rm -ti elasticdump/elasticsearch-dump --input [ソースとなる Elasticsearch インデックスのエンドポイント] --output=[コンテナの絶対パス]/[出力ファイル名].json --limit 10000 具体的には、以下のような形です。 docker run -v /Users/xxx/dump:/test --rm -ti elasticdump/elasticsearch-dump --input https://xxx.us-east-1.es.amazonaws.com/images --output=test/images.json --limit 10000 参考になりましたら幸いです。

NDL-DocLデータセットとYOLOv5を用いたレイアウト抽出モデルを作成しました。

NDL-DocLデータセットとYOLOv5を用いたレイアウト抽出モデルを作成しました。

概要 NDL-DocLデータセットとYOLOv5を用いたレイアウト抽出モデルを作成しました。 https://github.com/ndl-lab/layout-dataset https://github.com/ultralytics/yolov5 本モデルは以下のノートブックからお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/NDL_DocLデータセットとYOLOv5を用いたレイアウト抽出モデル.ipynb 本記事は、上記の学習過程の備忘録です。 データセットの作成 Pascal VOC形式のNDL-DocLデータセットを、YOLO形式に変換します。この方法については、以下の記事を参考にします。Pascal VOC形式からCOCO形式への変換に加えて、COCO形式からYOLO形式への変換を追加しています。 学習 以下のページにカスタムデータの学習方法が記載されています。 https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data 以下のノートブックにも学習方法が記載されています。 https://colab.research.google.com/github/ultralytics/yolov5/blob/master/tutorial.ipynb 入力画像のサイズを1024、バッチサイズを4、エポック数を300に設定した結果、以下のような結果が得られました。なお、データセットをtrain 80%, validation 10%, test 10%に分けています。 推論 上述した通り、以下のノートブックから推論をお試しいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/NDL_DocLデータセットとYOLOv5を用いたレイアウト抽出モデル.ipynb 以下、推論結果の例です。うまく認識できた例のみを掲載しています。 『源氏物語』(東京大学所蔵) 『源氏物語』(京都大学所蔵) 『源氏物語』(九州大学所蔵) まとめ レイアウト認識の結果を踏まえ、次は行内の文字認識に取り組みたいと思います。

Google Colabを使って、パスからGoogle DriveのフォルダのIDを取得する

Google Colabを使って、パスからGoogle DriveのフォルダのIDを取得する

以下のページを参考にしています。 https://stackoverflow.com/questions/67324695/is-there-a-way-to-get-the-id-of-a-google-drive-folder-from-the-path-using-colab 以下のように記述することで、パスからGoogle DriveのフォルダのIDを取得することができます。 # ドライブのマウント from google.colab import drive drive.mount('/content/drive') # koraのインストール !pip install kora from kora.xattr import get_id # 例)マイドライブへのidを取得する path = "/content/drive/MyDrive" fid = get_id(path) print("https://drive.google.com/drive/u/1/folders/{}".format(fid)) 以下のノートブックからもお試しいただけます。参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/パスからGoogle_DriveのフォルダのIDを取得.ipynb

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を実現する

概要 以下の記事を参考に、Hugging FaceモデルをAWS Lambdaでホスティングし、サーバーレス推論を行った備忘録です。 https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/ また、Lambdaの関数URLとCloudFrontを用いたAPIの提供までを行います。 Hugging FaceモデルをAWS Lambdaでホスティング 準備 この点については冒頭でも紹介した、以下のドキュメントを参考にしています。 https://aws.amazon.com/jp/blogs/compute/hosting-hugging-face-models-on-aws-lambda/ まず以下のコマンドを実行します。venvという仮想環境を作成していますが、この点は必須ではないはずです。 #Clone the project to your development environment git clone https://github.com/aws-samples/zero-administration-inference-with-aws-lambda-for-hugging-face.git cd zero-administration-inference-with-aws-lambda-for-hugging-face # 仮想環境の作成と有効化 python -m venv venv source venv/bin/activate # Install the required dependencies: pip install -r requirements.txt # Bootstrap the CDK. This command provisions the initial resources needed by the CDK to perform deployments: cdk bootstrap 注意 ドキュメントでは、この後にcdk deployをするように記載されています。その結果、deployすることができ、lambdaのテストも実行できました。しかし、後述するlambdaの関数URLを発行して利用した際に、いくつかエラーが発生しました。そのため、次の修正を行います。 inference/*.py 関数URLから利用する場合、パラメータがqueryStringParametersに格納されるため、そのための処理を追加します。postで利用する場合には、さらに修正が必要です。 以下、sentiment.pyの変更例です。pipelineの引数などを変更することで、自作モデルに基づく推論を行うことも可能です。 ...