見出し画像

ML_Kitで悩んで、結局、機械学習モデルを使わないことにする

jetracerを作って遊んでいたら、気が付くと自分で運転するのが楽しくなってラジコンカー沼にはまってしまいました。😅

家の近くのラジコンサーキットの上級コースにはラップタイム計測装置が付いているのですが、初心者コースとオフロードコースではタイム計測ができなかったので、flutterでラジコンカー用のラップタイム計測アプリを作ってみました。携帯の内蔵カメラを使って、カメラを横切ったらラップタイム計測して音声読み上げる、ごくごく簡単なものです。

当初はお気楽にgoogle_ml_kitのobject ditectionを使って実装してみたのですが、ゆっくりラジコンカーを走らせる分には問題ないのですが、ガンガン速度を上げていくと処理落ちが発生して物体認識が追い付かない感じになってしまいました。

しかたないのでカスタムモデルを学習させてみたり、いろいろ悩んだあげく、結局、フレームの移動平均との差分を計算するだけの超単純アルゴリズムに落ち着いてしまいました…。最近なんでも、機械学習モデルを使いがちですが、シンプルイズベストですね。あはは。

Before:

import 'package:google_ml_kit/google_ml_kit.dart';

class ObjectDetectorService {
  final objectDetector = GoogleMlKit.vision.objectDetecto(
          options: ObjectDetectorOptions(
           mode: DetectionMode.stream,
           classifyObjects: false,
           multipleObjects: false));

(中略)

return await objectDetector.processImage(inputImage);
}

これでイケると思ったんだけども、古い端末には荷が重かった…。

After:

if (frameBuffer.length >= bufferSize) {
      final double diff = calculateFrameDifference(frameBuffer);
      frameBuffer.removeAt(0);

      if (diff > detectionThreshold) {
        detecting = true;
        frameBuffer.clear();

        Timer(resetDelay, () {
          detecting = false;
        });
        return true;
      }
    }

    return false;
  }

結局、堅実というか、どんくさいコードに…。

この記事が気に入ったらサポートをしてみませんか?