← Documentation

build_notta_tta_comp_db.py(+ build_notta_tta_sigma_db.py)

DOI1.12以降の検証SQLレポート全部を支える、モデルごとの4つの データベースを構築するスクリプトです。8×8ピクセルの画像ブロック 1つにつき1行、ground truth・TTAなし復元・TTAあり復元それぞれに 対して独立にSSIMと8つのcomp_*特徴量を計算します。

入手先元々はDOI 1.12のZenodoアーカイブ(Merutan_DOI1.12.zip)に同梱、以降無改変。heatmap_tool.py・実行動画とともに、単体で無編集のままDOI 1.19.1として再公開済み
初出DOI1.12(技術基盤ページで説明しているJOIN由来のデータ不整合バグへの対策として確立)
使用範囲DOI1.12〜1.16——このスクリプトが作る4つのデータベースは、以降のレポートで無改変のまま再利用され続けており、再実行や編集は一度もされていません
状態現行版——訂正版は存在しません

このコードが初めての方へ:セクションごとの初心者向け解説はこちら →

何をするスクリプトか

ground truth・TTAなし復元・TTAあり復元の3種類が揃っている画像 それぞれについて、このスクリプトは:

  1. 3種類の画像を全て読み込み、それぞれを重なりのない8×8ピクセル のブロックに分割する。
  2. 各ブロックについてSSIMを2通り計算する——ground truth対TTA なし、ground truth対TTAあり——その際、最終的な統合スコアだけ でなく、輝度・コントラスト・構造の3つの部分項も別々に保持する。
  3. 8つのcomp_*特徴量(sharpness・edges・アーティファクト2種・ contrast・texture・entropy・noise)を、ground truthの画素・ TTAなし復元の画素・TTAあり復元の画素それぞれから独立に計算 する——1ブロックあたり合計24個の特徴量値になる。
  4. ブロック1つにつき1行、さらに画像1つにつき1行の要約を、 ローカルのデータベースファイルに書き込む。

なぜこのスクリプトがあるのか

技術基盤ページで説明している 設計変更——別々に生成した表を後からJOINするのではなく、読み込んだ 同じ画像群からSSIMとcomp_*を1回のパスで直接計算する——を、実際に 実装したものがこのスクリプトです。以前のJOINという工程は、数億行 規模のスケールで、繰り返しデータ不整合バグの発生源になって いました——詳しい経緯は同ページを参照してください。

何が生成されるか

1回の実行につき、DuckDBデータベースファイルが1つ生成されます ——指定するのはground truthフォルダ1つと、復元結果フォルダ2つ (TTAなし・TTAあり)です。複数のモデルを比較したい場合は、 モデルごとに1回ずつ実行してください。私たち自身が公開している レポートの元になっている4つのデータベース(Standard・SwinIR・ High-Fidelity・Digital-Art)も、この方法で1モデルずつ実行して 作成したものです。それぞれ2つの表を含みます:

実行方法

Python 3に加えて、numpy・pandas・ duckdb・pillow・ opencv-python-headless・scikit-image が必要です。また、同じディレクトリにheatmap_tool.py も必要です——このスクリプトが直接関数をimportして使っています。 heatmap_tool.py自体の1画像単位の可視化機能はまだ 改良中で、その作業が固まり次第、独立した技術報告書として発表 する予定です。ソースコード自体は、下記のDOI 1.19.1で本スクリプト と一緒にそのまま公開済みです。

python3 build_notta_tta_comp_db.py \
    --gt-dir /path/to/gt_images \
    --notta-dir /path/to/notta_recon \
    --tta-dir /path/to/tta_recon \
    --out std_notta_tta_comp.duckdb \
    [--workers N] [--chunk-size 20] [--limit N]

1回の実行で、1組の復元結果フォルダとground truthフォルダ1つを 比較する。複数のモデルを同じground truthと比較したい場合は、 --gt-dirを共通のまま、モデルごとに1回ずつ実行する。 --workersは並列処理する画像数を制御する(デフォルトは CPUコア数マイナス2——実行中もマシンを他の作業に使えるように するため)。--limitは新規処理する画像数の上限を 指定でき、本番実行の前に少数で動作確認したい場合に便利。

中断・再開について

いつ中断しても安全——クラッシュ、再起動、手動での停止、いずれも 問題ない。同じコマンドで再実行すると、出力先データベースの images表に既に記録済みの画像は自動的にスキップ されるため、中断した実行は最初からやり直すのでも重複行が生じる のでもなく、続きから再開する。

単体で公開済み(DOI 1.19.1)

本スクリプトとheatmap_tool.pyは、2026-09-01時点の 状態のまま——DOI 1.12からv1.16まで全ての数値を実際に生成した、 まさにそのコードとして——単体のレポートとしても公開されています。 誰でも自分自身のground truth/TTAなし復元/TTAあり復元の画像 フォルダを指定して、同じ種類のデータベースを自分のデータ・ モデルで構築できます。下の動画は実際の実行の様子 (--limit 20)を2回連続で撮影したもので、2回目が 既に処理済みの20枚を正しく検知し、次のバッチに進む様子——つまり 中断・再開が実際に機能することを示しています。

画面録画:--limit 20の実行を無編集のまま2回連続で撮影。

DOI 1.19.1では、この状態のまま無編集で公開したことに伴う制限 事項も2点明記しています:heatmap_tool.pyが生成する HTMLの説明文は日本語のみであること、そしてSIGMA_STAT 辞書がこのプロジェクト自身のデータセット・4モデル専用にハード コードされていること(SIGMA_Cは数式由来の普遍的な 値なので、この注意は不要)。自分のデータセット・モデルに適用 する場合は、これらの値をそのまま使わず、自分自身の SIGMA_STATを改めて導出してください。

DOI 1.21向けに拡張:build_notta_tta_sigma_db.py

build_notta_tta_sigma_db.pyは、DOI 1.21のために 書かれた本スクリプトの派生版です。同じheatmap_tool.py に依存し、全体のアプローチ(モデルごとに独立した、JOINなしの データベース、チャンク単位で再開可能)も同じですが、スキーマを 拡張しています:本スクリプトが保存する派生特徴量 comp_*に加えて、 σnotta/μnotta/σtta/μtta を生値として追加保存します。これはDOI 1.21の浮動小数点 「影の重複」 の訂正を、派生特徴量経由ではなく直接測定するために必要でした。

画面録画:--limit 20の実行を無編集のまま2回連続で撮影——上のDOI 1.19.1と同じ中断・再開テストを、この拡張スキーマに対して実行したもの。

構築したデータベースの使い方は DOI 1.21のSQL解説を参照してください。