物体検出のアノテーションツール「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 というテキストファイルを作り,設定するクラス名(任意)を入力します.
設定したら,cd labelImg が済んでいる状態から以下を実行します.
python labelImg.py class_file data/custom_classes.txt
教師データの形式は YOLO を選択します.「ディレクトリを開く」から画像のあるフォルダを指定し,画像をロードします.あとは教師データをガンガン作っていきま,,,
ウィンドウが閉じてしまいました.アノテーション作業ができません.
2. 原因
プロンプトには以下のログが表示されています.
クラス名のファイルがないと言っています.python コードを実行する際に "class_file data/custom_classes.txt" というオプションを付けているのですが,どこかで対応付けが漏れてしまったようです.
プログラムの色々なところに print を入れて調べたところ,YoloReader を使う際にクラス名のテキストファイルのパスを引数に入れていなかったためでした.
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 の論文と実装方法の紹介をしています.もしよければご一緒にどうぞ.