Beispiel #1
0
def main():
    parser = getparser()
    args = parser.parse_args()
    img = os.path.abspath(args.img)
    try:
        img_list = sorted(glob.glob(os.path.join(img, '*.tif')))
        temp = img_list[1]
    except BaseException:
        img_list = sorted(glob.glob(os.path.join(img, '*.tiff')))
    if len(img_list) == 0:
        print("No images in the specified folder, exiting")
        sys.exit()
    mode = args.mode
    session = args.t
    ba_prefix = args.ba_prefix
    overlap_list_fn = args.overlap_pkl
    frame_index = args.frame_index
    dem = args.dem
    texture = args.texture
    sampling_interval = args.sampling_interval
    if args.cam:
        cam_folder = args.cam
    if args.ba_prefix:
        ba_prefix = args.ba_prefix
    outfol = args.outfol
    if mode == 'video':
        # assume for now that we are still operating on a fixed image interval method
        # can accomodate different convergence angle function method here.
        frame_gdf = skysat.parse_frame_index(frame_index)
        # for now hardcording sgm,mgm,kernel params, should accept as inputs.
        # Maybe discuss with David with these issues/decisions when the overall
        # system is in place
        if args.mvs == 1:
            job_list = skysat.video_mvs(img,
                                        t=session,
                                        cam_fol=args.cam,
                                        ba_prefix=args.ba_prefix,
                                        dem=args.dem,
                                        sampling_interval=sampling_interval,
                                        texture=texture,
                                        outfol=outfol,
                                        block=args.block,
                                        frame_index=frame_gdf)
        else:
            if args.full_extent == 1:
                full_extent = True
            else:
                full_extent = False
            job_list = skysat.prep_video_stereo_jobs(
                img,
                t=session,
                cam_fol=args.cam,
                ba_prefix=args.ba_prefix,
                dem=args.dem,
                sampling_interval=sampling_interval,
                texture=texture,
                outfol=outfol,
                block=args.block,
                frame_index=frame_gdf,
                full_extent=full_extent,
                entry_point=args.entry_point)
    elif mode == 'triplet':
        if args.crop_map == 1:
            crop_map = True
        else:
            crop_map = False
        job_list = skysat.triplet_stereo_job_list(
            t=args.t,
            threads=args.threads,
            overlap_list=args.overlap_pkl,
            img_list=img_list,
            ba_prefix=args.ba_prefix,
            cam_fol=args.cam,
            dem=args.dem,
            crop_map=crop_map,
            texture=texture,
            outfol=outfol,
            block=args.block,
            entry_point=args.entry_point)
    # decide on number of processes
    # if block matching, Plieades is able to handle 30-40 4 threaded jobs on bro node
    # if MGM/SGM, 25 . This stepup is arbitrariry, research on it more.
    # next build should accept no of jobs and stereo threads as inputs
    print(job_list[0])
    n_cpu = cpu_count()
    # no of parallel jobs with user specified threads per job
    jobs = int(n_cpu / args.threads)
    stereo_log = p_map(asp.run_cmd, ['stereo'] * len(job_list),
                       job_list,
                       num_cpus=jobs)
    stereo_log_fn = os.path.join(outfol, 'stereo_log.log')
    print("Consolidated stereo log saved at {}".format(stereo_log_fn))
    #with open(stereo_log_fn,'w') as f:
    #   for logs in stereo_log:
    #      f.write(logs)
    print("Script is complete")
