def createsubmissionfromobject(objects, outputsubmissionfilepath, prefix):
    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'San Jose State University'
    # 'fake' unique_method_name should not be too long
    submission.unique_method_name = prefix
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()
Esempio n. 2
0
def createsubmissionfromobject(objects, outputsubmissionfilepath, prefix):
    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_3D  #DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'San Jose State University'
    # 'fake' unique_method_name should not be too long
    submission.unique_method_name = prefix
    submission.description = 'mm3d'
    submission.docker_image_source = "us-west1-docker.pkg.dev/cmpelkk/mycontainers/mymm3d@sha256:d2853bdc620a4e3aa434b1d22bbec8dfcedb09e6378978872d64dd9d1ab20d1b"
    submission.method_link = "https://drive.google.com/drive/folders/1qy8FmmrQfCKjg0G6nKVjME6tmZnlLBTz?usp=sharing"
    submission.sensor_type = submission_pb2.Submission.LIDAR_ALL  #CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()
Esempio n. 3
0
def create_pb_submission(detections, unique_method_name, description,
                         account_name, tracking):
    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.TRACKING_2D if tracking else submission_pb2.Submission.DETECTION_2D
    submission.account_name = account_name
    submission.authors.append('Yuan Xu')
    submission.authors.append('Erdene-Ochir Tuguldur')
    submission.affiliation = 'DAInamite'
    submission.unique_method_name = unique_method_name
    submission.description = description
    submission.method_link = ""
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    objects = create_pd_objects(detections)
    submission.inference_results.CopyFrom(objects)
    # submission.object_types = [LABEL_TYPE.items()]  # all types by default
    # submission.latency_second = ?
    return submission
def createsubmissionfromobject(objects, outputsubmissionfilepath, prefix):
    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'San Jose State University'
    # 'fake' unique_method_name should not be too long
    submission.unique_method_name = prefix
    submission.docker_image_source = "us-west1-docker.pkg.dev/cmpelkk/mycontainers/mytftorchvision@sha256:354ae11bb8947bfc2295aabb789b54b98ea92100425a061084723a9f00b6a35b"
    #Detectron2: "gcr.io/cmpelkk/mytftorch@sha256:629f60dd1b93c1750f909dd3064292f51d04db3b5cc041cf6fdfb26a49028c61"
    submission.description = 'Torchvision'
    submission.method_link = "https://drive.google.com/drive/folders/1qy8FmmrQfCKjg0G6nKVjME6tmZnlLBTz?usp=sharing"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()
