Dropbox

前回、手順は確認出来ました。次に探求すべきはどのモデルを使いepochsに何回指定すれば良いのかということです。まずはepcohs=200で各種モデルのテストをしてみようと思い立ちましたが、M2 MacBook AirではいくらGPU使ってもモデルによっては一晩では学習が完了しないということが分かりました。メモリーサイズの関係で生成出来ないモデルもあります。それは諦めるとしても時間がかかってしょうがない。目標が定まれば時間をかけて生成するのも悪くはないですが、試行錯誤のためには素早く終わらせたい。

高価なGPUを買いに走るわけにも行かないのでGoogle Colabを試してみることにしました。最初、無料版で試していましたが、色々と試しているとすぐに使用制限がかかって止まってしまいます。多分、何をするかが決まっていれば無料版だけでも大丈夫かも知れませんが、ストレス無くテストを行うために一番安いPay As You Goの1179円を支払って100コンピューティング単位を買いました。この単位がどれくらいのものかは分かりませんが、一連のテストで消費したのは17単位ほどでしたので、小規模なテストには十分でしょう。速度については申し分ないです。M2 MacBook Airで一晩で終わらない学習が無料で使えるGPUでも10分ほどで完了します。

以下、Colabでの実行例です。

前回、Label StudioからExportしたデータはGoogle Driveにアップロードしました。Colabノートブック内にアップロードする方法もありますが、ノートブックを接続解除(頻繁に行う可能性があります)するたびに消えてしまうので使い勝手が良くありません。

yamlファイルもGoogel Driveに作成します。

# fpvgoals dataset

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: /content/drive/My Drive/fpvgates
val: /content/drive/My Drive/fpvgates

# number of classes
nc: 2

# class names
names: ['gate', 'goalgate']

Google Colabで新規ノートブックを作ります。

「ランタイム/ランタイムの変更」でT4 GPUを選択します。下のスクリーンショットは課金した後なので選択肢が多くなっています。

!pip install ultralyticsを実行しUltralyticsを導入します。

そして以下のコードを貼り付けて実行します。

import time
start = time.time()
print(f'start time: {start}')
from ultralytics import YOLO
model = YOLO('yolov9m.pt')
model.info()
model.train(data='/content/drive/My Drive/fpvgoals.yaml', epochs=200, imgsz=640)
trained = time.time()
print(f'elpased time: {trained-start}')
model.val()
end = time.time()
print(f'end time: {end - start}')

Colabの画面だとこんな感じです。

これでモデルを変えたりepochsに指定する数値を変更して試してみました。元になるデータは最初に用意した56枚の画像です。

ざっくりと目視でトラッキング画像で判断して、重いモデルを使用するほど精度は良くなりそう。またepochsは20回より200回がはるかに良いという当たり前のことが確認できました。精度(誤認識の程度)が目的に適っているかどうかは簡単なプログラムを書いて確認しました(プログラムについてはいずれ紹介します)。その結果、軽めのモデルでも十分な結果が出せそうだということも分かりました。

軽いモデルの利点は学習時間が短い、大きなメモリーを必要としないということは既に分かっていましたが、それに加えて画像認識に要する時間が短いという特性があります。これはリアルタイム処理能力を考えるうえで重要なポイントになります。

ベース・モデル 1フレームの処理時間 fps
yolov9t.pt 45ms 22.2
yolov9s.pt 45ms 22.2
yolov9m.pt 75ms 13.3
yolov9c.pt 86ms 11.6
yolov9e.pt 152ms 6.6
yolo10n.pt 42ms 23.8
yolo10s.pt 64ms 15.6
yolo10m.pt 57ms 17.5
yolo10b.pt 79ms 12.7
yolo10l.pt 90ms 11.1
yolo10x.pt 115ms 8.7

これはM2 MacBook Airでの実行例です。22FPS出ているとまずまず目的に適っている気がします。ということでyolov9s.ptを使用する事にしました。yolov10nの方が速度が出ているのですが、まあ何となく感で決めました。

epochsについては200,300と400で比較してみましたが、見た目での差はほとんど分かりませんでした。result.pngで表示されるグラフについても微妙な差でした。勘でしかありませんが当面はepoch=300で進めてみます。

あとは元となる画像を増やしていって何かしら問題点があるかどうかを試していきたいです。

入門などと書いていますが、解説的なことは一切なく、やってみたら出来た手順の紹介です。

