From fa26d033a184a1001855bafdd1be4008af2645eb Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.dos.anjos@gmail.com>
Date: Fri, 10 Apr 2020 12:26:22 +0200
Subject: [PATCH] Remove use of bob.db.hrf

---
 .../drivechasedb1iostarhrf608sslstare.py      |   2 +-
 .../datasets/drivestarechasedb11168.py        |   9 -
 .../datasets/drivestarechasedb1iostar1168.py  |  19 +-
 .../drivestarechasedb1iostar1168sslhrf.py     |  53 ++--
 .../drivestareiostarhrf960sslchase.py         |  11 +-
 bob/ip/binseg/configs/datasets/hrf.py         |  27 +-
 bob/ip/binseg/configs/datasets/hrf1024.py     |  27 +-
 bob/ip/binseg/configs/datasets/hrf1168.py     |  20 +-
 bob/ip/binseg/configs/datasets/hrf1168test.py |  25 +-
 bob/ip/binseg/configs/datasets/hrf544.py      |  27 +-
 bob/ip/binseg/configs/datasets/hrf544test.py  |  31 ++-
 bob/ip/binseg/configs/datasets/hrf608.py      |  27 +-
 bob/ip/binseg/configs/datasets/hrf960.py      |  27 +-
 bob/ip/binseg/configs/datasets/hrftest.py     |  20 +-
 bob/ip/binseg/data/hrf/__init__.py            |  44 ++++
 bob/ip/binseg/data/hrf/default.json           | 231 ++++++++++++++++++
 bob/ip/binseg/data/hrf/test.py                |  77 ++++++
 bob/ip/binseg/data/jsondataset.py             |   2 +
 bob/ip/binseg/script/dataset.py               |   7 +-
 conda/meta.yaml                               |   1 -
 develop.cfg                                   |  14 +-
 doc/api.rst                                   |   1 -
 22 files changed, 525 insertions(+), 177 deletions(-)
 delete mode 100644 bob/ip/binseg/configs/datasets/drivestarechasedb11168.py
 create mode 100644 bob/ip/binseg/data/hrf/__init__.py
 create mode 100644 bob/ip/binseg/data/hrf/default.json
 create mode 100644 bob/ip/binseg/data/hrf/test.py

diff --git a/bob/ip/binseg/configs/datasets/drivechasedb1iostarhrf608sslstare.py b/bob/ip/binseg/configs/datasets/drivechasedb1iostarhrf608sslstare.py
index c2d041a9..e09f9b03 100644
--- a/bob/ip/binseg/configs/datasets/drivechasedb1iostarhrf608sslstare.py
+++ b/bob/ip/binseg/configs/datasets/drivechasedb1iostarhrf608sslstare.py
@@ -26,7 +26,7 @@ from bob.ip.binseg.configs.datasets.hrf608 import dataset as _hrf
 _labelled = torch.utils.data.ConcatDataset([_drive, _chase, _iostar, _hrf])
 
 # Use STARE without labels in this setup
-from .stare import dataset as _unlabelled
+from bob.ip.binseg.configs.datasets.stare import dataset as _unlabelled
 
 from bob.ip.binseg.data.utils import SSLDataset
 dataset = SSLDataset(_labelled, _unlabelled)
diff --git a/bob/ip/binseg/configs/datasets/drivestarechasedb11168.py b/bob/ip/binseg/configs/datasets/drivestarechasedb11168.py
deleted file mode 100644
index 1a7274ee..00000000
--- a/bob/ip/binseg/configs/datasets/drivestarechasedb11168.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from bob.ip.binseg.configs.datasets.drive1168 import dataset as drive
-from bob.ip.binseg.configs.datasets.stare1168 import dataset as stare
-from bob.ip.binseg.configs.datasets.chasedb11168 import dataset as chase
-import torch
-
-#### Config ####
-
-# PyTorch dataset
-dataset = torch.utils.data.ConcatDataset([drive, stare, chase])
diff --git a/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168.py b/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168.py
index 3bb4f28e..b6258f3f 100644
--- a/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168.py
+++ b/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168.py
@@ -1,10 +1,13 @@
-from bob.ip.binseg.configs.datasets.drive1168 import dataset as drive
-from bob.ip.binseg.configs.datasets.stare1168 import dataset as stare
-from bob.ip.binseg.configs.datasets.chasedb11168 import dataset as chase
-from bob.ip.binseg.configs.datasets.iostarvessel1168 import dataset as iostar
-import torch
+#!/usr/bin/env python
+# coding=utf-8
 
