GitHub Copilotとか、Cursorとか、Claude Codeとか、プログラミングをAIで支援する、もしくは、もう開発自体をやってもらうツールというのが広まってきているが、こういうのは仕事ではもちろん、趣味の世界でも大いに活用できるはず。むしろ多少の失敗が許される個人の趣味ならば気楽に使えると思う。
私も先日はFITS画像からTIFF画像へのバッチ変換ツールをGitHub Copilotに作ってもらった。
このときはブログのタイトルが「作らせてみた」になっているが、そのあとちょっと考えて、「作ってもらった」ぐらいの方が良いのでは・・・、と思って、今回は「作ってもらった」にした。
さて、来月にはふたご座流星群があるが、毎年ふたご群は寒いので外に出ることはなく、自宅バルコニーにカメラを設置して動画撮影をしている。具体的な機材は、カメラがZWO ASI482MCで、レンズがMeike 6.5mm F2.0。動画撮影ソフトはSharpCapで、8bitのRAW(SER形式)で記録している(詳細は下の記事)。
この記事にあるように、流星の検出は「一コマ飛ばしの比較明画像」を作って目視で行い、それをもとに元の動画ファイルから該当部分を手作業で切り出している。この作業では、検出した流星が動画のどの部分にあるのかを、動画を再生しながら特定する必要があり、多大な時間がかかっている。流星数が数十個になるふたご群やペルセ群では一日がかりになり、正直いってうんざりする。趣味は楽しむためにやっているはずなのに、仕事よりもしんどい作業を何時間もやりたくない。
そこで思いつくのはソフトウェアによる自動検出。実際、ATOMcam2による撮影では「meteor-detect」を使った自動検出をして、動画の切り出しもそれに頼っている。
ただ、このmeteor-detectでは私の処理の流れで使うAVIファイルは読めないし、書き出すファイルも私が思ったものとはちょっと違う。流星の自動検出の設定も調整したい、マルチプロセス化したい、流星をオブジェクトとして扱いたい・・・など、いろいろ改造したいところが出てきた。ただ私自身はPythonはあまり理解してないし、OpenCVの使い方は全くわからないので、自力で改造するのは不可能。
それなら、GitHub Copilotに作ってもらおうと考えた。作るにしてもmeteor-detectのノウハウは取り入れたいので、meteor-detectの内容も参考にするようプロンプト指示した。その結果としては、流星検出の要となる部分(フレーム間差分、比較明合成)は、結局ほぼmeteo-detectそのままになったので、実質meteo-detectのプライベート改造版という位置づけになった。なお、今回はLLMモデルに高性能のClaude sonnet 4.5を使いたかったのと、リクエスト数がFree版の制限では足りなかったので、Pro版(10 [USD/月])に加入した。毎月1600円ぐらいなので安くはないが、いつでも解約できるし、これだけ楽しめるのなら課金してみようかと思った。

meteo-detectプライベート改造版がオリジナルと変わったところ。
✅ 基本的な検出アルゴリズム(ほぼ同じ)
✅ 画像処理関数(完全一致)
❌ ストリーミング機能(削除)
❌ カメラ制御機能(削除)
✨ 流星追跡システム(新規追加)
✨ マルチプロセス処理(新規追加)
✨ 高度なパラメータ調整(大幅拡張)
✨ メモリ最適化(新規追加)
流星追跡システムは、同じ時間に画面上を移動する複数の光跡があれば、その連続性を判断してグループ化し、そのれぞれをオブジェクト(クラス)で管理するもの。そして、各オブジェクトについて、その移動速度などから流星か人工物(航空機・人工衛星)かを判断するという試み。つまり人工衛星1つが画面上をゆっくり横切っているときに、2つの流星が同時に流れた場合、オブジェクトは3つ発生することになる。そのうち2つが流星と判断されて、動画の切り出し対象となればよい。ただし、そのような状況をテストできる動画がなく、現時点ではその効果がわからない。使っていきながら調整したい。
そのほか、処理を高速化するために、「検出用の画像をダウンサンプリングして小さくする」、「検出するフレームを一コマ飛ばしにする」などのオプションを付けた。
ユーザーマニュアルも自分で書く必要はなく、「マニュアルを作って」とのプロンプト指示だけで生成してくれる。自分だけしか使わないので備忘録的なもので良いのだが、結構本格的なものを作ってくれた。

テストは、流星群の極大日でも何でもない日の夜に一晩中録画し続けたデータを用いた。データの流れは以下の通り
SharpCap -> 8bit SER -> PIPP(変換) -> ULRG Ut video AVI -> AviUtl (画質調整) -> mp4 or AVI(非圧縮)
ここまでの処理は全てバッチ処理で、全ファイルを一括して行える。流星検出ソフトは、このmp4または非圧縮AVIファイルを入力とする。
出力は、mp4v( .mp4), h264( .mp4), mjpeg( .avi), xvid( .avi)から選べるようにした。最初はxvidだけで、これがいつも使っている動画編集ソフトのDavinci Resolveで読めなかったので、mp4出力を追加した。
処理時間だが、9時間分の動画(1920 x 1080, 20FPS)で、約40分で終了した(マシンはこちら)。これは8並列、検出時ダウンサイズ0.5倍、フレームスキップ2(1コマ飛ばし)の場合。ダウンサイズ時は検出感度が下がるので、オリジナルサイズで検出する場合と異なったパラメータを探らなければならない。
それからメモリは1プロセスあたり10GBを消費するので、8並列で80GB使っている。これは128GB積んでいる自分のマシンに合わせて多めに設定した。
検出した動画のサンプルは以下(YouTube)。
緑色のバウンディングボックスが点滅しているのは、検出処理を1フレーム飛ばしで行ったため。これは処理の高速化が目的。このバウンディングBOXは、オプションでON/OFF可能。
静止画切り出し↓


そして、もちろん誤検出もある。

このあたりはmeteo-detectと同じで、HoughLinesP関数に渡す 引数のthresholdやminLineLength の値で結果が大きく変わる。これらについてはプログラム実行時のオプションとして指定できるようにした。設定値については今のところ試行錯誤するしかないが、流星を見逃すよりは、多少の誤検出が発生する程度が良いと思う。
それからGPUによる高速化もSonnet 4.5に相談してみたが、効果は限定的で、マルチプロセスとの相性も良くないとのことなので、やめることにした。
このように、自分の欲しい機能を日本語で指示するだけで実装してテストまでやってくれるのは大変楽しい。今後も天体関連で自動化できそうなことは、ソフトウェア化してみたい。




コメント