Esempio n. 5
0
def generatevalidationsubmission(PATH, outputfilepath, MODEL_DIR):
    now = datetime.datetime.now()
    print("In generatevalidationsubmission, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))

    tf.enable_eager_execution()
    print(tf.__version__)
    print(torch.cuda.is_available())
    print(torch.cuda.device_count())
    print(torch.cuda.get_device_name())
    device = torch.device("cuda")

    print("Loading Waymo validation frames...")
    waymovalidationframes = loadWaymoValidationFrames(PATH)
    #mywaymovaldataset = myNewWaymoDataset(PATH, waymovalidationframes, get_transform(train=False))
    print("Total validation frames: ", len(waymovalidationframes))

    num_classes = 4  #Unknown:0, Vehicles: 1, Pedestrians: 2, Cyclists: 3, Signs (removed)
    # get the model using our helper function
    print("Loading previous model: " + MODEL_DIR)
    #model = get_previous_object_detection_model(num_classes, previous_model_path)
    model = load_previous_object_detection_model(num_classes, MODEL_DIR)
    device = torch.device(
        'cuda') if torch.cuda.is_available() else torch.device('cpu')
    # move model to the right device
    model.to(device)
    model.eval()

    objects = metrics_pb2.Objects()
    f = open(outputfilepath, 'wb')  #waymovalidationframes, waymotestframes
    outputallframes = waymovalidationframes
    print("Total frames: ", len(outputallframes))
    #step=5
    for i in range(len(outputallframes)):  #len(outputallframes)
        if i % 10 == 0:
            print("current frame: ", i)
        frame = outputallframes[i]
        image = tf.image.decode_jpeg(
            frame.images[0].image).numpy()  #front camera image
        img = Image.fromarray(image)
        boxes, pred_cls, scores = get_prediction(model, img, device,
                                                 score_threshold)
        total_boxes = len(boxes)
        if len(boxes) == 0:
            continue
        for i in range(total_boxes):  #patch in pred_bbox:
            label = pred_cls[i]
            bbox = boxes[i]
            score = scores[i]
            o = metrics_pb2.Object()
            o.context_name = frame.context.name
            o.frame_timestamp_micros = int(frame.timestamp_micros)
            o.camera_name = dataset_pb2.CameraName.FRONT
            o.score = score

            # Populating box and score.
            box = label_pb2.Label.Box()
            box.length = bbox[1][0] - bbox[0][0]
            box.width = bbox[1][1] - bbox[0][1]
            box.center_x = bbox[0][0] + box.length * 0.5
            box.center_y = bbox[0][1] + box.width * 0.5

            o.object.box.CopyFrom(box)
            o.object.detection_difficulty_level = label_pb2.Label.LEVEL_1
            o.object.num_lidar_points_in_box = 100
            o.object.type = INSTANCE_pb2[
                label]  # INSTANCE_CATEGORY_NAMES.index(label) #INSTANCE_pb2[label]
            print(
                f'Object type label: {label}, {INSTANCE_pb2[label]}, {INSTANCE_CATEGORY_NAMES.index(label)}'
            )
            assert o.object.type != label_pb2.Label.TYPE_UNKNOWN
            objects.objects.append(o)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'torchvisionfaster'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputfilepath, 'wb')
    #f = open("./drive/My Drive/waymo_submission/waymo35.bin", 'wb')
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
Esempio n. 6
0
def evaluateWaymoValidationFramesAllcameraSubmission(PATH,
                                                     model_path,
                                                     config_path,
                                                     validation_folders,
                                                     outputsubmissionfilepath,
                                                     VisEnable,
                                                     imagesavepath,
                                                     nameprefix="output"):
    data_files = [
        path for x in validation_folders
        for path in glob(os.path.join(PATH, x, "*.tfrecord"))
    ]
    print(data_files)  # all TFRecord file list
    print(len(data_files))
    # create a list of dataset for each TFRecord file
    dataset = [
        tf.data.TFRecordDataset(FILENAME, compression_type='')
        for FILENAME in data_files
    ]
    # total number of TFrecord files * 40 frame(each TFrecord)

    wod_latency_submission.setupmodeldir(model_path, config_path)

    wod_latency_submission.initialize_model()

    objects = metrics_pb2.Objects()  # submission objects

    required_field = wod_latency_submission.DATA_FIELDS
    print(required_field)

    fps = FPS().start()

    #allcameras=["FRONT_IMAGE", "FRONT_LEFT_IMAGE", "FRONT_RIGHT_IMAGE", "SIDE_LEFT_IMAGE", "SIDE_RIGHT_IMAGE"]

    frameid = 0
    testImagedict = {}
    for i, data_file in enumerate(dataset):
        print("Datafile: ", i)  # Each TFrecord file
        # Create frame based on Waymo API, 199 frames per TFrecord (20s, 10Hz)
        for idx, data in enumerate(data_file):
            #             if idx % 5 != 0: #Downsample every 5 images, reduce to 2Hz, total around 40 frames
            #                 continue
            frame = open_dataset.Frame()
            frame.ParseFromString(bytearray(data.numpy()))

            #frame=frames[frameid]
            convertedframesdict = convert_frame_to_dict_cameras(
                frame)  #data_array[frameid]
            #Allconvertedframesdict.append(convertedframesdict)
            frame_timestamp_micros = convertedframesdict['TIMESTAMP']  #['key']
            context_name = frame.context.name
            print(
                f'Current frame id: {frameid}, idx: {idx}, context_name: {context_name}, frame_timestamp_micros: {frame_timestamp_micros}'
            )

            for imagename in allcameras:  #go through all cameras
                testImagedict[
                    required_field[0]] = convertedframesdict[imagename].copy()
                start_time = time.perf_counter()  #.time()
                #result = wod_latency_submission.run_model(Front_image)
                result = wod_latency_submission.run_model(
                    **testImagedict)  #All images
                end_time = time.perf_counter()  #.time()
                elapsed_time = end_time - start_time
                print('Inference time: ' + str(elapsed_time * 1000) +
                      f'ms, camera name: {imagename}')
                # createsubmisionobject(objects, result['boxes'], result['classes'],
                #                     result['scores'], context_name, frame_timestamp_micros)
                createsubmisioncameraobject(objects, result['boxes'],
                                            result['classes'],
                                            result['scores'], context_name,
                                            frame_timestamp_micros,
                                            cameraname_map[imagename])
                if VisEnable == True:
                    display_str = f'Inference time: {str(elapsed_time*1000)}ms, camera name: {imagename}, context_name: {context_name}, timestamp_micros: {frame_timestamp_micros}'
                    savedetectedimagetofile(convertedframesdict[imagename],
                                            frameid, result, imagename,
                                            display_str, nameprefix,
                                            imagesavepath)
                fps.update()
            frameid = frameid + 1
            if frameid % 5000 == 0:
                with open(
                        os.path.join(
                            imagesavepath,
                            nameprefix + '_' + str(frameid) + '.pickle'),
                        'wb') as f:
                    pickle.dump(objects, f)

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

    with open(os.path.join(imagesavepath, nameprefix + '.pickle'), 'wb') as f:
        pickle.dump(objects, f)
    # with open('allframedics.pickle', 'wb') as f:
    #     pickle.dump(Allconvertedframesdict, f)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'San Jose State University'
    submission.unique_method_name = nameprefix  #'fake'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