目的はここでは明かしませんが(出来るかどうか分かっていないw)、サンプル画像などから自ずと分かってくることでしょう。

世の中にない目的物を認識するためには自分で学習させないといけません。それを教師付き学習という手法で行います。その手順を示すことが、この記事の主な目的です。

[ Python3で仮想環境を作る ]
とりあえずコマンドラインでpython3が起動することを確認してください。記憶は定かではありませんがMacOS Sonomaでも何かしら作業を行わないと動かないかも知れません。その辺りはググっていただきたいです。WindowsならばPython3の導入が必要ですが、ここでは詳細は省きます。また以下の手順はMacOSを使用しています。

後から簡単に無かったことに出来るのでpythonの仮想環境を作って試すことをお勧めします。ターミナルを開き作業用のディレクトリーにて以下の呪文を唱えれば良いです。

python3 -m venv .yolo
source ./.yolo/bin/activate

.yoloは任意の名前です。最初のピリオドは無くても良いです。

以下の作業は全てこの仮想環境で行なっています。

[ アノテーション ]
学習する元データとなるサンプル画像をなるべく多数用意します。そして一枚一枚の画像の中で目標物の範囲を指定し、それが何者であるかのラベルを付けていく作業です。根気と忍耐が試されるステージとなります。

使用するツールはいくつか存在しますが、最初に試したのはlabelImgというものでした。「YOLOv8自作データセットの学習方法(ローカルでも動かすよ)」という記事が詳しいです。手軽に試すには良いのですが、作業を中断したり、後から画像を追加したりするのが難しいので軽いテストで使用するに留まりました。

現在はLabel Studioというツールを使用しています。作業用のPCに入れてローカルでも使えますが、元々サーバーに入れて使うことを前提に考えられているものなので作業用PCとは別のUbuntuサーバーで動かしています。複数の作業者で一つのプロジェクトを完成させるような作りですので作業を途中で中断したり、データを追加するのも自由自在です。Label Studioの使用方法については「多機能アノテーションツールLabelStudioの使い方を解説」という記事が詳しいです。

とりあえず手順の確認のため50枚強の画像を準備しました。元データはFPVドローンのゴーグルで録画した動画ファイルです。動画に直接アノテーションを行う手法もあるようですが、まずは静止画で行います。動画ファイルから使えそうな画像を切り出した静止画(jpgファイル)をLabel Studioにアップロードし、一枚一枚にラベルを付けていきます。これくらいの枚数ならば大して時間はかかりません。

出来上がったらYOLO形式でExportして作業用のPCにダウンロードします。zipファイルになっているので適当なところに解凍して分かりやすいフォルダー名に変更しておきます。

[ YOLOv8 ]
いよいよ学習モデルの作成です。色々な事例を真似してみましたがUltralyticsのYOLOv8パッケージを使用する方法が簡単で確実です。ドキュメントもよく出来ています。これを利用した事例の紹介も多数ありますがサンプルコードは公式ドキュメントと同じものがほとんどです。このブログ記事も含めて、事例紹介を読むより公式ドキュメントをじっくり読むことをお勧めします。

良くわっていませんが、プログラムとしてはYOLOv8ですが学習の元となるモデルはYOLOv10まで進んでいるようです。自分の目的を達成するために、どのモデルを使い、どれくらい学習させれば良いかは試してみるしかないようです。何はともあれ動かしてみます。

[ M2 MacBook Airでの学習 ]
ultralyticsを導入します。

pip install ultralytics

で、いよいよ学習するためのスクリプトです。

import time
from ultralytics import YOLO

start = time.time()
print(f'start time: {start}')
model = YOLO('yolov9s.pt')
model.info()
model.train(data='fpv.yaml', epochs=10, imgsz=640, device='mps')
trained = time.time()
print(f'elpased time: {trained-start}')
model.val()
end = time.time()
print(f'end time: {end - start}')

yolov9s.ptというのが元になるモデルで、何かしらのラベルが付いた学習済みモデルになっています。ここにyolov9s.yamlというファイルを指定して学習させると、全くのゼロからの学習になるらしいですが、ptファイルを使った方が速く結果が出るように思えます。yolov9s.ptは比較的軽いモデルです。目的や学習環境に合わせて、ここを変えます。モデル毎の特徴についてはYOLOのドキュメントを見てください。YOLOv9YOLOv10のリンクを貼っておきます。

