예제 #1
0
def look_at(log, output, anti_instagram, line_detector, image_prep,
            lane_filter, all_details):
    filename = get_local_bag_file(log)

    bag = rosbag.Bag(filename)

    vehicle_name = dtu.which_robot(bag)

    dtu.logger.info('Vehicle name: %s' % vehicle_name)

    gp = GroundProjection(vehicle_name)

    topic = dtu.get_image_topic(bag)
    res = dtu.d8n_read_all_images_from_bag(bag, topic, max_images=1)

    image_cv = res[0]['rgb']

    #     dtu.logger.debug(dtu.describe_value(image_cv))

    image_cv_bgr = dtu.bgr_from_rgb(image_cv)

    dtu.DuckietownConstants.show_timeit_benchmarks = True
    res, _stats = run_pipeline(image_cv_bgr,
                               gp=gp,
                               anti_instagram_name=anti_instagram,
                               line_detector_name=line_detector,
                               image_prep_name=image_prep,
                               lane_filter_name=lane_filter,
                               all_details=all_details)

    res = dtu.resize_small_images(res)

    dtu.write_bgr_images_as_jpgs(res, output)
예제 #2
0
 def show_info(self, logs):
     for id_log, log in list(logs.items()):
         try:
             filename = get_local_bag_file(log)
             print(filename)
         except NotAvailableLocally:
             dtu.logger.error(f"No local file for {id_log}")
예제 #3
0
def process_one_processor(processor_name_or_spec, prefix_in, prefix_out,
                          bag_filename, next_bag_filename, t0_absolute,
                          t1_absolute, log):
    dtu.DuckietownConstants.show_timeit_benchmarks = True

    easy_algo_db = get_easy_algo_db()
    processor = easy_algo_db.create_instance(ProcessorInterface.FAMILY,
                                             processor_name_or_spec)

    dtu.logger.info('in: bag_filename: %s' % bag_filename)
    if not os.path.exists(bag_filename):
        msg = 'File does not exist: %s' % bag_filename
        raise ValueError(msg)
    dtu.logger.info('out: next_bag_filename: %s' % next_bag_filename)
    dtu.logger.info('t0_absolute: %s' % t0_absolute)
    dtu.logger.info('t1_absolute: %s' % t1_absolute)

    log = download_if_necessary(log)
    filename = get_local_bag_file(log)
    original_bag = rosbag.Bag(filename)
    bag_absolute_t0_ref = original_bag.get_start_time()
    original_bag.close()

    dtu.d8n_make_sure_dir_exists(next_bag_filename)
    out_bag = rosbag.Bag(next_bag_filename, 'w')

    bag0 = rosbag.Bag(bag_filename)
    t0_rel = t0_absolute - bag0.get_start_time()
    t1_rel = t1_absolute - bag0.get_start_time()

    in_bag = dtu.BagReadProxy(bag0,
                              t0_rel,
                              t1_rel,
                              bag_absolute_t0_ref=bag_absolute_t0_ref)

    utils = ProcessorUtils(bag_out=out_bag, log=log)
    processor.process_log(in_bag, prefix_in, out_bag, prefix_out, utils)
    in_bag.close()
    # also copy the other messages

    in_bag1 = rosbag.Bag(bag_filename)
    for topic, msg, t in in_bag1.read_messages(raw=True):
        out_bag.write(topic, msg, t, raw=True)
    in_bag1.close()

    out_bag.close()

    #     r = rosbag.Bag(next_bag_filename)
    #     for topic, msg, t in r.read_messages(raw=True):
    #         pass
    #     r.close()

    #     cmd = ['rosbag', 'fix', next_bag_filename, next_bag_filename]
    #     dtu.system_cmd_result(cwd='.', cmd=cmd, raise_on_error=True, display_stdout=True,
    #                           display_stderr=True)
    #     cmd = ['rosbag', 'reindex', next_bag_filename]
    #     dtu.system_cmd_result(cwd='.', cmd=cmd, raise_on_error=True, display_stdout=True,
    #                           display_stderr=True)
    return next_bag_filename
예제 #4
0
def get_logs_description_table(logs, color=True):
    table = []
    table.append([
        "#",
        "Log name",
        "rc",
        "description",
        "bag size",
        "hash bag",
        "date",
        "length",
        "vehicle name",
        "filename",
        "valid",
        "topics",
    ])
    for i, (_, log) in enumerate(logs.items()):
        row = []
        row.append(i)
        row.append(log.log_name)
        row.append(len(log.resources))
        #        row.append(log.map_name)
        row.append(log.description)
        dtr = DTR.from_yaml(log.resources["bag"])
        bag_size_mb = f"{dtr.size / (1024.0 * 1024):8.1f} MB"
        row.append(bag_size_mb)
        row.append(f"{dtr.name} {bag_size_mb} \n{dtr.hash['sha1']}")
        row.append(log.date)
        if log.length is not None:
            l = f"{log.length:5.1f} s"
        else:
            l = "(none)"
        row.append(l)
        row.append(log.vehicle)

        try:
            filename = get_local_bag_file(log)
            row.append(dtu.friendly_path(filename))
        except NotAvailableLocally:
            row.append("not local")

        if log.valid:
            sr = "Yes."
        else:
            sr = log.error_if_invalid
        row.append(sr)
        if log.bag_info is not None:
            info = yaml.dump(log.bag_info["topics"])
        else:
            info = "(none)"
        if color and not log.valid:
            row = dtu.make_row_red(row)

        row.append(info)
        table.append(row)
    return table
