Custom Tracker deepstream

DeepStream Version - 7.1
• JetPack Version (valid for Jetson only)
• TensorRT Version - 10.3.0.26
• NVIDIA GPU Driver Version (valid for GPU only) - 565.57.01

• Issue Type( questions, new requirements, bugs) - question about best practices
• How to reproduce the issue ? I attach example code

#include "Tracker.h"
#include "BYTETracker.h"
#include <fstream>

NvMOTContext::NvMOTContext(const NvMOTConfig &configIn, NvMOTConfigResponse &configResponse) {
    configResponse.summaryStatus = NvMOTConfigStatus_OK;
}

NvMOTContext::~NvMOTContext()
{
}

NvMOTStatus NvMOTContext::processFrame(const NvMOTProcessParams *params, NvMOTTrackedObjBatch *pTrackedObjectsBatch) {
    for (uint streamIdx = 0; streamIdx < pTrackedObjectsBatch->numFilled; streamIdx++){
        NvMOTTrackedObjList   *trackedObjList = &pTrackedObjectsBatch->list[streamIdx];
        NvMOTFrame            *frame          = &params->frameList[streamIdx];
        std::vector<NvObject> nvObjects(frame->objectsIn.numFilled);
        for (uint32_t numObjects = 0; numObjects < frame->objectsIn.numFilled; numObjects++) {
            NvMOTObjToTrack *objectToTrack = &frame->objectsIn.list[numObjects];
            NvObject nvObject;
            nvObject.prob = objectToTrack->confidence;
            nvObject.label = objectToTrack->classId;
            nvObject.rect[0] = objectToTrack->bbox.x;
            nvObject.rect[1] = objectToTrack->bbox.y;
            nvObject.rect[2] = objectToTrack->bbox.width;
            nvObject.rect[3] = objectToTrack->bbox.height;
            nvObject.associatedObjectIn = objectToTrack;
            nvObjects.push_back(nvObject);
        }

        if (byteTrackerMap.find(frame->streamID) == byteTrackerMap.end())
            byteTrackerMap.insert(std::pair<uint64_t, std::shared_ptr<BYTETracker>>(frame->streamID, std::make_shared<BYTETracker>(15, 30)));

        std::vector<STrack> outputTracks = byteTrackerMap.at(frame->streamID)->update(nvObjects);

        if (trackedObjList->numAllocated != MAX_TARGETS_PER_STREAM)
        {
            // Reallocate memory space
            delete trackedObjList->list;
            trackedObjList->list = new NvMOTTrackedObj[MAX_TARGETS_PER_STREAM];
        }
        // This should resolve the memory leak issue:
        //   https://github.com/ifzhang/ByteTrack/issues/276
        NvMOTTrackedObj *trackedObjs = trackedObjList->list;
        int filled = 0;

        for (STrack &sTrack: outputTracks) {
            if (filled >= MAX_TARGETS_PER_STREAM)
                break;
            std::vector<float> tlwh = sTrack.original_tlwh;
            NvMOTRect motRect{tlwh[0], tlwh[1], tlwh[2], tlwh[3]};
            NvMOTTrackedObj *trackedObj = &trackedObjs[filled];
            trackedObj->classId = sTrack.label;
            trackedObj->trackingId = (uint64_t) sTrack.track_id;
            trackedObj->bbox = motRect;
            trackedObj->confidence = 1;
            trackedObj->age = (uint32_t) sTrack.tracklet_len;
            trackedObj->associatedObjectIn = sTrack.associatedObjectIn;
            trackedObj->associatedObjectIn->doTracking = true;
            filled++;
        }

        trackedObjList->streamID     = frame->streamID;
        trackedObjList->frameNum     = frame->frameNum;
        trackedObjList->valid        = true;
        trackedObjList->list         = trackedObjs;
        trackedObjList->numFilled    = filled;
        trackedObjList->numAllocated = MAX_TARGETS_PER_STREAM;
    }
    return NvMOTStatus_OK;
}

NvMOTStatus NvMOTContext::retrieveMiscData(const NvMOTProcessParams *params,
                                 NvMOTTrackerMiscData *pTrackerMiscData){
    return NvMOTStatus_OK;
}

NvMOTStatus NvMOTContext::removeStream(const NvMOTStreamId streamIdMask) {
    if (byteTrackerMap.find(streamIdMask) != byteTrackerMap.end()){
        std::cout << "Removing tracker for stream: " << streamIdMask << std::endl;
        byteTrackerMap.erase(streamIdMask);
    }
    return NvMOTStatus_OK;
}

Hi, I’m integrating a tracker into my pipeline. (see NvMOTContext.cpp) I want to specify interval >0, but in this case, the tracker doesn’t work correctly. A significant portion of the boxes disappear, and I get the error gstnvtracker: obj 0 Class mismatch! 0 → 4
I saw a similar topic, but the suggested changes don’t help. I assume I’m doing something wrong, so I’ve attached the code as an archive. Please help me make the changes correctly.

test.zip (23.7 KB)

Please upgrade to the latest DeepStream. Does your custom tracker works with detector interval = 0? The nvtracker plugin is open sourced, you can debug add some log to print the input/output objects.

yes, tracker works correctly with interval=0, I run with gdb, but there are no any errors from pipeline, so debug mode is useless in this situation

Seems the same issue as: How to set custom tracker in deepstream with detection interval > 0 - #7 by kesong

There is no update from you for a period, assuming this is not an issue anymore. Hence we are closing this topic. If need further support, please open a new one. Thanks.