見出し画像

物体検出のアノテーションツール「labelImg」が勝手に落ちる (2025/1)

物体検出の教師データを作成するツールとして "labelImg" があります.以前から使っていたのですが,新しい PC にインストールした際にエラーがあったのでログを残しておきます.

0. 環境構築

ほぼこちらの方法でできました.OS は Windows 11 です.

conda create -n label python=3.11
conda activate label
pip install PyQT5
pip install lxml
  • labelImg のファイル一式を zip でダウンロードして,ホームディレクトリ(C:\Users\ユーザー名)で展開します.

  • 普通に展開するとファイル名は "labelImg-master" となりますが,"labelImg" のみにリネームしておきます.将来の入力が短く済むという単純な理由と,差別的な表現を避けるという深い理由からです.
    参考:Git Hub のデフォルトブランチ名と人権問題について  Zenn

cd labelImg
# 初回だけ実行
pyrcc5 -o libs/resources.py resources.qrc

これで(エラーを起こすための)準備は完璧です.

1. エラーの内容

クラス名を設定します.labelImg / data ディレクトリにcustom_classes.txt というテキストファイルを作り,設定するクラス名(任意)を入力します.

class1
class2
class3

custom_classes.txt

設定したら,cd labelImg が済んでいる状態から以下を実行します.

python labelImg.py class_file data/custom_classes.txt
ウィンドウが立ち上がりました!

教師データの形式は YOLO を選択します.「ディレクトリを開く」から画像のあるフォルダを指定し,画像をロードします.あとは教師データをガンガン作っていきま,,,
ウィンドウが閉じてしまいました.アノテーション作業ができません.

2. 原因

プロンプトには以下のログが表示されています.

Traceback (most recent call last):
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1358, in open_dir_dialog
   self.import_dir_images(target_dir_path)
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1373, in import_dir_images
   self.open_next_image()
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1450, in open_next_image
   self.load_file(filename)
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1159, in load_file
   self.show_bounding_box_from_annotation_file(self.file_path)
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1192, in show_bounding_box_from_annotation_file
   self.load_yolo_txt_by_filename(txt_path)
File "C:\Users\[ユーザー名]\labelImg\labelImg.py", line 1639, in load_yolo_txt_by_filename
   t_yolo_parse_reader = YoloReader(txt_path, self.image) #,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\[ユーザー名]\labelImg\libs\yolo_io.py", line 97, in __init__
   classes_file = open(self.class_list_path, 'r')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\[データフォルダへのパス]\\labels\\classes.txt'

出力

クラス名のファイルがないと言っています.python コードを実行する際に "class_file data/custom_classes.txt" というオプションを付けているのですが,どこかで対応付けが漏れてしまったようです.

プログラムの色々なところに print を入れて調べたところ,YoloReader を使う際にクラス名のテキストファイルのパスを引数に入れていなかったためでした.

libs/yolo_io.py.class_list_path を指定しないと,デフォルトでアノテーションファイルのフォルダの classes.txt にされる

3. 対策

labelImg.py を 2 行だけ編集します.

まず,1608 行目付近の load_predefined_classes に以下のように追記し,class_list のパスを記憶させてあげます.

    def load_predefined_classes(self, predef_classes_file):
        if os.path.exists(predef_classes_file) is True:
            self.class_list_path = predef_classes_file # この行を追加
            with codecs.open(predef_classes_file, 'r', 'utf8') as f:
                (以下略)

続いて,1630 行目付近の load_yolo_txt_by_filename の中で,YoloReader を使う際の引数に,クラスリストのパスを追加します.

    def load_yolo_txt_by_filename(self, txt_path):
        if self.file_path is None:
            return
        if os.path.isfile(txt_path) is False:
            return

        self.set_format(FORMAT_YOLO)
        # t_yolo_parse_reader = YoloReader(txt_path, self.image) # これを削除
        # 以下 2 行を追記
        t_yolo_parse_reader = YoloReader(txt_path, self.image,
                                         class_list_path=self.class_list_path)
        (以下略)

これで解決するはずです.あとは教師データをガンガン作っていきましょう

ラベル生成の様子

ちなみに,GitHub のプルリクエストは上がっていました.が,現在の開発は後継の label-studio に移っており,labelImg の方はもう更新されないようです.ローカルで簡単に YOLO 形式のアノテーションができるという点では今でも良いツールだと思うのですが.

おまけ

YOLO-v9 の論文と実装方法の紹介をしています.もしよければご一緒にどうぞ.


いいなと思ったら応援しよう!