-#### Config ####
+"""COVD-HRF (training set) for Vessel Segmentation
+"""
 
-# PyTorch dataset
-dataset = torch.utils.data.ConcatDataset([drive, stare, chase, iostar])
+from bob.ip.binseg.configs.datasets.drive1168 import dataset as _drive
+from bob.ip.binseg.configs.datasets.stare1168 import dataset as _stare
+from bob.ip.binseg.configs.datasets.chasedb11168 import dataset as _chase
+from bob.ip.binseg.configs.datasets.iostarvessel1168 import dataset as _iostar
+
+import torch.utils.data
+dataset = torch.utils.data.ConcatDataset([_drive, _stare, _chase, _iostar])
diff --git a/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168sslhrf.py b/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168sslhrf.py
index 3b3d2f2e..9cf7b838 100644
--- a/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168sslhrf.py
+++ b/bob/ip/binseg/configs/datasets/drivestarechasedb1iostar1168sslhrf.py
@@ -1,43 +1,20 @@
-from bob.ip.binseg.configs.datasets.drive1168 import dataset as drive
-from bob.ip.binseg.configs.datasets.stare1168 import dataset as stare
-from bob.ip.binseg.configs.datasets.chasedb11168 import dataset as chasedb
-from bob.ip.binseg.configs.datasets.iostarvessel1168 import dataset as iostar
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-import torch
-from bob.ip.binseg.data.binsegdataset import (
-    BinSegDataset,
-    SSLBinSegDataset,
-    UnLabeledBinSegDataset,
-)
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
 
+"""HRF (SSL training set) for Vessel Segmentation
 
-#### Config ####
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3504
+x 2336. One set of ground-truth vessel annotations is available.
 
-# PyTorch dataset
-labeled_dataset = torch.utils.data.ConcatDataset([drive, stare, iostar, chasedb])
+* Reference: [HRF-2013]_
+* Configuration resolution: 1168 x 1648
 
-#### Unlabeled HRF TRAIN ####
-unlabeled_transforms = Compose(
-    [
-        RandomRotation(),
-        Crop(0, 108, 2336, 3296),
-        Resize((1168)),
-        RandomHFlip(),
-        RandomVFlip(),
-        ColorJitter(),
-        ToTensor(),
-    ]
-)
+The dataset available in this file is composed of STARE, CHASE-DB1, IOSTAR
+vessel and CHASE-DB1 (with annotated samples) and HRF without labels.
+"""
 