epochs=10というのは学習を繰り返す回数です。お試しなので少なめにしておきます。device=’mps’はAppleのM2チップのGPUを使用するためのおまじないです。device=を省略するとMacBookの場合はCPUによる稼働になります。NVIDIAのGPUが実装されている環境ではdeviceの指定がなくても自動的にGPUを使用します。

fpv.yamlというファイルでラベルを付けたデータの置き場所を指定します。内容は以下の通りです。

# fpvgoals dataset

# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: /Users/kozak/Downloads/fpvgates
val: /Users/kozak/Downloads/fpvgates

# number of classes
nc: 2

# class names
names: ['gate','goalgate']

trainとvalの所で指定しているのはLabel StudioからExportしたYOLO形式のzipファイルを展開したフォルダーです。ncは作成したラベルの数に合わせます。namesにはラベル名を書いておきます。

これで先のスクリプトを走らせれば自前の学習済みデータが出来上がります。結果は’runs/detect/train{n}/’ ({n}は数字と置き換えて読んでください)以下に入ります。学習結果を示す各種データがありますが、あまり良くは研究していないです。result.pngを見比べるとepochによる繰り返しが適当な回数になったかどうかが分かるような気もします。出来上がったモデルはweights/bets.ptです。これを使って画像認識を行います。

[ 動画に画像認識をかける ]
いきなりスクリプトを提示します。

import cv2
import time
from ultralytics import YOLO
model = YOLO("./runs/detect/train13/weights/best.pt")
model.to('mps')

video_path = "../video/test2.mov"
cap = cv2.VideoCapture(video_path)
t1 = time.time()
while cap.isOpened():
  success, frame = cap.read()
  if success:
    results = model.track(frame, persist=True)
    annotated_frame = results[0].plot()
    cv2.imshow("FPV Tracking", annotated_frame)
    t2 = time.time()
    print("elapsed: " + str(t2-t1))
    t1 = t2
    if cv2.waitKey(1) & 0xFF == ord("q"):
      break
  else:
    break
cap.release()
cv2.destroyAllWindows()

最初の方にあるbest.ptが自分で生成したモデルです。その直後にある’model.to(‘mps’)はApple M2チップのGPUを使用するためのおまじないです。
“../video/test2.mov”で用意した動画に対して画像認識を行います。単純なトラッキングならば動画を直接YOLOに渡してしまっても良いのですが、画像認識の結果(resultsに格納される各種データ)を後からプログラムで処理するためにOpenCV2にて画像をフレームごとに分解して解析を行うようにしています。

下の例は、もうちょっと深く学習させてからの例ですが、様子的には同じものが出てくきます。

少しテストしてみるとepochs=10では足りなくて200回か300回回した方が良いと分かります。問題は処理時間でM2 MacBook Airでは一晩走らせても終わらないということもあります。あと16GBメモリーのMBAでもメモリーが足りなくなりそうでした。

ということで、探求は次回に続きます。

HDZeroのDVRはTSフォーマットが推奨されています。そのあたりの事情は以前書いた記事をご覧ください。

その時に手作業でTSファイルからMP4への変換方法を書きましたが、やはり面倒です。ということで少しでも楽をするためのプログラムを書いてみました。

[ 特徴 ]
– 再エンコードなしで動作が速い
– ワンクリックでSDカードのTSファイルをまとめて変換
– TSファイルのタイムスタンプをMP4にも反映(手作業の時は諦めていた) -> DVRファイルの時刻を何時も正しくするためにはHDZeroゴーグルにバッテリーを取り付けます

https://github.com/nkozawa/ts2mp4

[ 前提 ]
プログラムを書いたと言っても実際に動画を変換するのはffmpegというツールです。もしffmpegが導入されていない場合は、まずこれを導入しコマンド窓でffmpegと打ち込んで動くようにしておく必要があります。Windowsの場合、おそらく自分でPATHを通すという作業を行わないといけません。

[ 実行ファイル ]
Python3の環境がある場合、公開されているts2mp4.pyを実行してください。MacOSとWindows11のPython 3.11でテストしています。試してはいませんがLinuxでも動くと思います。MacOSとWindows用にはPythonの環境がなくても稼働する実行ファイルも用意しています。

[ 使い方 ]

