概要
リアルの環境でジグソーパズルをやるのが趣味なのですが、2,000ピースの世界の風景などをやるのが楽しいです
現在進めているのはウユニ塩湖を進めているのですが、みなさんお分かりかと思いますが湖の青や雲の白が全く判別つかなくて全く進まない状態となっております
ここでピースの形状を数値化して値が似ている物を君合わせていくといずれパズルが出来上がっていくのではという算段に行きつきました(そんなことしても本来の楽しむという部分は全く満たせないと思いますが)
ということでいきなり2,000ピースはかなり無理があると思うので、少ないピースから検証していって精度の向上や実際に2,000ピースを解決できるか試していければと思います
本題
今回検証用に使ったのは以下の画像になります
4 x 6 の形状のパズルとなっています
人間的な思考でいくと角の四隅であったり、辺を先に埋めていくといったところ完成までの第一歩となるかと思います
初手はAIに以下のように伝えました
パズルに関する定理や数学的知識、形状の計算式などわからないところがありましたのでざっくりとした内容にしております
そして、ゆくゆくは現実のジグソーパズルの写真から解き方を導く予定があると伝えています
また、Pythonとuvを使用するように最後に伝えております
@test.png
を解析してパズルを完成させる、もしくは解法の補助を行うプログラムを作りたいと考えています。まずはそれぞれのピースを認識してID振り分けを行うとこ
ろや形状を数値化し、各ピースの情報として保持できるようにしたいです。最終的には限りなく正解に近い値をトップ3ほど抽出し、重ねるとその候補のどれ
かが正解のピースであったということを実現したいです。現在は正確な画像ですが、将来的には現実世界に存在するピースの写真からでも解読できるようにし
たいです。使用する言語はPythonでパッケージ管理にはuvを使用してください
結果としては以下のような形で不完全ではありますが、ほとんど正解に近い形までは割り出すことに成功しました
現時点でプログラムが導き出した正解は以下のようになっております
AIが作成した計画書から抜粋すると以下のような計画でプログラムを作成してくれました
- エッジ抽出戦略: ジグソーパズルのピースは4つのコーナー(角)によって定義されます。外側の輪郭(コントゥア)の曲率解析を用いて、これらのコーナーを自動検出します。これにより、各ピースは4つのエッジ(上、右、下、左)に分割されます。
- 形状の数値化(特徴量抽出):各エッジについて、2つのコーナー点を結ぶ線分(弦)を、長さ100ピクセルの標準的な水平線に回転・縮小(拡大)することで形状を正規化します。その後、曲線は1次元信号として表現されます。具体的には、水平軸に沿って均等に配置された $N$ 個の点における、弦からの垂直距離です。これにより、特徴ベクトルはスケーリング(拡大縮小)と回転に対して不変(インバリアント)となり、実際の写真解析に対応できるようになります。
- マッチングアルゴリズム:一対のマッチングするエッジ(例:1つのタブ[凸]と1つのブランク[凹])は、相補的な形状を持つ必要があります。ブランクの曲線を $f_{\text{blank}}(x)$、タブの曲線を $f_{\text{tab}}(x)$ と表すと、マッチングする向きにおいて、これらは $f_{\text{blank}}(x) \approx -f_{\text{tab}}(1 - x)$ を満たす必要があります。これら正規化された1次元信号の平均二乗誤差(MSE)または動的時間伸縮法(DTW)を用いて、マッチングの品質を測定します。
- 可視化: 本環境はターミナル/スクリプト環境であるため、検証用のプロット(セグメンテーションされたピース、コーナー検出プロット、上位3つのマッチングオーバーレイプロットなど)を可視化し、PNG画像として保存・出力します。
やりたかったパズルの形状を数値化するところや形状マッチングするところについて考えてやってくれています
途中でクウォーター制限がかかってしまったため、やりきれなかったのでここまでとなってしまいますがもうすこし修正を繰り返すことで正確に解くことができるようになるのではと踏んでいます
おわりに
途中までは進みが良かったのですが利用制限がかかってからは進めなくなり、AI駆動開発はこうなるとストップしてしまうということに初めてつまづきました
やる気はあるのに進められないという状況が非常にもどかしいので、個人契約するのは正直全然アリかと考えております
また、進展あり次第記事にしたいと思います

