예제 #1
0
def demo(opt):
    result_root = opt.output_root if opt.output_root != '' else '.'
    mkdir_if_missing(result_root)

    logger.info('Starting tracking...')

    #dataloader = datasets.LoadVideo(opt.input_video, opt.img_size)
    dataloader = datasets.LoadImages(opt.input_video)
    result_filename = os.path.join(result_root, 'results.txt')
    frame_rate = 0.5  #dataloader.frame_rate

    frame_dir = None if opt.output_format == 'text' else osp.join(
        result_root, 'frame')
    try:
        eval_seq(opt,
                 dataloader,
                 'mot',
                 result_filename,
                 save_dir=frame_dir,
                 show_image=False,
                 frame_rate=frame_rate)
    except Exception as e:
        logger.info(e)

    if opt.output_format == 'video':
        output_video_path = osp.join(result_root, 'result.mp4')
        cmd_str = 'ffmpeg -f image2 -i {}/%05d.jpg -b 5000k -c:v mpeg4 {}'.format(
            osp.join(result_root, 'frame'), output_video_path)
        os.system(cmd_str)
예제 #2
0
파일: demo.py 프로젝트: yuanliangxie/MCMOT
def run_demo(opt):
    """
    :param opt:
    :return:
    """
    result_root = opt.output_root if opt.output_root != '' else '.'
    mkdir_if_missing(result_root)

    # clear existing frame results
    frame_res_dir = result_root + '/frames'
    if os.path.isdir(frame_res_dir):
        shutil.rmtree(frame_res_dir)
        os.makedirs(frame_res_dir)
    else:
        os.makedirs(frame_res_dir)

    if opt.input_mode == 'video':
        logger.info('Starting tracking...')
        data_loader = datasets.LoadVideo(opt.input_video, opt.img_size)
    elif opt.input_mode == 'image_dir':
        logger.info('Starting detection...')
        data_loader = datasets.LoadImages(opt.input_img, opt.img_size)
    elif opt.input_mode == 'img_path_list_txt':
        if not os.path.isfile(opt.input_img):
            print('[Err]: invalid image file path list.')
            return

        with open(opt.input_img, 'r', encoding='utf-8') as r_h:
            logger.info('Starting detection...')
            paths = [x.strip() for x in r_h.readlines()]
            print('Total {:d} image files.'.format(len(paths)))
            data_loader = datasets.LoadImages(path=paths,
                                              img_size=opt.img_size)

    result_file_name = os.path.join(result_root, 'results.txt')
    frame_rate = data_loader.frame_rate

    frame_dir = None if opt.output_format == 'text' else osp.join(
        result_root, 'frame')

    opt.device = device
    try:  # 视频推断的入口函数
        if opt.id_weight > 0:
            eval_seq(opt=opt,
                     data_loader=data_loader,
                     data_type='mot',
                     result_f_name=result_file_name,
                     save_dir=frame_dir,
                     show_image=False,
                     frame_rate=frame_rate,
                     mode='track')
        else:
            # eval_seq(opt=opt,
            #          data_loader=data_loader,
            #          data_type='mot',
            #          result_f_name=result_file_name,
            #          save_dir=frame_dir,
            #          show_image=False,
            #          frame_rate=frame_rate,
            #          mode='detect')

            # only for tmp detection evaluation...
            output_dir = '/users/duanyou/c5/results_new/results_all/mcmot_hrnet18_deconv_ep3'
            eval_seq_and_output_dets(opt=opt,
                                     data_loader=data_loader,
                                     data_type='mot',
                                     result_f_name=result_file_name,
                                     out_dir=output_dir,
                                     save_dir=frame_dir,
                                     show_image=False)
    except Exception as e:
        logger.info(e)

    if opt.output_format == 'video':
        output_video_path = osp.join(result_root, 'result.mp4')
        cmd_str = 'ffmpeg -f image2 -i {}/%05d.jpg -b 5000k -c:v mpeg4 {}' \
            .format(osp.join(result_root, 'frame'),
                    output_video_path)
        os.system(cmd_str)
