Instance Segmentation Masks
caution
The following approach only works for segmentation and polygons.
When running an importer, any previously imported predictions will be overwritten! To ensure the ability to revert to previous model iterations, it is important to version your projects.
If you have predictions stored as .png
masks of shape , where each pixel value correspond to a class,
then you can use the import_mask_predictions
function from encord_active.model_predictions.importers
.
It requires that you can provide a mapping between file name and data hashes.
Assuming you have predictions stored in a directory like this:
predictions
├── aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.png
├── ...
└── aaaaaaaa-bbbb-cccc-dddd-ffffffffffff.png
or in a nested structure like
predictions
├── dir1
│ ├── aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.png
│ ├── ...
│ └── aaaaaaaa-bbbb-cccc-dddd-ffffffffffff.png
└── dir2
├── bbbbbbbb-bbbb-cccc-dddd-eeeeeeeeeeee.png
├── ...
└── bbbbbbbb-bbbb-cccc-dddd-ffffffffffff.png
You can use this template where the highlighted lines are what you need to change:
from pathlib import Path
import yaml
from encord import EncordUserClient
from encord_active.lib.model_predictions.importers import import_mask_predictions
from encord_active.lib.model_predictions.writer import PredictionWriter
data_dir = Path("/path/to/the/data")
meta = yaml.safe_load((data_dir / "project_meta.yaml").read_text())
private_key = Path(meta["ssh_key_path"]).read_text()
client = EncordUserClient.create_with_ssh_private_key(private_key)
project = client.get_project(project_hash=meta["project_hash"])
class_map = {
# featureNodeHash: pixel_value
"OTk2MzM3": 1, # "pedestrian"
"NzYyMjcx": 2, # "cyclist",
"Nzg2ODEx": 3, # "car"
# Note: value: 0 is reserved for "background"
}
predictions_root = Path("/path/to/predictions")
with PredictionWriter(cache_dir=data_dir, project=project) as writer:
import_mask_predictions(
project,
data_root=predictions_root,
cache_dir=data_dir,
prediction_writer=writer,
# this is what provides the mapping between file names and data hashes:
du_hash_name_lookup=lambda file_pth: (file_pth.stem, 0),
)
caution
- The script will look recursively for files with a
.png
extension and import them. - For each file, every "self-contained" contour will be interpreted as an individual prediction. For example, This mask will be treated as three objects. Two from class 1 and one from class 2.
┌───────────────────┐
│0000000000000000000│
│0011100000000000000│
│0011100000002222000│
│0000000000002222000│
│0000111000002200000│
│0000111000002200000│
│0000111000000000000│
│0000000000000000000│
└───────────────────┘
- NB: model confidence scores will be set to 1.