def main():
    parser = getparser()
    args = parser.parse_args()
    mode = args.mode
    session = args.t
    img_folder = os.path.abspath(args.img)
    outdir = os.path.abspath(args.outdir)
    if not os.path.exists(outdir):
        try:
            os.makedir(outdir)
        except:
            os.makedirs(outdir)
    if mode == 'video':
        sampling = args.video_sampling_mode
        frame_index = skysat.parse_frame_index(args.frame_index, True)
        product_level = 'l1a'
        num_samples = len(frame_index)
        frames = frame_index.name.values
        sampler = args.sampler
        outdf = os.path.join(outdir, os.path.basename(args.frame_index))
        if sampling == 'sampling_interval':
            print(
                "Hardcoded sampling interval results in frame exclusion at the end of the video sequence based on step size, better to chose the num_images mode and the program will equally distribute accordingly"
            )
            idx = np.arange(0, num_samples, sampler)
            outdf = '{}_sampling_inteval_{}.csv'.format(
                os.path.splitext(outdf)[0], sampler)
        else:
            print("Sampling {} from {} of the input video sequence".format(
                sampler, num_samples))
            idx = np.linspace(0, num_samples - 1, sampler, dtype=int)
            outdf = '{}_sampling_inteval_aprox{}.csv'.format(
                os.path.splitext(outdf)[0], idx[1] - idx[0])
        sub_sampled_frames = frames[idx]
        sub_df = frame_index[frame_index['name'].isin(
            list(sub_sampled_frames))]
        sub_df.to_csv(outdf, sep=',', index=False)
        #this is camera/gcp initialisation
        n = len(sub_sampled_frames)
        img_list = [
            glob.glob(os.path.join(img_folder, '{}*.tiff'.format(frame)))[0]
            for frame in sub_sampled_frames
        ]
        pitch = [1] * n
        out_fn = [
            os.path.join(outdir, '{}_frame_idx.tsai'.format(frame))
            for frame in sub_sampled_frames
        ]
        out_gcp = [
            os.path.join(outdir, '{}_frame_idx.gcp'.format(frame))
            for frame in sub_sampled_frames
        ]
        frame_index = [args.frame_index] * n
        camera = [None] * n
        gcp_factor = 4

    elif mode == 'triplet':
        df = pd.read_pickle(args.overlap_pkl)
        img_list = list(
            np.unique(np.array(list(df.img1.values) + list(df.img2.values))))
        img_list = [
            os.path.splitext(os.path.basename(img))[0] for img in img_list
        ]
        cam_list = [
            glob.glob(os.path.join(img_folder, '{}*.tif'.format(img)))[0]
            for img in img_list
        ]
        n = len(img_list)
        if args.product_level == 'l1b':
            pitch = [0.8] * n
        else:
            pitch = [1.0] * n
        out_fn = [
            os.path.join(outdir, '{}_rpc.tsai'.format(frame))
            for frame in img_list
        ]
        out_gcp = [
            os.path.join(outdir, '{}_rpc.gcp'.format(frame))
            for frame in img_list
        ]
        camera = cam_list
        frame_index = [None] * n
        img_list = cam_list
        gcp_factor = 8
    fl = [553846.153846] * n
    cx = [1280] * n
    cy = [540] * n
    dem = args.dem
    ht_datum = [malib.get_stats_dict(iolib.fn_getma(dem))['median']
                ] * n  # use this value for height where DEM has no-data
    gcp_std = [1] * n
    datum = ['WGS84'] * n
    refdem = [dem] * n
    n_proc = 30
    #n_proc = cpu_count()
    cam_gen_log = p_map(asp.cam_gen,
                        img_list,
                        fl,
                        cx,
                        cy,
                        pitch,
                        ht_datum,
                        gcp_std,
                        out_fn,
                        out_gcp,
                        datum,
                        refdem,
                        camera,
                        frame_index,
                        num_cpus=n_proc)
    print("writing gcp with basename removed")
    # count expexted gcp
    print(f"Total expected GCP {gcp_factor*n}")
    asp.clean_gcp(out_gcp, outdir)
    # saving subprocess consolidated log file
    from datetime import datetime
    now = datetime.now()
    log_fn = os.path.join(outdir, 'camgen_{}.log'.format(now))
    print("saving subprocess camgen log at {}".format(log_fn))
    with open(log_fn, 'w') as f:
        for log in cam_gen_log:
            f.write(log)
    print("Script is complete !")
