From 7a3f6e6286fc9abba49be25544aec3e3200e293a Mon Sep 17 00:00:00 2001
From: Mathieu Beligon <mathieu@feedly.com>
Date: Tue, 31 Mar 2020 20:46:21 -0400
Subject: [PATCH] [robots] (armor dataset factory) Add lock to be sure that all
 images were extracted last time

---
 .../dataset/armor_image_dataset_factory.py       | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/robots-at-robots/research/dataset/armor_image_dataset_factory.py b/robots-at-robots/research/dataset/armor_image_dataset_factory.py
index 85dd6cc..7bff809 100644
--- a/robots-at-robots/research/dataset/armor_image_dataset_factory.py
+++ b/robots-at-robots/research/dataset/armor_image_dataset_factory.py
@@ -1,5 +1,5 @@
+import json
 from abc import abstractmethod
-from dataclasses import dataclass
 from pathlib import Path
 from typing import TypeVar, Tuple, Iterable
 
@@ -7,6 +7,7 @@ import cv2
 
 from polystar.common.models.image import Image
 from polystar.common.models.object import ArmorColor
+from polystar.common.utils.time import create_time_id
 from research.dataset.armor_dataset_factory import ArmorDatasetFactory
 from research_common.dataset.directory_roco_dataset import DirectoryROCODataset
 from research_common.image_pipeline_evaluation.image_dataset_generator import ImageDatasetGenerator
@@ -18,23 +19,30 @@ class ArmorImageDatasetGenerator(ImageDatasetGenerator[T]):
     task_name: str
 
     def from_roco_dataset(self, dataset: DirectoryROCODataset) -> Iterable[Tuple[Image, T]]:
-        if not (dataset.dataset_path / self.task_name).exists():
+        if not (dataset.dataset_path / self.task_name / ".lock").exists():
             self._create_labelized_armor_images_from_roco(dataset)
         return self._get_saved_images_and_labels(dataset)
 
     def _create_labelized_armor_images_from_roco(self, dataset):
         dset_path = dataset.dataset_path / self.task_name
-        dset_path.mkdir()
+        dset_path.mkdir(exist_ok=True)
         for (armor_img, color, digit, k, path) in ArmorDatasetFactory.from_dataset(dataset):
             label = self._label_from_armor_info(color, digit, k, path)
             cv2.imwrite(str(dset_path / f"{path.stem}-{k}-{label}.jpg"), cv2.cvtColor(armor_img, cv2.COLOR_RGB2BGR))
+        (dataset.dataset_path / self.task_name / ".lock").write_text(
+            json.dumps({"version": "0.0", "date": create_time_id()})
+        )
 
     def _get_saved_images_and_labels(self, dataset: DirectoryROCODataset) -> Iterable[Tuple[Image, T]]:
         return (
-            (Image.from_path(image_path), self._label_from_str(image_path.stem.split("-")[-1]))
+            (Image.from_path(image_path), self._label_from_filepath(image_path))
             for image_path in (dataset.dataset_path / self.task_name).glob("*.jpg")
+            if self._valid_label(self._label_from_filepath(image_path))
         )
 
+    def _label_from_filepath(self, image_path: Path) -> T:
+        return self._label_from_str(image_path.stem.split("-")[-1])
+
     @abstractmethod
     def _label_from_armor_info(self, color: ArmorColor, digit: int, k: int, path: Path) -> T:
         pass
-- 
GitLab