– Input path(TS files)ボタンを押してTSファイルのある場所を指定します。HDZeroゴーグルのSDカードを指定する事が多いと思います。その場合、SDカード下のmoviesフォルダーを指定します。
– Output path(MP4 files)ボタンを押してMP4ファイルを格納する場所を指定します。
– TSファイルのタイムスタンプをMP4ファイルに反映させる場合はUse Original File Timestampにチェックを入れます。チェックを入れない場合はMP4ファイルのタイムスタンプは現在の時刻になります。
– Start, no overwriteもしくはStart, overwrite allを押して変換を開始します。
“Start, no overwite”は出力先にすでに該当のMP4ファイルがあれば何もしません。新しく録画したものだけを変換するので普通はこのボタンが便利です。ただし判定はファイル名のみで行っています。SDカードを初期化した場合などは考慮が必要です。”Start, overwrite all”は出力先の状態に関係なく全てのTSファイルを変換します。

[ INIファイル ]
Input path(TS files)、Output path(MP4 files)、Use Original File Timestampの設定値はINIファイルに記録されます。次にプログラムを起動するとINIファイルを自動的に読み込みます。

INIファイルはユーザーのホームディレクトリーにts2mp4.iniという名前で書き込みます。

INIファイルの書き込みは、今のところStart, no overwriteもしくはStart, overwrite allを押した時に行なっています。

自分用の覚書です。zipファイルの中に複数のzipファイルが有り、zip中zipの中から目的のテキストファイルを探し出して読み込むサンプル・コードです。特別なことは何もないですし、注釈は要らないでしょう。

#!/usr/bin/perl

my $fn_to_be_found = "target.txt";

if ($ARGV[0] =~ /zip$/i) {
	use File::Temp qw/tempfile/;
	use Archive::Zip;
	my $zip = Archive::Zip->new;
	$zip->read($ARGV[0]);
	my @members = $zip->membersMatching(/zip$/i);
	my $finish = 0;
	foreach my $m (@members) {
		my $fn = $m->fileName;
		print "zip in zip file: $fn\n";
		my ($temp_fh, $temp_filename) = tempfile(UNLINK => 1);
		print "Temporary file name: $temp_filename\n";
		$m->extractToFileHandle($temp_fh);
		$temp_fh->flush;
		my $zip2 = Archive::Zip->new;
		$zip2->read($temp_filename);
		my $m2 = $zip2->memberNamed($fn_to_be_found);
		if ($m2) {
			my $fn2 = $m2->fileName;
			print ">>$fn2\n";
			$file_contents = $m2->contents;
			$finish = 1;
		}
		close $temp_fh;
		if ($finish) {last;}
	}
}

# print $file_contents;

++++++++++
この記事の内容は古すぎます。(2024/03/28)
現在のおすすめは「【Pyinstaller】MacOS用、Windows用のexeをそれぞれ作成する失敗しない方法」です。
++++++++++

MacとWindows環境の両方で動く小さなツールを作ろうと思いました。作りたいのはCUIベースのもので簡単なファイル操作を行い結果を標準出陸出来れば良いだけです。最悪、メインのロジックだけでも共通化出来れば良いくらいに考えていました。WindowsにActivePerlとかStrawberryPerlを入れてしまえば解決と言えないこともないのですが、もともとPerl実行環境が入っていないWindowsにもツールを提供する方法を模索していました。

色々と巡り巡って(というほどでは無いですが)、結局Perlに戻ってきました。Windows環境でPerlスクリプトをexe化すればPerl実行環境をインストールすることなく作成したツールを実行出来ます。

参考ページ: Strawberry Perl(Portable)でPerlスクリプトのexeファイル化

まったく参考ページ、そのままなので追加する情報もありません。わたしが実際にしようしたバージョン等についてだけ書いておきます。

Windows : 日本語版Windows 7 Ultimate 64bit
Perl : Strawberry Perl Portable version 5.24.0.1 64bit PortableZIP edition + extra PDL related libs

Windows上の適当な場所にダウンロードしたzipファイルを展開します。Portable版なのでインストール作業を行うことなくPerlが使用できます。展開した中にあるportableshell.batを実行するとPerlが使用できるコマンドプロンプトが開きます。以下、そのコマンドプロンプトでの実行になります。

以下のコマンドを実行してcpanからPackerモジュールを導入します。参考ページでは–forceオプションを指定してましたが、わたしの実行環境では普通に導入出来ました。

cpanm PAR::Packer

後は以下のようにして目的のPerlスクリプトをexe化します。

pp -o test.exe test.pl

‘Use Archive::Tar’などモジュールが含まれたものも問題なくexe化が可能でした。

