Pythonで歩行者カウントを行うプログラムが正常に動作しない場合、コードの構造やデータの処理方法を見直すことで問題を解決できます。本記事では、具体的なデバッグ方法と修正案について解説します。
歩行者カウントプログラムの概要
このプログラムは、物体検出結果から歩行者を識別し、指定された線を越えた歩行者をカウントするものです。一般的に、以下のような処理が行われます。
- 検出された歩行者の座標情報を取得
- 物体IDを割り当て、同じ物体かどうかを判断
- 指定したラインを超えた場合にカウント
- 結果をリアルタイムで画面に表示
コードの問題点と修正方法
投稿されたコードには、以下のような問題が考えられます。
① ループ内での変数展開ミス
現在のコードでは、for *xyxy, conf, cls in results[0].boxes.xyxy
の部分が誤っている可能性があります。この記述では、適切にデータを展開できていない可能性があるため、for box in results[0].boxes
のように修正します。
for box in results[0].boxes: xyxy = box.xyxy[0].cpu().numpy() conf = box.conf[0].cpu().numpy() cls = box.cls[0].cpu().numpy()
② Bounding Boxの長さをチェックする条件の改善
現在のコードでは、bounding boxの座標が不足している場合にエラーが発生する可能性があります。より適切なチェックを行い、エラー回避のためにデバッグメッセージを追加します。
if len(xyxy) < 4: print("Bounding box data is incomplete, skipping this detection.") continue # スキップ
③ 物体IDの適切な割り当て
現在のコードでは、(x_center, y_center)
のタプルを使用して物体IDを管理していますが、実際には動きのあるオブジェクトでは座標が変わるため、一意性を確保できません。UUIDを利用する方法も検討できます。
import uuid object_ids = {} if (x_center, y_center) not in object_ids: object_ids[(x_center, y_center)] = str(uuid.uuid4()) # 一意のIDを付与
線を超えたかの判定ロジックの改善
線を超えたかどうかの判定も、現在のコードでは x_center > line_x
というシンプルな条件になっていますが、方向を考慮する場合は、過去の位置情報と比較する方が正確です。
if prev_positions.get(object_id, 0) <= line_x and x_center > line_x: crossed_line.add(object_id)
このように、過去の位置と比較することで、意図しないカウントの重複を防げます。
デバッグ方法とエラーの確認
プログラムが正しく動作しない場合、次の手順でエラーを特定できます。
- 中間データ(xyxy, conf, cls)の内容をprint()で確認
- エラーメッセージを明示的に出力
- 小規模なデータセットで試しながら検証
まとめ
本記事では、Pythonを使用した歩行者カウントプログラムのデバッグと修正方法について解説しました。主なポイントは以下の通りです。
- 変数展開を適切に修正
- Bounding Boxの長さをチェックし、エラーハンドリングを強化
- 物体IDの一意性を確保
- 線を超えたかの判定ロジックを改善
これらの改善を適用することで、より正確で安定した歩行者カウントが可能になります。
コメント