Esempio n. 7
0
def evaluateWaymoValidationFramesSubmission(PATH,
                                            validation_folders,
                                            outputsubmissionfilepath,
                                            VisEnable,
                                            outputfile="./output_video1.mp4"):
    data_files = [
        path for x in validation_folders
        for path in glob(os.path.join(PATH, x, "*.tfrecord"))
    ]
    print(data_files)  # all TFRecord file list
    print(len(data_files))
    # create a list of dataset for each TFRecord file
    dataset = [
        tf.data.TFRecordDataset(FILENAME, compression_type='')
        for FILENAME in data_files
    ]
    # total number of TFrecord files * 40 frame(each TFrecord)

    objects = metrics_pb2.Objects()  # submission objects

    wod_latency_submission.initialize_model()

    required_field = wod_latency_submission.DATA_FIELDS
    print(required_field)

    if VisEnable == True:
        frame_width = 1920
        frame_height = 1280
        out = cv2.VideoWriter(outputfile,
                              cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 5,
                              (frame_width, frame_height))
    fps = FPS().start()

    frameid = 0
    for i, data_file in enumerate(dataset):
        print("Datafile: ", i)  # Each TFrecord file
        # Create frame based on Waymo API, 199 frames per TFrecord (20s, 10Hz)
        for idx, data in enumerate(data_file):
            #             if idx % 5 != 0: #Downsample every 5 images, reduce to 2Hz, total around 40 frames
            #                 continue
            frame = open_dataset.Frame()
            frame.ParseFromString(bytearray(data.numpy()))

            #frame=frames[frameid]
            convertedframesdict = convert_frame_to_dict_cameras(
                frame)  #data_array[frameid]
            #Allconvertedframesdict.append(convertedframesdict)
            frame_timestamp_micros = convertedframesdict['TIMESTAMP']  #['key']
            context_name = frame.context.name
            print(
                f'Current frame id: {frameid}, context_name: {context_name}, frame_timestamp_micros: {frame_timestamp_micros}'
            )

            start_time = time.perf_counter()  #.time()
            #result = wod_latency_submission.run_model(Front_image)
            result = wod_latency_submission.run_model(
                **convertedframesdict)  #All images
            end_time = time.perf_counter()  #.time()
            elapsed_time = end_time - start_time
            print('Inference time: ' + str(elapsed_time) + 's')
            # print(result)

            createsubmisionobject(objects, result['boxes'], result['classes'],
                                  result['scores'], context_name,
                                  frame_timestamp_micros)

            if VisEnable == True:
                Front_image = convertedframesdict[required_field[0]]
                #Front_image = convertedframesdict['FRONT_IMAGE']
                image_np_with_detections = Front_image.copy()
                visualization_util.visualize_boxes_and_labels_on_image_array(
                    image_np_with_detections,
                    result['boxes'],
                    result['classes'],
                    result['scores'],
                    category_index,
                    use_normalized_coordinates=False,
                    max_boxes_to_draw=200,
                    min_score_thresh=Threshold,
                    agnostic_mode=False)
                display_str = f'Inference time: {str(elapsed_time*1000)}ms, context_name: {context_name}, timestamp_micros: {frame_timestamp_micros}'
                visualization_util.draw_text_on_image(image_np_with_detections,
                                                      0,
                                                      0,
                                                      display_str,
                                                      color='black')
                #visualization_util.save_image_array_as_png(image_np_with_detections, outputfile)

                name = './Test_data/frame' + str(frameid) + '.jpg'
                #print ('Creating\...' + name)
                # cv2.imwrite(name, image_np_with_detections) #write to image folder
                #out.write(image_np_with_detections)
                out.write(
                    cv2.cvtColor(image_np_with_detections, cv2.COLOR_RGB2BGR))
                #cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
            frameid = frameid + 1
            fps.update()

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
    if VisEnable == True:
        out.release()

    with open('objectsresult0525_detectron282k_valall_front.pickle',
              'wb') as f:
        pickle.dump(objects, f)
    # with open('allframedics.pickle', 'wb') as f:
    #     pickle.dump(Allconvertedframesdict, f)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'fake'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
