code: def _parse_kitti_detection_row(row, frame_size, extra_attrs):
      label = row[0]
  
      attributes = {}
  
      if "truncated" in extra_attrs:
          attributes["truncated"] = float(row[1])
  
      if "occluded" in extra_attrs:
          attributes["occluded"] = int(row[2])
  
      if "alpha" in extra_attrs:
          attributes["alpha"] = float(row[3])
  
      width, height = frame_size
      xtl, ytl, xbr, ybr = tuple(map(float, row[4:8]))
      bounding_box = [
          xtl / width,
          ytl / height,
          (xbr - xtl) / width,
          (ybr - ytl) / height,
      ]
  
      if "dimensions" in extra_attrs:
          try:
              attributes["dimensions"] = list(map(float, row[8:11]))
          except IndexError:
              pass
  
      if "location" in extra_attrs:
          try:
              attributes["location"] = list(map(float, row[11:14]))
          except IndexError:
              pass
  
      if "rotation_y" in extra_attrs:
          try:
              attributes["rotation_y"] = float(row[14])
          except IndexError:
              pass
  
      try:
          confidence = float(row[15])
      except IndexError:
          confidence = None
  
      return fol.Detection(
          label=label,
          bounding_box=bounding_box,
          confidence=confidence,
          **attributes,
      )
  
imports: import csv
  import logging
  import struct
  import os
  import numpy
  import eta.core.utils
  import eta.core.web
  import fiftyone
  import fiftyone.core.labels
  import fiftyone.core.metadata
  import fiftyone.core.storage
  import fiftyone.core.utils
  import fiftyone.utils.data
label_desc: Use image node_id 5 for calling a global function with example usage: _parse_kitti_detection_row(row, frame_size, extra_attrs) and returns: fol