参考ページにオプションの説明があります。そこにも書かれていますが、実行の際にライブラリやスクリプトそのものはC:\Users\xxx\AppData\Local\Temp\par-*に展開されます。削除はされません。

Appleに提出したアプリケーションが審査の段階でクラッシュした場合 iTunes ConnectのResolution Centerにトラブルの発生状況とともにCrsh Reportが添付されます。

Crash Reportをダウンロードしてダブルクリックするとコンソールが立ち上がり內容を読むことが出来ますが、肝心の自分のアプリケーションのシンボルが関連付けられていません。困ったときのGoogle頼みで調べ見るとxcrun atosをCrash reportとアーカイブから取り出した.dSYMファイルを関連付ける方法が見つかりました。ところが試してみてもうまく行きません。

基本にかえってAppleのガイドに従うことにしました。答えは簡単に見つかりました。先のResolution CenterにリンクがあるTechnical Note TN2151によると単純にXcodeのOrganizer/Devices/LIBRARY/Device LogsにダウンロードしたクラッシュレポートをImportすればOKです。もちろん、これはアプリケーションをBuild/ArchiveしたXcodeで行わないとシンボルとの突き合わせは行われません。

Mac OS XはGUIアプリケーションが洗練されていることのみならず、shell script、PythonそれにPerlがそのまま使える事が一部のユーザーにとっては意義のあることになっています。

ターミナル上で簡単に実行出来るスクリプトも便利なものです。常用するスクリプトはパスを通したりaliasで簡単に起動させることで実用になります。しかしながら、場合によってはGUIは無くても良いけどアイコンをクリックして起動させたいと思うこともあります。

スクリプトの.app化については既に多くの情報が出回っていますが、アイコンの作成まで含めると複数の情報を組みあせなければなりませんでした。また、私の目的であるperlスクリプトの実行後に画面を残して置くためには一工夫が必要でした。というわけで、自分への覚え書きにするとともに新たな.app化サンブルの提供を行うことにしました。

細かい説明は省いて、ガシガシとサンプルの作成を行なって行きます。

[ アプリケーション・バンドルの作成 ]
参考webページ: 技術/MacOSX/シェルスクリプトを”.app”(“Bundle”)化する

ターミナルを開いて適当な作業場所に移動します。

mkdir WhatDate.app
cd WhatDate.app
mkdir Contents
cd Contents
mkdir MacOS
mkdir Resources

WhatDate.app/Contents/MacOS/WhatDate.pl を以下の内容で作成。またchmod +xで実行属性も付けておく。

#!/usr/bin/perl
system("date");
print "EPOCH: ", time, "¥n";
@localtime = localtime;
print "JULIAN: $localtime[7]¥n";

コマンドラインから実行してみて動作を確認。

WhatDate.app/Contents/MacOS/WhatDate.bash を以下の内容で作成。これも同様にchmod +xで実行属性を付ける。

#!/bin/bash
BASEDIR=$(dirname $0)
open -a Terminal "${BASEDIR}/WhatDate.pl"

コマンドラインから実行してみる。今度は別のウインドウが開いて先のPerlスクリプトが実行されます。

WhatDate.app/Contents/Info.plist を以下の内容で作成します。これがアプリケーションの詳細を記述した重要なファイルです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>WhatDate.bash</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
</dict>
</plist>

もうこれでアプリケーション・バンドルとしては成立しています。アイコンをクリックして起動できるかどうか確認してみましょう。

[ アイコンの作成 ]

インターネットで調べるとIcon Composerを使うべしという情報が沢山見つかりますが、今時は iconutil というコマンドライン・ツールを使用します。

参考リンク: MacアプリのRetina対応アイコン(*.icns)を作成する方法

まずはアイコン画像をでっち上げますが、解像度に応じて沢山作らないといけません。ガイドによると全て作らなくても良いと書いてありますが、どれを作っておけば良いかは書いてないので今回は全部用意することにします。

まずは適当な場所にフォルダー作ります。
mkdir WhatDate.iconset

その下に以下の画像ファイルを作成します。
icon_16x16.png
icon_16x16@2x.png
icon_32x32.png
icon_32x32@2x.png
icon_128x128.png
icon_128x128@2x.png
icon_256x256.png
icon_256x256@2x.png
icon_512x512.png
icon_512x512@2x.png

WhatDateIcons

