🏷️

labelImg の TypeError 解消方法

2024/11/21に公開

こんにちは!『麦ちゃーはん』です。
今回は、labelImgの使用中にTypeErrorが発生したため、その対処方法を自分なりにまとめてみました。

こちらの記事を参考にさせていただきました。
https://chem-fac.com/yolov8/

labelImgの概要

labelImg は、物体検出のためのデータセットを作成する際に使用される、オープンソースのアノテーション(ラベル付け)ツールです。Pythonで開発されており、直感的な操作でバウンディングボックス形式のラベル付けを行うことができます。

発生したエラーについて

YOLO形式での出力を行うためにlabelImgを導入したのですが、いざ画像にバウンディングボックスを追加しようとするとソフトが落ちてしまいました。

表示されたエラーは以下の通りです。

TypeError: arguments did not match any overloaded call:
  drawLine(self, l: QLineF): argument 1 has unexpected type 'float'
  drawLine(self, line: QLine): argument 1 has unexpected type 'float'
  drawLine(self, x1: int, y1: int, x2: int, y2: int): argument 1 has unexpected type 'float'
  drawLine(self, p1: QPoint, p2: QPoint): argument 1 has unexpected type 'float'
  drawLine(self, p1: Union[QPointF, QPoint], p2: Union[QPointF, QPoint]): argument 1 has unexpected type 'float'

確認してみると、labelImgのdrawLine()に渡している引数の型が正しくないためにエラーが発生していました。

drawLine()が整数型(int)の引数を必要としているところに、浮動小数点型(float)を渡してしまっているようです。

エラーの原因

結論から言うと、「labelImg.py」と「canvas.py」を修正する必要があります。

まず、以下のコマンドでディレクトリを取得してください。

pip show labelImg

このディレクトリに含まれる「labelImg」フォルダと「libs」フォルダに「labelImg.py」と「canvas.py」が含まれています。

修正内容

コードを以下のように書き換えてください。

  • labelImg.pyの965行目
bar.setValue(int(bar.value() + bar.singleStep() * units))
  • canvas.pyの526行目
p.drawRect(int(left_top.x()), int(left_top.y()), int(rect_width), int(rect_height))
  • canvas.pyの530行目
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
  • canvas.pyの531行目
p.drawLine(0, int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))

これで問題なく動作するはずです。

おわりに

今回は、「labelImgのTypeError解消方法」について解説させていただきました。今後labelImgとYOLOを使って画像認識モデルを作成する予定ですので、よろしければそちらの記事もご覧ください。

ここまでお付き合いいただき、心から感謝いたします!

Discussion