def main():
    parser = get_parser()
    args = parser.parse_args()
    tr = str(args.tr)
    tsrs = args.tsrs
    dir = os.path.abspath(args.img_folder)
    outdir = os.path.abspath(args.out_folder)
    images = sorted(glob.glob(os.path.join(dir,'*.tif*')))
    if os.path.islink(images[0]):
        images = [os.readlink(x) for x in images]
    del_opt = args.delete_temporary_files
    dem=args.DEM
    cam_folder = args.cam
    ba_prefix = args.ba_prefix
    mode = args.mode
    if mode == 'browse':
        """
        this block creates low-res orthomosaics from RPC info for browsing purpose only
        """
        for_img_list,nadir_img_list,aft_img_list,for_time,nadir_time,aft_time = skysat.sort_img_list(images)
        for_out_dir = os.path.join(outdir,'for_map_browse')
        nadir_out_dir = os.path.join(outdir,'nadir_map_browse')
        aft_out_dir = os.path.join(outdir,'aft_map_browse')
        for_out_list = [os.path.join(for_out_dir,os.path.splitext(os.path.basename(img))[0]+'_browse_map.tif') for img in for_img_list]
        nadir_out_list = [os.path.join(nadir_out_dir,os.path.splitext(os.path.basename(img))[0]+'_browse_map.tif') for img in nadir_img_list]
        aft_out_list = [os.path.join(aft_out_dir,os.path.splitext(os.path.basename(img))[0]+'_browse_map.tif') for img in aft_img_list]
        for_count,nadir_count,aft_count = [len(for_img_list), len(nadir_img_list), len(aft_img_list)]
        print("Performing orthorectification for forward images {}".format(for_time))
        for_map_log = p_map(asp.mapproject,for_img_list,for_out_list,[args.session]*for_count,['WGS84']*for_count,[None]*for_count,['EPSG:4326']*for_count,[None]*for_count,[None]*for_count)
        print("Performing orthorectification for nadir images {}".format(nadir_time))
        nadir_map_log = p_map(asp.mapproject,nadir_img_list,nadir_out_list,[args.session]*nadir_count,['WGS84']*nadir_count,[None]*nadir_count,['EPSG:4326']*nadir_count,[None]*nadir_count,[None]*nadir_count)
        print("Performing orthorectification for aft images {}".format(aft_time))
        aft_map_log = p_map(asp.mapproject,aft_img_list,aft_out_list,[args.session]*aft_count,['WGS84']*aft_count,[None]*aft_count,['EPSG:4326']*aft_count,[None]*aft_count,[None]*aft_count)
        ortho_log = os.path.join(outdir,'low_res_ortho.log')
        print("Orthorectification log saved at {}".format(ortho_log))
        with open(ortho_log,'w') as f:
            total_ortho_log = for_map_log+nadir_map_log+aft_map_log
            for log in itertools.chain.from_iterable(total_ortho_log):
                f.write(log)

        # after orthorectification, now do mosaic
        for_out_mos = os.path.join(outdir,'for_map_mos_{}m.tif'.format(tr))
        for_map_list = sorted(glob.glob(os.path.join(for_out_dir,'*.tif')))
        nadir_out_mos = os.path.join(outdir,'nadir_map_mos_{}m.tif'.format(tr))
        nadir_map_list = sorted(glob.glob(os.path.join(nadir_out_dir,'*.tif')))
        aft_out_mos = os.path.join(outdir,'aft_map_mos_{}m.tif'.format(tr))
        aft_map_list = sorted(glob.glob(os.path.join(aft_out_dir,'*.tif')))
        print("Preparing forward browse orthomosaic")
        for_mos_log = asp.dem_mosaic(for_map_list,for_out_mos,tr,tsrs,'first',None)
        print("Preparing nadir browse orthomosaic")
        nadir_mos_log = asp.dem_mosaic(nadir_map_list, nadir_out_mos, tr, tsrs, 'first',None)
        print("Preparing aft browse orthomosaic")
        aft_mos_log = asp.dem_mosaic(aft_map_list, aft_out_mos, tr, tsrs, 'first',None)
        ## delete temporary files
        if del_opt:
            [shutil.rmtree(x) for x in [for_out_dir,nadir_out_dir,aft_out_dir]]
        #Save figure to jpeg ?
        fig_title = os.path.basename(images[0]).split('_',15)[0]+'_'+for_time+'_'+nadir_time+'_'+aft_time
        fig,ax = plt.subplots(1,3,figsize=(10,10))
        pltlib.iv_fn(for_out_mos,full=True,ax=ax[0],cmap='gray',scalebar=True,title='Forward')
        pltlib.iv_fn(nadir_out_mos,full=True,ax=ax[1],cmap='gray',scalebar=True,title='NADIR')
        pltlib.iv_fn(aft_out_mos,full=True,ax=ax[2],cmap='gray',scalebar=True,title='Aft')
        plt.tight_layout(rect=[0, 0.03, 1, 0.95])
        fig.suptitle(fig_title)
        browse_img_fn = os.path.join(outdir,'browse_img_{}_{}m.jpg'.format(fig_title,tr))
        fig.savefig(browse_img_fn,dpi=300,bbox_inches='tight',pad_inches=0.1)
        print("Browse figure saved at {}".format(browse_img_fn))

    if mode == 'science':
        img_list = images
        if args.frame_index is not 'None':
            frame_index = skysat.parse_frame_index(args.frame_index)
            img_list = [glob.glob(os.path.join(dir,'{}*.tiff'.format(frame)))[0] for frame in frame_index.name.values]
            print("no of images is {}".format(len(img_list)))
        img_prefix = [os.path.splitext(os.path.basename(img))[0] for img in img_list]
        out_list = [os.path.join(outdir,img+'_map.tif') for img in img_prefix]
        session_list = 	[args.session]*len(img_list)
        dem_list = [dem]*len(img_list)
        tr_list = [args.tr]*len(img_list)
        if args.frame_index is not 'None':
            # this hack is for video
            df = skysat.parse_frame_index(args.frame_index)
            trunc_df = df[df['name'].isin(img_prefix)]
            tr_list = [str(gsd) for gsd in trunc_df.gsd.values]
        srs_list = [tsrs]*len(img_list)
        if args.session == 'pinhole':
            if ba_prefix:
                cam_list = [glob.glob(os.path.abspath(ba_prefix)+'-'+os.path.splitext(os.path.basename(x))[0]+'*.tsai')[0] for x in img_list]
                print("No of cameras is {}".format(len(cam_list)))
            else:
                print(os.path.join(os.path.abspath(args.cam),os.path.splitext(os.path.basename(img_list[0]))[0]+'*.tsai'))
                cam_list = [glob.glob(os.path.join(os.path.abspath(args.cam),os.path.splitext(os.path.basename(x))[0]+'*.tsai'))[0] for x in img_list]
        else:
            cam_list = [None]*len(img_list)
            if ba_prefix:
                # not yet implemented
                ba_prefix_list = [ba_prefix]*len(img_list)
        print("Mapping given images")
        ortho_logs = p_map(asp.mapproject,img_list,out_list,session_list,dem_list,tr_list,srs_list,cam_list,num_cpus=int(cpu_count()/4))
        ortho_log = os.path.join(outdir,'ortho.log')
        print("Saving Orthorectification log at {}".format(ortho_log))
        with open(ortho_log,'w') as f:
            for log in ortho_logs:
                f.write(log)
        if args.copy_rpc == 1:
            print("Copying RPC from native image to orthoimage in parallel")
            copy_rpc_out = p_map(skysat.copy_rpc,img_list,out_list,num_cpus=cpu_count())
        if args.orthomosaic == 1:
            print("Will also produce median, weighted average and highest resolution orthomosaic")
            if args.data == 'triplet':
                for_img_list,nadir_img_list,aft_img_list,for_time,nadir_time,aft_time = skysat.sort_img_list(out_list)
                res_sorted_list = skysat.res_sort(out_list)
                res_sorted_mosaic = os.path.join(outdir,'{}_{}_{}_finest_orthomosaic.tif'.format(for_time,nadir_time,aft_time))
                median_mosaic = os.path.join(outdir,'{}_{}_{}_median_orthomosaic.tif'.format(for_time,nadir_time,aft_time))
                wt_avg_mosaic = os.path.join(outdir,'{}_{}_{}_wt_avg_orthomosaic.tif'.format(for_time,nadir_time,aft_time))
                print("producing finest resolution on top mosaic, per-pixel median and wt_avg mosaic")
                all_3_view_mos_logs = p_map(asp.dem_mosaic, [res_sorted_list]*3, [res_sorted_mosaic,median_mosaic,wt_avg_mosaic], ['None']*3, [None]*3, ['first','median',None],[None]*3,num_cpus=4)
                res_sorted_log = asp.dem_mosaic(res_sorted_list,res_sorted_mosaic,tr='None',stats='first')
                print("producing idependent mosaic for different views in parallel")
                for_mosaic = os.path.join(outdir,'{}_for_first_mosaic.tif'.format(for_time))
                nadir_mosaic = os.path.join(outdir,'{}_nadir_first_mosaic.tif'.format(nadir_time))
                aft_mosaic = os.path.join(outdir,'{}_aft_first_mosaic.tif'.format(aft_time))
                # prepare mosaics in parallel
                indi_mos_log = p_map(asp.dem_mosaic,[for_img_list,nadir_img_list,aft_img_list], [for_mosaic,nadir_mosaic,aft_mosaic], ['None']*3, [None]*3, ['first']*3,[None]*3,num_cpus=4)
                out_log = os.path.join(outdir,'science_mode_ortho_mos.log')
                total_mos_log = all_3_view_mos_logs+indi_mos_log
                print("Saving orthomosaic log at {}".format(out_log))
                with open(out_log,'w') as f:
                    for log in itertools.chain.from_iterable(total_mos_log):
                        f.write(log)
            if args.data == 'video':
                res_sorted_list = skysat.res_sort(out_list)
                print("producing orthomasaic with finest on top")
                res_sorted_mosaic = os.path.join(outdir,'video_finest_orthomosaic.tif')
                print("producing orthomasaic with per-pixel median stats")
                median_mosaic = os.path.join(outdir,'video_median_orthomosaic.tif')
                print("producing orthomosaic with weighted average statistics")
                wt_avg_mosaic = os.path.join(outdir,'video_wt_avg_orthomosaic.tif')
                print("Mosaicing will be done in parallel")
                all_3_view_mos_logs = p_map(asp.dem_mosaic, [res_sorted_list]*3, [res_sorted_mosaic,median_mosaic,wt_avg_mosaic], ['None']*3, [None]*3, ['first','median',None],[None]*3)
                out_log = os.path.join(outdir,'science_mode_ortho_mos.log')
                print("Saving orthomosaic log at {}".format(out_log))
                with open(out_log,'w') as f:
                    for log in all_3_view_mos_logs:
                        f.write(log)
            print("Script is complete!")