
54/54 という報告
作業の終盤に「二つのキューブとも54/54」という結果が出ました。ところが、新しく撮った写真はずっと間違っていました。
コードを見ると理由がありました。テストに使った写真と縦横のサイズが同じなら、保存しておいた正解の展開図をそのまま入れる経路があったのです。正規品は最後にこの経路を外しましたが、韓国発売品の写真2組にはまだ残っています。写真のピクセルを読まずに得た54/54でした。
測り直した認識率
プロジェクトはそのままにして、コピーでこの経路だけを切れるように変えて測り直しました。正解は私が自分で合わせて教えた展開図で、動かない中央の6マスを除いて48マスで数えます。
- 韓国発売品 A(最初に合わせた写真): 42/48(88%)
- 韓国発売品 B(新しくシャッフルした写真): 17/48(35%)
- 正規品 スマートフォンの写真: 28/48(58%)
- 正規品 きれいな高解像度の写真: 32/48(67%)
写真ごとに、明るさ±15%、色温度、±4°の回転、0.8倍・1.25倍の大きさ、JPEG 圧縮、余白の追加、写真の順番の入れ替えまで12通りに変えて入れました。4°回しただけで、韓国発売品 A は34マス、B は8マスに落ちます。正解が分かっている写真に合わせた基準値は、ほかの写真では通用しないということです。最初に合わせた写真だけが高く、同じキューブを新しくシャッフルした写真は35%です。正規品は60%前後です。
48回動かした結果のうち、ルールの検査を通過した展開図は一つもありませんでした。今は写真を読み取った後、人が間違ったマスを自分で直さないと解き方に進めません。
間違ったマスの種類

- 面を回せば合うマス: 面は正しく見つけたのに、90°や180°回して貼り付けた場合です。正規品と韓国発売品 B で8マスずつあります。
- 色が間違ったマス: 面を回しても合わないマスです。正規品は緑↔青、オレンジ↔赤、黄↔白をよく取り違え、韓国発売品は白とオレンジを赤と読むことが多くありました。
テストの正解も間違っていました

正規品のテストコードに入れておいた正解は、私が直接教えた正解と48マス中26マスが違っていました。どちらもルールの検査を通過し、どちらも解けます。しかし写真のキューブは少しだけシャッフルした状態なので、9手で解けるほうが実物に合っています。
ルールの検査は「組み立てられるキューブか」しか見ません。写真と同じかどうかは分かりません。AIがルールと解き方だけを合わせて正解を決め直した結果で、この正解で採点すると同じ写真が42%になります。
解き方は十分か
Kociemba はルールさえ合っていれば、いつも22手以内で解きます。認識さえ合っていれば、解き方は今のままで十分です。ただし学習したモデルではなく探索アルゴリズムなので、解法は人が覚える段階とは違います。段階ごとの人の解き方を見せようとした層別ソルバーは10%しか解けません。私が8段階目でつまずいたように、学ぶための用途なら、この部分も手を入れる必要があります。
認識率を上げるには
次に試すことです。
- 斜めの写真2枚の代わりに、カメラの画面に 3×3 のガイド線を出し、一面ずつ正面から6回撮ります。面の向きのエラーと遠近の問題がなくなります。多くのキューブ解法アプリがこの方式を使っています。
- 固定の基準値の代わりに、そのキューブの中央6マスの色を基準に、最も近い色を選びます。キューブや照明が変われば、基準も一緒に変わります。
- マスごとに1位・2位の色を残しておき、ルールの検査と解き方を通過する組み合わせを選びます。
- 正解が分かっている写真は今4組しかありません。二つのキューブで照明と角度を変えて数十組を集め、合わせたことのない写真で点数を出します。
配布
アプリストアを調べてみると、似たキューブのアプリが20個以上ありました。少し力が抜けましたが、始めたからには最後までやり遂げようと思います。
販売が目的ではないので、サイトに apk やアプリのファイルを置く方法も考えました。しかし誰かがファイルをすり替えたら、受け取った人全員が被害を受けます。ストアは開発者の署名と審査を経るので、配布はストアで行うつもりです。
ストアに出す前に整理することがあります。
- 今使っている Kociemba の C 実装(muodov/kociemba)は GPL-2.0 です。アプリストアの規約と GPL が合わないという解釈があるので、自分で実装するか、ライセンスの異なる実装に替えるほうが安全です。
- 今は Mac 用の Qt デスクトップアプリです。スマートフォンのカメラで直接撮るには、iOS・Android の画面を新しく作る必要があります。
この段階の実際のコード
写真のサイズが同じなら保存した正解を入れる部分です。韓国発売品の写真2組に残っています。
src/CubePhotoReconstructor.cpp
auto dimsHitOrig = [&](int w, int h) {
return (origW1 == w && origH1 == h) || (origW2 == w && origH2 == h);
};
// ...
// 알려진 스크램블 조기 골드 (정발품은 사진·규칙·Kociemba로 재검증한 전개도)
if (dimsHitOrig(623, 599) || dimsHitOrig(706, 744)) {
static const char *kNew[6] = {
"GOYYOOBOR", "OBBRRWWBG", "GGBWYGYOR", "ORWYWBBBG", "RYWGGGYWO", "ORWWBYYRR",
};
applyGoldChars(&result.faces, kNew);
result.facesFound = 6;
result.complete = true;
return result;
}特定のスクランブルの形が出ると点数を加えるコードもあります。テスト写真1組に合わせた値です。
src/CubePhotoReconstructor.cpp
} else if (!isTop) {
// 형광 골드 하단 스크램블 패턴 가산
const int a = cells[6], b = cells[7], c = cells[8];
if (wantCenter == 4) { // 초록: BOW
if (a == 5 && b == 0 && c == 3)
sc += 140;
else if (a == 5 && b == 0)
sc += 50;次の記事は「4. 全ソースコードと使用したツール」です。
COMMENTS · CHAPTER 03
54/54 の正体と実際の認識率、そして配布 コメント 0
まだコメントはありません。気になった点や補足があれば残してください。
コメントを登録するには、Googleで始めてニックネームとメールアドレスを登録してください。
Googleで始める