예제 #5
0
파일: videos.py 프로젝트: light5551/dt-core
def jobs_videos(context, log, name, outd, only_camera):
    filename = get_local_bag_file(log)

    bag = rosbag.Bag(filename)
    main_camera_topic = dbu.get_image_topic(bag)
    min_messages = 5  # need at least 5 frames to make a video

    topics = [
        _ for _, __ in dbu.d8n_get_all_images_topic_bag(
            bag, min_messages=min_messages)
    ]
    bag.close()

    only_camera_fn = outd + "-video.mp4"

    for topic in topics:
        stop_at = min_messages + 2
        actual_count, count, _stopped_early = dbu.count_messages_in_slice(
            filename, topic, log.t0, log.t1, stop_at=stop_at)

        assert count >= min_messages
        if actual_count < min_messages:
            msg = f"There are only {actual_count} (out of {count}) in the slice [{log.t0}, {log.t1}]"
            msg += f"\n topic: {topic}"
            continue

        d = topic.replace("/", "_")
        if d.startswith("_"):
            d = d[1:]

        if only_camera:
            if topic != main_camera_topic:
                continue
            out = only_camera_fn
            j = context.comp(
                dbu.d8n_make_video_from_bag,
                filename,
                topic,
                out,
                t0=log.t0,
                t1=log.t1,
                job_id=f"{name}-{topic}",
            )

        else:
            out = os.path.join(outd, name + "-" + d + ".mp4")
            j = context.comp(dbu.d8n_make_video_from_bag,
                             filename,
                             topic,
                             out,
                             job_id=f"{name}-{topic}")

            # create link
            if topic == main_camera_topic:
                context.comp(link, j, out, only_camera_fn)
예제 #6
0
def jobs_videos(context, log, name, outd, only_camera):
    filename = get_local_bag_file(log)

    bag = rosbag.Bag(filename)
    main_camera_topic = dtu.get_image_topic(bag)
    min_messages = 5  # need at least 5 frames to make a video

    topics = [
        _ for _, __ in dtu.d8n_get_all_images_topic_bag(
            bag, min_messages=min_messages)
    ]
    bag.close()

    only_camera_fn = outd + '-video.mp4'

    for topic in topics:
        stop_at = min_messages + 2
        actual_count, count, _stopped_early = \
            count_messages_in_slice(filename, topic, log.t0, log.t1, stop_at=stop_at)

        assert count >= min_messages
        if actual_count < min_messages:
            msg = 'There are only %d (out of %d) in the slice [%s, %s]' % (
                actual_count, count, log.t0, log.t1)
            msg += '\n topic: %s' % topic
            continue

        d = topic.replace('/', '_')
        if d.startswith('_'):
            d = d[1:]

        if only_camera:
            if topic != main_camera_topic:
                continue
            out = only_camera_fn
            j = context.comp(dtu.d8n_make_video_from_bag,
                             filename,
                             topic,
                             out,
                             t0=log.t0,
                             t1=log.t1,
                             job_id='%s-%s' % (name, topic))

        else:
            out = os.path.join(outd, name + '-' + d + '.mp4')
            j = context.comp(dtu.d8n_make_video_from_bag,
                             filename,
                             topic,
                             out,
                             job_id='%s-%s' % (name, topic))

            # create link
            if topic == main_camera_topic:
                context.comp(link, j, out, only_camera_fn)
예제 #7
0
def get_logs_description_table(logs, color=True):
    table = []
    table.append([
        '#', 'Log name', 'rc', 'description', 'bag size', 'hash bag', 'date',
        'length', 'vehicle name', 'filename', 'valid', 'topics'
    ])
    for i, (_, log) in enumerate(logs.items()):
        row = []
        row.append(i)
        row.append(log.log_name)
        row.append(len(log.resources))
        #        row.append(log.map_name)
        row.append(log.description)
        dtr = DTR.from_yaml(log.resources['bag'])
        bag_size_mb = '%8.1f MB' % (dtr.size / (1024.0 * 1024))
        row.append(bag_size_mb)
        row.append('%s %s \n%s' % (dtr.name, bag_size_mb, dtr.hash['sha1']))
        row.append(log.date)
        if log.length is not None:
            l = '%5.1f s' % log.length
        else:
            l = '(none)'
        row.append(l)
        row.append(log.vehicle)

        try:
            filename = get_local_bag_file(log)
            row.append(dtu.friendly_path(filename))
        except NotAvailableLocally:
            row.append('not local')

        if log.valid:
            sr = 'Yes.'
        else:
            sr = log.error_if_invalid
        row.append(sr)
        if log.bag_info is not None:
            info = yaml.dump(log.bag_info['topics'])
        else:
            info = '(none)'
        if color and not log.valid:
            row = dtu.make_row_red(row)

        row.append(info)
        table.append(row)
    return table
