0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

機械学習で画像から推定する方法:モデルの違いと選び方(ResNet〜Swinまで)

0
Posted at

はじめに

機械学習(ディープラーニング)を使うと、画像から「大きさを推定する」「重さを推定する」といった、これまで人が目で判断していた作業を自動化できます。

この記事では 画像から物体の重さを推定する=回帰(連続値の予測)タスク を題材に、

  • どんな考え方でモデルを選ぶのか
  • 代表的なモデルにはどんな違いがあるのか

を、初学者の視点で整理します。

私はまだ学習途中なので、学んだ内容を備忘録として残しつつ、同じようにこれから始める人が「迷いにくくなる」ことを目的に書いています。

事前に決めておくこと(ここが一番大事)

画像から推定する場合、モデル選びより先に「何をどう当てたいか」を決めるのが最重要です。ここが曖昧だと、どれだけ良いモデルを使っても精度が安定しません。

最初に整理しておくと迷いにくいポイント:

  • 対象:植物?魚?家畜?(何の重さか)
  • 推定単位:個体 / 区画 / 画像全体(どの範囲の重さか)
  • 画像の撮り方:真上固定?斜め?距離固定?照明固定?
  • スケール:定規や既知サイズのマーカーを入れられるか(※超重要)
  • 正解データ(ラベル):生重 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付近の値があると注意)
  • (余力があれば):当てはまりの指標

最初のおすすめ(迷ったらこの順)

まず動かして基準を作る(最重要)

  1. 超シンプルなベースライン
    • 例:面積(簡易マスクや閾値でも可)→ 線形回帰
  2. DLベースライン
    • ResNet-50 回帰EfficientNet-B0 回帰
  3. そこから「データ設計」や「②/③」へ拡張

ベースラインがあると、「本当にDLが効いてるか」「データ設計が効いてるか」が判断できます。

条件別・おすすめ

  • とにかくまず動かしたい
    → ResNet-50 / EfficientNet-B0

  • 軽量運用・エッジ端末(CPU/スマホ)
    → MobileNetV3 / EfficientNet-B0 /(さらに軽さ重視なら)Shuffle系

  • 背景や環境が変わりやすい
    → ② セグメンテーション併用 + ResNet / ConvNeXt

  • データ量・計算資源が十分ある(精度も狙う)
    → Swin Transformer / ViT(+良い事前学習の活用)

まとめ

  • モデル選びより 「何をどう測るか」 が重要
  • 画像から重さ推定は 2D→3D の壁があり、スケール・撮影固定・切り出し が効く
  • 最初は ベースライン(簡易)→ ResNet/EfficientNet回帰 で基準を作る
  • その後、環境変化が大きいなら セグメンテーション、物理的に寄せるなら 深度/3D を検討する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?