Commit 739e0c79 authored by Tim Laibacher's avatar Tim Laibacher

Initial commit

parents
Pipeline #33079 passed with stages
in 55 minutes and 11 seconds
### Bob defaults ###
*~
*.swp
*.pyc
*.so
*.dylib
bin
eggs
parts
.installed.cfg
.mr.developer.cfg
*.egg-info
develop-eggs
sphinx
dist
.nfs*
.gdb_history
build
*.egg
src/
record.txt
core
### JupyterNotebook ###
.ipynb_checkpoints
*/.ipynb_checkpoints/*
### VisualStudioCode ###
.vscode/*
.vscode/settings.json
.vscode/tasks.json
.vscode/launch.json
.vscode/extensions.json
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
\ No newline at end of file
include: 'https://gitlab.idiap.ch/bob/bob.devtools/raw/master/bob/devtools/data/gitlab-ci/single-package.yaml'
\ No newline at end of file
Copyright (c) 2019 Idiap Research Institute, http://www.idiap.ch/
Written by Tim Laibacher <tim.laibacher@idiap.ch>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors
may be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
include README.rst buildout.cfg LICENSE version.txt requirements.txt
recursive-include doc *.rst *.png *.ico *.txt
recursive-include bob *.json *.csv
\ No newline at end of file
.. -*- coding: utf-8 -*-
.. image:: https://img.shields.io/badge/docs-stable-yellow.svg
:target: hhttp://beatubulatest.lab.idiap.ch/private/docs/bob/bob.db.iostar/stable/index.html
.. image:: https://img.shields.io/badge/docs-latest-orange.svg
:target: http://beatubulatest.lab.idiap.ch/private/docs/bob/bob.db.iostar/master/index.html
.. image:: https://gitlab.idiap.ch/bob/bob.db.iostar/badges/master/build.svg
:target: https://gitlab.idiap.ch/bob/bob.db.iostar/commits/master
.. image:: https://gitlab.idiap.ch/bob/bob.db.iostar/badges/master/coverage.svg
:target: https://gitlab.idiap.ch/bob/bob.db.iostar/commits/master
.. image:: https://img.shields.io/badge/gitlab-project-0000c0.svg
:target: https://gitlab.idiap.ch/bob/bob.db.iostar
.. image:: https://img.shields.io/pypi/v/bob.db.iostar.svg
:target: https://pypi.python.org/pypi/bob.db.iostar
==================================
IOSTAR Database Interface for Bob
==================================
This package is part of the signal-processing and machine learning toolbox Bob_. It provides an interface for the `IOSTAR Dataset`_. This package does
not contain the original data files, which need to be obtained through the link above.
Installation
------------
Complete bob's `installation`_ instructions. Then, to install this
package, run::
$ conda install bob.db.iostar
Contact
-------
For questions or reporting issues to this software package, contact our
development `mailing list`_.
.. Place your references here:
.. _bob: https://www.idiap.ch/software/bob
.. _installation: https://www.idiap.ch/software/bob/install
.. _mailing list: https://www.idiap.ch/software/bob/discuss
.. _iostar dataset: http://www.retinacheck.org/download-iostar-retinal-vessel-segmentation-dataset
\ No newline at end of file
# see https://docs.python.org/3/library/pkgutil.html
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
# see https://docs.python.org/3/library/pkgutil.html
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
"""
IOSTAR – Retinal Vessel Segmentation (A/V) Dataset (Updated by 6/1/2018)
Jiong Zhang, Behdad Dashtbozorg, Erik Bekkers, Josien P.W. Pluim, Remco Duits, and Bart M. ter Haar Romeny, “Robust retinal vessel segmentation via locally adaptive derivative frames in orientation scores,” IEEE Transactions on Medical Imaging, vol. 35, no. 12, pp. 2631–2644, 2016.
http://www.retinacheck.org/datasets
"""
from .query import Database
def get_config():
"""Returns a string containing the configuration information.
"""
import bob.extension
return bob.extension.get_config(__name__)
# gets sphinx autodoc done right - don't remove it
__all__ = [_ for _ in dir() if not _.startswith('_')]
from pathlib import Path
import logging
import bob.extension
from .query import Database
def checkfiles(args):
"""
Check if the local database tree is consistent
with the expected structure
"""
db = Database(args.protocol)
# go through all files, check if they are available on the filesystem
good = []
bad = []
datadir = Path(args.datadir)
paths = db.paths
for obj in paths:
obj = datadir.joinpath(obj)
if obj.exists():
good.append(obj)
logging.info(f'Found file {obj}')
else:
bad.append(obj)
logging.warning(f'Cannot find file {obj}')
# report
if bad:
logging.warning(f'{len(bad)} files (out of {len(paths)}) were not found at "{str(datadir)}" ')
else:
print('checkfiles completed sucessfully')
return 0
def add_command(subparsers):
"""Add specific subcommands that the action "checkfiles" can use"""
from argparse import SUPPRESS
parser = subparsers.add_parser('checkfiles', help='Check if the local database tree is consistent with the expected structure')
parser.add_argument('-D', '--datadir', metavar='DIR', default=bob.extension.rc['bob.db.iostar.datadir'], help='path to IOSTAR dataset, default uses bob config settings (to check use: bob config show).')
parser.add_argument('-P', '--protocol', metavar='STR', default='default_vessel',help='The train/test set protocol to use')
parser.add_argument('--self-test', dest="selftest", default=False, action='store_true', help=SUPPRESS)
parser.set_defaults(func=checkfiles) # action
\ No newline at end of file
from pathlib import Path
import csv
import json
import pkg_resources
import bob.extension
def get_file_names(datadir):
"""
Get absolute path of files in a data directory (recursively).
Parameters
----------
data_dir : a Path object
Returns:
-------
file_path: list
a sorted list of paths to all files in the given data directory. Ignores hidden files (suchs as .DS_Store)
"""
file_paths = sorted(list(datadir.glob('**/*?.*')))
rel_file_paths = [f.relative_to(datadir) for f in file_paths]
return rel_file_paths
def read_split(file):
"""
Reads a csv file with two columns: image_file_name, ground_truth_file_name.
Returns
-------
file_list : list
list containing two tuples. The first one contains image file names, the second the ground truth file names
"""
file = open(file,"r")
rows = csv.reader(file)
file_list = list(zip(*rows))
file.close()
return file_list
def create(args):
"""
Writes a 'database' json file to disk
Parameters
----------
args.train : csv containg train img, gt, (mask) pairs
args.test : csv containg test img,gt, (mask) pairs
args.datadir : path to the dataset on disk
args.output : name of the output file
Returns
-------
int : 0
"""
# read file name pairs as defined in the csv
basedir = Path(pkg_resources.resource_filename(__name__, ''))
train_split = read_split(basedir.joinpath(args.train))
test_split = read_split(basedir.joinpath(args.test))
# get actual file paths and create dictionary (filname, path)
files = get_file_names(Path(args.datadir))
filedict = dict([(f.name, f) for f in files])
# map split to files
train_images = [str(filedict[img]) for img in train_split[0]]
train_ground_truths = [str(filedict[gt]) for gt in train_split[1]]
test_images = [str(filedict[img]) for img in test_split[0]]
test_ground_truths = [str(filedict[gt]) for gt in test_split[1]]
train_masks = [str(filedict[gt]) for gt in train_split[2]]
test_masks = [str(filedict[gt]) for gt in test_split[2]]
# sense check
assert len(train_images) == len(train_ground_truths) == len(train_masks)
assert len(test_images) == len(test_ground_truths) == len(test_masks)
# zip together and create dict.
train = list(zip(train_images, train_ground_truths, train_masks))
test = list(zip(test_images, test_ground_truths, test_masks))
db = {'train':train,'test':test}
# json
with open(basedir.joinpath(args.output),'w') as outfile:
json.dump(db, outfile, indent = 1)
# return 0 for self-test
return 0
def add_command(subparsers):
"""Add specific subcommands that the action "create" can use"""
from argparse import SUPPRESS
parser = subparsers.add_parser('create', help='Creates json file with train and test splits')
parser.add_argument('-D', '--datadir', metavar='DIR', default=bob.extension.rc['bob.db.iostar.datadir'], help='path to IOSTAR dataset, default uses bob config settings (to check use: bob config show).')
parser.add_argument('-T', '--train', metavar='STR', default='iostar_train_od.csv', help='csv containg train img,gt pairs')
parser.add_argument('-E', '--test', metavar='STR', default='iostar_test_od.csv', help='csv containg test img,gt pairs')
parser.add_argument('-O', '--output', metavar='STR', default='iostar_db_default_od.json', help='output file name')
parser.add_argument('--self-test', dest="selftest", default=False, action='store_true', help=SUPPRESS)
parser.set_defaults(func=create) #action
#!/usr/bin/env python
# vim: set fileencoding=utf-8 :
"""Commands the database can respond to.
"""
import pkg_resources
from bob.db.base.driver import Interface as BaseInterface
class Interface(BaseInterface):
def name(self):
return 'iostar'
def version(self):
return pkg_resources.require('bob.db.%s' % self.name())[0].version
def files(self):
"""
List of meta-data files for the package to be downloaded/uploaded
This function should normally return an empty list, except in case the
database being implemented requires download/upload of metadata files that
are **not** kept in its (git) repository.
"""
return []
def type(self):
return 'text'
def add_commands(self, parser):
from . import __doc__ as docs
subparsers = self.setup_parser(parser,"IOSTAR database", docs)
# checkfiles command
from .checkfiles import add_command as checkfiles_command
checkfiles_command(subparsers)
# create command
from .create import add_command as create_command
create_command(subparsers)
\ No newline at end of file
{
"train": [
[
"image/STAR 01_OSC.jpg",
"mask_OD/STAR 01_OSC_ODMask.tif",
"mask/STAR 01_OSC_Mask.tif"
],
[
"image/STAR 02_ODC.jpg",
"mask_OD/STAR 02_ODC_ODMask.tif",
"mask/STAR 02_ODC_Mask.tif"
],
[
"image/STAR 03_OSN.jpg",
"mask_OD/STAR 03_OSN_ODMask.tif",
"mask/STAR 03_OSN_Mask.tif"
],
[
"image/STAR 05_ODC.jpg",
"mask_OD/STAR 05_ODC_ODMask.tif",
"mask/STAR 05_ODC_Mask.tif"
],
[
"image/STAR 06_ODN.jpg",
"mask_OD/STAR 06_ODN_ODMask.tif",
"mask/STAR 06_ODN_Mask.tif"
],
[
"image/STAR 08_OSN.jpg",
"mask_OD/STAR 08_OSN_ODMask.tif",
"mask/STAR 08_OSN_Mask.tif"
],
[
"image/STAR 09_OSN.jpg",
"mask_OD/STAR 09_OSN_ODMask.tif",
"mask/STAR 09_OSN_Mask.tif"
],
[
"image/STAR 10_OSN.jpg",
"mask_OD/STAR 10_OSN_ODMask.tif",
"mask/STAR 10_OSN_Mask.tif"
],
[
"image/STAR 13_OSN.jpg",
"mask_OD/STAR 13_OSN_ODMask.tif",
"mask/STAR 13_OSN_Mask.tif"
],
[
"image/STAR 15_OSN.jpg",
"mask_OD/STAR 15_OSN_ODMask.tif",
"mask/STAR 15_OSN_Mask.tif"
],
[
"image/STAR 16_OSN.jpg",
"mask_OD/STAR 16_OSN_ODMask.tif",
"mask/STAR 16_OSN_Mask.tif"
],
[
"image/STAR 17_ODN.jpg",
"mask_OD/STAR 17_ODN_ODMask.tif",
"mask/STAR 17_ODN_Mask.tif"
],
[
"image/STAR 20_ODC.jpg",
"mask_OD/STAR 20_ODC_ODMask.tif",
"mask/STAR 20_ODC_Mask.tif"
],
[
"image/STAR 21_OSC.jpg",
"mask_OD/STAR 21_OSC_ODMask.tif",
"mask/STAR 21_OSC_Mask.tif"
],
[
"image/STAR 24_OSC.jpg",
"mask_OD/STAR 24_OSC_ODMask.tif",
"mask/STAR 24_OSC_Mask.tif"
],
[
"image/STAR 26_ODC.jpg",
"mask_OD/STAR 26_ODC_ODMask.tif",
"mask/STAR 26_ODC_Mask.tif"
],
[
"image/STAR 28_ODN.jpg",
"mask_OD/STAR 28_ODN_ODMask.tif",
"mask/STAR 28_ODN_Mask.tif"
],
[
"image/STAR 30_ODC.jpg",
"mask_OD/STAR 30_ODC_ODMask.tif",
"mask/STAR 30_ODC_Mask.tif"
],
[
"image/STAR 31_ODN.jpg",
"mask_OD/STAR 31_ODN_ODMask.tif",
"mask/STAR 31_ODN_Mask.tif"
],
[
"image/STAR 32_ODC.jpg",
"mask_OD/STAR 32_ODC_ODMask.tif",
"mask/STAR 32_ODC_Mask.tif"
]
],
"test": [
[
"image/STAR 34_ODC.jpg",
"mask_OD/STAR 34_ODC_ODMask.tif",
"mask/STAR 34_ODC_Mask.tif"
],
[
"image/STAR 36_OSC.jpg",
"mask_OD/STAR 36_OSC_ODMask.tif",
"mask/STAR 36_OSC_Mask.tif"
],
[
"image/STAR 37_ODN.jpg",
"mask_OD/STAR 37_ODN_ODMask.tif",
"mask/STAR 37_ODN_Mask.tif"
],
[
"image/STAR 38_ODC.jpg",
"mask_OD/STAR 38_ODC_ODMask.tif",
"mask/STAR 38_ODC_Mask.tif"
],
[
"image/STAR 39_ODC.jpg",
"mask_OD/STAR 39_ODC_ODMask.tif",
"mask/STAR 39_ODC_Mask.tif"
],
[
"image/STAR 40_OSC.jpg",
"mask_OD/STAR 40_OSC_ODMask.tif",
"mask/STAR 40_OSC_Mask.tif"
],
[
"image/STAR 43_OSC.jpg",
"mask_OD/STAR 43_OSC_ODMask.tif",
"mask/STAR 43_OSC_Mask.tif"
],
[
"image/STAR 44_OSN.jpg",
"mask_OD/STAR 44_OSN_ODMask.tif",
"mask/STAR 44_OSN_Mask.tif"
],
[
"image/STAR 45_ODC.jpg",
"mask_OD/STAR 45_ODC_ODMask.tif",
"mask/STAR 45_ODC_Mask.tif"
],
[
"image/STAR 48_OSN.jpg",
"mask_OD/STAR 48_OSN_ODMask.tif",
"mask/STAR 48_OSN_Mask.tif"
]
]
}
\ No newline at end of file
{
"train": [
[
"image/STAR 01_OSC.jpg",
"GT/STAR 01_OSC_GT.tif",
"mask/STAR 01_OSC_Mask.tif"
],
[
"image/STAR 02_ODC.jpg",
"GT/STAR 02_ODC_GT.tif",
"mask/STAR 02_ODC_Mask.tif"
],
[
"image/STAR 03_OSN.jpg",
"GT/STAR 03_OSN_GT.tif",
"mask/STAR 03_OSN_Mask.tif"
],
[
"image/STAR 05_ODC.jpg",
"GT/STAR 05_ODC_GT.tif",
"mask/STAR 05_ODC_Mask.tif"
],
[
"image/STAR 06_ODN.jpg",
"GT/STAR 06_ODN_GT.tif",
"mask/STAR 06_ODN_Mask.tif"
],
[
"image/STAR 08_OSN.jpg",
"GT/STAR 08_OSN_GT.tif",
"mask/STAR 08_OSN_Mask.tif"
],
[
"image/STAR 09_OSN.jpg",
"GT/STAR 09_OSN_GT.tif",
"mask/STAR 09_OSN_Mask.tif"
],
[
"image/STAR 10_OSN.jpg",
"GT/STAR 10_OSN_GT.tif",
"mask/STAR 10_OSN_Mask.tif"
],
[
"image/STAR 13_OSN.jpg",
"GT/STAR 13_OSN_GT.tif",
"mask/STAR 13_OSN_Mask.tif"
],
[
"image/STAR 15_OSN.jpg",
"GT/STAR 15_OSN_GT.tif",
"mask/STAR 15_OSN_Mask.tif"
],
[
"image/STAR 16_OSN.jpg",
"GT/STAR 16_OSN_GT.tif",
"mask/STAR 16_OSN_Mask.tif"
],
[
"image/STAR 17_ODN.jpg",
"GT/STAR 17_ODN_GT.tif",
"mask/STAR 17_ODN_Mask.tif"
],
[
"image/STAR 20_ODC.jpg",
"GT/STAR 20_ODC_GT.tif",
"mask/STAR 20_ODC_Mask.tif"
],
[
"image/STAR 21_OSC.jpg",
"GT/STAR 21_OSC_GT.tif",
"mask/STAR 21_OSC_Mask.tif"
],
[
"image/STAR 24_OSC.jpg",
"GT/STAR 24_OSC_GT.tif",
"mask/STAR 24_OSC_Mask.tif"
],
[
"image/STAR 26_ODC.jpg",
"GT/STAR 26_ODC_GT.tif",
"mask/STAR 26_ODC_Mask.tif"
],
[
"image/STAR 28_ODN.jpg",
"GT/STAR 28_ODN_GT.tif",
"mask/STAR 28_ODN_Mask.tif"
],
[
"image/STAR 30_ODC.jpg",
"GT/STAR 30_ODC_GT.tif",
"mask/STAR 30_ODC_Mask.tif"
],
[
"image/STAR 31_ODN.jpg",
"GT/STAR 31_ODN_GT.tif",
"mask/STAR 31_ODN_Mask.tif"
],
[
"image/STAR 32_ODC.jpg",
"GT/STAR 32_ODC_GT.tif",
"mask/STAR 32_ODC_Mask.tif"
]
],
"test": [
[
"image/STAR 34_ODC.jpg",
"GT/STAR 34_ODC_GT.tif",
"mask/STAR 34_ODC_Mask.tif"
],
[
"image/STAR 36_OSC.jpg",
"GT/STAR 36_OSC_GT.tif",
"mask/STAR 36_OSC_Mask.tif"
],
[
"image/STAR 37_ODN.jpg",
"GT/STAR 37_ODN_GT.tif",
"mask/STAR 37_ODN_Mask.tif"
],
[
"image/STAR 38_ODC.jpg",
"GT/STAR 38_ODC_GT.tif",
"mask/STAR 38_ODC_Mask.tif"
],
[
"image/STAR 39_ODC.jpg",
"GT/STAR 39_ODC_GT.tif",
"mask/STAR 39_ODC_Mask.tif"
],
[
"image/STAR 40_OSC.jpg",
"GT/STAR 40_OSC_GT.tif",
"mask/STAR 40_OSC_Mask.tif"
],
[
"image/STAR 43_OSC.jpg",
"GT/STAR 43_OSC_GT.tif",
"mask/STAR 43_OSC_Mask.tif"
],
[
"image/STAR 44_OSN.jpg",
"GT/STAR 44_OSN_GT.tif",
"mask/STAR 44_OSN_Mask.tif"
],
[
"image/STAR 45_ODC.jpg",
"GT/STAR 45_ODC_GT.tif",
"mask/STAR 45_ODC_Mask.tif"
],
[
"image/STAR 48_OSN.jpg",
"GT/STAR 48_OSN_GT.tif",
"mask/STAR 48_OSN_Mask.tif"
]
]
}
\ No newline at end of file
STAR 34_ODC.jpg,STAR 34_ODC_ODMask.tif,STAR 34_ODC_Mask.tif
STAR 36_OSC.jpg,STAR 36_OSC_ODMask.tif,STAR 36_OSC_Mask.tif
STAR 37_ODN.jpg,STAR 37_ODN_ODMask.tif,STAR 37_ODN_Mask.tif
STAR 38_ODC.jpg,STAR 38_ODC_ODMask.tif,STAR 38_ODC_Mask.tif
STAR 39_ODC.jpg,STAR 39_ODC_ODMask.tif,STAR 39_ODC_Mask.tif
STAR 40_OSC.jpg,STAR 40_OSC_ODMask.tif,STAR 40_OSC_Mask.tif
STAR 43_OSC.jpg,STAR 43_OSC_ODMask.tif,STAR 43_OSC_Mask.tif
STAR 44_OSN.jpg,STAR 44_OSN_ODMask.tif,STAR 44_OSN_Mask.tif
STAR 45_ODC.jpg,STAR 45_ODC_ODMask.tif,STAR 45_ODC_Mask.tif
STAR 48_OSN.jpg,STAR 48_OSN_ODMask.tif,STAR 48_OSN_Mask.tif
\ No newline at end of file
STAR 34_ODC.jpg,STAR 34_ODC_GT.tif,STAR 34_ODC_Mask.tif
STAR 36_OSC.jpg,STAR 36_OSC_GT.tif,STAR 36_OSC_Mask.tif
STAR 37_ODN.jpg,STAR 37_ODN_GT.tif,STAR 37_ODN_Mask.tif
STAR 38_ODC.jpg,STAR 38_ODC_GT.tif,STAR 38_ODC_Mask.tif
STAR 39_ODC.jpg,STAR 39_ODC_GT.tif,STAR 39_ODC_Mask.tif
STAR 40_OSC.jpg,STAR 40_OSC_GT.tif,STAR 40_OSC_Mask.tif
STAR 43_OSC.jpg,STAR 43_OSC_GT.tif,STAR 43_OSC_Mask.tif
STAR 44_OSN.jpg,STAR 44_OSN_GT.tif,STAR 44_OSN_Mask.tif
STAR 45_ODC.jpg,STAR 45_ODC_GT.tif,STAR 45_ODC_Mask.tif
STAR 48_OSN.jpg,STAR 48_OSN_GT.tif,STAR 48_OSN_Mask.tif
\ No newline at end of file
STAR 01_OSC.jpg,STAR 01_OSC_ODMask.tif,STAR 01_OSC_Mask.tif
STAR 02_ODC.jpg,STAR 02_ODC_ODMask.tif,STAR 02_ODC_Mask.tif
STAR 03_OSN.jpg,STAR 03_OSN_ODMask.tif,STAR 03_OSN_Mask.tif
STAR 05_ODC.jpg,STAR 05_ODC_ODMask.tif,STAR 05_ODC_Mask.tif
STAR 06_ODN.jpg,STAR 06_ODN_ODMask.tif,STAR 06_ODN_Mask.tif
STAR 08_OSN.jpg,STAR 08_OSN_ODMask.tif,STAR 08_OSN_Mask.tif
STAR 09_OSN.jpg,STAR 09_OSN_ODMask.tif,STAR 09_OSN_Mask.tif
STAR 10_OSN.jpg,STAR 10_OSN_ODMask.tif,STAR 10_OSN_Mask.tif
STAR 13_OSN.jpg,STAR 13_OSN_ODMask.tif,STAR 13_OSN_Mask.tif
STAR 15_OSN.jpg,STAR 15_OSN_ODMask.tif,STAR 15_OSN_Mask.tif
STAR 16_OSN.jpg,STAR 16_OSN_ODMask.tif,STAR 16_OSN_Mask.tif
STAR 17_ODN.jpg,STAR 17_ODN_ODMask.tif,STAR 17_ODN_Mask.tif
STAR 20_ODC.jpg,STAR 20_ODC_ODMask.tif,STAR 20_ODC_Mask.tif
STAR 21_OSC.jpg,STAR 21_OSC_ODMask.tif,STAR 21_OSC_Mask.tif
STAR 24_OSC.jpg,STAR 24_OSC_ODMask.tif,STAR 24_OSC_Mask.tif
STAR 26_ODC.jpg,STAR 26_ODC_ODMask.tif,STAR 26_ODC_Mask.tif
STAR 28_ODN.jpg,STAR 28_ODN_ODMask.tif,STAR 28_ODN_Mask.tif
STAR 30_ODC.jpg,STAR 30_ODC_ODMask.tif,STAR 30_ODC_Mask.tif
STAR 31_ODN.jpg,STAR 31_ODN_ODMask.tif,STAR 31_ODN_Mask.tif
STAR 32_ODC.jpg,STAR 32_ODC_ODMask.tif,STAR 32_ODC_Mask.tif
STAR 01_OSC.jpg,STAR 01_OSC_GT.tif,STAR 01_OSC_Mask.tif
STAR 02_ODC.jpg,STAR 02_ODC_GT.tif,STAR 02_ODC_Mask.tif
STAR 03_OSN.jpg,STAR 03_OSN_GT.tif,STAR 03_OSN_Mask.tif
STAR 05_ODC.jpg,STAR 05_ODC_GT.tif,STAR 05_ODC_Mask.tif
STAR 06_ODN.jpg,STAR 06_ODN_GT.tif,STAR 06_ODN_Mask.tif
STAR 08_OSN.jpg,STAR 08_OSN_GT.tif,STAR 08_OSN_Mask.tif
STAR 09_OSN.jpg,STAR 09_OSN_GT.tif,STAR 09_OSN_Mask.tif
STAR 10_OSN.jpg,STAR 10_OSN_GT.tif,STAR 10_OSN_Mask.tif
STAR 13_OSN.jpg,STAR 13_OSN_GT.tif,STAR 13_OSN_Mask.tif
STAR 15_OSN.jpg,STAR 15_OSN_GT.tif,STAR 15_OSN_Mask.tif
STAR 16_OSN.jpg,STAR 16_OSN_GT.tif,STAR 16_OSN_Mask.tif
STAR 17_ODN.jpg,STAR 17_ODN_GT.tif,STAR 17_ODN_Mask.tif
STAR 20_ODC.jpg,STAR 20_ODC_GT.tif,STAR 20_ODC_Mask.tif
STAR 21_OSC.jpg,STAR 21_OSC_GT.tif,STAR 21_OSC_Mask.tif
STAR 24_OSC.jpg,STAR 24_OSC_GT.tif,STAR 24_OSC_Mask.tif
STAR 26_ODC.jpg,STAR 26_ODC_GT.tif,STAR 26_ODC_Mask.tif
STAR 28_ODN.jpg,STAR 28_ODN_GT.tif,STAR 28_ODN_Mask.tif
STAR 30_ODC.jpg,STAR 30_ODC_GT.tif,STAR 30_ODC_Mask.tif
STAR 31_ODN.jpg,STAR 31_ODN_GT.tif,STAR 31_ODN_Mask.tif
STAR 32_ODC.jpg,STAR 32_ODC_GT.tif,STAR 32_ODC_Mask.tif
\ No newline at end of file
from pathlib import Path
from PIL import Image
import bob.extension
import PIL
class FundusImage: