pass in model name and task id to run auto annotation script (#934)

main
Ben Hoff 6 years ago committed by Nikita Manovich
parent ab6303f033
commit 7e41893a45

@ -4,13 +4,29 @@ A small command line program to test and run AutoAnnotation Scripts.
## Instructions ## Instructions
Change in to the root of the project directory and run There are two modes to run this script in. If you already have a model uploaded into the server, and you're having
issues with running it in production, you can pass in the model name and a task id that you want to test against.
```shell ```shell
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ # Note that this module can be found in cvat/utils/auto_annotation/run_model.py
--xml /path/to/xml/file.xml \ $ python /path/to/run_model.py --model-name mymodel --task-id 4
--bin /path/to/bin/file.bin \ ```
--json /path/to/json/mapping/mapping.json
If you're running in docker, this can be useful way to debug your model.
``` shell
$ docker exec -it cvat bash -ic 'python3 ~/cvat/apps/auto_annotation/run_model.py --model-name my-model --task-id 4
```
If you are developing an auto annotation model or you can't get something uploaded into the server,
then you'll need to specify the individual inputs.
```shell
# Note that this module can be found in cvat/utils/auto_annotation/run_model.py
$ python path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json
``` ```
Some programs need to run unrestricted or as an administer. Use the `--unrestriced` flag to simulate. Some programs need to run unrestricted or as an administer. Use the `--unrestriced` flag to simulate.
@ -18,35 +34,35 @@ Some programs need to run unrestricted or as an administer. Use the `--unrestric
You can pass image files in to fully simulate your findings. Images are passed in as a list You can pass image files in to fully simulate your findings. Images are passed in as a list
```shell ```shell
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ $ python /path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \ --xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \ --bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json \ --json /path/to/json/mapping/mapping.json \
--image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg
``` ```
Additionally, it's sometimes useful to visualize your images. Additionally, it's sometimes useful to visualize your images.
Use the `--show-images` flag to have each image with the annotations pop up. Use the `--show-images` flag to have each image with the annotations pop up.
```shell ```shell
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ $ python /path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \ --xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \ --bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json \ --json /path/to/json/mapping/mapping.json \
--image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \ --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \
--show-images --show-images
``` ```
If you'd like to see the labels printed on the image, use the `--show-labels` flag If you'd like to see the labels printed on the image, use the `--show-labels` flag
```shell ```shell
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ $ python /path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \ --xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \ --bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json \ --json /path/to/json/mapping/mapping.json \
--image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \ --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \
--show-images \ --show-images \
--show-labels --show-labels
``` ```
There's a command that let's you scan quickly by setting the length of time (in milliseconds) to display each image. There's a command that let's you scan quickly by setting the length of time (in milliseconds) to display each image.
@ -55,13 +71,13 @@ In this example, 2000 milliseconds is 2 seconds for each image.
```shell ```shell
# Display each image in a window for 2 seconds # Display each image in a window for 2 seconds
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ $ python /path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \ --xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \ --bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json \ --json /path/to/json/mapping/mapping.json \
--image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \ --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \
--show-images \ --show-images \
--show-image-delay 2000 --show-image-delay 2000
``` ```
Visualization isn't always enough. Visualization isn't always enough.
@ -70,10 +86,10 @@ You must install the necessary packages installed, but then you can add the `--s
results will serialize correctly. results will serialize correctly.
```shell ```shell
$ python cvat/utils/auto_annotation/run_model.py --py /path/to/python/interp.py \ $ python /path/to/run_model.py --py /path/to/python/interp.py \
--xml /path/to/xml/file.xml \ --xml /path/to/xml/file.xml \
--bin /path/to/bin/file.bin \ --bin /path/to/bin/file.bin \
--json /path/to/json/mapping/mapping.json \ --json /path/to/json/mapping/mapping.json \
--image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \ --image-files /path/to/img.jpg /path2/to/img2.png /path/to/img3.jpg \
--serialize --serialize
``` ```

@ -4,6 +4,8 @@ import json
import argparse import argparse
import random import random
import logging import logging
import fnmatch
from operator import xor
import numpy as np import numpy as np
import cv2 import cv2
@ -18,10 +20,14 @@ from cvat.apps.auto_annotation.inference import run_inference_engine_annotation
def _get_kwargs(): def _get_kwargs():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument('--py', required=True, help='Path to the python interpt file') parser.add_argument('--py', help='Path to the python interpt file')
parser.add_argument('--xml', required=True, help='Path to the xml file') parser.add_argument('--xml', help='Path to the xml file')
parser.add_argument('--bin', required=True, help='Path to the bin file') parser.add_argument('--bin', help='Path to the bin file')
parser.add_argument('--json', required=True, help='Path to the JSON mapping file') parser.add_argument('--json', help='Path to the JSON mapping file')
parser.add_argument('--model-name', help='Name of the model in the Model Manager')
parser.add_argument('--task-id', type=int, help='ID task used to test the model')
parser.add_argument('--restricted', dest='restricted', action='store_true') parser.add_argument('--restricted', dest='restricted', action='store_true')
parser.add_argument('--unrestricted', dest='restricted', action='store_false') parser.add_argument('--unrestricted', dest='restricted', action='store_false')
parser.add_argument('--image-files', nargs='*', help='Paths to image files you want to test') parser.add_argument('--image-files', nargs='*', help='Paths to image files you want to test')
@ -56,14 +62,75 @@ def find_min_y(array):
return array[index] return array[index]
def _get_docker_files(model_name: str, task_id: int):
os.environ['DJANGO_SETTINGS_MODULE'] = 'cvat.settings.development'
import django
django.setup()
from cvat.apps.auto_annotation.models import AnnotationModel
from cvat.apps.engine.models import Task as TaskModel
task = TaskModel(pk=task_id)
model = AnnotationModel.objects.get(name=model_name)
images_dir = task.get_data_dirname()
py_file = model.interpretation_file.name
mapping_file = model.labelmap_file.name
xml_file = model.model_file.name
bin_file = model.weights_file.name
image_files = []
for root, _, filenames in os.walk(images_dir):
for filename in fnmatch.filter(filenames, '*.jpg'):
image_files.append(os.path.join(root, filename))
return py_file, mapping_file, bin_file, xml_file, image_files
def main(): def main():
kwargs = _get_kwargs() kwargs = _get_kwargs()
py_file = kwargs['py'] py_file = kwargs.get('py')
bin_file = kwargs['bin'] bin_file = kwargs.get('bin')
mapping_file = kwargs['json'] mapping_file = kwargs.get('json')
xml_file = kwargs['xml'] xml_file = kwargs.get('xml')
model_name = kwargs.get('model_name')
task_id = kwargs.get('task_id')
is_docker = model_name and task_id
# xor is `exclusive or`. English is: if one or the other but not both
if xor(bool(model_name), bool(task_id)):
logging.critical('Must provide both `--model-name` and `--task-id` together!')
return
if is_docker:
files = _get_docker_files(model_name, task_id)
py_file = files[0]
mapping_file = files[1]
bin_file = files[2]
xml_file = files[3]
image_files = files[4]
else:
return_ = False
if not py_file:
logging.critical('Must provide --py file!')
return_ = True
if not bin_file:
logging.critical('Must provide --bin file!')
return_ = True
if not xml_file:
logging.critical('Must provide --xml file!')
return_ = True
if not mapping_file:
logging.critical('Must provide --json file!')
return_ = True
if return_:
return
if not os.path.isfile(py_file): if not os.path.isfile(py_file):
logging.critical('Py file not found! Check the path') logging.critical('Py file not found! Check the path')
@ -98,7 +165,9 @@ def main():
mapping = {int(k): v for k, v in mapping.items()} mapping = {int(k): v for k, v in mapping.items()}
restricted = kwargs['restricted'] restricted = kwargs['restricted']
image_files = kwargs.get('image_files')
if not is_docker:
image_files = kwargs.get('image_files')
if image_files: if image_files:
image_data = [cv2.imread(f) for f in image_files] image_data = [cv2.imread(f) for f in image_files]

Loading…
Cancel
Save