Commit 9002a782 authored by jay's avatar jay
Browse files

Cluster load images

parent 5cb5d545
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -69,7 +69,8 @@ def cluster_place_points_in_overlaps(size_threshold=0.0007,
                                     distribute_points_kwargs={},
                                     walltime='00:10:00',
                                     chunksize=1000,
                                     cam_type="csm"):
                                     cam_type="csm",
                                     query_string='SELECT overlay.id FROM overlay LEFT JOIN points ON ST_INTERSECTS(overlay.geom, points.geom) WHERE points.id IS NULL;'):
    """
    Place points in all of the overlap geometries by back-projecing using
    sensor models. This method uses the cluster to process all of the overlaps
@@ -86,6 +87,8 @@ def cluster_place_points_in_overlaps(size_threshold=0.0007,
    cam_type : str
               options: {"csm", "isis"}
               Pick what kind of camera model implementation to use

    query
    """
    # Setup the redis queue
    rqueue = StrictRedis(host=config['redis']['host'],
@@ -96,10 +99,10 @@ def cluster_place_points_in_overlaps(size_threshold=0.0007,
    queuename = config['redis']['processing_queue']
    past = 0
    session = Session()
    ids = session.query(Overlay.id).all()
    ids = [i[0] for i in session.execute(query_string)]
    session.close()
    for i, id in enumerate(ids):
        msg = {'id' : id[0],
        msg = {'id' : id,
               'distribute_points_kwargs' : distribute_points_kwargs,
               'walltime' : walltime,
               'cam_type': cam_type}

bin/acn_load_images

0 → 100644
+116 −0
Original line number Diff line number Diff line
#!/usr/bin/env python

import json
import os
os.environ['PROJ_LIB'] = '/home/jlaura/anaconda3/envs/autocnet/share/proj'
import sys
import time
import warnings

import csmapi
from knoten.csm import generate_latlon_footprint, generate_boundary
from plio.io.io_gdal import GeoDataset
from plio.io.isis_serial_number import generate_serial_number
import pvl
from redis import StrictRedis
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import shapely
import yaml

from autocnet.io.db.redis_queue import pop_computetime_push
from autocnet.io.db.model import Images, Cameras
from autocnet.utils import utils

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 504),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

#Load the config file
try:
    print('Using config: ', os.environ['autocnet_config'])
    with open(os.environ['autocnet_config'], 'r') as f:
        config = yaml.safe_load(f)
except:
    print("The 'autocnet_config' environment variable is not set.")
    sys.exit(1)

def create_footprint(config, geodata, camera):
    boundary = generate_boundary(geodata.raster_size[::-1])  # yx to xy
    dem = GeoDataset(config['spatial']['dem'])
    footprint_latlon = generate_latlon_footprint(camera, boundary, dem=dem)
    footprint_latlon.FlattenTo2D()
    return footprint_latlon

def create_camera(config, geodata, imagepath):
    # Create the camera entry
    label = pvl.dumps(geodata.metadata).decode()
    url = config['pfeffernusse']['url']
    response = requests_retry_session.post(url, json={'label':label})
    response = response.json()
    model_name = response.get('name_model', None)
    if model_name is None:
        return (None, None)
    isdpath = os.path.splitext(imagepath)[0] + '.json'
    try:
        with open(isdpath, 'w') as f:
            json.dump(response, f)
    except Exception as e:
        warnings.warn('Failed to write JSON ISD for image {}.\n{}'.format(imagepath, e))
    isd = csmapi.Isd(imagepath)
    plugin = csmapi.Plugin.findPlugin('UsgsAstroPluginCSM')
    camera = plugin.constructModelFromISD(isd, model_name)
    serialized_camera = camera.getModelState()

    cam = Cameras(camera=serialized_camera)
    return cam, camera

def main(msg, config):
    images = [] 
    for path in msg['imagepaths']:
        print(f'Processing: {path}')
        try:
            geodata = GeoDataset(path)
            dbcam, cam = create_camera(config, geodata, path)
            if dbcam is None:
                warnings.warn(f'Failed to add {path}')
                continue
            fp = create_footprint(config, geodata, cam)
            if isinstance(fp, shapely.geometry.Polygon):
                fp = shapely.geometry.MultiPolygon([fp])
            serial = generate_serial_number(path)
            i = Images(name=geodata.file_name,
                    path=path,
                    footprint_latlon=fp,
                    cameras=dbcam,
                    serial=serial)
            images.append(i)
        except:
            warnings.warn(f'Failed to add {path}.')
            
    Images.bulkadd(images)

if __name__ == '__main__':
    conf = config['redis']
    queue = StrictRedis(host=conf['host'], port=conf['port'], db=0)
    
    msg = pop_computetime_push(queue,
                               conf['processing_queue'],
                               conf['working_queue'])
    main(msg, config)
+5 −6
Original line number Diff line number Diff line
@@ -24,20 +24,19 @@ except:

def main(msg, config):
    session = Session()
    id = msg['id']
    res = session.query(Overlay).filter(Overlay.id == msg['id'])
    if res is None:
    oid = msg['id']
    overlap = session.query(Overlay).filter(Overlay.id == oid).one()
    if overlap is None:
        print('Could not find overlap with ID', id)
        sys.exit(1)
    overlap = res.first()
    geom = overlap.geom
    nodes = []
    for id in overlap.intersections:
        res = session.query(Images).filter(Images.id == id).first()
        res = session.query(Images).filter(Images.id == id).one()
        nodes.append(NetworkNode(node_id=id, image_path=res.path))
    session.close()
    
    print('Placing points in overlap', id)
    print('Placing points in overlap', oid)
    points = place_points_in_overlap(nodes, geom, msg["cam_type"],
                                     msg['distribute_points_kwargs'])