LayoutParserによるレイアウト解析とOCR
LayoutParserとは
LayoutParserは、レイアウト検出、文字認識、その他多くの文書処理タスクに応用が可能なDLベースのレイアウト解析ツールです。(ライセンスはApache 2.0)大まかなレイアウトに対する物体検出結果を合成し、意味のあるまとまりを持ったテキストで抽出することが可能です。また、事前に画像とそれに対して座標情報と文字列をアノテーションした複数のXMLファイルを用意して、学習済みモデルをfine tuningすることができ、個別の用途にカスタマイズすることが可能です。
pre-trained modelの紹介
LayoutParserにはすでに多くの学習済みモデルが存在します。それぞれのモデルは既に個別の用途に最適なモデルとなっており、自分達がこれから処理するドキュメントのレイアウトにある程度似ていれば学習済みモデルをそのまま使用しても一定の精度が見込めます。以下の表1では学習済みモデルの学習データとその概要についてのまとめです。
モデル名 | 学習データの内訳 | データ数 | ライセンス |
HJDataset | 日本語の歴史文書 | 25万以上 | Apache 2.0 |
PubLayNet | 主に研究論文 | 50万 | Community Data License Agreement – Permissive – Version 1.0 |
PrimaLayout | 主に雑誌や技術・科学出版物 | 305 | 研究のみに使用可能で商用利用不可能 |
NewspaperNavigator | 歴史的な新聞 | 1635万 | —- |
TableBank | 表を含むデータ | 41.7万 | Apache 2.0 |
モデル名 | Label Map |
HJDataset | {1:"Page Frame", 2:"Row", 3:"Title Region", 4:"Text Region", 5:"Title", 6:"Subtitle", 7:"Other"} |
PubLayNet | {0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"} |
PrimaLayout | {1:"TextRegion", 2:"ImageRegion", 3:"TableRegion", 4:"MathsRegion", 5:"SeparatorRegion", 6:"OtherRegion"} |
NewspaperNavigator | {0: "Photograph", 1: "Illustration", 2: "Map", 3: "Comics/Cartoon", 4: "Editorial Cartoon", 5: "Headline", 6: "Advertisement"} |
TableBank | {0: "Table"} |
サンプルコード
import layoutparser as lp
model = lp.Detectron2LayoutModel(
config_path ='lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config',
# In model catalog
label_map ={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"}, # In model`label_map`
extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8]
# Optional
)
model.detect(image)
実行コード
OCRツールとしてはtesseractを使用しています。
import layoutparser as lp
import cv2
def layoutparser(image):
model = lp.Detectron2LayoutModel('lp://PubLayNet/faster_rcnn_R_50_FPN_3x/config',
extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.9],
label_map={0: "Text", 1: "Title", 2: "List", 3:"Table", 4:"Figure"})
layout = model.detect(image)
text_blocks = lp.Layout([b for b in layout if b.type=='Figure'])
return text_blocks
def tesseract(text_blocks):
ocr_agent = lp.TesseractAgent(languages='jpn')
for block in text_blocks:
segment_image = (block
.pad(left=5, right=5, top=5, bottom=5)
.crop_image(img))
text = ocr_agent.detect(segment_image)
block.set(text=text, inplace=True)
for txt in text_blocks.get_texts():
print(txt, end='\n---\n')
def main():
img = cv2.imread("sample.png")
text_blocks = layoutparser(img)
txt = tesseract(text_blocks)
if __name__ == '__main__':
main()
出力結果
元画像
出力画像
M1 mac に labellmg を (きれいに) インス トールする方法 データコースの yuji です。現在、画像処理の プロジェクトに参加しています。この記吾 は、M1 mac に labellmg をインストールす.… --- loggingとは(django-structlog) 今回の記事は 「loggingとは?」 「qdjangoで logを出力する方法」 についてです。 自分が 案件でloggingの実装を始めたときは何が何.… --- PlayGround PlayGroundでCTFコンテストを開きました (出題編) PlayGroundにおいて開催したCTFコンテスト で出題したクイズに関する技術のfine-tuningの仕方
fine-tuningに必要なものは、画像データとアノテーションがなされたXMLファイルです。
以下のGithubに詳しいfine-tuning方法が記載されています。
参考文献
https://layoutparser.readthedocs.io/en/latest/example/deep_layout_parsing/index.html