リファレンス資料管理ソフト、ってどういうこと?
絵を描いたり3DCGを作ったりするために集めたバラバラのリファレンスを見やすくまとめるツールのことです。有名なものだとPureRefですね。
で、何故作ったの?
リファレンス管理といえば、今の主流はPureRefっぽいです(同種類の無料ソフトがあまりない)。たまにNotionとかでリファレンスをまとめるクリエーターさんもいるでしょう。
私もずっとPureRefを使っていました。PureRefは決して悪いツールではありませんが、やはり使っているうちに色々不満を感じています
例えば、
- 記憶機能がない(同じクリエーターは同種のものを描くことも多いし同じ参考画像を複数回使いたいかもしれないが、PureRefだとその画像を見つけ出してまた新しいプロジェクトのキャンバスに貼らないといけない)
- リファレンスを収集するためにはまずキャンバスが必要(別になんらかの作業をしているわけではないけど、将来使えそうな画像を自分のリファレンスライブラリに入れておきたい、という時もある)
- 3Dリファレンスがない(3Dモデルをリファレンスにしたい場合もある)
- 分類が固定されている(同じリファレンス画像群に対しても、違い分類が欲しい場合もある;例えば「生物」と「非生物」で分けたい時があれば、色で分けたい時もある)
- 拡張性がない(クリエーター系ソフトは大抵なんらかのAPIがあるがPureRefにはカスタムするためのAPIがない)
- OSSではない(やはりオープンソースのほうがいいよね ←あくまで個人の意見)
- 戻せない(昨日のキャンバス配置に戻したい、とかはできないらしい)
既存の理想的なツールがなければ、それを作っちゃいましょう、ということで開発を始めました
技術スタック
GitHub リポジトリ : https://github.com/shinonome-MiDUki/oxoria
PyPIパッケージ : https://pypi.org/project/oxoria/
(まだまだ開発中です)
プログラミング言語 : Python3.13
GUI : PySide6
ライブラリ : PySide6, faiss-cpu, torch, transformers, numpy, optimum[onnxruntime], pillow, ImageHash, psutil, setproctitle
生成AI使っているか?
→ はい、GUIプログラミングについてそんなに詳しいわけではないから(あとメソッド多すぎて覚えられない)、UIのほうは色々AIの力を借りました。バックエンドの処理はほぼ自力で書きました(AIに色々質問したりはするけど)
手伝ってもらったAIはGemini Flash 3です(無料のやつ
ライセンスは?
→ Apache 2.0ライセンスのオープンソースソフトウェアです。個人用・商用問わずご自由に使用・改変・再配布していただいて構いません)
目玉機能
まだまだ開発中ですが、主な機能はとりあえず実装できましたのに途中報告のような気持ちで投稿しています。完成したらSteamで配布する予定です
セマンティック検索
例えば「宗教」と検索しても「神社」の結果がヒットできるような仕組みです。
リファレンス画像をインポートするときにmemoという一言がつけることができ、その後memoの内容に基づいて自分のリファレンスライブラリから欲しいリファレンス画像を検索できる
スクショをリファレンスにする
ソフトを起動しなくても、「Oxoria Screen Capture Util」というバックグラウンドプログラムを許可していれば、いつでもcommand+shift+Oでスクショし、そのままスクショを自分のリファレンスライブラリにインポートできる
重複検出
画像のハッシュ値が記憶されていて、誤って同じ画像をまたライブラリにインポートしちゃっても、コピーは作られません
移植性
中央リポジトリを新しい環境にコピペするだけで元のままに使えます
Python API
UI動作と内部処理は全部Pythonの関数に対応しており、その関数を組み合わせることによっていくらでもカスタムしたり自動化したりできます
以下はこれから実装していきたい機能です
3Dオブジェクトインポート
OpenGLで.objファイルとかをリファレンスとしてインポートできるようにしたいです
バージョン管理
そもそもキャンバスの定義はjsonで保存されているから、PyGitをソフトに組み込めばキャンバスそのものに対してバージョン管理できるはずです
ウィンドウオーバーレイ
上にリファレンスソフトを開いたまま、ソフトのウィンドウ自体の透明度を下げて、真下にある別ソフトを操作できるPureRef仕組みを取り入れたいです
一部C++移行
3DとかのところはPythonでやるとやや重いかもしれませんから必要に応じてC++を採用します
問題点
transformersとtorch はとにかく重い
ソフト起動時にこれらのライブラリを読み込むようにしていますが、この二つのライブラリをインポートするだけで8秒かかってしまいます
transformersのAutoTokenizer.from_pretrainedをやめてRust製のtokenizersに移行し、optimum.onnxruntimeも別のライブラリを使って自前で実装すればだいぶ軽くなると思います
画像の同一判定が甘い
表情差分とかが「同じ画像」だと判断されてしまう場合もあります
16桁のdhashを使っていますから、32桁にしたら改善できるでしょう
Python API がバラバラすぎる
できるだけ責任を分離させたい、と思いつつ書いたあげく、機能がバラバラでちょっと使いにくいAPIになってしまいました
テストがない
ユニットテストと退行テストプログラムを書いておらず、手動でテストしていますがやはりテストプログラムが絶対必要だと思います
おわり
ソフトとしてまだまだですが、クリエーターさんにとってかなり役立つ機能が盛り込まれているかなと思います
安定に動くツールとして完成したら、ビルドしてSteamとかで配布する予定です
何卒よろしくお願いします
