Mercurial > hg > nsaunier > traffic-intelligence
comparison python/metadata.py @ 866:8fba46899e74
addition of class to represent tracking annotations
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 08 Dec 2016 17:51:03 -0500 |
| parents | 5afa1d30edd8 |
| children | 003445db1e30 |
comparison
equal
deleted
inserted
replaced
| 865:5afa1d30edd8 | 866:8fba46899e74 |
|---|---|
| 1 # from moving import Point | |
| 2 | |
| 3 from datetime import datetime, timedelta | 1 from datetime import datetime, timedelta |
| 4 from os import path | 2 from os import path |
| 5 from math import floor | 3 from math import floor |
| 6 | 4 |
| 7 from numpy import zeros, loadtxt, array | 5 from numpy import zeros, loadtxt, array |
| 11 from sqlalchemy.ext.declarative import declarative_base | 9 from sqlalchemy.ext.declarative import declarative_base |
| 12 | 10 |
| 13 from utils import datetimeFormat, removeExtension | 11 from utils import datetimeFormat, removeExtension |
| 14 from cvutils import computeUndistortMaps | 12 from cvutils import computeUndistortMaps |
| 15 from moving import TimeInterval | 13 from moving import TimeInterval |
| 14 | |
| 15 """ | |
| 16 Metadata to describe how video data and configuration files for video analysis are stored | |
| 17 | |
| 18 Typical example is | |
| 19 | |
| 20 site1/view1/2012-06-01/video.avi | |
| 21 /2012-06-02/video.avi | |
| 22 ... | |
| 23 /view2/2012-06-01/video.avi | |
| 24 /2012-06-02/video.avi | |
| 25 ... | |
| 26 | |
| 27 - where site1 is the path to the directory containing all information pertaining to the site, | |
| 28 relative to directory of the SQLite file storing the metadata | |
| 29 represented by Site class | |
| 30 (can contain for example the aerial or map image of the site, used for projection) | |
| 31 | |
| 32 - view1 is the directory for the first camera field of view (camera fixed position) at site site1 | |
| 33 represented by CameraView class | |
| 34 (can contain for example the homography file, mask file and tracking configuration file) | |
| 35 | |
| 36 - YYYY-MM-DD is the directory containing all the video files for that day | |
| 37 with camera view view1 at site site1 | |
| 38 | |
| 39 | |
| 40 """ | |
| 16 | 41 |
| 17 Base = declarative_base() | 42 Base = declarative_base() |
| 18 | 43 |
| 19 class Site(Base): | 44 class Site(Base): |
| 20 __tablename__ = 'sites' | 45 __tablename__ = 'sites' |
| 147 if resX is not None: | 172 if resX is not None: |
| 148 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).filter(CameraType.resX == resX).all() | 173 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).filter(CameraType.resX == resX).all() |
| 149 else: | 174 else: |
| 150 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all() | 175 return session.query(CameraType).filter(CameraType.name.like('%'+cameraTypeId+'%')).all() |
| 151 | 176 |
| 177 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines | |
| 178 | |
| 152 class CameraView(Base): | 179 class CameraView(Base): |
| 153 __tablename__ = 'camera_views' | 180 __tablename__ = 'camera_views' |
| 154 idx = Column(Integer, primary_key=True) | 181 idx = Column(Integer, primary_key=True) |
| 155 description = Column(String) | 182 description = Column(String) |
| 156 homographyFilename = Column(String) # path to homograph file, relative to the site name | 183 homographyFilename = Column(String) # path to homograph file, relative to the site name |
| 159 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name | 186 trackingConfigurationFilename = Column(String) # path to configuration .cfg file, relative to site name |
| 160 maskFilename = Column(String) # path to mask file, relative to site name | 187 maskFilename = Column(String) # path to mask file, relative to site name |
| 161 virtual = Column(Boolean) # indicates it is not a real camera view, eg merged | 188 virtual = Column(Boolean) # indicates it is not a real camera view, eg merged |
| 162 | 189 |
| 163 site = relationship("Site", backref=backref('sites', order_by = idx)) | 190 site = relationship("Site", backref=backref('sites', order_by = idx)) |
| 164 cameraType = relationship('CameraType', backref=backref('camera_views', order_by = idx)) | 191 cameraType = relationship('CameraType', backref=backref('camera_types', order_by = idx)) |
| 165 | 192 |
| 166 def __init__(self, description, homographyFilename, site, cameraType, trackingConfigurationFilename, maskFilename, virtual = False): | 193 def __init__(self, description, homographyFilename, site, cameraType, trackingConfigurationFilename, maskFilename, virtual = False): |
| 167 self.description = description | 194 self.description = description |
| 168 self.homographyFilename = homographyFilename | 195 self.homographyFilename = homographyFilename |
| 169 self.site = site | 196 self.site = site |
| 194 return ProcessParameters(self.getTrackingConfigurationFilename()) | 221 return ProcessParameters(self.getTrackingConfigurationFilename()) |
| 195 | 222 |
| 196 def getHomographyDistanceUnit(self): | 223 def getHomographyDistanceUnit(self): |
| 197 return self.site.worldDistanceUnit | 224 return self.site.worldDistanceUnit |
| 198 | 225 |
| 199 class Alignment(Base): | 226 # class Alignment(Base): |
| 200 __tablename__ = 'alignments' | 227 # __tablename__ = 'alignments' |
| 201 idx = Column(Integer, primary_key=True) | 228 # idx = Column(Integer, primary_key=True) |
| 202 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) | 229 # cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) # should be sites?? |
| 203 | 230 |
| 204 cameraView = relationship("CameraView", backref=backref('alignments', order_by = idx)) | 231 # cameraView = relationship("CameraView", backref=backref('alignments', order_by = idx)) |
| 205 | 232 |
| 206 def __init__(self, cameraView): | 233 # def __init__(self, cameraView): |
| 207 self.cameraView = cameraView | 234 # self.cameraView = cameraView |
| 208 | 235 |
| 209 class Point(Base): | 236 # class Point(Base): |
| 210 __tablename__ = 'points' | 237 # __tablename__ = 'points' |
| 211 alignmentIdx = Column(Integer, ForeignKey('alignments.idx'), primary_key=True) | 238 # alignmentIdx = Column(Integer, ForeignKey('alignments.idx'), primary_key=True) |
| 212 index = Column(Integer, primary_key=True) # order of points in this alignment | 239 # index = Column(Integer, primary_key=True) # order of points in this alignment |
| 213 x = Column(Float) | 240 # x = Column(Float) |
| 214 y = Column(Float) | 241 # y = Column(Float) |
| 215 | 242 |
| 216 alignment = relationship("Alignment", backref=backref('points', order_by = index)) | 243 # alignment = relationship("Alignment", backref=backref('alignments', order_by = index)) |
| 217 | 244 |
| 218 def __init__(self, alignmentIdx, index, x, y): | 245 # def __init__(self, alignmentIdx, index, x, y): |
| 219 self.alignmentIdx = alignmentIdx | 246 # self.alignmentIdx = alignmentIdx |
| 220 self.index = index | 247 # self.index = index |
| 221 self.x = x | 248 # self.x = x |
| 222 self.y = y | 249 # self.y = y |
| 223 | 250 |
| 224 class VideoSequence(Base): | 251 class VideoSequence(Base): |
| 225 __tablename__ = 'video_sequences' | 252 __tablename__ = 'video_sequences' |
| 226 idx = Column(Integer, primary_key=True) | 253 idx = Column(Integer, primary_key=True) |
| 227 name = Column(String) # path to the video file relative to the the site name | 254 name = Column(String) # path to the video file relative to the the site name |
| 229 duration = Column(Interval) # video sequence duration | 256 duration = Column(Interval) # video sequence duration |
| 230 databaseFilename = Column(String) # path to the database file relative to the the site name | 257 databaseFilename = Column(String) # path to the database file relative to the the site name |
| 231 virtual = Column(Boolean) # indicates it is not a real video sequence (no video file), eg merged | 258 virtual = Column(Boolean) # indicates it is not a real video sequence (no video file), eg merged |
| 232 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) | 259 cameraViewIdx = Column(Integer, ForeignKey('camera_views.idx')) |
| 233 | 260 |
| 234 cameraView = relationship("CameraView", backref=backref('video_sequences', order_by = idx)) | 261 cameraView = relationship("CameraView", backref=backref('camera_views', order_by = idx)) |
| 235 | 262 |
| 236 def __init__(self, name, startTime, duration, cameraView, databaseFilename = None, virtual = False): | 263 def __init__(self, name, startTime, duration, cameraView, databaseFilename = None, virtual = False): |
| 237 '''startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39 | 264 '''startTime is passed as string in utils.datetimeFormat, eg 2011-06-22 10:00:39 |
| 238 duration is a timedelta object''' | 265 duration is a timedelta object''' |
| 239 self.name = name | 266 self.name = name |
| 281 | 308 |
| 282 class TrackingAnnotation(Base): | 309 class TrackingAnnotation(Base): |
| 283 __tablename__ = 'tracking_annotations' | 310 __tablename__ = 'tracking_annotations' |
| 284 idx = Column(Integer, primary_key=True) | 311 idx = Column(Integer, primary_key=True) |
| 285 description = Column(String) # description | 312 description = Column(String) # description |
| 286 | 313 groundTruthFilename = Column(String) |
| 314 firstFrameNum = Column(Integer) # first frame num of annotated data (could be computed on less data) | |
| 315 lastFrameNum = Column(Integer) | |
| 316 videoSequenceIdx = Column(Integer, ForeignKey('video_sequences.idx')) | |
| 317 undistorted = Column(Boolean) # indicates whether the annotations were done in undistorted video space | |
| 318 | |
| 319 videoSequence = relationship("VideoSequence", backref=backref('video_sequences', order_by = idx)) | |
| 320 | |
| 321 def __init__(self, description, groundTruthFilename, firstFrameNum, lastFrameNum, videoSequence, undistorted = True): | |
| 322 self.description = description | |
| 323 self.groundTruthFilename = groundTruthFilename | |
| 324 self.firstFrameNum = firstFrameNum | |
| 325 self.lastFrameNum = lastFrameNum | |
| 326 self.videoSequence = videoSequence | |
| 327 self.undistorted = undistorted | |
| 328 | |
| 329 def getGroundTruthFilename(self, relativeToSiteFilename = True): | |
| 330 if relativeToSiteFilename: | |
| 331 return path.join(self.videoSequence.cameraView.site.getPath(), self.groundTruthFilename) | |
| 332 else: | |
| 333 return self.groundTruthFilename | |
| 334 | |
| 335 def getTimeInterval(self): | |
| 336 return TimeInterval(self.firstFrameNum, self.lastFrameNum) | |
| 337 | |
| 287 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file) | 338 # add class for Analysis: foreign key VideoSequenceId, dataFilename, configFilename (get the one from camera view by default), mask? (no, can be referenced in the tracking cfg file) |
| 288 | |
| 289 # class SiteDescription(Base): # list of lines and polygons describing the site, eg for sidewalks, center lines | |
| 290 | 339 |
| 291 # class Analysis(Base): # parameters necessary for processing the data: free form | 340 # class Analysis(Base): # parameters necessary for processing the data: free form |
| 292 # eg bounding box depends on camera view, tracking configuration depends on camera view | 341 # eg bounding box depends on camera view, tracking configuration depends on camera view |
| 293 # results: sqlite | 342 # results: sqlite |
| 294 | 343 |
