オブジェクトトラッカー

オブジェクトトラッカーは、モデルの実行間の中間フレームで検出されたオブジェクトを追跡し、既存のオブジェクトを新しい検出と照合します。 これにより、異なるフレーム内の同じオブジェクトの認識が重複する可能性が低減され、モデルの実行よりも頻繁にオブジェクトの位置を更新することで、よりスムーズなエクスペリエンスを提供できます。

オブジェクトトラッカーを使用するに は、各モデルの認識結果で、新しいフレームおよびonFrame()メソッドごとにそのtrackResults()メソッドを呼び出します。 各メソッドのパラメータは、使用されているトラッカーによって異なりますが、各メソッドの機能は同じままです。 トラッカーからの検出は getTrackedObjects() 、メソッドを呼び出すことで受信できます。

onFrame() メソッド trackResults() は、新しい各フレームを処理し、現在追跡されているすべてのオブジェクトの場所を更新します。メソッドは、トラッカーに新しいオブジェクトを追加し、新しいオブジェクトと既存の追跡対象オブジェクトの間の相関関係を検索して、それらが同じオブジェクトであるかどうかを判断します。

追跡対象の機能タイプに基づいて、次の 2 種類のトラッカーがあります。

  • BasicObjectTracker - 機能の存在や存在を追跡することが、その位置の瞬間的な変化よりも重要な場合に最適です。 小さいものや静電気のあるもの ( 交通標識、コーンなど ) に適しています。

  • MultiBoxObjectTracker - 衝突の可能性をユーザーに警告するために必要な機能の瞬時の位置がより重要な場合に最適です。 頻繁に移動する荷物(乗用車、ライダー、自転車、オートバイなど)に適しています。

// OpenCV is used for image transformations in sample, but OpenCV is not required for trackers.
using namespace cv;   // Mat, cvtColor, resize, split
using namespace ls;   // Recognition, MultiBoxObjectTracker, BasicObjectTracker, TrackedRecognition

// Keeps track if model is running in background.
std::atomic<bool> isDetectionRunning(false);

// Tracker instances
MultiBoxObjectTracker objectTracker
BasicObjectTracker basicTracker

// Timestamp value used by trackers
long timestamp = 1;

/**
 * Classes to use with MultiBoxObjectTracker
 */
std::set<std::string> multiBoxTrackerClasses{
    "rider",
    "car",
    "bus",
    "truck",
    "bicycle",
    "motorcycle",
    "car-brake-light-on",
};

// Vector of models to run in background
std::vector<LivesenseModel *> livesenseModels;

void processFrameWithTracker(Mat frame) {

    // Extracting the y component from color image
    Mat frameLuminance;
    cvtColor(frame, frameLuminance, cv::COLOR_BGR2YUV);
    Mat yuv[3];                  //destination array
    split(frameLuminance, yuv);  //split source

    // Passing the y luminance frame to tracker for processing
    objectTracker.onFrame(
        frame_width,
        frame_height,
        frame_width,
        0,
        yuv[0].data,
        timestamp);
    // Basic object tracker does not use frame data so only takes the timestamp
    basicTracker.onFrame(timestamp);

    if (isDetectionRunning == false) {
        isDetectionRunning = true;
        // Convert colorspace as model use RGB images
        Mat frameRGB;
        cvtColor(frame, frameRGB, COLOR_BGR2RGB);
        // Run detection in background
        std::thread th(runDetectionInBackground, livesenseModels, &objectTracker,
                       &basicTracker, frameRGB, yuv[0].data, timestamp);
        th.detach();
    }

    // Get vector of tracked objects from the object trackers
    auto trackedObjects = objectTracker.getTrackedObjects();
    auto basicTrackedObject = basicTracker.getTrackedObjects()

    // Increment timestamp
    timestamp = timestamp + 1
}

モデルの推測はバックグラウンドで実行され、次に示すようにモデルの結果がトラッカーによって処理されます。

void runDetectionInBackground(const vector<ls::LivesenseModel *> models,
                              ls::MultiBoxObjectTracker *objectTracker,
                              ls::BasicObjectTracker *basicTracker,
                              const cv::Mat frame,
                              const uint8_t frameLuminance[],
                              const long timestamp) {
    using namespace ls;
    isDetectionRunning = true;

    // Resize the input RGB frame
    unsigned char *resizedInput = NULL;
    unsigned char *origInput = &frame.data[0];
    int origWidth = frame.cols;
    int origHeight = frame.rows;

    // OpenCV resize
    cv::Mat resizedFrame;


    std::vector<Recognition> trackMultiBox;
    std::vector<Recognition> trackBasic;
    for (auto livesenseModel : models) {
        // Each model may have its own input shape. For code to assist in
        // managing the different input shapes, see the example applications
        // provided alongside the SDK.
        int resizedInputWidth = livesenseModel->getInputWidth();
        int resizedInputHeight = livesenseModel->getInputHeight();
        // OpenCV resize
        cv::resize(frame, resizedFrame, cv::Size(resizedInputWidth, resizedInputHeight));
        resizedInput = &resizedFrame.data[0];
        // Get recognitions from each individual model in sequence
        auto recognitions = livesenseModel->recognizeImage(resizedInput,
                                                           resizedInputWidth,
                                                           resizedInputHeight,
                                                           origWidth,
                                                           origHeight,
                                                           origInput);
        // Sort recognitions for each tracker
        for (auto r : recognitions) {
            if (multiBoxTrackerClasses.find(r.getTitle()) != multiBoxTrackerClasses.end()) {
                trackMultiBox.push_back(r);
            } else {
                trackBasic.push_back(r);
            }
        }
    }
    // Pass the combined model recognitions with luminance frame and timestamp to tracker
    objectTracker->trackResults(trackMultiBox, frameLuminance, timestamp);
    basicTracker->trackResults(trackBasic, timestamp);
    // Signal detection finished
    isDetectionRunning = false;
}

」に一致する結果は 件です

    」に一致する結果はありません