geowatch.cli.coco_visualize_videos module

KWCoco video visualization script

Todo

  • [ ] Option to interpret a channel as a heatmap and overlay it on top of

    another set of channels interpreted as a grayscale image.

  • [ ] Migrate to kwcoco proper

  • [ ] Show valid image regions

CommandLine

# A demo of this script on toydata is as follows

# TEMP_DPATH=$(mktemp -d)
TEMP_DPATH=$HOME/.cache/kwcoco/demo/viz
mkdir -p $TEMP_DPATH
echo "TEMP_DPATH = $TEMP_DPATH"
cd $TEMP_DPATH
KWCOCO_BUNDLE_DPATH=$TEMP_DPATH/toy_bundle
KWCOCO_FPATH=$KWCOCO_BUNDLE_DPATH/data.kwcoco.json
VIZ_DPATH=$KWCOCO_BUNDLE_DPATH/_viz
python -m kwcoco toydata --key=vidshapes3-msi-multisensor-frames7 --dst=$KWCOCO_FPATH

python -m geowatch.cli.coco_visualize_videos --src=$KWCOCO_FPATH --viz_dpath=$VIZ_DPATH --animate=True --workers=0 --any3=only --max_dim=128

python -m geowatch.cli.coco_visualize_videos --src=$KWCOCO_FPATH --viz_dpath=$VIZ_DPATH --zoom_to_tracks=True --start_frame=1 --num_frames=5 --animate=True
class geowatch.cli.coco_visualize_videos.CocoVisualizeConfig(*args, **kwargs)[source]

Bases: DataConfig

Visualizes annotations on kwcoco video frames on each band

CommandLine

# Point to your kwcoco file
DVC_DPATH=$HOME/data/dvc-repos/smart_watch_dvc
COCO_FPATH=$DVC_DPATH/drop1-S2-L8-aligned/data.kwcoco.json

python -m geowatch.cli.coco_visualize_videos --src $COCO_FPATH --viz_dpath ./viz_out --channels="red|green|blue" --space="video"

COCO_FPATH=/home/joncrall/data/dvc-repos/smart_watch_dvc/drop1-S2-L8-WV-aligned/KR_R001/subdata.kwcoco.json
COCO_FPATH=/home/joncrall/data/dvc-repos/smart_watch_dvc/drop1-S2-L8-WV-aligned/data.kwcoco.json
python -m geowatch.cli.coco_visualize_videos --src $COCO_FPATH --space="image"

# Also note you can make an animated gif
python -m kwplot.cli.gifify -i "./viz_out/US_Jacksonville_R01/_anns/red|green|blue/" -o US_Jacksonville_R01_anns.gif

# NEW: as of 2021-11-04 : helper animation script
python -m geowatch.cli.animate_visualizations --viz_dpath ./viz_out

Valid options: []

Parameters:
  • *args – positional arguments for this data config

  • **kwargs – keyword arguments for this data config

default = {'alpha': <Value(None)>, 'animate': <Value('auto')>, 'ann_score_thresh': <Value(0)>, 'any3': <Value(False)>, 'channels': <Value(None)>, 'cmap': <Value('viridis')>, 'draw_anns': <Value('auto')>, 'draw_boxes': <Value(True)>, 'draw_chancode': <Value(True)>, 'draw_header': <Value(True)>, 'draw_imgs': <Value(True)>, 'draw_labels': <Value(True)>, 'draw_segmentations': <Value(True)>, 'draw_track_trails': <Value(False)>, 'draw_valid_region': <Value(False)>, 'exclude_sensors': <Value(None)>, 'extra_header': <Value(None)>, 'fixed_normalization_scheme': <Value(None)>, 'include_sensors': <Value(None)>, 'max_dim': <Value(None)>, 'max_workers': <Value(None)>, 'min_dim': <Value(384)>, 'norm_over_time': <Value(False)>, 'num_frames': <Value(None)>, 'only_boxes': <Value(False)>, 'resolution': <Value(None)>, 'role_order': <Value(None)>, 'select_images': <Value(None)>, 'select_videos': <Value(None)>, 'skip_aggressive': <Value(False)>, 'skip_missing': <Value(True)>, 'smart': <Value(False)>, 'space': <Value('video')>, 'src': <Value('data.kwcoco.json')>, 'stack': <Value('auto')>, 'start_frame': <Value(0)>, 'verbose': <Value(0)>, 'viz_dpath': <Value(None)>, 'workers': <Value('auto')>, 'zoom_to_tracks': <Value(False)>}
geowatch.cli.coco_visualize_videos.main(cmdline=True, **kwargs)[source]

CommandLine

xdoctest -m geowatch.cli.coco_visualize_videos main:2

Example

