Skip to content

Commit

Permalink
bug fix: duplicate track ids
Browse files Browse the repository at this point in the history
  • Loading branch information
walzimmer committed Jan 18, 2021
1 parent 3516ec2 commit 21eda5a
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 77 deletions.
41 changes: 25 additions & 16 deletions js/base_label_tool.js
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ let labelTool = {
pointSize: 1,
pointMaterial: new THREE.PointsMaterial({size: 5, sizeAttenuation: false, vertexColors: THREE.VertexColors}),
views: {perspective: "perspective", orthographic: "orthographic"},
maxTrackIds: [0, 0, 0, 0, 0],// vehicle, truck, motorcycle, bicycle, pedestrian
/********** Externally defined functions **********
* Define these functions in the labeling tools.
**************************************************/
Expand Down Expand Up @@ -455,7 +456,6 @@ let labelTool = {
// Set values to this.annotationObjects from allAnnotations
loadAnnotationsNuScenesJSON: function (frameObject) {
// Remove old bounding boxes of current frame.
let maxTrackIds = [0, 0, 0, 0, 0];// vehicle, truck, motorcycle, bicycle, pedestrian
let frameAnnotations = frameObject.labels;
// Add new bounding boxes
for (let annotationIdx in frameAnnotations) {
Expand All @@ -472,8 +472,8 @@ let labelTool = {
let classIdx;
params.trackId = annotation.id;
classIdx = classesBoundingBox[annotation.category].index;
if (params.trackId > maxTrackIds[classIdx]) {
maxTrackIds[classIdx] = params.id;
if (params.trackId > labelTool.maxTrackIds[classIdx]) {
labelTool.maxTrackIds[classIdx] = params.id;
}
// Nuscenes labels are stored in global frame in the database
// Nuscenes: labels (3d positions) are transformed from global frame to point cloud (global -> ego, ego -> point cloud) before exporting them
Expand Down Expand Up @@ -507,6 +507,9 @@ let labelTool = {
if (labelTool.showOriginalNuScenesLabels === true) {
classesBoundingBox.content[classesBoundingBox.targetName()].nextTrackId++;
} else {
if (isNaN(classesBoundingBox.target().nextTrackId)) {
classesBoundingBox.target().nextTrackId = 1;
}
classesBoundingBox.target().nextTrackId++;
}

Expand All @@ -524,13 +527,13 @@ let labelTool = {

if (labelTool.showOriginalNuScenesLabels === true) {
let keys = Object.keys(classesBoundingBox.content);
for (let i = 0; i < maxTrackIds.length; i++) {
classesBoundingBox.content[keys[i]].nextTrackId = maxTrackIds[i] + 1;
for (let i = 0; i < labelTool.maxTrackIds.length; i++) {
classesBoundingBox.content[keys[i]].nextTrackId = labelTool.maxTrackIds[i] + 1;
}
} else {
let keys = Object.keys(classesBoundingBox);
for (let i = 0; i < maxTrackIds.length; i++) {
classesBoundingBox[keys[i]].nextTrackId = maxTrackIds[i] + 1;
for (let i = 0; i < labelTool.maxTrackIds.length; i++) {
classesBoundingBox[keys[i]].nextTrackId = labelTool.maxTrackIds[i] + 1;
}
}
// project 3D positions of current frame into 2D camera images
Expand All @@ -543,7 +546,6 @@ let labelTool = {
}
},
loadFrameAnnotationsProvidentiaJSON: function (frameObject) {
let maxTrackIds = [0, 0, 0, 0, 0];// vehicle, truck, motorcycle, bicycle, pedestrian
// convert 2D bounding box to integer values
let frameAnnotations = frameObject.labels;

Expand All @@ -562,11 +564,9 @@ let labelTool = {
let classIdx;
params.trackId = annotation.id;
classIdx = classesBoundingBox[annotation.category].index;
if (params.id > maxTrackIds[classIdx]) {
maxTrackIds[classIdx] = params.id;
if (params.trackId > labelTool.maxTrackIds[classIdx]) {
labelTool.maxTrackIds[classIdx] = params.trackId;
}
// Nuscenes labels are stored in global frame in the database
// Nuscenes: labels (3d positions) are transformed from global frame to point cloud (global -> ego, ego -> point cloud) before exporting them
params.x = parseFloat(annotation.box3d.location.x);
params.y = parseFloat(annotation.box3d.location.y);
params.z = parseFloat(annotation.box3d.location.z);
Expand Down Expand Up @@ -594,15 +594,18 @@ let labelTool = {
// add new entry to contents array
annotationObjects.set(annotationObjects.__insertIndex, params);
annotationObjects.__insertIndex++;
classesBoundingBox.target().nextTrackId++;
if (isNaN(classesBoundingBox[params.class].nextTrackId)) {
classesBoundingBox[params.class].nextTrackId = 1;
}
classesBoundingBox[params.class].nextTrackId++;
}
}
// reset insert index
annotationObjects.__insertIndex = 0;

let keys = Object.keys(classesBoundingBox);
for (let i = 0; i < maxTrackIds.length; i++) {
classesBoundingBox[keys[i]].nextTrackId = maxTrackIds[i] + 1;
for (let i = 0; i < labelTool.maxTrackIds.length; i++) {
classesBoundingBox[keys[i]].nextTrackId = labelTool.maxTrackIds[i] + 1;
}
},

Expand Down Expand Up @@ -1035,6 +1038,7 @@ let labelTool = {
}, start() {
this.initTimer();
this.setFileNames();
this.initTrackIDs();
this.initializeClassPicker();
this.initFrameSelector();
if (labelTool.pointCloudOnlyAnnotation === false) {
Expand All @@ -1055,7 +1059,12 @@ let labelTool = {
labelTool.currentDataset = labelTool.datasetArray[0];
parameters.currentDataset = labelTool.datasetArray[0];
labelTool.currentDatasetIdx = 0;
labelTool.sequence= labelTool.dataStructure.datasets[0].sequences[0];
labelTool.sequence = labelTool.dataStructure.datasets[0].sequences[0];
},
initTrackIDs() {
for (let i = 0; i < labelTool.maxTrackIds.length; i++) {
labelTool.maxTrackIds[i] = 0;
}
},

setFileNames() {
Expand Down
115 changes: 54 additions & 61 deletions js/pcd_label_tool.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ let grid;

let operationStack = [];

let orthographicCamera;
let perspectiveCamera;
let currentCamera;

Expand All @@ -15,15 +14,9 @@ let cameraSideView;
let cameraFrontView;

let currentOrbitControls;
let controlsTarget = new THREE.Vector3(0, 0, 0);
let orthographicOrbitControls;
let perspectiveOrbitControls;
let pointerLockControls;
let pointerLockObject;
let transformControls;
let mapControlsBev;
let mapControlsFrontView;
let mapControlsSideView;

let scene;
let projector;
Expand Down Expand Up @@ -53,15 +46,12 @@ let translationDirection = new THREE.Vector3();
let rotationDirection = new THREE.Vector3();
let prevTime = performance.now();

// let stats;
let cube;
let interpolationObjIndexCurrentFile = -1;
let interpolationObjIndexNextFile = -1;
let interpolateBtn;
let pointSizeSlider;

// let keyboard = new KeyboardState();

let guiAnnotationClasses = new dat.GUI({autoPlace: true, width: 90, resizable: false});
let guiBoundingBoxAnnotationMap;
let guiOptions = new dat.GUI({autoPlace: true, width: 350, resizable: false});
Expand All @@ -77,7 +67,6 @@ let folderBoundingBox3DArray = [];
let folderPositionArray = [];
let folderRotationArray = [];
let folderSizeArray = [];
let bboxFlag = true;
let clickFlag = false;
let clickedObjectIndex = -1;
let clickedObjectIndexPrevious = -1;
Expand All @@ -90,7 +79,6 @@ let groundPointMouseDown;
let groundPlaneArray = [];
let clickedPlaneArray = [];
let birdsEyeViewFlag = true;
let cls = 0;
let rotWorldMatrix;
let rotObjectMatrix;
let circleArray = [];
Expand All @@ -101,8 +89,6 @@ let currentDistances = [];
let spriteBehindObject;
let pointCloudScanList = [];
let pointCloudScanNoGroundList = [];
let pointCloudScan;
let pointCloudScanNoGround;
let useTransformControls;
let dragControls = false;
let keyboardNavigation = false;
Expand Down Expand Up @@ -916,13 +902,19 @@ function deleteObject(bboxClass, trackId, labelIndex) {
//register new bounding box
function addBoundingBoxGui(bbox, bboxEndParams) {
let insertIndex = folderBoundingBox3DArray.length;
let bb = guiOptions.addFolder(bbox.class + ' ' + bbox.trackId);
let bb;
if (guiOptions.__folders[bbox.class + ' ' + bbox.trackId] === undefined){
bb = guiOptions.addFolder(bbox.class + ' ' + bbox.trackId);
}else{
bb = guiOptions.__folders[bbox.class + ' ' + bbox.trackId];
}

folderBoundingBox3DArray.push(bb);

let minXPos = -100;
let maxXPos = 100;
let minYPos = -100;
let maxYPos = 100;
let minXPos = -150;
let maxXPos = 150;
let minYPos = -150;
let maxYPos = 150;

let minZPos;
let maxZPos;
Expand Down Expand Up @@ -1068,11 +1060,13 @@ function addBoundingBoxGui(bbox, bboxEndParams) {
cubeHeight.onChange(function (value) {
for (let i = 0; i < labelTool.numFrames; i++) {
let selectionIndex = getObjectIndexByTrackIdAndClass(bbox.trackId, bbox.class, i);
let newZPos = labelTool.cubeArray[i][selectionIndex].position.z + (value - labelTool.cubeArray[i][selectionIndex].scale.z) / 2;
labelTool.cubeArray[i][selectionIndex].position.z = newZPos;
bbox.z = newZPos;
labelTool.cubeArray[i][selectionIndex].scale.z = value;
annotationObjects.contents[i][selectionIndex]["height"] = value;
if (selectionIndex !== -1) {
let newZPos = labelTool.cubeArray[i][selectionIndex].position.z + (value - labelTool.cubeArray[i][selectionIndex].scale.z) / 2;
labelTool.cubeArray[i][selectionIndex].position.z = newZPos;
bbox.z = newZPos;
labelTool.cubeArray[i][selectionIndex].scale.z = value;
annotationObjects.contents[i][selectionIndex]["height"] = value;
}
}
if (labelTool.pointCloudOnlyAnnotation === false) {
let selectionIndexCurrent = getObjectIndexByTrackIdAndClass(bbox.trackId, bbox.class, labelTool.currentFileIndex);
Expand Down Expand Up @@ -2587,6 +2581,9 @@ function mouseUpLogic(ev) {
clickFlag = false;
} else if (groundPlaneArray.length === 1 && birdsEyeViewFlag === true && useTransformControls === false) {
let groundUpObject = ray.intersectObjects(groundPlaneArray);
if (groundUpObject === undefined || groundUpObject[0] === undefined) {
return;
}
let groundPointMouseUp = groundUpObject[0].point;

let trackId = -1;
Expand Down Expand Up @@ -2750,7 +2747,15 @@ function mouseDownLogic(ev) {
ray.setFromCamera(mouse, currentCamera);
}
let clickedObjects = ray.intersectObjects(labelTool.cubeArray[labelTool.currentFileIndex]);

let geometry = new THREE.PlaneGeometry(2 * gridSize, 2 * gridSize);
let material = new THREE.MeshBasicMaterial({
color: 0x000000,
wireframe: false,
transparent: true,
opacity: 0.0,
side: THREE.DoubleSide
});
let groundPlane = new THREE.Mesh(geometry, material);
if (clickedObjects.length > 0) {

if (ev.button === 0) {
Expand All @@ -2760,37 +2765,28 @@ function mouseDownLogic(ev) {
clickedCube = labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex];

if (birdsEyeViewFlag === true) {
let material = new THREE.MeshBasicMaterial({
color: 0x000000,
wireframe: false,
transparent: true,
opacity: 0.0,
side: THREE.DoubleSide
});
let geometry = new THREE.PlaneGeometry(200, 200);
let clickedPlane = new THREE.Mesh(geometry, material);
clickedPlane.position.x = clickedPoint.x;
clickedPlane.position.y = clickedPoint.y;
clickedPlane.position.z = clickedPoint.z;
groundPlane.position.x = clickedPoint.x;
groundPlane.position.y = clickedPoint.y;
groundPlane.position.z = clickedPoint.z;
let normal = clickedObjects[0].face;
if ([normal.a, normal.b, normal.c].toString() == [6, 3, 2].toString() || [normal.a, normal.b, normal.c].toString() == [7, 6, 2].toString()) {
clickedPlane.rotation.x = Math.PI / 2;
clickedPlane.rotation.y = labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
groundPlane.rotation.x = Math.PI / 2;
groundPlane.rotation.y = labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
} else if ([normal.a, normal.b, normal.c].toString() == [6, 7, 5].toString() || [normal.a, normal.b, normal.c].toString() == [4, 6, 5].toString()) {
clickedPlane.rotation.x = -Math.PI / 2;
clickedPlane.rotation.y = -Math.PI / 2 - labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
groundPlane.rotation.x = -Math.PI / 2;
groundPlane.rotation.y = -Math.PI / 2 - labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
} else if ([normal.a, normal.b, normal.c].toString() == [0, 2, 1].toString() || [normal.a, normal.b, normal.c].toString() == [2, 3, 1].toString()) {
clickedPlane.rotation.x = Math.PI / 2;
clickedPlane.rotation.y = Math.PI / 2 + labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
groundPlane.rotation.x = Math.PI / 2;
groundPlane.rotation.y = Math.PI / 2 + labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
} else if ([normal.a, normal.b, normal.c].toString() == [5, 0, 1].toString() || [normal.a, normal.b, normal.c].toString() == [4, 5, 1].toString()) {
clickedPlane.rotation.x = -Math.PI / 2;
clickedPlane.rotation.y = -labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
groundPlane.rotation.x = -Math.PI / 2;
groundPlane.rotation.y = -labelTool.cubeArray[labelTool.currentFileIndex][clickedObjectIndex].rotation.z;
} else if ([normal.a, normal.b, normal.c].toString() == [3, 6, 4].toString() || [normal.a, normal.b, normal.c].toString() == [1, 3, 4].toString()) {
clickedPlane.rotation.y = -Math.PI
groundPlane.rotation.y = -Math.PI
}
clickedPlane.name = "planeObject";
scene.add(clickedPlane);
clickedPlaneArray.push(clickedPlane);
groundPlane.name = "planeObject";
scene.add(groundPlane);
clickedPlaneArray.push(groundPlane);
}

} else if (ev.button === 2) {
Expand All @@ -2810,21 +2806,14 @@ function mouseDownLogic(ev) {
console.log("unselected");
clickedObjectIndex = -1;
groundPlaneArray = [];
let material = new THREE.MeshBasicMaterial({
color: 0x000000,
wireframe: false,
transparent: true,//default: true
opacity: 0.0,//oefault 0.0
side: THREE.DoubleSide
});
let geometry = new THREE.PlaneGeometry(200, 200);
let groundPlane = new THREE.Mesh(geometry, material);
groundPlane.position.x = 0;
groundPlane.position.y = 0;
groundPlane.position.z = 0;
groundPlaneArray.push(groundPlane);
let groundObject = ray.intersectObjects(groundPlaneArray);
groundPointMouseDown = groundObject[0].point;
if (groundObject !== undefined && groundObject[0] !== undefined) {
groundPointMouseDown = groundObject[0].point;
}
}
}
}
Expand Down Expand Up @@ -2999,14 +2988,18 @@ function disableChooseSequenceDropDown(chooseSequenceDropDown) {

function createGrid() {
labelTool.removeObject("grid");
grid = new THREE.GridHelper(gridSize,gridSize);
grid = new THREE.GridHelper(gridSize, gridSize);
let posZLidar;
let translationX;
if (labelTool.currentDataset === labelTool.datasets.NuScenes) {
posZLidar = labelTool.positionLidarNuscenes[2];
}else{
translationX = 0;
} else {
posZLidar = labelTool.positionLidar[2];
translationX = gridSize/2;
}
grid.translateZ(-posZLidar);
grid.translateX(translationX);
grid.rotateX(Math.PI / 2);
grid.name = "grid";
if (showGridFlag === true) {
Expand Down

0 comments on commit 21eda5a

Please sign in to comment.