-# bob.db.dataset init
-hrfbobdb = HRF(protocol="default")
-
-# PyTorch dataset
-unlabeled_dataset = UnLabeledBinSegDataset(
-    hrfbobdb, split="train", transform=unlabeled_transforms
-)
-
-# SSL Dataset
-
-dataset = SSLBinSegDataset(labeled_dataset, unlabeled_dataset)
+from bob.ip.binseg.configs.datasets.drivestarechasedb1iostar1168 import dataset as _labelled
+from bob.ip.binseg.configs.datasets.hrf1168 import dataset as _unlabelled
+from bob.ip.binseg.data.utils import SSLDataset
+dataset = SSLDataset(_labelled, _unlabelled)
diff --git a/bob/ip/binseg/configs/datasets/drivestareiostarhrf960sslchase.py b/bob/ip/binseg/configs/datasets/drivestareiostarhrf960sslchase.py
index e01d70e8..1306a2f4 100644
--- a/bob/ip/binseg/configs/datasets/drivestareiostarhrf960sslchase.py
+++ b/bob/ip/binseg/configs/datasets/drivestareiostarhrf960sslchase.py
@@ -23,16 +23,7 @@ The dataset available in this file is composed of STARE, CHASE-DB1, IOSTAR
 vessel and HRF (with annotated samples) and CHASE-DB1 without labels.
 """
 
-# Labelled bits
-import torch.utils.data
-from bob.ip.binseg.configs.datasets.drive960 import dataset as _drive
-from bob.ip.binseg.configs.datasets.stare960 import dataset as _stare
-from bob.ip.binseg.configs.datasets.hrf960 import dataset as _hrf
-from bob.ip.binseg.configs.datasets.iostarvessel960 import dataset as _iostar
-_labelled = torch.utils.data.ConcatDataset([_drive, _stare, _hrf, _iostar])
-
-# Use CHASE-DB1 without labels in this setup
+from bob.ip.binseg.configs.datasets.drivestareiostarhrf960 import dataset as _labelled
 from bob.ip.binseg.configs.datasets.chasedb1 import dataset as _unlabelled
-
 from bob.ip.binseg.data.utils import SSLDataset
 dataset = SSLDataset(_labelled, _unlabelled)
diff --git a/bob/ip/binseg/configs/datasets/hrf.py b/bob/ip/binseg/configs/datasets/hrf.py
index b1330209..95df5b00 100644
--- a/bob/ip/binseg/configs/datasets/hrf.py
+++ b/bob/ip/binseg/configs/datasets/hrf.py
@@ -1,13 +1,21 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (training set) for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3504
+x 2336. One set of ground-truth vessel annotations is available.
 
-#### Config ####
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 2336 x 3296 (after specific cropping and rescaling)
+* Training samples: 15
+* Split reference: [ORLANDO-2017]_
+"""
 
