「ファインチューニング(FT)はテキストだけのものではありません」——妖怪ハザードマップ(LLM・QLoRA)に続く2本目の自前FT実例は、画像認識(ビジョン)です。丸太の断面写真から本数を検出する自作YOLOを、公開データと自宅GPUだけで作り、完全ローカル(ブラウザ内・データ送信なし)で動かしました。テキストもビジョンも「振る舞いを自作FTで固める」——最適化の順序の原則を、別モダリティで示すケースです。
このモデルの学習画像は公開データセット(後述・CC BY 4.0)で、自前撮影ではありません。目的は「個人が公開データ+自宅GPUで、完全ローカルの検出AIをどこまで作れるか」の実証です。
何を作ったか
丸太を積んだ「椪(はい)」の木口(断面)写真をアップロードすると、丸太を1本ずつ検出して本数を数え、基準丸太で校正して直径を推定、JAS規格の式で材積を計算します。ライブで触れるデモはエッジAIラボ(丸太材積計測AIデモ)にあります。肝はすべての推論がブラウザ内で完結し、画像が外部に送信されないこと。現場(山間部)の通信事情でも、プライバシー要件でも、ローカル完結が効きます。
なぜ「自作FT」なのか
「わざわざ学習しなくても、何でも検出できる汎用モデル(ゼロショット)でいいのでは?」——実測すると、そうはなりませんでした。同じ3枚のサンプルで、汎用のOWLv2(ゼロショット検出)と自作YOLOを比べた結果です。
| モデル | 3サンプルの検出本数 | 1枚あたり推論時間(ブラウザ・WASM) |
|---|---|---|
| OWLv2(ゼロショット・汎用) | 5 / 2 / 0 本 | 約9〜27秒 |
| 自作YOLO(丸太特化) | 26 / 23 / 37 本 | 約1〜2秒 |
汎用ゼロショットは密に積まれた丸太をほとんど拾えず、しかも桁違いに遅い。小さな特化モデルが、巨大な汎用モデルをオンデバイスで上回る——ローカルAIの要点がそのまま出ました(当サイトでの実測)。
学習レシピ
| 項目 | 値 |
|---|---|
| ベースモデル | YOLOv8s + P2ヘッド(COCO学習の yolov8s.pt から転移・Ultralytics・AGPL-3.0) |
| クラス | 1クラス(wood-log) |
| 学習データ | Roboflow「Wood Log Counting」(作者 nanomatrix・CC BY 4.0)を整備して使用 |
| データ構成(出荷v8) | ポリゴン注釈 105枚 + 単体構図クロップ 303枚 + 端切れ構図クロップ 262枚 |
| 学習設定 | 300エポック・入力960px・batch8・patience100・mosaic無効・seed固定 |
| 評価用 | 学習に使っていない 69枚(丸太8,304本ぶんの中心点注釈)でホールドアウト評価 |
P2ヘッド(小さな物体用の検出ヘッド)を足したのは、検出漏れの主体が「遠景の小さな丸太」だったためです。手元で学習できそうかは動くか診断と自宅GPUの選び方を参照してください。
効いたこと:本数recall 0.42 → 0.95
このモデルは一発でできたわけではありません。初期版(v5)から出荷版(v8)まで、本数の検出漏れ(recall)を 0.42 から 0.95 へ、約2.3倍に積み上げました。効いたのは、モデルを大きくすることではなく、次の3つです。
- P2ヘッドの追加:遠景の小径木の取りこぼしを減らす。
- データのクリーニング:自動変換したラベルの多く(検証側は9割超)が不正確なボックスだと発見し、除去・作り直した。
- クロップ拡張:単体構図303枚・端切れ構図262枚を合成し、密な積み方や画面端の丸太に強くした。
「精度が出ない」を、個人が原因を切り分けて一つずつ潰した過程そのものが、このケースの中身です。
評価:本数recall 0.95(ホールドアウト69枚)
学習に使っていない69枚(丸太8,304本)で、出荷版v8を評価しました(検出信頼度の閾値conf0.5)。
| 指標 | v5(初期) | v8(出荷) |
|---|---|---|
| 本数 recall(取りこぼしの少なさ) | 0.42 | 0.95 |
| 本数 precision(誤検出の少なさ) | 0.77 | 0.84 |
| ボックスF1(IoU≥0.5・位置の正確さ) | 0.44 | 0.97 |
数値の測り方:本数のrecall/precisionは学習に使っていない69枚で測ったクリーンな値です。一方ボックスF1は、モデル選定に使った検証画像由来のためやや楽観的なバイアスがあります(開発側でも自己申告)。また材積の誤差(%)は未計測です——公開データセットに直径・材積の正解値が無く、本数と位置の検出精度までしか検証していません。構造化された検出がモデルでどう変わるかはfunction callingの実測の考え方とも通じます。
完全ローカル配信(ブラウザWASM)
学習した重み(PyTorch .pt・約22MB)をONNXに変換し、8bit量子化(約12MB)して配信。ブラウザ側は onnxruntime-web(WASM実行)で、960px入力で推論します。サーバーGPUもAPIキーも不要で、ページを開けばその場で・データを送らずに動きます。速度は前述のとおり1枚あたり約1〜2秒で、機種や画像によって前後します。
JAS材積の計算
材積は、日本の丸太取引で標準の末口二乗法で計算します。末口(細いほうの木口)の直径を2cm単位で丸め(括約)、材積(m³) = 末口直径(m)² × 材長(m)で求めます(材長6m以上はテーパー補正が入ります)。検出した各丸太の直径から本数ぶんを合算して、椪全体の材積を出す流れです。
実装メモ:材積式はJASの慣行である末口二乗法 V = D² × L(π/4を掛けない外接正方形近似)に統一しています。このツールの主眼は「本数と直径の検出」で、材積はJAS末口二乗法の定義どおりに算出します。
エッジ実機での実行(Jetson・Pi5 実測)
完全ローカルの検出は、手のひらサイズのエッジ機でも動きます。当サイトのJetsonとRaspberry Pi 5で、この自作YOLOを実測しました。
| 機材 | 実行 | 速度 | 消費電力 | 実測条件 |
|---|---|---|---|---|
| Jetson Orin Nano Super | TensorRT FP16(GPU) | 約46 FPS(約22ms/枚) | 約22.2W(アイドル約7.9W) | 960px・MAXN_SUPER・自前実測 |
| Raspberry Pi 5(CPU) | onnxruntime(CPU実行) | 約0.75 FPS(約1.3秒/枚) | 約6.0W(アイドル約2.6W) | 960px・4スレッド・自前実測 |
- Jetson Orin Nano Super(TensorRT FP16・GPU)46.5
- Raspberry Pi 5(onnxruntime・CPU)0.75
同じモデルでも、GPU(Jetson)はCPU(Pi5)の約60倍。Pi5のバーがほぼ見えないほど差が開く。だから推奨構成では推論をAIカメラ(IMX500)側に任せる。消費電力はJetson 約22.2W / Pi5 約6.0W。
同じモデルでも、動かす先で約60倍変わりました。Jetsonの専用エンジン(TensorRT・GPU)なら約22ミリ秒/枚(46 FPS)でリアルタイム域、一方Pi5のCPUで直接回すと約1.3秒/枚(0.75 FPS)とブラウザ(WASM・CPU)並みで、常時検出には向きません。いずれも当サイトでの実測です(Jetsonのエンジンビルドは初回のみ約11分)。
推奨構成の目安(価格は変動します):
- 安定構成:NVIDIA Jetson Orin Nano + AIカメラ(Sony IMX500)=約6.8万円〜
- 最安構成:Raspberry Pi 5 + AIカメラ=約3.5万円〜
Pi5構成は「AIカメラ側で推論」が前提:上のPi5の数値はCPU直実行のベースラインです。推奨するPi5 + AIカメラ(Sony IMX500)はカメラのチップ側でAI推論を実行し、Pi本体のCPUはほぼ使いません。つまり「Pi5のCPUが遅いからこそ、推論はカメラ側に任せる」という設計です(IMX500へ載せるにはSonyのモデル変換が別途必要で、今回はCPU実行値のみ)。計測手順は計測プロトコルに、機材の実測傾向は検証DBにあります。
市販ツールとの棲み分け
丸太計測のAIは、すでに強力な市販ツールが存在します。国産の「Log-co(ログコ)」は約20万本の丸太画像で学習、「AI丸太検知くん」は本数精度ほぼ100%・直径精度95%以上を掲げ、ほかにiFovea Proやジツタの検収システムなどもあります。いずれも各社が公表する数値です。
だから本記事は「最強の丸太計測ツール」を主張するものではありません。製品としての精度なら、20万本規模で学習された市販品が上でしょう。ここで示したのは「個人が公開データ(数百枚規模)+自宅GPUで、完全ローカルの検出AIをどこまで作れるか」という実証と、その過程で得た再現可能な学びです。この正直な棲み分けこそが、当サイトの立ち位置です。
学び
- ゼロショットより特化FT:巨大な汎用モデルより、小さな特化モデルの方がオンデバイスで速く・正確なことがある。
- 効いたのはデータ整備:モデルの巨大化ではなく、ラベルのクリーニングとP2ヘッド、クロップ拡張で recall 0.42→0.95。
- 完全ローカルの価値:画像を送らず、通信の無い現場でも動く。プライバシーと可用性が要る領域に効く。
- 公開データでも届く:自前撮影がなくても、数百枚規模の公開データで本数recall95%に到達できた。
テキスト側の実例=妖怪ハザードマップQLoRAと対で読むと、「個人でテキストもビジョンも自作FTできる」ことが具体的に見えるはずです。
現場で使いたい・作りたい方へ
林業のデジタル化(スマート林業)は林野庁も推進する成長領域です。現場に特化した検出モデルを一緒に作りたい——そうしたご相談はLink Fieldへ。まず触って確かめたい方はエッジAIラボのデモをどうぞ。
まだ検証余地があるもの
- 材積の絶対精度:式は末口二乗法(V = D² × L)に確定していますが、直径・材積の正解値での検証は未実施です(材積誤差%は未計測)。
- エッジ実機の速度・電力:Jetson Orin Nano Super=約46 FPS/約22.2W(FP16 TensorRT)、Raspberry Pi 5(CPU)=約0.75 FPS/約6.0W(onnxruntime)=いずれも自前実測済。推奨のPi5+AIカメラのオンセンサー推論はIMX500へのモデル変換が要で、その実測は別途。
- ベースモデルのライセンス:Ultralytics YOLO(YOLOv8s)はAGPL-3.0です。本記事は個人の実験・学習用途の実例であり、公開デモやサービス・受託成果物として提供する場合は、AGPLのソース開示条件、またはUltralytics Enterprise Licenseの要否を必ず確認してください(専門家への確認を推奨)。
- ボックスF1のバイアス:位置精度F1は検証画像由来で楽観的。本数recall/precisionは学習未使用のホールドアウトでクリーン。
- データのドメイン差:学習は公開データセットで、樹種・撮影条件が実運用と異なる場合、精度は変わりえます。
- 学習データ「Wood Log Counting」の作者 nanomatrix 氏に感謝します(Roboflow Universe/CC BY 4.0)。本記事では元データセットにクロップ・ラベル整備等の変更を加えて学習に使用しています。