Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
28万枚の写真に タグづけした話
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
T. Fujiba
June 27, 2026
Programming
58
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
28万枚の写真に タグづけした話
T. Fujiba
June 27, 2026
More Decks by T. Fujiba
See All by T. Fujiba
Geminiをパートナーに神社DXシステムを個人開発した話(いなめぐDX 開発振り返り)
fujiba
0
180
KlarSky開発譚センサーダストとのAI開発戦記
fujiba
0
89
独自ドメインからのメール送信でDMARCエラーに悩まされた話
fujiba
0
130
Hugo + Firebaseなboilerplate作ったらGWが潰れた話
fujiba
0
110
Other Decks in Programming
See All in Programming
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
250
the container ship “Apple Silicon”@WWDC26 Recap -Japan-\(region).swift
shingangan
0
130
Flow は今どうなっているか
mizdra
PRO
0
630
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
390
React本体のコードリーディング
high_g_engineer
1
150
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
790
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
250
Android CLI
fornewid
0
220
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
700
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
110
20260722_microCMSで考える、AI時代のコンテンツ運用設計
yosh1
0
430
Featured
See All Featured
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
420
Building Adaptive Systems
keathley
44
3.2k
The Pragmatic Product Professional
lauravandoore
37
7.4k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
800
Designing Experiences People Love
moore
143
24k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
350
エンジニアに許された特別な時間の終わり
watany
108
250k
Optimizing for Happiness
mojombo
378
71k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
250
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Transcript
28万枚の写真に タグづけした話 ズボラな航空写真作家が、10年放置した撮影地タグを週末で片づけるまで ふじば(T.Fujiba)— 航空写真作家 / プログラマ · 2026.06.27
自己紹介:撮るほうが本業です ふじば(T.Fujiba) 航空写真作家 「情景的飛行機写真」— 飛行機そのものより、飛行機のいる風景を撮る ホームは鳥取空港(TTJ) 撮影のほとんどがここ。ただし遠征の例外がたまに混ざる プログラマ Lightroom カタログは10年もの。気づけば
28万枚 TTJ HND NRT + 27空港 写真展: 空港散歩 V 朱から蒼 〜Airport Stroll V TOTTORI SUNSET & STARLIGHT〜 ▪東京 富士フォトギャラリー銀座 スペース2 2026/10/23(金)〜29(木) 10:30〜19:00(土日: 11:00〜17:00)、最終日は14:00まで ▪大阪 イロリムラ プチホール 2026/11/4(水)〜9(月) 12:00〜19:00(初日: 13:00〜、最終日15:00まで) 2 https://www.fujiba.net/ twitter/insta/github:@fujiba
撮影地タグ、もう何年もつけてない 01 最初はまめだった 撮影地(空港名)を毎回手入力。えらい 。ただし最初の数年だけ。 → その後ズボラが勝利 02 「基本は鳥取」の罠 9割は鳥取空港。でも遠征・出張の例外が
混ざるので「全部TTJ」では誤爆する。 → 一括処理ができない 03 手作業は無理 10年分・28万枚超。1枚1秒でも79時間。検 索できないカタログは資産じゃない。 → なんとかせねば 285,630 枚。これを「プラグインを作って」自動でタグ付けすることにした 3
作ったもの:Lightroomプラグイン + ローカル推論サーバ Lightroom Classic プラグイン Lua(SDK) 常駐デーモンとして少しずつ処理 カタログ検索で未処理だけ抽出 カスタムメタデータに書き戻し
airportCode / burstId / chunkId HTTP localhost 推論サーバ Python / FastAPI GPS判定(空港ジオフェンス辞書) YOLOv8:飛行機・猫の検出 CLIP + 線形SVM:空港の推定 SQLite 処理管理DB burst / chunk / photo の台帳 再開・再推定に使う ポイント:Lightroomを止めない。寝てる間も撮影に出てる間も、デーモンが裏で淡々と消化する設計 4
タグ付けの仕様はシンプル 被写体キーワード YOLOv8で検出するのは 「飛行機」と「猫」だけ。 検出したらLightroomのキーワードに登録。 飛行機 猫 空港には猫がいる。撮ってしまう。 だからクラスは2つ必要(伏線)。 撮影地(空港)の特定
信頼できる順に使う。上が獲れたら下は見ない。 1. GPS カメラ/スマホ連携の位置情報。最強 2. 手入力 過去の自分が付けた空港名。信用する 3. 写真から推定 CLIP特徴量 + SVM。最後の砦 優先度: GPS > 手入力 > 画像からの推定 5
28万枚に対峙する 全写真にYOLOとCLIPをかける? …常軌を逸している。 推論の回数をどう減らすかが、この話の本体。
鍵は「写真家の行動」をモデル化すること 連写は数秒の塊になる バッファが詰まるまで連写して、止める。似た写真が5秒以内に固まる。 chunk 1回の撮影は長くても20分 地方空港の折り返し撮影。降りて、撮って、上がるまで。 burst 空港間の移動は1時間以上かかる 物理的に。つまり1時間以内の撮影はぜんぶ同じ空港。 session
画像を見る前に、 撮っている 人間の動きを 見る。 ルールはこの3つだけ。機械学習ではなく、撮影者としての自己観察から出てきた数字。 7
時間で切るだけ:session ⊃ burst ⊃ chunk session 同一空港とみなす範囲 burst 最長20分 chunk
chunk chunk chunk = 5秒以内の連写塊 burst chunk chunk burst間隔 <1時間 ≥1時間 空いたら 別session session =空港が変わった可能性 時間 → 28.5万枚 → 10,267 burst / 100,366 chunk に圧縮(平均27.7枚/burst・最大442枚/burst) 8
推論は代表だけ。結果は信頼度つきで伝播させる 被写体(YOLO)はchunk代表だけ 代表1枚 YOLO実行 同じchunkの残りにはコピー 連写の中身はほぼ同じ画。だから1枚見れば十分。 YOLO実行は 62,713回(全28.5万枚の22%)で済んだ。 撮影地はグループ内で最強の情報が勝つ burst内・session内で最も信頼できる位置情報を全員に配る。
GPS 1枚でもGPS付きがあれば全員その空港 手入力 過去の自分の入力。1枚あればburstごとロック CLIP推定 どちらも無いときだけ。confidence=guess扱い 「確実な1枚」が「不確かな数百枚」を救う構図。 9
伝播の戦果:推論しなかった分が勝ち 62,713回 YOLO推論の総数(28.5万枚の22%) 32,572枚 伝播だけで空港が確定(1,399 burst・推論ゼロ ) 0回 locked burst(手入力済み)への再推論。過去の
自分を上書きしない 空港コードの確定ソース(写真ベース・285,208枚) 手入力 98,015 GPS 81,373 CLIP推定 49,026 伝播 32,572 未確定 23,117 10
機械学習の話は、ここだけ(飾りです) 写真 CLIP 特徴量 線形SVM 空港コード 教師データは手持ちの写真 — 3空港ぶん、自分のカタログから (TTJ/HND/NRT)
足りなければあとで足して再分析と割り切る 重心ベースのオープンセット判定 — どの空港でもなければ「わからない」と 言わせる 出番はGPSも手入力も無いときだけ — あくまで最後の砦 PHOTO [図/スクショ] 空港分類の混同行列 or 学習データのコンタクトシート 11
実装:人間はほぼ書いてない(まあどうでもいい) STEP 1 AntiGravity にコードを書かせる 仕様と文句は人間が言う STEP 2 Claude Code
にレビューと修正をさ せる AI同士で殴り合ってもらう STEP 3 土日 プラグインを回しっぱなし 月曜未明、28万枚完了 12
結果 285,208 処理した写真(カタログ実数 285,630 ) 10,267 burst 100,366 chunk 30空港
タグ付けされた空港 ※一部は要精査 156,823 鳥取空港(TTJ)— 全体の55% 108,426 「飛行機」が写っていた枚数 3,666 「猫」が写っていた枚数 2 飛行機と猫が同時に写っていた枚数 ※集計後に撮影してるので増えてます。 PHOTO 13 結果を見る限り、まあまあいい感じ。
残作業:ここからは運用 ログの精査 判定根拠(source / confidence)は全部SQLiteに残してある。怪しい判定を抽出して眺める。 「鳥取以外」の総点検 TTJ以外にタグ付けされた写真を確認。GPSだけで付いた行ってない空港(静岡5枚・秋田4枚など)が誤検知候補。 辞書を更新して部分再推定 空港ジオフェンス辞書・学習データを直して、該当burstだけ再推定。全部やり直さなくていい設計。 手入力(locked)は絶対に上書きしないので、何度回しても過去の仕事は壊れない。安心して再推定できる。
14
まとめ:効いたのはMLじゃない 1 ドメイン知識のモデル化が9割 「空港の移動は1時間かかる」— 撮影者として自分の行動を観察して出てきたルールが、問題サイズを1/4以下にした。 2 推論より伝播 信頼できるデータ(GPS・過去の手入力)を、信頼できる範囲(burst / session)に配る。確実な1枚が数百枚を救う。
3 MLは最後の砦で十分 CLIP+SVMの出番は他に手がないときだけ。それでも49,026枚を拾ってくれた。適材適所。 15
画像認識は、飛行機と猫で十分。 ありがとうございました — ふじば(T.Fujiba) 28万枚を見てわかったこと:僕のカタログに写っているのは、 ほぼ飛行機(108,426枚)、ときどき猫(3,666枚)。 両方同時に写っていたのは — 2枚だけ。 PHOTO
[写真]空港の猫 (ベストショットを)