オブジェクトトラッカー
オブジェクトトラッカーは、モデルの実行間の中間フレームで検出されたオブジェクトを追跡し、既存のオブジェクトを新しい検出と照合します。 これにより、異なるフレーム内の同じオブジェクトの認識が重複する可能性が低減され、モデルの実行よりも頻繁にオブジェクトの位置を更新することで、よりスムーズなエクスペリエンスを提供できます。
オブジェクトトラッカーを使用するに は、各モデルの認識結果で、新しいフレームおよびonFrame()
メソッドごとにそのtrackResults()
メソッドを呼び出します。 各メソッドのパラメータは、使用されているトラッカーによって異なりますが、各メソッドの機能は同じままです。 トラッカーからの検出は getTrackedObjects()
、メソッドを呼び出すことで受信できます。
onFrame()
メソッド trackResults()
は、新しい各フレームを処理し、現在追跡されているすべてのオブジェクトの場所を更新します。メソッドは、トラッカーに新しいオブジェクトを追加し、新しいオブジェクトと既存の追跡対象オブジェクトの間の相関関係を検索して、それらが同じオブジェクトであるかどうかを判断します。
追跡対象の機能タイプに基づいて、次の 2 種類のトラッカーがあります。
-
BasicObjectTracker
- 機能の存在や存在を追跡することが、その位置の瞬間的な変化よりも重要な場合に最適です。 小さいものや静電気のあるもの ( 交通標識、コーンなど ) に適しています。
-
MultiBoxObjectTracker
- 衝突の可能性をユーザーに警告するために必要な機能の瞬時の位置がより重要な場合に最適です。 頻繁に移動する荷物(乗用車、ライダー、自転車、オートバイなど)に適しています。
using namespace cv;
using namespace ls;
std::atomic<bool> isDetectionRunning(false);
MultiBoxObjectTracker objectTracker
BasicObjectTracker basicTracker
long timestamp = 1;
std::set<std::string> multiBoxTrackerClasses{
"rider",
"car",
"bus",
"truck",
"bicycle",
"motorcycle",
"car-brake-light-on",
};
std::vector<LivesenseModel *> livesenseModels;
void processFrameWithTracker(Mat frame) {
Mat frameLuminance;
cvtColor(frame, frameLuminance, cv::COLOR_BGR2YUV);
Mat yuv[3];
split(frameLuminance, yuv);
objectTracker.onFrame(
frame_width,
frame_height,
frame_width,
0,
yuv[0].data,
timestamp);
basicTracker.onFrame(timestamp);
if (isDetectionRunning == false) {
isDetectionRunning = true;
Mat frameRGB;
cvtColor(frame, frameRGB, COLOR_BGR2RGB);
std::thread th(runDetectionInBackground, livesenseModels, &objectTracker,
&basicTracker, frameRGB, yuv[0].data, timestamp);
th.detach();
}
auto trackedObjects = objectTracker.getTrackedObjects();
auto basicTrackedObject = basicTracker.getTrackedObjects()
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;
unsigned char *resizedInput = NULL;
unsigned char *origInput = &frame.data[0];
int origWidth = frame.cols;
int origHeight = frame.rows;
cv::Mat resizedFrame;
std::vector<Recognition> trackMultiBox;
std::vector<Recognition> trackBasic;
for (auto livesenseModel : models) {
int resizedInputWidth = livesenseModel->getInputWidth();
int resizedInputHeight = livesenseModel->getInputHeight();
cv::resize(frame, resizedFrame, cv::Size(resizedInputWidth, resizedInputHeight));
resizedInput = &resizedFrame.data[0];
auto recognitions = livesenseModel->recognizeImage(resizedInput,
resizedInputWidth,
resizedInputHeight,
origWidth,
origHeight,
origInput);
for (auto r : recognitions) {
if (multiBoxTrackerClasses.find(r.getTitle()) != multiBoxTrackerClasses.end()) {
trackMultiBox.push_back(r);
} else {
trackBasic.push_back(r);
}
}
}
objectTracker->trackResults(trackMultiBox, frameLuminance, timestamp);
basicTracker->trackResults(trackBasic, timestamp);
isDetectionRunning = false;
}