-transforms = Compose(
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
     [
         Crop(0, 108, 2336, 3296),
         RandomHFlip(),
@@ -18,8 +26,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf1024.py b/bob/ip/binseg/configs/datasets/hrf1024.py
index e07bd883..a1d7cb36 100644
--- a/bob/ip/binseg/configs/datasets/hrf1024.py
+++ b/bob/ip/binseg/configs/datasets/hrf1024.py
@@ -1,13 +1,21 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (training set) for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3504
+x 2336. One set of ground-truth vessel annotations is available.
 
-#### Config ####
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 1024 x ? (after specific padding and rescaling)
+* Training samples: 15
+* Split reference: [ORLANDO-2017]_
+"""
 
-transforms = Compose(
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
     [
         Pad((0, 584, 0, 584)),
         Resize((1024)),
@@ -19,8 +27,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf1168.py b/bob/ip/binseg/configs/datasets/hrf1168.py
index 64ebef45..67ece23f 100644
--- a/bob/ip/binseg/configs/datasets/hrf1168.py
+++ b/bob/ip/binseg/configs/datasets/hrf1168.py
@@ -4,23 +4,18 @@
 """HRF (training set) for Vessel Segmentation
 
 The database includes 15 images of each healthy, diabetic retinopathy (DR), and
-glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3504
 x 2336. One set of ground-truth vessel annotations is available.
 
 * Reference: [HRF-2013]_
 * Original resolution (height x width): 2336 x 3504
-* Configuration resolution: 1168 x 1648 (after specific cropping and rescaling)
+* Configuration resolution: 1168 x 1648 (after specific padding and rescaling)
 * Training samples: 15
 * Split reference: [ORLANDO-2017]_
 """
 
-from bob.db.hrf import Database as HRF
 from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
-
-#### Config ####
-
-transforms = Compose(
+_transforms = Compose(
     [
         Crop(0, 108, 2336, 3296),  #(upper, left, height, width)
         Resize((1168)),  # applies to the smaller edge
@@ -32,8 +27,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf1168test.py b/bob/ip/binseg/configs/datasets/hrf1168test.py
index 86d968f4..d73da151 100644
--- a/bob/ip/binseg/configs/datasets/hrf1168test.py
+++ b/bob/ip/binseg/configs/datasets/hrf1168test.py
@@ -1,16 +1,23 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (test set) for Vessel Segmentation
 
-#### Config ####
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+x 2336. One set of ground-truth vessel annotations is available.
 
-transforms = Compose([Crop(0, 108, 2336, 3296), Resize((1168)), ToTensor()])
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 1168 x 1648 (after specific cropping and rescaling)
+* Test samples: 30
+* Split reference: [ORLANDO-2017]_
+"""
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose([Crop(0, 108, 2336, 3296), Resize((1168)), ToTensor()])
 
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="test", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["test"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf544.py b/bob/ip/binseg/configs/datasets/hrf544.py
index 6cd9ccf0..d45b4247 100644
--- a/bob/ip/binseg/configs/datasets/hrf544.py
+++ b/bob/ip/binseg/configs/datasets/hrf544.py
@@ -1,13 +1,21 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (training set) for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+x 2336. One set of ground-truth vessel annotations is available.
 
-#### Config ####
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 544 x 544 (after specific padding and rescaling)
+* Test samples: 30
+* Split reference: [ORLANDO-2017]_
+"""
 
-transforms = Compose(
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
     [
         Resize((363)),
         Pad((0, 90, 0, 91)),
@@ -19,8 +27,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf544test.py b/bob/ip/binseg/configs/datasets/hrf544test.py
index 45a3e61d..16102bf8 100644
--- a/bob/ip/binseg/configs/datasets/hrf544test.py
+++ b/bob/ip/binseg/configs/datasets/hrf544test.py
@@ -1,16 +1,29 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (test set) for Vessel Segmentation
 
-#### Config ####
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+x 2336. One set of ground-truth vessel annotations is available.
 
-transforms = Compose([Resize((363)), Pad((0, 90, 0, 91)), ToTensor()])
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 544 x 544 (after specific padding and rescaling)
+* Test samples: 30
+* Split reference: [ORLANDO-2017]_
+"""
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
+    [
+        Resize((363)),
+        Pad((0, 90, 0, 91)),
+        ToTensor(),
+    ]
+)
 
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="test", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["test"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf608.py b/bob/ip/binseg/configs/datasets/hrf608.py
index 7b232ea7..a1d4fbf9 100644
--- a/bob/ip/binseg/configs/datasets/hrf608.py
+++ b/bob/ip/binseg/configs/datasets/hrf608.py
@@ -1,13 +1,21 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (training set) for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+x 2336. One set of ground-truth vessel annotations is available.
 
-#### Config ####
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 608 x 608 (after specific padding and rescaling)
+* Training samples: 15
+* Split reference: [ORLANDO-2017]_
+"""
 
-transforms = Compose(
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
     [
         Pad((0, 345, 0, 345)),
         Resize(608),
@@ -19,8 +27,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrf960.py b/bob/ip/binseg/configs/datasets/hrf960.py
index 059a831c..2dd12ef6 100644
--- a/bob/ip/binseg/configs/datasets/hrf960.py
+++ b/bob/ip/binseg/configs/datasets/hrf960.py
@@ -1,13 +1,21 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
-from bob.db.hrf import Database as HRF
-from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+"""HRF (training set) for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+x 2336. One set of ground-truth vessel annotations is available.
 
-#### Config ####
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 960 x 960 (after specific padding and rescaling)
+* Training samples: 15
+* Split reference: [ORLANDO-2017]_
+"""
 
-transforms = Compose(
+from bob.ip.binseg.data.transforms import *
+_transforms = Compose(
     [
         Pad((0, 584, 0, 584)),
         Resize((960)),
@@ -19,8 +27,7 @@ transforms = Compose(
     ]
 )
 
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="train", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["train"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/configs/datasets/hrftest.py b/bob/ip/binseg/configs/datasets/hrftest.py
index d106365a..0ae5d763 100644
--- a/bob/ip/binseg/configs/datasets/hrftest.py
+++ b/bob/ip/binseg/configs/datasets/hrftest.py
@@ -4,26 +4,20 @@
 """HRF (test set) for Vessel Segmentation
 
 The database includes 15 images of each healthy, diabetic retinopathy (DR), and
-glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3304
+glaucomatous eyes.  It contains 45 eye fundus images with a resolution of 3504
 x 2336. One set of ground-truth vessel annotations is available.
 
 * Reference: [HRF-2013]_
 * Original resolution (height x width): 2336 x 3504
-* Configuration resolution: 1168 x 1648 (after specific cropping and rescaling)
+* Configuration resolution: 2336 x 3296 (after specific cropping and rescaling)
 * Test samples: 30
 * Split reference: [ORLANDO-2017]_
 """
 
-from bob.db.hrf import Database as HRF
 from bob.ip.binseg.data.transforms import *
-from bob.ip.binseg.data.binsegdataset import BinSegDataset
+_transforms = Compose([Crop(0, 108, 2336, 3296), ToTensor()])
 
-#### Config ####
-
-transforms = Compose([Crop(0, 108, 2336, 3296), ToTensor()])
-
-# bob.db.dataset init
-bobdb = HRF(protocol="default")
-
-# PyTorch dataset
-dataset = BinSegDataset(bobdb, split="test", transform=transforms)
+from bob.ip.binseg.data.utils import DelayedSample2TorchDataset
+from bob.ip.binseg.data.hrf import dataset as hrf
+dataset = DelayedSample2TorchDataset(hrf.subsets("default")["test"],
+        transform=_transforms)
diff --git a/bob/ip/binseg/data/hrf/__init__.py b/bob/ip/binseg/data/hrf/__init__.py
new file mode 100644
index 00000000..e3b3fa80
--- /dev/null
+++ b/bob/ip/binseg/data/hrf/__init__.py
@@ -0,0 +1,44 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+"""HRF dataset for Vessel Segmentation
+
+The database includes 15 images of each healthy, diabetic retinopathy (DR), and
+glaucomatous eyes.  It contains a total  of 45 eye fundus images with a
+resolution of 3304 x 2336. One set of ground-truth vessel annotations is
+available.
+
+* Reference: [HRF-2013]_
+* Original resolution (height x width): 2336 x 3504
+* Configuration resolution: 1168 x 1648 (after specific cropping and rescaling)
+* Split reference: [ORLANDO-2017]_
+* Protocol ``default``:
+
+  * Training samples: 15 (including labels)
+  * Test samples: 30 (including labels)
+
+"""
+
+import os
+import pkg_resources
+
+import bob.extension
+
+from ..jsondataset import JSONDataset
+from ..loader import load_pil_rgb, load_pil_1
+
+_protocols = [
+        pkg_resources.resource_filename(__name__, "default.json"),
+        ]
+
+_root_path = bob.extension.rc.get('bob.ip.binseg.hrf.datadir',
+        os.path.realpath(os.curdir))
+
+def _loader(s):
+    return dict(
+            data=load_pil_rgb(s["data"]),
+            label=load_pil_1(s["label"]),
+            )
+
+dataset = JSONDataset(protocols=_protocols, root_path=_root_path, loader=_loader)
+"""HRF dataset object"""
diff --git a/bob/ip/binseg/data/hrf/default.json b/bob/ip/binseg/data/hrf/default.json
new file mode 100644
index 00000000..87f29ad5
--- /dev/null
+++ b/bob/ip/binseg/data/hrf/default.json
@@ -0,0 +1,231 @@
+{
+ "train": [
+  [
+   "images/01_dr.JPG",
+   "manual1/01_dr.tif",
+   "mask/01_dr_mask.tif"
+  ],
+  [
+   "images/02_dr.JPG",
+   "manual1/02_dr.tif",
+   "mask/02_dr_mask.tif"
+  ],
+  [
+   "images/03_dr.JPG",
+   "manual1/03_dr.tif",
+   "mask/03_dr_mask.tif"
+  ],
+  [
+   "images/04_dr.JPG",
+   "manual1/04_dr.tif",
+   "mask/04_dr_mask.tif"
+  ],
+  [
+   "images/05_dr.JPG",
+   "manual1/05_dr.tif",
+   "mask/05_dr_mask.tif"
+  ],
+  [
+   "images/01_g.jpg",
+   "manual1/01_g.tif",
+   "mask/01_g_mask.tif"
+  ],
+  [
+   "images/02_g.jpg",
+   "manual1/02_g.tif",
+   "mask/02_g_mask.tif"
+  ],
+  [
+   "images/03_g.jpg",
+   "manual1/03_g.tif",
+   "mask/03_g_mask.tif"
+  ],
+  [
+   "images/04_g.jpg",
+   "manual1/04_g.tif",
+   "mask/04_g_mask.tif"
+  ],
+  [
+   "images/05_g.jpg",
+   "manual1/05_g.tif",
+   "mask/05_g_mask.tif"
+  ],
+  [
+   "images/01_h.jpg",
+   "manual1/01_h.tif",
+   "mask/01_h_mask.tif"
+  ],
+  [
+   "images/02_h.jpg",
+   "manual1/02_h.tif",
+   "mask/02_h_mask.tif"
+  ],
+  [
+   "images/03_h.jpg",
+   "manual1/03_h.tif",
+   "mask/03_h_mask.tif"
+  ],
+  [
+   "images/04_h.jpg",
+   "manual1/04_h.tif",
+   "mask/04_h_mask.tif"
+  ],
+  [
+   "images/05_h.jpg",
+   "manual1/05_h.tif",
+   "mask/05_h_mask.tif"
+  ]
+ ],
+ "test": [
+  [
+   "images/06_dr.JPG",
+   "manual1/06_dr.tif",
+   "mask/06_dr_mask.tif"
+  ],
+  [
+   "images/07_dr.JPG",
+   "manual1/07_dr.tif",
+   "mask/07_dr_mask.tif"
+  ],
+  [
+   "images/08_dr.JPG",
+   "manual1/08_dr.tif",
+   "mask/08_dr_mask.tif"
+  ],
+  [
+   "images/09_dr.JPG",
+   "manual1/09_dr.tif",
+   "mask/09_dr_mask.tif"
+  ],
+  [
+   "images/10_dr.JPG",
+   "manual1/10_dr.tif",
+   "mask/10_dr_mask.tif"
+  ],
+  [
+   "images/11_dr.JPG",
+   "manual1/11_dr.tif",
+   "mask/11_dr_mask.tif"
+  ],
+  [
+   "images/12_dr.JPG",
+   "manual1/12_dr.tif",
+   "mask/12_dr_mask.tif"
+  ],
+  [
+   "images/13_dr.JPG",
+   "manual1/13_dr.tif",
+   "mask/13_dr_mask.tif"
+  ],
+  [
+   "images/14_dr.JPG",
+   "manual1/14_dr.tif",
+   "mask/14_dr_mask.tif"
+  ],
+  [
+   "images/15_dr.JPG",
+   "manual1/15_dr.tif",
+   "mask/15_dr_mask.tif"
+  ],
+  [
+   "images/06_g.jpg",
+   "manual1/06_g.tif",
+   "mask/06_g_mask.tif"
+  ],
+  [
+   "images/07_g.jpg",
+   "manual1/07_g.tif",
+   "mask/07_g_mask.tif"
+  ],
+  [
+   "images/08_g.jpg",
+   "manual1/08_g.tif",
+   "mask/08_g_mask.tif"
+  ],
+  [
+   "images/09_g.jpg",
+   "manual1/09_g.tif",
+   "mask/09_g_mask.tif"
+  ],
+  [
+   "images/10_g.jpg",
+   "manual1/10_g.tif",
+   "mask/10_g_mask.tif"
+  ],
+  [
+   "images/11_g.jpg",
+   "manual1/11_g.tif",
+   "mask/11_g_mask.tif"
+  ],
+  [
+   "images/12_g.jpg",
+   "manual1/12_g.tif",
+   "mask/12_g_mask.tif"
+  ],
+  [
+   "images/13_g.jpg",
+   "manual1/13_g.tif",
+   "mask/13_g_mask.tif"
+  ],
+  [
+   "images/14_g.jpg",
+   "manual1/14_g.tif",
+   "mask/14_g_mask.tif"
+  ],
+  [
+   "images/15_g.jpg",
+   "manual1/15_g.tif",
+   "mask/15_g_mask.tif"
+  ],
+  [
+   "images/06_h.jpg",
+   "manual1/06_h.tif",
+   "mask/06_h_mask.tif"
+  ],
+  [
+   "images/07_h.jpg",
+   "manual1/07_h.tif",
+   "mask/07_h_mask.tif"
+  ],
+  [
+   "images/08_h.jpg",
+   "manual1/08_h.tif",
+   "mask/08_h_mask.tif"
+  ],
+  [
+   "images/09_h.jpg",
+   "manual1/09_h.tif",
+   "mask/09_h_mask.tif"
+  ],
+  [
+   "images/10_h.jpg",
+   "manual1/10_h.tif",
+   "mask/10_h_mask.tif"
+  ],
+  [
+   "images/11_h.jpg",
+   "manual1/11_h.tif",
+   "mask/11_h_mask.tif"
+  ],
+  [
+   "images/12_h.jpg",
+   "manual1/12_h.tif",
+   "mask/12_h_mask.tif"
+  ],
+  [
+   "images/13_h.jpg",
+   "manual1/13_h.tif",
+   "mask/13_h_mask.tif"
+  ],
+  [
+   "images/14_h.jpg",
+   "manual1/14_h.tif",
+   "mask/14_h_mask.tif"
+  ],
+  [
+   "images/15_h.jpg",
+   "manual1/15_h.tif",
+   "mask/15_h_mask.tif"
+  ]
+ ]
+}
\ No newline at end of file
diff --git a/bob/ip/binseg/data/hrf/test.py b/bob/ip/binseg/data/hrf/test.py
new file mode 100644
index 00000000..1cb21407
--- /dev/null
+++ b/bob/ip/binseg/data/hrf/test.py
@@ -0,0 +1,77 @@
+#!/usr/bin/env python
+# coding=utf-8
+
+
+"""Tests for STARE"""
+
+import os
+import nose.tools
+
+from ..utils import rc_variable_set, DelayedSample2TorchDataset
+from ..transforms import Compose, Crop, Resize
+from . import dataset
+
+
+def test_protocol_consitency():
+
+    subset = dataset.subsets("default")
+    nose.tools.eq_(len(subset), 2)
+
+    assert "train" in subset
+    nose.tools.eq_(len(subset["train"]), 15)
+    for s in subset["train"]:
+        assert s.key.startswith(os.path.join("images", "0"))
+
+    assert "test" in subset
+    nose.tools.eq_(len(subset["test"]), 30)
+    for s in subset["test"]:
+        assert s.key.startswith("images")
+
+
+@rc_variable_set('bob.ip.binseg.hrf.datadir')
+def test_loading():
+
+    def _check_sample(s):
+        data = s.data
+        assert isinstance(data, dict)
+        nose.tools.eq_(len(data), 2)
+        assert "data" in data
+        nose.tools.eq_(data["data"].size, (3504, 2336))
+        nose.tools.eq_(data["data"].mode, "RGB")
+        assert "label" in data
+        nose.tools.eq_(data["label"].size, (3504, 2336))
+        nose.tools.eq_(data["label"].mode, "1")
+
+    subset = dataset.subsets("default")
+    for s in subset["train"]: _check_sample(s)
+    for s in subset["test"]: _check_sample(s)
+
+
+@rc_variable_set('bob.ip.binseg.stare.datadir')
+def test_check():
+    nose.tools.eq_(dataset.check(), 0)
+
+
+@rc_variable_set('bob.ip.binseg.stare.datadir')
+def test_torch_dataset():
+
+    def _check_sample(s):
+        nose.tools.eq_(len(s), 3)
+        assert isinstance(s[0], str)
+        nose.tools.eq_(s[1].size, (1648, 1168))
+        nose.tools.eq_(s[1].mode, "RGB")
+        nose.tools.eq_(s[2].size, (1648, 1168))
+        nose.tools.eq_(s[2].mode, "1")
+
+
+    transforms = Compose([Crop(0, 108, 2336, 3296), Resize((1168))])
+
+    subset = dataset.subsets("default")
+
+    torch_dataset = DelayedSample2TorchDataset(subset["train"], transforms)
+    nose.tools.eq_(len(torch_dataset), 15)
+    for s in torch_dataset: _check_sample(s)
+
+    torch_dataset = DelayedSample2TorchDataset(subset["test"], transforms)
+    nose.tools.eq_(len(torch_dataset), 30)
+    for s in torch_dataset: _check_sample(s)
diff --git a/bob/ip/binseg/data/jsondataset.py b/bob/ip/binseg/data/jsondataset.py
index 99c554bf..6ce86a20 100644
--- a/bob/ip/binseg/data/jsondataset.py
+++ b/bob/ip/binseg/data/jsondataset.py
@@ -122,6 +122,8 @@ class JSONDataset:
 
         """
 
+        logger.info(f"Checking dataset at '{self.root_path}'...")
+
         errors = 0
         for proto in self.protocols:
             logger.info(f"Checking protocol '{proto}'...")
diff --git a/bob/ip/binseg/script/dataset.py b/bob/ip/binseg/script/dataset.py
index b00d225e..940f9ef0 100644
--- a/bob/ip/binseg/script/dataset.py
+++ b/bob/ip/binseg/script/dataset.py
@@ -113,13 +113,16 @@ def check(dataset, **kwargs):
     if dataset:  #check only some
         to_check = [k for k in to_check if k.group("name") in dataset]
 
-    if not dataset:
+    if not to_check:
         click.echo("No configured datasets matching specifications")
         click.echo("Try bob binseg dataset list --help to get help in "
                 "configuring a dataset")
     else:
+        errors = 0
         for k in to_check:
             click.echo(f"Checking \"{k.group('name')}\" dataset...")
             module = importlib.import_module(f"...data.{k.group('name')}",
                     __name__)
-            module.dataset.check()
+            errors += module.dataset.check()
+        if not errors:
+            click.echo(f"No errors reported")
diff --git a/conda/meta.yaml b/conda/meta.yaml
index 1b1a7615..dd4d7894 100644
--- a/conda/meta.yaml
+++ b/conda/meta.yaml
@@ -79,7 +79,6 @@ test:
     - sphinx
     - sphinx_rtd_theme
     - sphinxcontrib-programoutput
-    - bob.db.hrf
     - bob.db.drionsdb
     - bob.db.rimoner3
     - bob.db.drishtigs1
diff --git a/develop.cfg b/develop.cfg
index 9229bdf9..0bc61a9e 100644
--- a/develop.cfg
+++ b/develop.cfg
@@ -4,10 +4,6 @@
 [buildout]
 parts = scripts
 eggs = bob.ip.binseg
-       bob.db.drive
-       bob.db.stare
-       bob.db.chasedb1
-       bob.db.hrf
        bob.db.drionsdb
        bob.db.rimoner3
        bob.db.drishtigs1
@@ -16,11 +12,7 @@ eggs = bob.ip.binseg
 extensions = bob.buildout
              mr.developer
 auto-checkout = *
-develop = src/bob.db.drive
-          src/bob.db.stare
-          src/bob.db.chasedb1
-          src/bob.db.hrf
-          src/bob.db.drionsdb
+develop = src/bob.db.drionsdb
           src/bob.db.rimoner3
           src/bob.db.drishtigs1
           src/bob.db.refuge
@@ -33,10 +25,6 @@ verbose = true
 newest = false
 
 [sources]
-bob.db.drive      = git git@gitlab.idiap.ch:bob/bob.db.drive
-bob.db.stare      = git git@gitlab.idiap.ch:bob/bob.db.stare
-bob.db.chasedb1   = git git@gitlab.idiap.ch:bob/bob.db.chasedb1
-bob.db.hrf        = git git@gitlab.idiap.ch:bob/bob.db.hrf
 bob.db.drionsdb   = git git@gitlab.idiap.ch:bob/bob.db.drionsdb
 bob.db.rimoner3   = git git@gitlab.idiap.ch:bob/bob.db.rimoner3
 bob.db.drishtigs1 = git git@gitlab.idiap.ch:bob/bob.db.drishtigs1
diff --git a/doc/api.rst b/doc/api.rst
index 19afcc1e..b16d4422 100644
--- a/doc/api.rst
+++ b/doc/api.rst
@@ -148,7 +148,6 @@ Datasets
    bob.ip.binseg.configs.datasets.drive960
    bob.ip.binseg.configs.datasets.drivechasedb1iostarhrf608
    bob.ip.binseg.configs.datasets.drivechasedb1iostarhrf608sslstare
-   bob.ip.binseg.configs.datasets.drivestarechasedb11168
    bob.ip.binseg.configs.datasets.drivestarechasedb1hrf1024
    bob.ip.binseg.configs.datasets.drivestarechasedb1hrf1024ssliostar
    bob.ip.binseg.configs.datasets.drivestarechasedb1iostar1168
-- 
GitLab