>>> import kwcoco
>>> from geowatch.utils import kwcoco_extensions
>>> from geowatch.cli.coco_visualize_videos import *  # NOQA
>>> import ubelt as ub
>>> dpath = ub.Path.appdir('geowatch/tests/viz_video1').delete().ensuredir()
>>> dset = kwcoco.CocoDataset.demo('vidshapes8-multispectral', num_frames=2, image_size=(64, 64), num_videos=2)
>>> img = dset.dataset['images'][0]
>>> coco_img = dset.coco_image(img['id'])
>>> kwargs = {
>>>     'src': dset.fpath,
>>>     'viz_dpath': dpath,
>>>     'space': 'video',
>>>     'channels': None,
>>>     'zoom_to_tracks': True,
>>> }
>>> cmdline = False
>>> main(cmdline=cmdline, **kwargs)

Example

>>> import kwcoco
>>> from geowatch.utils import kwcoco_extensions
>>> from geowatch.cli.coco_visualize_videos import *  # NOQA
>>> import geowatch
>>> import ubelt as ub
>>> dpath = ub.Path.appdir('geowatch/tests/viz_video2').delete().ensuredir()
>>> dset = geowatch.coerce_kwcoco('geowatch-msi', num_frames=5, image_size=(64, 64), num_videos=1)
>>> img = dset.dataset['images'][0]
>>> coco_img = dset.coco_image(img['id'])
>>> kwargs = {
>>>     'src': dset.fpath,
>>>     'viz_dpath': dpath,
>>>     'space': 'video',
>>>     'channels': None,
>>>     'zoom_to_tracks': False,
>>>     'stack': 'only',
>>> }
>>> cmdline = False
>>> main(cmdline=cmdline, **kwargs)

Example

>>> # Test ability to draw track trails
>>> from geowatch.cli.coco_visualize_videos import *  # NOQA
>>> import kwcoco
>>> import numpy as np
>>> from kwcoco.demo.perterb import perterb_coco
>>> import kwimage
>>> anchors = np.array([[0.05, 0.05]])
>>> size = (512, 512)
>>> dset = kwcoco.CocoDataset.demo('vidshapes1', num_frames=20, num_tracks=20, anchors=anchors, image_size=size)
>>> # Make 3 annots not have tracks
>>> dset.remove_tracks(dset.tracks()[0:3], keep_annots=True)
>>> # Give half of the tracks a random color
>>> for track in dset.dataset['tracks'][::2]:
>>>     track['color'] = kwimage.Color.random().ashex()
>>> # Give tracks roles
>>> for track in dset.dataset['tracks'][2::2]:
...     track['role'] = 'role1'
>>> for track in dset.dataset['tracks'][3::2]:
...     track['role'] = 'role2'
>>> dpath = ub.Path.appdir('geowatch/tests/viz_video3').ensuredir()
>>> for r, ds, fs in dpath.walk():
...     for f in fs:
...         (r / f).delete()
>>> kwargs = {
>>>     'src': dset,
>>>     'viz_dpath': dpath,
>>>     'channels': 'r,b',
>>>     'draw_track_trails': True,
>>>     'stack': 'only',
>>>     'role_order': ['role1', 'role2'],
>>>     'cmap': 'gray',
>>>     'workers': 0,
>>>     'verbose': 101,
>>> }
>>> cmdline = False
>>> main(cmdline=cmdline, **kwargs)
exception geowatch.cli.coco_visualize_videos.SkipFrame[source]

Bases: Exception

exception geowatch.cli.coco_visualize_videos.SkipChanGroup[source]

Bases: Exception

geowatch.cli.coco_visualize_videos.video_track_info(coco_dset, vidid)[source]
class geowatch.cli.coco_visualize_videos.TrackInfoLookup(dset)[source]

Bases: object

Prototype implementation for something that kwcoco can use to make track information more accessible. TODO: cache information to make subsequent queries slightly faster.

get_track_trail_by_video_id(video_id, image_id=None)[source]
geowatch.cli.coco_visualize_videos.select_fixed_normalization(fixed_normalization_scheme, sensor_coarse)[source]
geowatch.cli.coco_visualize_videos.draw_chan_group(coco_dset, frame_id, name, ann_view_dpath, img_view_dpath, delayed, chan_row, finalize_opts, verbose, skip_missing, skip_aggressive, chan_to_normalizer, cmap, header_lines, valid_image_poly, draw_imgs, draw_anns, only_boxes, draw_boxes, draw_labels, draw_segmentations, role_to_drawables, valid_video_poly, stack, draw_header, stack_idx, request_roles, ann_score_thresh, alpha)[source]

This draws a single image using selected set of channelse for an intensity, color, or false color visualization with annotations optionally drawn.

geowatch.cli.coco_visualize_videos.draw_polyline_on_image(image, xy_pts, color=None, thickness=1)[source]

TODO: port to kwimage