Esempio n. 8
0
def evaluateWaymoValidationFramesFakeSubmission(
        PATH,
        validation_folders,
        outputsubmissionfilepath,
        outputfile="./output_video1.mp4"):
    data_files = [
        path for x in validation_folders
        for path in glob(os.path.join(PATH, x, "*.tfrecord"))
    ]
    print(data_files)  # all TFRecord file list
    print(len(data_files))
    # create a list of dataset for each TFRecord file
    dataset = [
        tf.data.TFRecordDataset(FILENAME, compression_type='')
        for FILENAME in data_files
    ]
    # total number of TFrecord files * 40 frame(each TFrecord)

    objects = metrics_pb2.Objects()  # submission objects

    frame_width = 1920
    frame_height = 1280
    out = cv2.VideoWriter(outputfile,
                          cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 5,
                          (frame_width, frame_height))
    fps = FPS().start()

    frameid = 0
    for i, data_file in enumerate(dataset):
        print("Datafile: ", i)  # Each TFrecord file
        # Create frame based on Waymo API, 199 frames per TFrecord (20s, 10Hz)
        for idx, data in enumerate(data_file):
            #             if idx % 5 != 0: #Downsample every 5 images, reduce to 2Hz, total around 40 frames
            #                 continue
            frame = open_dataset.Frame()
            frame.ParseFromString(bytearray(data.numpy()))

            #frame=frames[frameid]
            convertedframesdict = convert_frame_to_dict_cameras(
                frame)  #data_array[frameid]
            #Allconvertedframesdict.append(convertedframesdict)
            frame_timestamp_micros = convertedframesdict['TIMESTAMP']  #['key']
            context_name = frame.context.name
            print(
                f'Current frame id: {frameid}, context_name: {context_name}, frame_timestamp_micros: {frame_timestamp_micros}'
            )

            o_list = []
            boundingbox = []
            boxscore = []
            boxtype = []
            for camera_labels in frame.camera_labels:
                if camera_labels.name != 1:  #Only use front camera
                    continue
                for gt_label in camera_labels.labels:
                    o = metrics_pb2.Object()
                    # The following 3 fields are used to uniquely identify a frame a prediction
                    # is predicted at.
                    o.context_name = frame.context.name
                    # The frame timestamp for the prediction. See Frame::timestamp_micros in
                    # dataset.proto.
                    o.frame_timestamp_micros = frame.timestamp_micros
                    # This is only needed for 2D detection or tracking tasks.
                    # Set it to the camera name the prediction is for.
                    o.camera_name = camera_labels.name

                    # Populating box and score.
                    box = label_pb2.Label.Box()
                    box.center_x = gt_label.box.center_x
                    box.center_y = gt_label.box.center_y
                    box.length = gt_label.box.length
                    box.width = gt_label.box.width
                    boundingbox.append(
                        [box.center_x, box.center_y, box.length,
                         box.width])  #width height
                    o.object.box.CopyFrom(box)
                    # This must be within [0.0, 1.0]. It is better to filter those boxes with
                    # small scores to speed up metrics computation.
                    o.score = 0.9
                    boxscore.append(o.score)
                    # Use correct type.
                    o.object.type = gt_label.type
                    boxtype.append(o.object.type)
                    o_list.append(o)
                    print(
                        f'Camera labelname: {camera_labels.name}, object type: { gt_label.type}, box:{box}'
                    )

            for o in o_list:
                objects.objects.append(o)
            # Save the original image
            #output_path = "./test.png"
            #visualization_util.save_image_array_as_png(Front_image, output_path)
            boundingbox = np.array(boundingbox)
            boxscore = np.array(boxscore)
            boxtype = np.array(boxtype).astype(np.uint8)

            Front_image = convertedframesdict['FRONT_IMAGE']
            image_np_with_detections = Front_image.copy()
            visualization_util.visualize_boxes_and_labels_on_image_array(
                image_np_with_detections,
                boundingbox,
                boxtype,
                boxscore,
                category_index,
                use_normalized_coordinates=False,
                max_boxes_to_draw=200,
                min_score_thresh=Threshold,
                agnostic_mode=False)
            display_str = f'context_name: {context_name}, timestamp_micros: {frame_timestamp_micros}'
            visualization_util.draw_text_on_image(image_np_with_detections,
                                                  0,
                                                  0,
                                                  display_str,
                                                  color='black')
            #visualization_util.save_image_array_as_png(image_np_with_detections, outputfile)

            name = './Test_data/frame' + str(frameid) + '.jpg'
            #print ('Creating\...' + name)
            # cv2.imwrite(name, image_np_with_detections) #write to image folder
            fps.update()
            #out.write(image_np_with_detections)
            out.write(cv2.cvtColor(image_np_with_detections,
                                   cv2.COLOR_RGB2BGR))
            #cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
            frameid = frameid + 1

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
    out.release()

    with open('objectsresult_gtvalall.pickle', 'wb') as f:
        pickle.dump(objects, f)
    # with open('allframedics.pickle', 'wb') as f:
    #     pickle.dump(Allconvertedframesdict, f)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'fake'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
