Source code for off_parser.data.loader
import os
import zipfile
import tempfile
import numpy as np
from ..parser import OffParser
try:
from urllib.request import urlretrieve
except:
from urllib import urlretrieve
__all__ = [
'load_data',
'download_dataset',
'load_modelnet10',
'load_modelnet40'
]
DATA_FOLDER = os.path.abspath(os.path.dirname(__file__))
DATASETS = {
'modelnet10': 'http://3dvision.princeton.edu/projects/2014/3DShapeNets/ModelNet10.zip',
'modelnet40': 'http://modelnet.cs.princeton.edu/ModelNet40.zip'
}
[docs]def load_data(name):
"""
Loads the built-in data file into an :class:`.OffParser` object.
Parameters
----------
name : str
The name of the built-in data file. If the string does not include
the `.off` file extension, it will be added. The following names are
available:
* 'cube'
* 'toilet'
"""
if not name.endswith('.off'):
name = '{}.off'.format(name)
path = os.path.join(DATA_FOLDER, name)
return OffParser(path)
[docs]def download_dataset(name):
"""
Downloads the named dataset to the system temporary folder.
Parameters
----------
name : str
The name of the dataset. The following names are available:
* 'modelnet10'
* 'modelnet40'
"""
url = DATASETS[name]
fname = url.split('/')[-1]
dirname = tempfile.gettempdir()
path = os.path.join(dirname, fname)
if not os.path.isfile(path):
urlretrieve(url, path)
return path
def _load_modelnet(name, partition):
"""
Downloads the specified modelnet datasets and yields generated elements.
Parameters
----------
name : str
The name of the dataset.
partition : {'train', 'test'}
The dataset partition to load.
"""
path = download_dataset(name)
s = '/{}/'.format(partition)
with zipfile.ZipFile(path, 'r') as fh:
for name in fh.namelist():
if name.endswith('.off') and not name.startswith('__MACOSX') and s in name:
label = name.split('/')[-3]
data = fh.read(name)
data = data.decode('utf-8')
data = data.split('\n')
data = [x.split(' ') for x in data]
data = OffParser.from_data(data, label=label)
yield data
[docs]def load_modelnet10(partition):
"""
Downloads the ModelNet10 dataset and returns a generator of
:class:`.OffParser` objects. The dataset is described
`here <http://modelnet.cs.princeton.edu/>`_.
Parameters
----------
partition : {'train', 'test'}
The dataset partition to load.
"""
return _load_modelnet('modelnet10', partition)
[docs]def load_modelnet40(partition):
"""
Downloads the ModelNet40 dataset and returns a generator of
:class:`.OffParser` objects. The dataset is described
`here <http://modelnet.cs.princeton.edu/>`_.
Parameters
----------
partition : {'train', 'test'}
The dataset partition to load.
"""
return _load_modelnet('modelnet40', partition)