changeset 1251:2b1c8fe8f7e4

added function for KITTI 2D format (just a simple csv-like format with xy coordinates)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 15 Mar 2024 17:05:54 -0400
parents 77fbd0e2ba7d
children fe35473acee3
files trafficintelligence/storage.py
diffstat 1 files changed, 27 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/trafficintelligence/storage.py	Thu Feb 15 22:04:35 2024 -0500
+++ b/trafficintelligence/storage.py	Fri Mar 15 17:05:54 2024 -0400
@@ -1347,8 +1347,8 @@
         if len(tmp) != interval.length(): #interpolate
             print(objNum, len(tmp), interval.length())
             instants = set(interval).difference(tmp.frame)
-            tmp = concat([tmp, DataFrame([[t, objNum, userType]+[NaN]*(len(header)-3) for t in instants], columns = header)], ignore_index=True).sort_values('frame')
-            tmp.interpolate(inplace=True)
+            missing = concat([tmp[header[10:]], DataFrame([[t]+[NaN]*(len(header)-10) for t in instants], columns = ['frame']+header[10:])], ignore_index=True).sort_values('frame')
+            tmp = missing.interpolate()
         featureTrajectories = [moving.Trajectory() for i in range(4)]
         for i, r in tmp.iterrows():
             _, Tr_imu_to_world = oxts[r.frame]
@@ -1439,6 +1439,31 @@
 
     return objects
 
+def loadTrajectoriesFromKITTI2D(filename):
+    '''Loads x,y coordinate series
+    e.g. obtained by projecting from image to ground world plane using a homography
+    Format: frame_id,track_id,usertype,x,y,score '''
+
+    header = ['frame','trackingid','usertype','x','y','score']
+    data = read_csv(filename, delimiter=' ', names = header)
+    objects = []
+    for objNum in data.trackingid.unique():
+        tmp = data[data.trackingid == objNum].sort_values('frame')
+        interval = moving.TimeInterval(int(tmp.frame.min()), int(tmp.frame.max()))
+        userType = tmp.iloc[0].usertype
+        if len(tmp) != interval.length(): #interpolate
+            print(objNum, len(tmp), interval.length())
+            instants = set(interval).difference(tmp.frame)
+            missing = concat([tmp[['frame', 'x', 'y']], DataFrame([[t, NaN, NaN] for t in instants], columns = ['frame', 'x', 'y'])], ignore_index=True).sort_values('frame')
+            tmp = missing.interpolate()
+            #print(tmp.info())
+        if interval.length()>1:
+            t = moving.Trajectory([tmp.x.to_list(), tmp.y.to_list()])
+            newObj = moving.MovingObject(num = objNum, timeInterval = interval, positions = t, velocities = t.differentiate(True), userType = userType)
+            objects.append(newObj)
+        
+    return objects
+    
 def convertNgsimFile(inputfile, outputfile, append = False, nObjects = -1, sequenceNum = 0):
     '''Reads data from the trajectory data provided by NGSIM project
     and converts to our current format.'''