Esempio n. 9
0
def evaluateallframesgtfakesubmission(frames,
                                      outputsubmissionfilepath,
                                      outputfile="./output_video1.mp4"):
    array_len = len(frames)  #4931 frames for validation_0000
    # 20, 200 frames in one file, downsample by 10
    print("Frames lenth:", array_len)
    print("Final_array type:", type(frames))  # class 'list'

    objects = metrics_pb2.Objects()  # submission objects

    frame_width = 1920
    frame_height = 1280
    out = cv2.VideoWriter(outputfile,
                          cv2.VideoWriter_fourcc('M', 'P', '4', 'V'), 5,
                          (frame_width, frame_height))
    fps = FPS().start()

    #wod_latency_submission.initialize_model()

    #required_field = wod_latency_submission.DATA_FIELDS
    #print(required_field)
    #Allconvertedframesdict=[]

    for frameid in range(array_len):
        #frameid = 5
        print("frameid:", frameid)
        # {'key':key, 'context_name':context_name, 'framedict':framedict}
        frame = frames[frameid]
        convertedframesdict = convert_frame_to_dict_cameras(
            frame)  #data_array[frameid]
        #Allconvertedframesdict.append(convertedframesdict)
        frame_timestamp_micros = convertedframesdict['TIMESTAMP']  #['key']
        context_name = frame.context.name

        o_list = []
        boundingbox = []
        boxscore = []
        boxtype = []
        for camera_labels in frame.camera_labels:
            if camera_labels.name != 1:  #Only use front camera
                continue
            for gt_label in camera_labels.labels:
                o = metrics_pb2.Object()
                # The following 3 fields are used to uniquely identify a frame a prediction
                # is predicted at.
                o.context_name = frame.context.name
                # The frame timestamp for the prediction. See Frame::timestamp_micros in
                # dataset.proto.
                o.frame_timestamp_micros = frame.timestamp_micros
                # This is only needed for 2D detection or tracking tasks.
                # Set it to the camera name the prediction is for.
                o.camera_name = camera_labels.name

                # Populating box and score.
                box = label_pb2.Label.Box()
                box.center_x = gt_label.box.center_x
                box.center_y = gt_label.box.center_y
                box.length = gt_label.box.length
                box.width = gt_label.box.width
                boundingbox.append(
                    [box.center_x, box.center_y, box.length,
                     box.width])  #width height
                o.object.box.CopyFrom(box)
                # This must be within [0.0, 1.0]. It is better to filter those boxes with
                # small scores to speed up metrics computation.
                o.score = 0.9
                boxscore.append(o.score)
                # Use correct type.
                o.object.type = gt_label.type
                boxtype.append(o.object.type)
                o_list.append(o)
                print(
                    f'Camera labelname: {camera_labels.name}, object type: { gt_label.type}, box:{box}'
                )

        # Save the original image
        #output_path = "./test.png"
        #visualization_util.save_image_array_as_png(Front_image, output_path)
        boundingbox = np.array(boundingbox)
        boxscore = np.array(boxscore)
        boxtype = np.array(boxtype).astype(np.uint8)

        Front_image = convertedframesdict['FRONT_IMAGE']
        image_np_with_detections = Front_image.copy()
        visualization_util.visualize_boxes_and_labels_on_image_array(
            image_np_with_detections,
            boundingbox,
            boxtype,
            boxscore,
            category_index,
            use_normalized_coordinates=False,
            max_boxes_to_draw=200,
            min_score_thresh=Threshold,
            agnostic_mode=False)
        display_str = f'context_name: {context_name}, timestamp_micros: {frame_timestamp_micros}'
        visualization_util.draw_text_on_image(image_np_with_detections,
                                              0,
                                              0,
                                              display_str,
                                              color='black')
        #visualization_util.save_image_array_as_png(image_np_with_detections, outputfile)

        name = './Test_data/frame' + str(frameid) + '.jpg'
        #print ('Creating\...' + name)
        # cv2.imwrite(name, image_np_with_detections) #write to image folder
        fps.update()
        #out.write(image_np_with_detections)
        out.write(cv2.cvtColor(image_np_with_detections, cv2.COLOR_RGB2BGR))
        #cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
    out.release()

    with open('objectsresult_gtvalall.pickle', 'wb') as f:
        pickle.dump(objects, f)
    # with open('allframedics.pickle', 'wb') as f:
    #     pickle.dump(Allconvertedframesdict, f)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'fake'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))
    for i, data_file in enumerate(dataset):
        print("Datafile: ", i)  #Each TFrecord file
        for idx, data in enumerate(
                data_file
        ):  #Create frame based on Waymo API, 199 frames per TFrecord (20s, 10Hz)
            #             if idx % 5 != 0: #Downsample every 5 images, reduce to 2Hz, total around 40 frames
            #                 continue
            frame = dataset_pb2.Frame()
            frame.ParseFromString(bytearray(data.numpy()))
            o_list = _fancy_deep_learning(frame)
            frames.append(frame)
            for o in o_list:
                objects.objects.append(o)

    #https://github.com/waymo-research/waymo-open-dataset/blob/master/waymo_open_dataset/protos/submission.proto
    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'fake'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    submission.docker_image_source = ''  #// Link to the latency submission Docker image stored in Google Storage bucket
    #object_types // Object types this submission contains. By default, we assume all types.
    #latency_second Self-reported end to end inference latency in seconds