예제 #8
0
def look_at(
    log,
    output: str,
    anti_instagram: str,
    line_detector: str,
    image_prep: str,
    lane_filter: str,
    all_details: bool,
) -> None:
    filename = get_local_bag_file(log)

    bag = rosbag.Bag(filename)

    vehicle_name = dbu.which_robot(bag)

    dtu.logger.info(f"Vehicle name: {vehicle_name}")

    brp = dbu.BagReadProxy(bag)
    rcg = get_robot_camera_geometry_from_log(brp)

    topic = dbu.get_image_topic(bag)
    res = dbu.d8n_read_all_images_from_bag(bag, topic, max_images=1)

    image_cv = res[0]["rgb"]

    #     dtu.logger.debug(dtu.describe_value(image_cv))

    image_cv_bgr = dtu.bgr_from_rgb(image_cv)

    dtu.DuckietownConstants.show_timeit_benchmarks = True
    res, _stats = run_pipeline(
        image_cv_bgr,
        gpg=rcg.gpg,
        rectifier=rcg.rectifier,
        anti_instagram_name=anti_instagram,
        line_detector_name=line_detector,
        image_prep_name=image_prep,
        lane_filter_name=lane_filter,
        all_details=all_details,
    )

    res = dtu.resize_small_images(res)

    dtu.write_bgr_images_as_jpgs(res, output)
예제 #9
0
파일: copy.py 프로젝트: light5551/dt-core
    def go(self):
        extra = self.options.get_extra()
        if not extra:
            query = "*"
        else:
            if len(extra) > 1:
                msg = "Expected only one extra argument."
                raise dtu.DTUserError(msg)
            query = extra[0]

        db = self.get_easy_logs_db()
        logs = db.query(query)

        self.info(f"Found {len(logs)} logs.")
        outdir = self.options["outdir"]

        if outdir is None:
            outdir = "."
            msg = 'Option "--outdir" not passed. Will copy to current directory.'
            self.warn(msg)

        if not os.path.exists(outdir):
            dtu.mkdirs_thread_safe(outdir)

        for id_log, log in list(logs.items()):
            log = download_if_necessary(log)
            out = os.path.join(outdir, id_log + ".bag")
            if os.path.exists(out):
                print(out)
                continue

            try:
                filename = get_local_bag_file(log)
                shutil.copy(filename, out)
                print(out)
            except NotAvailableLocally:
                dtu.logger.error(f"No local file for {id_log}")
예제 #10
0
def work(log, outd, max_images, only_camera, write_frames):
    filename = get_local_bag_file(log)
    t0 = log.t0
    t1 = log.t1

    MIN_HEIGHT = 480

    # noinspection PyUnboundLocalVariable
    bag = rosbag.Bag(filename)

    main = dtu.get_image_topic(bag)

    topics = [_ for _, __ in dtu.d8n_get_all_images_topic_bag(bag)]
    bag.close()
    dtu.logger.debug('%s - topics: %s' % (filename, topics))
    for topic in topics:

        if only_camera and topic != main:
            continue

        try:
            bag = rosbag.Bag(filename)
        except:
            msg = 'Cannot read Bag file %s' % filename
            dtu.logger.error(msg)
            raise
        bag_proxy = dtu.BagReadProxy(bag, t0, t1)
        res = dtu.d8n_read_all_images_from_bag(bag_proxy,
                                               topic,
                                               max_images=max_images,
                                               use_relative_time=True)
        bag.close()

        d = topic.replace('/', '_')
        if d.startswith('_'):
            d = d[1:]

        d0 = os.path.join(outd, d)

        images_with_label = []
        for i in range(len(res)):
            rgb = res[i]['rgb']

            H, _W = rgb.shape[:2]
            if H < MIN_HEIGHT:
                zoom = int(np.ceil(MIN_HEIGHT / H))
                rgb = dtu.zoom_image(rgb, zoom)

            timestamp = res[i]['timestamp']
            s = 't = %.2f' % (timestamp - t0)
            with_label = dtu.add_header_to_rgb(rgb, s)
            images_with_label.append(with_label)

        if write_frames:
            for i, rgb in enumerate(images_with_label):
                rgb = res[i]['rgb']
                fn = os.path.join(d0, ('image-%05d' % i) + '.jpg')
                dtu.write_bgr_as_jpg(dtu.bgr_from_rgb(rgb), fn)

        grid = dtu.make_images_grid(
            images_with_label,
            pad=4,
            bgcolor=dtu.ColorConstants.RGB_DUCKIETOWN_YELLOW)
        s = log.log_name
        grid = dtu.add_header_to_rgb(grid, s, max_height=32)

        if (topic != main) or len(topics) > 1:
            fn = d0 + '.jpg'
            dtu.write_rgb_as_jpg(grid, fn)

        if topic == main:
            fn = outd + '.thumbnails.jpg'
            dtu.write_rgb_as_jpg(grid, fn)