プログラミング
35mmフィルムスキャンパイプラインの自動化
Automating my 35mm film scanning pipeline (shannadige.com)
要約
筆者は、写真撮影の楽しさを維持するために、時間のかかる35mmフィルムのスキャンと編集プロセスを自動化するパイプラインを構築しました。AIモデルやカスタムスクリプトを活用することで、現像、色補正、ゴミ除去、メタデータ付与、そして最終的な画像公開までを効率化し、本来のクリエイティブな作業に集中できるようにしました。
全文翻訳
35mmフィルムスキャンパイプラインの自動化
クリエイティブなワークフローを置き換え、別のことに集中するための物語。
2026年10月2日・8分で読める
体験を見る
darkroom.shannadige.com
私は写真撮影が大好きです。レンズを通して画像を見ること、物語を構成するためにそれを整理すること、そして結果の写真を扱うことには特別な感情があります。DSLRやミラーレスカメラをいくつか試した後、父が世界中を旅してアメリカに落ち着く前に使っていたアナログSLR、Canon AE-1Pに深く恋をしました。
フィルム写真とは、シンプルですが独特です。プラスチックの帯に反射光を露光し、化学的な画像を焼き付けます。光の条件、使用するフィルムストック、レンズによって、魔法のようにユニークな構図が得られます。
長年、私のプロセスは以下のようでした。フィルムをロードして写真を撮る、現像を待つためにフィルムをラボに送る、そのフィルムを受け取る、ネガをストリップにカットする、それらをホルダーにロードする、特殊なスキャナーで各フレームのネガをキャプチャする、darktableで全てのファイルを開く、手動で反転する、トピック編集を行う、そしてエクスポートされた画像をどこに保存または共有するかを決定する。
最初はこれは私にとってエキサイティングなプロセスでした。しかし、ロール数が増えるにつれて、1ロールあたり36枚の写真を全て処理する労力も増えました。
平均して、1ロール(36枚の写真)を完全にスキャンして編集を完了するには約4時間かかっていました。最終的な画像にほこりや傷をつけないように、フィルムの取り扱いには細心の注意が必要です。正直に言うと、このプロセスはすぐに私を疲れさせました。写真を撮る時間よりも、画像を処理する時間の方が長くなっていました。そこで、時間を短縮する方法、あるいはCEOたちが言うように、私の個人的なデジタルラボの「オペレーションを合理化」する方法を探し始めました。
Claudeに破壊的なハードウェア機能を与える
私の最初の仮説は、完全に自分自身をループから外すことができるかどうかでした。ClaudeにSANE(オープンソーススキャナードライバスタック)経由でスキャナードライブさせ、スキャン、カラー変換、編集をエンドツーエンドで処理させることです。
最初に行ったスキャンで、ClaudeはSANEをX/Yスキャンベッドの向きを反転させて使用し、スキャナ内部のギア機構を壊しかけました。そのため、200ドルを節約するためにスキャナに緊急手術を行う必要があり、時間を無駄にしてしまいました。
チャット:真っ白なスキャン 2026年9月20日 Shan 午後4:54
間違いなくフィルムは入っています。おそらくスキャン設定が原因かもしれません。
Claude 午後4:56
スキャンが白くなる理由を追跡していましたが、設定が原因というあなたの推測は除外できます。
…代わりに、856行の全てが同一です。ランプの不均一な照明による滑らかな垂直バンドで、上下の変動はなく、画像の詳細もありません。
…つまり、センサーはスキャン全体で同じ遮られない光の線を見ていたということです。
Shan 午後5:01
VueScanでも試しましたが、センサーかキャリッジが動いていません。何か間違ったことをしたに違いありません。
Shan 午後5:04
明らかに状態が悪いです。動いていると知らせるまでスキャナを確認してもらえますか。先ほどカチカチという音が聞こえたので、逆方向に動いていたのかもしれません。
Claude 午後5:05
カチカチという音の原因を見つけました。それは私のスキャンから来ていました。
…各スキャンが終了すると、genesysバックエンドはブラインドリバースムーブでキャリッジを戻します。900dpiで7010ステップ、3600dpiではさらに多くなります。スキャン中にキャリッジが前進したと仮定しています。
…そのため、各スキャンは、既に後方に駐車されていたキャリッジをエンドストップに押し込むモーターによって終了しました。それがあなたが聞いたカチカチという音で、方向の読み取りは正しかったです。7回スキャンを実行したので、7回発生しました。
手術。押したくないロッドとギアを元の場所に戻す作業。
私はすでにうまく機能していたものを使って作業することにしました。VueScanは私が以前から使用していたソフトウェアです。私のスキャナとの互換性が最も高かったため、そして物理的なロードとスキャン操作を自動化するロボットアームがなかったため、自分でこれを使用し、これの直後から引き継げるソリューションを見つけることにしました。
スタジオ
失敗からの学びは、幸いにも私の思考プロセスを転換させました。私はこれまで通りVueScanで作業するので、スキャンされた画像の処理を自動化する方法が必要でした。少数の個別のテストで画像データに対してテストを行った後、それらを組み合わせて役立つツールの完全なスイートが機能しました。
ネガの変換
ネガをポジに変換するのは、ほとんどプレーンなコードです。反転は短いNumPyルーチンで、フィルムの濃度で動作し、ロール全体の色を測定してから、各フレームをそのネガの制限内で調整します。そのため、36枚のフレームは1つのロール全体として一貫して見え、夕焼けが劇的にカラー補正されることはありません。これは、手動で行っていても苦労していたことでした。私のエージェントは、ロールの空の先頭スロットを、残りのフレームに対するカラー補正の重み付けの基準として使用するのが良いと判断しました。他のものを構築する前に、古いロールでゴー・ノー・ゴー・テストとして実行しました。
チャット:変換テスト 2026年9月21日 Shan 午前10:35
フィルム/valentines2026で変換テストを開始してください。
Claude 午前10:40
変換テストは28フレーム中29フレームで合格しました。カスタム変換は構築するのに十分うまく機能しており、それを行うためにdarktableは必要ありません。
…私のものはより明るく、よりニュートラルですが、あなたのエクスポートはティールとダークに傾いています(ホテルデルコロナドの空、ビーチのポートレート、庭園)。それは正確さと同じくらい好みなので、判断してください。
Shan 午前10:40
あなたの方向性が気に入りました。ゴミ検出テストを実行してください。
ネガサンプル対変換済みポジ(これらの傷跡はフィルムストックの特徴です)
ゴミ除去と編集
プレーンなコードが尽きるところでモデルが登場します。ゴミはネガの画像分析によって検出され、除去のためにマークされます。これは言うほど簡単ではありません。ビーチのフレームでは、最初の検出器が約2,000の水面の太陽のきらめきをゴミとしてフラグ付けしました。修正したのは、コンテキストを付与し、周囲が滑らかな場合にのみ作用することでした。検出されたスポットはLaMa(インペインティングモデル)で埋められ、近くのフィルムスポットから詳細がコピーされるため、パッチがぼやけて見えません。フォトショップの修復ツールのようなものです。
全ての領域を埋める必要があるわけではありません。粒状性を考慮して各画像の光と色のプロパティを個別に調整する必要があったため、カスタムしきい値が設定されており、個別にまたはバッチでレビューするために粒状のスポットを保持できます。露出、コントラスト、色温度などのコントロールを手の届くところに埋め込みました。
フレームレビュー。緑色の円は自動的にゴミ除去されたもので、琥珀色の円はレビューのために保持されています。
メタデータ
アナログフィルムのデータをインデックス化するのは時間がかかることがあります。特に自分で別々のツールを使っている場合はそうです。これは「うーん、なぜやらないの?」という問題でした。テクノロジーを使っているので、後で検索しやすいように写真を識別するために拡張できるからです。
そのため、スキャンが入るとQwen3-VLがOllamaでローカルで実行され、完成した各フレームを見て約5秒でタグを作成します。これにカメラ、レンズ、日付、フィルムストックのデータが組み合わさることで、検索しやすい包括的なライブラリが得られます。
Qwen3-VLによって3秒で作成されたタグ。フレームを選択したら修正します。
私の役割は今、私が心から楽しめる部分、つまり撮影した結果を見て、さらに撮影するインスピレーションを見つけることです。
ギャラリー
パイプラインを通して数ロール処理した後、次の疑問はどこに保存するかでした。
通常、それらは私の4TB HDDに保存されます。これは、マシンに接続されたまま永遠に回転するように設定されています。しかし、自分用のエンタープライズソフトウェアを構築する熱狂から離れて、Web経由で共有する方法を探求したいと思いました。
公開ワークフロー
Cloudflareアカウントを持っており、個人的なサイトのCDNコンテンツへの訪問者から時折アクティビティがあります。無料プランを最大限に活用するのに、自分のR2バケットに全ての画像をアップロードする以上の方法があるでしょうか?そこで、スタジオを拡張して公開できるようにしました。
ロールの公開。選択されたフレームは、表示された順序でR2にアップロードされ、タグのみが含まれます。
ロールごとの写真の展示
サムネイルのグリッド