예제 #3
0
파일: demo.py 프로젝트: sinianyutian/MCMOT
def run_demo(opt):
    """
    :param opt:
    :return:
    """
    result_root = opt.output_root if opt.output_root != '' else '.'
    mkdir_if_missing(result_root)

    # clear existing frame results
    frame_res_dir = result_root + '/frame'
    if os.path.isdir(frame_res_dir):
        shutil.rmtree(frame_res_dir)
        os.makedirs(frame_res_dir)
    else:
        os.makedirs(frame_res_dir)

    if opt.input_mode == 'video':
        if opt.id_weight > 0:
            logger.info('Starting tracking...')
        else:
            logger.info('Starting detection...')
        if not os.path.isfile(opt.input_video):
            print('[Err]: invalid input video file.')
            return

        data_loader = datasets.LoadVideo(opt.input_video,
                                         opt.img_size)  # load video as input
        f_name = os.path.split(opt.input_video)[-1][:-4]
    elif opt.input_mode == 'image_dir':
        logger.info('Starting detection...')
        data_loader = datasets.LoadImages(opt.input_img,
                                          opt.img_size)  # load images as input
        f_name = os.path.split(opt.input_video)[-1]
        opt.id_weight = 0  # only do detection in this mode
    elif opt.input_mode == 'img_path_list_txt':
        logger.info('Starting detection...')
        if not os.path.isfile(opt.input_img):
            print('[Err]: invalid image file path list.')
            return

        opt.id_weight = 0  # only do detection in this mode
        with open(opt.input_img, 'r', encoding='utf-8') as r_h:
            logger.info('Starting detection...')
            paths = [x.strip() for x in r_h.readlines()]
            print('Total {:d} image files.'.format(len(paths)))
            data_loader = datasets.LoadImages(path=paths,
                                              img_size=opt.img_size)

    result_file_name = os.path.join(result_root, 'results.txt')
    frame_rate = data_loader.frame_rate
    frame_dir = None if opt.output_format == 'text' else osp.join(
        result_root, 'frame')

    # Set device
    # opt.device = device

    # set device
    opt.device = str(FindFreeGPU())
    print('Using gpu: {:s}'.format(opt.device))
    device = select_device(
        device='cpu' if not torch.cuda.is_available() else opt.device)
    opt.device = device

    try:
        if opt.input_mode == 'video':
            if opt.id_weight > 0:
                eval_seq(opt=opt,
                         data_loader=data_loader,
                         data_type='mot',
                         result_f_name=result_file_name,
                         save_dir=frame_dir,
                         show_image=False,
                         frame_rate=frame_rate,
                         mode='track')
            else:  # input video, do detection
                eval_seq(opt=opt,
                         data_loader=data_loader,
                         data_type='mot',
                         result_f_name=result_file_name,
                         save_dir=frame_dir,
                         show_image=False,
                         frame_rate=frame_rate,
                         mode='detect')
        else:
            # only for tmp detection evaluation...
            output_dir = '/users/duanyou/c5/results_new/results_all/tmp'
            eval_imgs_output_dets(opt=opt,
                                  data_loader=data_loader,
                                  data_type='mot',
                                  result_f_name=result_file_name,
                                  out_dir=output_dir,
                                  save_dir=frame_dir,
                                  show_image=False)
    except Exception as e:
        logger.info(e)

    if opt.output_format == 'video':
        output_video_path = 'result.mp4'
        if opt.input_mode == 'video':
            if opt.id_weight > 0:
                output_video_path = osp.join(result_root,
                                             f_name + '_track.mp4')
            else:
                output_video_path = osp.join(result_root, f_name + '_det.mp4')
        elif opt.input_mode == 'image_dir':
            output_video_path = osp.join(result_root, f_name + '_det.mp4')
        cmd_str = 'ffmpeg -f image2 -i {}/%05d.jpg -b 5000k -c:v mpeg4 {}' \
            .format(osp.join(result_root, 'frame'), output_video_path)
        print(cmd_str)
        os.system(cmd_str)
예제 #4
0
def main(opt,
         data_root='/data/MOT16/train',
         det_root=None,
         seqs=('MOT16-05', ),
         exp_name='demo',
         save_images=False,
         save_videos=False,
         show_image=True):
    """
    """

    logger.setLevel(logging.INFO)
    result_root = os.path.join(data_root, '..', 'results', exp_name)
    mkdir_if_missing(result_root)
    data_type = 'mot'

    # run tracking
    accs = []
    n_frame = 0
    timer_avgs, timer_calls = [], []
    for seq in seqs:
        output_dir = os.path.join(data_root, '..', 'outputs', exp_name,
                                  seq) if save_images or save_videos else None
        logger.info('start seq: {}'.format(seq))
        dataloader = datasets.LoadImages(osp.join(data_root, seq, 'img1'),
                                         opt.img_size)
        result_filename = os.path.join(result_root, '{}.txt'.format(seq))
        meta_info = open(os.path.join(data_root, seq, 'seqinfo.ini')).read()
        frame_rate = int(meta_info[meta_info.find('frameRate') +
                                   10:meta_info.find('\nseqLength')])
        nf, ta, tc = eval_seq(opt,
                              dataloader,
                              data_type,
                              result_filename,
                              save_dir=output_dir,
                              show_image=show_image,
                              frame_rate=frame_rate)
        n_frame += nf
        timer_avgs.append(ta)
        timer_calls.append(tc)

        # eval
        logger.info('Evaluate seq: {}'.format(seq))
        evaluator = Evaluator(data_root, seq, data_type)
        accs.append(evaluator.eval_file(result_filename))
        if save_videos:
            output_video_path = osp.join(output_dir, '{}.mp4'.format(seq))
            cmd_str = 'ffmpeg -f image2 -i {}/%05d.jpg -c:v copy {}'.format(
                output_dir, output_video_path)
            os.system(cmd_str)
    timer_avgs = np.asarray(timer_avgs)
    timer_calls = np.asarray(timer_calls)
    all_time = np.dot(timer_avgs, timer_calls)
    avg_time = all_time / np.sum(timer_calls)
    logger.info('Time elapsed: {:.2f} seconds, FPS: {:.2f}'.format(
        all_time, 1.0 / avg_time))

    # get summary
    metrics = mm.metrics.motchallenge_metrics
    mh = mm.metrics.create()
    summary = Evaluator.get_summary(accs, seqs, metrics)
    strsummary = mm.io.render_summary(summary,
                                      formatters=mh.formatters,
                                      namemap=mm.io.motchallenge_metric_names)
    print(strsummary)
    Evaluator.save_summary(
        summary, os.path.join(result_root, 'summary_{}.xlsx'.format(exp_name)))