【文字検出・認識】機械学習に使えるデータセットを作成 - テキスト画像を生成する


Python を使って画像中のランダムな位置にテキスト(日本語・英語)を描画するものを作りました。

機械学習(文字検出・認識)のデータセットを作成するプログラムです。

このプログラムを実行することで、

  • テキストが描画された画像
  • テキストの座標、単語を示す txt ファイル
  • カタカナ1文字のみが描画された画像

を生成することができます。

テキストの座標を示すファイルも一緒に作られるので面倒なラベル付けの作業をしなくて済みます。

GitHub


GitHub のリンク

作成されたデータセットの例

テキスト検出用のデータセット

 

 

テキスト認識用のデータセット

   

概要


背景画像をダウンロードし、その画像のランダムな位置にテキストを描画します。

背景の画像は Bing Image Search からダウンロードされます。

 

単語は katakana_words.txt の中からランダムに選択されます。

便利手帳コム に記載されている466個のカタカナの単語を使用しました。

画像にテキストを描画する際、画像1枚につきランダムで1~3個の単語が描画されます。3より大きい値には設定できません。また、下記のパラメータはランダムに生成されます。

  • フォントサイズ(30 ~ 80)
  • テキストは 3回に1回の確率で回転
  • 回転される場合の角度(-30 度~ 30度)
  • テキストカラー(白、黒、赤、茶、青、水色)

上記のパラメータの値は config.py で変更が可能です。

ただし注意点があります。

カタカナの描画には while ループを使用しています。

仕組みとしてはまず画像内の適当なランダムな位置を定め、その位置に単語を描画します。

もしその際、他の単語と位置が重複していたり、単語が長すぎて画像からはみ出てしまっている場合、文字が重ならない場所を見つけるまでループが繰り返されます。

位置が被らないなおかつ単語が画像内に収まっているという条件が満たされるまで繰り返されます。

なので、フォントのサイズを大きくしすぎたり、文字数が多すぎる単語を使用した場合はうまく空いてるスペースを見つけることができず、ループが延々と繰り返される可能性があります。

 

描画される単語が回転されている場合、単語を囲む枠の座標は下記の写真のように求めています。

緑で描かれている長方形の4隅の座標が txt ファイルに記録されます。


使用方法


まず大まかな手順について紹介します。

最初に、下記のものを pip でインストールしてください。

bing-image-downloader
numpy
pillow
opencv-python
matplotlib
scipy
split-folders

次に fonts ディレクトリを作成し使用するフォントをそこに置いてください。

config.py でフォントの名前も変更する必要があります。

そのあとに、


  1. icrawler.py を実行して背景画像をダウンロード

  2. put_text.py を実行してテキスト画像と txt ファイルを作成

  3. gen_char_image.py を実行。カタカナの画像を生成。

  4. split_dataset.py を実行。put_text.py で作った画像を train, val 用に分割します。


 

テキスト画像だけ入手したい場合は icrawler.py を実行して、put_text.py でテキストデータセットを作ることができます。

 

icrawler.py では bing-images-downloader ライブラリを使用し、背景画像をダウンロードします。

6行目の

query = ["sky", "ocean"] #put words to search

に検索語句を追加し、さらに多くの画像をダウンロードすることができます。

 

put_text.py では images/results 下のディレクトリにテキスト画像と座標が書かれた txt ファイルを生成します。

 

gen_char_image.py では put_text.py によって作られたファイルをもとに画像をクロップしカタカナ1文字のみの画像を生成します。

デフォルトの設定でファイルを実行した場合、合計およそ1600枚の「ア」~「ン」までのカタカナの画像が作られます。

拗音・促音などを表す「ァィゥェォッ」は「アイウエオツ」として認識されます。

おまけ


katakana_words.txt,  put_text.py の 61~64行を編集することで、下記のように英単語バージョンのデータセットも作成可能です。