前回の「深層学習 TensorFlow Object Detection API サンプルプログラム」では、画像からの動物の検出と画像の切り出しを行うサンプルプログラムを作りましたが、今度はフォルダ内の画像ファイルからの動物の検出と座標などの情報をテキストファイルに書き出す Python サンプルプログラムを自作してみました。
今後、より詳細の学習を行うためにはアノテーションが必要ですが、ゼロから作業するのは大変なので既存の学習済みモデルを利用して大まかな検出を行い、より詳細な情報を与えて再学習することを想定してます。
(練習のためのサンプルプログラムです。詳細の動作確認は行っていません。)

(1)概要
画像からの動物の検出、検出された物体の座標・クラス等の情報をテキストファイルに書き出す。

1.選択されたフォルダ内の画像ファイルより物体の検出を行う。
2.検出された物体が特定の動物ならば、その情報をテキストファイルとして出力する。
3.元の画像に、検出された特定の動物のラベルを付加した画像を出力する。
出力されるファイル
・元画像にラベルを書き込んだファイル: labeled_元画像ファイル名
・検出された動物の座標等を出力したテキストファイル: 元画像ファイル名_画像形式_番号_クラス名
出力先は元画像のあるフォルダ内に”annotation”のフォルダを作成して書き込む。

(このプログラムのオブジェクト検出部分の処理は TensorFlow 2 Object Detection API tutorial の Example を参考にして作成されています)

(2)プログラム

Pythonプログラム(テキストファイル UTF-8)
annotationtool01.py

(3)解説

オブジェクト検出APIの使用方法について基本的には前回と同じですが、スコアが 0.2 より大きい場合を対象にしています。
画像へのラベル書き込みは、より柔軟な処理ができるようにvisualize_boxes_and_labels_on_image_array を使用せずにPILの描画機能を利用して画像に上書きしています。

テキストファイルには以下の情報を書き込みます。
1行目 イメージファイル名パス名
2行目 イメージサイズ
3行目 検出された物体のインデックス
4行目 検出された物体のクラス名
5〜8行目 検出された物体の範囲(縦横をそれぞれ1とした比率)
 縦開始位置、横開始位置、縦終了位置、横終了位置
  

(4)動作確認

検出された画像の例
labeled_image10.jpg
labeled_image10

labeled_image31.jpg
labeled_image31

テキストファイルの例
image10_jpg_0_bird.txt
/home/userdir/anaconda3/envs/tfod/test2/image10.jpg
(375, 500)
0
bird
0.50703984
0.10497093
0.82479376
0.7557262

image10_jpg_1_bird.txt
/home/userdir/anaconda3/envs/tfod/test2/image10.jpg
(375, 500)
1
bird
0.22791733
0.14359193
0.48691255
0.7994894

image31_jpg_0_dog.txt
/home/userdir/anaconda3/envs/tfod/test2/image31.jpg
(150, 150)
0
dog
0.20236379
0.22474584
0.8014222
0.7483696

例えば、クラス bird を 細分化して passer_domesticus (イエスズメ)、larus_ridibundus(ユリカモメ)などを学習させる場合や、クラス定義にない動物(例えばサンプルではウサギが”dog”として検出されている)を再学習させるなど、今後の学習のためのアノテーションの元として利用できると思います。

(2024/02/25 Shin Onda)