はじめに
機械学習(ディープラーニング)を使うと、画像から「大きさを推定する」「重さを推定する」といった、これまで人が目で判断していた作業を自動化できます。
この記事では 画像から物体の重さを推定する=回帰(連続値の予測)タスク を題材に、
- どんな考え方でモデルを選ぶのか
- 代表的なモデルにはどんな違いがあるのか
を、初学者の視点で整理します。
私はまだ学習途中なので、学んだ内容を備忘録として残しつつ、同じようにこれから始める人が「迷いにくくなる」ことを目的に書いています。
事前に決めておくこと(ここが一番大事)
画像から推定する場合、モデル選びより先に「何をどう当てたいか」を決めるのが最重要です。ここが曖昧だと、どれだけ良いモデルを使っても精度が安定しません。
最初に整理しておくと迷いにくいポイント:
- 対象:植物?魚?家畜?(何の重さか)
- 推定単位:個体 / 区画 / 画像全体(どの範囲の重さか)
- 画像の撮り方:真上固定?斜め?距離固定?照明固定?
- スケール:定規や既知サイズのマーカーを入れられるか(※超重要)
- 正解データ(ラベル):生重 or 乾物重、測定頻度(ラベルの作り方)
- データ量:何枚くらい集められそうか
- 運用制約:推論はリアルタイム?端末(GPU/CPU/スマホ)?バッテリー?
これらが決まると、
- 必要なデータの作り方
- 適したモデルの方向性
- どこに難しさが出るか(撮影条件・個体差・水分量など)
が自然と見えてきます。
「バックボーン」とは何か
画像系AIでは、画像から特徴を取り出すための 特徴抽出部分 を
バックボーン(backbone) と呼ぶことが多いです。
ResNet、EfficientNet、ConvNeXt、Swin Transformer などは、主にこの 「特徴抽出の設計」 が違うモデルだと考えてOKです。
実際のタスクではだいたい、
- バックボーン:画像から特徴を取り出す
- ヘッド:分類・回帰・セグメンテーションなど目的に応じた出力
という構成になります。
今回の「重さ推定」は 回帰 なので、ヘッドは「数値を出す」形(例:最後を1ユニットの線形層)にします。
初心者がまず押さえる3つの視点
モデルの違いは、まず次の3軸で考えれば十分です。
- 精度(当たりやすさ):どれくらい誤差が小さいか
- 計算の軽さ(速さ):推論が速いか、GPUが必要か
- モデルサイズ(容量):メモリ使用量、ファイルサイズ、端末に載るか
※ 実際には入力解像度、実装、バッチサイズ、最適化などでも変わります。
CNN系とTransformer系(ざっくり)
モデルは大きく2系統に分かれます。
A. CNN系(従来からの主流)
- 局所(近所のパターン)を積み上げて理解する設計が多い
- 速くて扱いやすいものが多い
- 小〜中規模データでも比較的安定しやすい傾向
B. Transformer系(近年強い選択肢)
- 画像全体の関係性を扱う設計が得意(設計により局所性も入れる)
- 条件が整うと高精度になりやすい一方で、計算や設定に左右されやすいこともある
- 検出・セグメンテーションなどでも強いモデルが多い(例:Swin)
重要:CNNも層を重ねれば全体情報を持てますし、Transformerも局所性を取り入れています。
「どっちが必ず上」ではなく、データ量・計算資源・運用条件で“コスパが変わる” と捉えるのが安全です。
代表的なバックボーンの例(押さえる範囲を絞って紹介)
「全部覚える」より、まずは よく出る代表 を掴むのが近道です。
ResNet-18 / 50 / 101(基本の教科書)
- 何者?:標準的で最も参照されるCNN
-
違い:数字が大きいほど精度寄りだが重くなる
- 18:軽量・高速
- 50:バランス型(定番)
- 101:精度寄り・重め
EfficientNet-B0 / B4(計算の節約が上手)
- 何者?:少ない計算で精度を上げる設計が特徴
-
違い
- B0:非常にコスパが良い(軽いのに強い)
- B4:より高精度だが計算量増
MobileNetV3-Large(スマホ・エッジ向け)
- 何者?:モバイル/CPUで回す前提の軽量モデル
- 特徴:非常に軽く高速(Largeは精度寄り)
- 使いどころ:アプリ・組み込み用途
ConvNeXt-Tiny(“今どき設計”のCNN)
- 何者?:CNNを最新設計思想でアップデート
- 特徴:CNNの中ではかなり強い
- 使いどころ:迷ったら候補に入れてよい
ViT-B/16(Vision Transformer)
- 何者?:画像をパッチに分けてTransformerで処理
- 特徴:データ量・事前学習・設定に性能が依存しやすい
- 使いどころ:大規模学習が可能、または良い事前学習を活かせるとき
Swin Transformer(Swin-Tなど)
- 何者?:Transformerを現実的な計算量に抑えた設計(階層+ウィンドウ)
- 特徴:実用性が高く、検出・セグメンテーションにも強い
- 使いどころ:データと計算がある程度あり、精度も狙いたいとき
補足:DenseNet / Inception 系も重要ですが、初学者の最初の選択肢としては
「ResNet / EfficientNet / MobileNet / ConvNeXt / Swin」あたりを押さえると迷いにくいです。
推定の代表的アプローチ3つ
ここが「モデルより効く」ことも多いです。
① 画像 → 直接「重さ」を回帰(最短で試せる)
分類モデルの最後を 数値出力 に変更して学習します。
- メリット:最もシンプル、すぐ試せる
-
注意点
- 背景・照明・カメラ距離などの 撮影条件に引っ張られやすい
- 「見た目が似てるけど重さが違う」ケースに弱くなりがち(厚み・密度・水分量)
② 対象領域を切り出してから推定(環境変化に強くしやすい)
セグメンテーションで対象部分を抽出し、面積・被覆率などを使って推定します。
-
メリット
- 背景変化に強くなりやすい
- 「対象だけ」を見せられるので学習が安定しやすいことがある
-
注意点
- マスク作成コストが高い(ただし効果も大きい)
- 面積だけでは厚みが表現できず限界が出ることもある
③ 深度・体積情報を使う(物理的に納得しやすい)
ステレオ、LiDAR、SfM、ToFカメラなどで3D情報を取得して推定します。
- メリット:体積が取れるので「重さ」に近づきやすい
- 注意点:撮影システムのハードルが高い(機材・校正・運用)
データ設計が成功のカギ(超重要)
画像→重さ推定では、モデルより データ設計の影響が大きいことが多いです。
1) 正解(重さ)の定義を固定する
- 生重 / 乾物重(混ぜない)
- 個体 / 区画 / 画像全体(対象範囲を固定)
- 測定タイミング(撮影と計量のズレをなくす)
2) スケールを入れる(非常に重要)
- 定規、既知サイズマーカー
- 撮影距離・カメラ位置・焦点距離を固定
スケール導入で減る誤差
- 距離(撮影倍率)の違いによる見かけのサイズ変化
- 個体サイズ差の解釈ミス
ただし残りやすいもの
- 照明、影、反射、濡れ具合、背景の色・模様
3) 背景を単純にする or 切り出す
- 背景が変わると精度が落ちやすい
- 可能なら「背景は一定」か「マスクで切り出す」
4) データ分割に注意(リーク防止)
同一個体・同一区画が train/test に混ざると、実力より良く見えます。
- 個体単位・区画単位・日付単位で分割
- 似た連番画像はまとめて同じ側へ
評価指標(まずはこれだけでOK)
「当たる」を数値化しないと改善できません。
- MAE(平均絶対誤差):誤差の平均(単位がそのまま)
- MAPE(平均絶対%誤差):%で分かりやすい(0付近の値があると注意)
- (余力があれば)R²:当てはまりの指標
最初のおすすめ(迷ったらこの順)
まず動かして基準を作る(最重要)
-
超シンプルなベースライン
- 例:面積(簡易マスクや閾値でも可)→ 線形回帰
-
DLベースライン
- ResNet-50 回帰 か EfficientNet-B0 回帰
- そこから「データ設計」や「②/③」へ拡張
ベースラインがあると、「本当にDLが効いてるか」「データ設計が効いてるか」が判断できます。
条件別・おすすめ
-
とにかくまず動かしたい
→ ResNet-50 / EfficientNet-B0 -
軽量運用・エッジ端末(CPU/スマホ)
→ MobileNetV3 / EfficientNet-B0 /(さらに軽さ重視なら)Shuffle系 -
背景や環境が変わりやすい
→ ② セグメンテーション併用 + ResNet / ConvNeXt -
データ量・計算資源が十分ある(精度も狙う)
→ Swin Transformer / ViT(+良い事前学習の活用)
まとめ
- モデル選びより 「何をどう測るか」 が重要
- 画像から重さ推定は 2D→3D の壁があり、スケール・撮影固定・切り出し が効く
- 最初は ベースライン(簡易)→ ResNet/EfficientNet回帰 で基準を作る
- その後、環境変化が大きいなら セグメンテーション、物理的に寄せるなら 深度/3D を検討する