ファイル名の512×512は想像通り画素数です。後ろに@2xが付いている場合は倍の画素数になります。すなわちicon_512x512@2x.pngは1024×1024の画像ファイルを作成します。icon_16x16@2x.pngとicon_32x32.pngは同じ画素数ですが、あくまでもicon_16x16.pngの高解像度版です。場合によっては解像度によって違うデザインを使うこともあります。その場合、icon_16x16@2x.pngはicon_16x16.pngと同じデザインを使用するということです。

以下のコマンドを実行するとWhatDate.icnsが出来上がります。
iconutil -c icns WhatDate.iconset

出来上がった WhatDate.iconset を WhatDate.app/Contents/Resources/ 下にコピーする。

WhatDate.app/Contents/Info.plistに以下の2行を適当な場所に追加する。
<key>CFBundleIconFile</key>
<string>WhatDate.icns</string>

改めてWhatDate.app/Contents/Info.plistを全部書き出すとこんな具合です。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>WhatDate.bash</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleIconFile</key>
<string>WhatDate.icns</string>
<key>CFBundleSignature</key>
<string>????</string>
</dict>
</plist>

これで完成です。実際のアイコンは直ぐには表示されないかも知れません。

[ 配布 ]

これを配布する場合はディスクイメージにするのが簡単です。

まず適当なところにフォルダを作ります。フォルダ名は分かりやすくアプリケーション名と同じにしたりします。その中に、作成したアプリケーション・バンドルをコピー。必要に応じてReadme.txtみたいな説明も入れておきます。

ディスクユーティリティを起動。
「ファイル/新規/フォルダからのディスクイメージ」を選択します。
ファイル・ダイアログが表示されるので先に作ったフォルダを指定すれば配布用のディスクイメージが出来上がります。
配布先ではWhatDate.dmgをダブルクリックして開いた中にWhatDataアプリケーションが見えますので、適当なところにコピーして使用します。

参考までに、 作成したWhatData.dmgをサンブルとして置いておきます。

Adobeからソースコード用のフォントSource Code Proが公開されています。Iやl, Oと0などが視認しやすくなっています。

Mac OS Xでは/Library/Fontsにファイルファイルを入れておけば良いようです。

CotEditorで早速使用してみました。すっきりとして読みやすく、かなり良い感じです。

前のエントリーと関連した話題です。Perlにもいつの間にかデバッガーが搭載されていました。ほぼpythonのものと同等の機能を持っていますが微妙にコマンドが違います。ということで、覚書エントリーです。

起動は、

perl -d hoge.pl

などとします。

コマンドは、

ブレークポイント設定
 b 100
行番号100にブレークポイントが設定される
ブレークポイント
 L
ブレークポイントが設定されていれば、その一覧が表示される
ブレークポイントの解除
 B 100
行番号100のブレークポイントが解除される。番号の代わりに * を指定すると全てのブレークポイントを解除できる
実行
 c
ブレークポイントに遭遇するまで実行する
ステップ動作
 s
一行だけ実行してデバッガーに戻ります。サブルーチンの内部に入り込んでステップ動作します
ステップ動作
 n
一行だけ実行してデバッガーに戻ります。サブルーチンに遭遇しても次の行に進みます
変数の表示
 p $hoge
hoge変数の内容が表示される

今時のpythonにはデバッガーが内蔵されているためブレークポイントを設定したりステップ動作を行いつつ変数の中身を調べるなどということを簡単に行うことが出来ます。たまにしか使わないためすぐコマンドを忘れてしまう自分のために覚書としてエントリーしておきます。

起動方法は簡単で

python -m pdb hoge.py

などとしてコマンドラインで起動します。同時にhoge.pyを行番号表示の出来るエディターで開いておくと分かりやすいです。

コマンドを自分で使う最低限のものだけ紹介します。

ブレークポイント設定
 b 100 
行番号100にブレークポイントが設定される
ブレークポイント
 b 
ブレークポイントが設定されていれば、その一覧が表示される
ブレークポイントの解除
 cl 1 
1番目のブレークポイントが解除される。番号を省略すると全てのブレークポイントを解除できる
実行
 c 
ブレークポイントに遭遇するまで実行する
ステップ動作
 s 
一行だけ実行してデバッガーに戻ります>/td>
変数の表示
 p hoge 
hoge変数の内容が表示される


この本にはデバッガーについての解説は無いと思いますが、私がpythonを始めるにあたって購入した唯一の書籍です。