def evaluateallframescreatesubmission(frames, outputsubmissionfilepath, outputfile="./output_video1.mp4"):
    array_len = len(frames) #4931 frames for validation_0000
    # 20, 200 frames in one file, downsample by 10
    print("Frames lenth:", array_len)
    print("Final_array type:", type(frames))  # class 'list'

    objects = metrics_pb2.Objects()  # submission objects

    frame_width = 1920
    frame_height = 1280
    out = cv2.VideoWriter(outputfile, cv2.VideoWriter_fourcc(
        'M', 'P', '4', 'V'), 5, (frame_width, frame_height))
    fps = FPS().start()

    wod_latency_submission.initialize_model()

    required_field = wod_latency_submission.DATA_FIELDS
    print(required_field)

    for frameid in range(array_len):
        #frameid = 5
        print("frameid:", frameid)
        # {'key':key, 'context_name':context_name, 'framedict':framedict}
        currentframe=frames[frameid]
        convertedframesdict = convert_frame_to_dict_cameras(currentframe) #data_array[frameid]
        frame_timestamp_micros = convertedframesdict['TIMESTAMP']#['key']
        context_name = currentframe.context.name #convertedframesdict['context_name']
        #framedict = convertedframesdict['framedict']
        # 10017090168044687777_6380_000_6400_000
        #print('context_name:', context_name)
        # print('frame_timestamp_micros:', frame_timestamp_micros)  # 1550083467346370

        #result = wod_latency_submission.run_model(framedict[required_field[0]], framedict[required_field[1]])
        #result = wod_latency_submission.run_model(**framedict)
        #Front_image = framedict[required_field[0]]
        start_time = time.time()
        #result = wod_latency_submission.run_model(Front_image)
        result = wod_latency_submission.run_model(**convertedframesdict)#All images
        end_time = time.time()
        elapsed_time = end_time - start_time
        print('Inference time: ' + str(elapsed_time) + 's')
        # print(result)

        createsubmisionobject(objects, result['boxes'], result['classes'],
                              result['scores'], context_name, frame_timestamp_micros)

        # Save the original image
        #output_path = "./test.png"
        #visualization_util.save_image_array_as_png(Front_image, output_path)

        Front_image = convertedframesdict[required_field[0]]
        image_np_with_detections = Front_image.copy()
        visualization_util.visualize_boxes_and_labels_on_image_array(image_np_with_detections, result['boxes'], result['classes'], result['scores'], category_index, use_normalized_coordinates=False,
                                                                     max_boxes_to_draw=200,
                                                                     min_score_thresh=Threshold,
                                                                     agnostic_mode=False)
        display_str=f'Inference time: {str(elapsed_time*1000)}ms, context_name: {context_name}, timestamp_micros: {frame_timestamp_micros}'
        visualization_util.draw_text_on_image(image_np_with_detections, 0, 0, display_str, color='black')
        #visualization_util.save_image_array_as_png(image_np_with_detections, outputfile)

        name = './Test_data/frame' + str(frameid) + '.jpg'
        #print ('Creating\...' + name)
        # cv2.imwrite(name, image_np_with_detections) #write to image folder
        fps.update()
        #out.write(image_np_with_detections)
        out.write(cv2.cvtColor(image_np_with_detections, cv2.COLOR_RGB2BGR))
        #cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
        

    # stop the timer and display FPS information
    fps.stop()
    print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
    print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))
    out.release()

    with open('objectsresult.pickle', 'wb') as f:
        pickle.dump(objects, f)

    submission = submission_pb2.Submission()
    submission.task = submission_pb2.Submission.DETECTION_2D
    submission.account_name = '*****@*****.**'
    submission.authors.append('Kaikai Liu')
    submission.affiliation = 'None'
    submission.unique_method_name = 'torchvisionfaster'
    submission.description = 'none'
    submission.method_link = "empty method"
    submission.sensor_type = submission_pb2.Submission.CAMERA_ALL
    submission.number_past_frames_exclude_current = 0
    submission.number_future_frames_exclude_current = 0
    submission.inference_results.CopyFrom(objects)
    f = open(outputsubmissionfilepath, 'wb')  # output submission file
    f.write(submission.SerializeToString())
    f.close()

    now = datetime.datetime.now()
    print("Finished validation, current date and time : ")
    print(now.strftime("%Y-%m-%d %H:%M:%S"))