Please provide complete information as applicable to your setup.
• Hardware Platform (Jetson / GPU)
NVIDIA GeForce GTX 1650
• DeepStream Version
6.2
• JetPack Version (valid for Jetson only)
• TensorRT Version
TensorRT-8.6.1.6
• NVIDIA GPU Driver Version (valid for GPU only)
Driver Version: 525.125.06
• Issue Type( questions, new requirements, bugs)
questions
• How to reproduce the issue ? (This is for bugs. Including which sample app is using, the configuration files content, the command line used and other details for reproducing)
# pipeline
filesrc->h264parse->nvv4l2decoder->nvstreammux->nvinfer(yolov5)->customer track->nvvideoconvert->nvdsosd->nv3dsink
# customer tracker context code
NvMOTContext::NvMOTContext(const NvMOTConfig &configIn, NvMOTConfigResponse &configResponse) {
custom_config_file = configIn.customConfigFilePath;
configResponse.summaryStatus = NvMOTConfigStatus_OK;
}
NvMOTStatus NvMOTContext::processFrame(const NvMOTProcessParams *params, NvMOTTrackedObjBatch *pTrackedObjectsBatch) {
for (uint streamIdx = 0; streamIdx < pTrackedObjectsBatch->numFilled; streamIdx++){
NvMOTTrackedObjList *trackedObjList = &pTrackedObjectsBatch->list[streamIdx];
NvMOTFrame *frame = ¶ms->frameList[streamIdx];
/* get tracker per stream */
if (NanoTrackMap.find(frame->streamID) == NanoTrackMap.end()) {
NanoTrackMap[frame->streamID] = std::make_shared<TrackerNanoTRT>(custom_config_file);
}
/* get input frame */
NvBufSurfaceParams *surfaceParams = frame->bufferList[0];
cv_frame = cv::Mat(surfaceParams->height, surfaceParams->width, CV_8UC4, (char*)surfaceParams->dataPtr);
cv::cvtColor(cv_frame, cv_frame, cv::COLOR_RGBA2BGR);
/* get input rect */
if (frame->objectsIn.numFilled) {
objToTrack = &frame->objectsIn.list[0];
std::cout << ">>> [detect] class idx: " << ((NvDsObjectMeta*)(objToTrack->pPreservedData))->class_id << std::endl;
confidence = objToTrack->confidence;
class_idx = objToTrack->classId;
rect.x = (int)(objToTrack->bbox.x);
rect.y = (int)(objToTrack->bbox.y);
rect.width = (int)(objToTrack->bbox.width);
rect.height = (int)(objToTrack->bbox.height);
}
else {
std::cout << ">>> [track] class idx: " << ((NvDsObjectMeta*)(objToTrack->pPreservedData))->class_id << std::endl;
objToTrack->confidence = confidence;
objToTrack->classId = class_idx;
objToTrack->bbox.x = rect.x;
objToTrack->bbox.y = rect.y;
objToTrack->bbox.width = rect.width;
objToTrack->bbox.height = rect.height;
}
/* tracking */
NanoTrackMap.at(frame->streamID)->update(cv_frame, rect);
confidence = NanoTrackMap.at(frame->streamID)->tracking_score;
/* output */
trackedObj->confidence = confidence;
trackedObj->classId = (uint16_t)class_idx;
trackedObj->trackingId = 0;
trackedObj->bbox.x = (float)rect.x;
trackedObj->bbox.y = (float)rect.y;
trackedObj->bbox.width = (float)rect.width;
trackedObj->bbox.height = (float)rect.height;
// trackedObj->age = frame->frameNum;
trackedObj->age = 1;
trackedObj->associatedObjectIn = objToTrack;
trackedObj->associatedObjectIn->doTracking = true;
trackedObjList->streamID = frame->streamID;
trackedObjList->frameNum = frame->frameNum;
trackedObjList->valid = true;
trackedObjList->list = trackedObj;
trackedObjList->numFilled = 1;
trackedObjList->numAllocated = 1;
}
return NvMOTStatus_OK;
}
NvMOTStatus NvMOTContext::processFramePast(const NvMOTProcessParams *params,
NvDsPastFrameObjBatch *pPastFrameObjectsBatch) {
return NvMOTStatus_OK;
}
NvMOTStatus NvMOTContext::removeStream(const NvMOTStreamId streamIdMask) {
if (NanoTrackMap.find(streamIdMask) != NanoTrackMap.end()){
std::cout << "Removing tracker for stream: " << streamIdMask << std::endl;
NanoTrackMap.erase(streamIdMask);
}
return NvMOTStatus_OK;
}
customer tracker for SOT(single object track), etc: NanoTrack, the tracker with tensorrt backbone extract instance region and template region feature, and fusion features with tensorrt neckhead, finally get score and rect on next frame. that can get rect without detection, like dcf.
when i set interval > 0 in yolov5 detection configure, got this msg:
>>> [detect] class idx: 4
>>> [track] class idx: 4
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [track] class idx: 0
gstnvtracker: obj 0 Class mismatch! 0 -> 4
>>> [detect] class idx: 4
>>> [track] class idx: 4
>>> [track] class idx: 4
>>> [track] class idx: 4
>>> [track] class idx: 0
set interval=30, the class idx is ((NvDsObjectMeta*)(objToTrack->pPreservedData))->class_id in the context code, with debug in deepstream6.3 deepstream/sources/gst-plugins/gst-nvtracker/, i found this func NvTrackerProc::fillMOTFrame in nvtracker_proc.cpp line 714:
void NvTrackerProc::fillMOTFrame(SurfaceStreamId ssId,
const ProcParams& procParams,
const NvDsFrameMeta& frameMeta,
NvMOTFrame& motFrame,
NvMOTTrackedObjList& trackedObjList)
{
uint32_t i = 0;
NvMOTObjToTrackList *pObjList = &motFrame.objectsIn;
NvBufSurfaceParams *pInputBuf = &procParams.input.pSurfaceBatch->surfaceList[frameMeta.batch_id];
float scaleWidth = ((float)m_Config.trackerWidth/pInputBuf->width);
float scaleHeight = ((float)m_Config.trackerHeight/pInputBuf->height);
pObjList->numFilled = 0;
NvDsObjectMetaList *l = NULL;
NvDsObjectMeta *objectMeta = NULL;
NvMOTObjToTrack *pObjs = pObjList->list;
for (i = 0, l = frameMeta.obj_meta_list;
i < pObjList->numAllocated && l != NULL;
i++, l = l->next)
{
objectMeta = (NvDsObjectMeta *)(l->data);
NvOSD_RectParams *rectParams = &objectMeta->rect_params;
pObjs[i].bbox.x = rectParams->left * scaleWidth;
pObjs[i].bbox.y = rectParams->top * scaleHeight;
pObjs[i].bbox.width = rectParams->width * scaleWidth;
pObjs[i].bbox.height = rectParams->height * scaleHeight;
pObjs[i].classId = objectMeta->class_id;
pObjs[i].confidence = objectMeta->confidence;
pObjs[i].doTracking = true;
pObjs[i].pPreservedData = objectMeta;
pObjList->numFilled++;
... ...
in this func, the tracker had copy class_id in frameMeta to motFrame which is params of context in NvMOTContext::processFrame, so why i get Class mismatch error?
• Requirement details( This is for new requirement. Including the module name-for which plugin or for which sample application, the function description)