{"id":13571396,"url":"https://github.com/perslev/U-Time","last_synced_at":"2025-04-04T08:31:11.255Z","repository":{"id":37774004,"uuid":"164857449","full_name":"perslev/U-Time","owner":"perslev","description":"U-Time: A Fully Convolutional Network for Time Series  Segmentation","archived":false,"fork":false,"pushed_at":"2025-01-02T12:05:06.000Z","size":16157,"stargazers_count":259,"open_issues_count":8,"forks_count":68,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-01-02T13:18:28.908Z","etag":null,"topics":["deep-learning","fully-convolutional-networks","segmentation","sleep-analysis","time-series-analysis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/perslev.png","metadata":{"files":{"readme":"README.md","changelog":"HISTORY.rst","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-01-09T12:18:58.000Z","updated_at":"2024-12-01T00:34:36.000Z","dependencies_parsed_at":"2023-01-29T02:46:08.417Z","dependency_job_id":"cee94673-969f-4c25-a908-48a3894eb45f","html_url":"https://github.com/perslev/U-Time","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perslev%2FU-Time","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perslev%2FU-Time/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perslev%2FU-Time/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/perslev%2FU-Time/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/perslev","download_url":"https://codeload.github.com/perslev/U-Time/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247147075,"owners_count":20891617,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["deep-learning","fully-convolutional-networks","segmentation","sleep-analysis","time-series-analysis"],"created_at":"2024-08-01T14:01:01.676Z","updated_at":"2025-04-04T08:31:06.421Z","avatar_url":"https://github.com/perslev.png","language":"Python","funding_links":[],"categories":["📝 Papers with code","2019"],"sub_categories":["Managed database services"],"readme":"# U-Time \u0026 U-Sleep\n\nOfficial implementation of\n\n* The *U-Time* [[1]](#utime_ref) model for general-purpose time-series segmentation.\n* The *U-Sleep* [[2]](#usleep_ref) model for resilient high-frequency sleep staging.\n\nThis repository may be used to train both the original U-Time and newer U-Sleep models.\nHowever, the repository has been significantly extended since [[1]](#utime_ref) and may gradually \ndiverge from the version described in [[2]](#usleep_ref). Earlier versions may be found at:\n\n* [U-Sleep paper version](https://github.com/perslev/U-Time/tree/usleep-paper-version).\n* [Latest U-Time only version](https://github.com/perslev/U-Time/tree/utime-latest).\n* [U-Time paper version](https://github.com/perslev/U-Time/releases/tag/utime-paper-version).\n\n## Contents\n\n- [Overview](#overview)\n- [System Requirements](#system-requirements)\n- [Installation Guide](#installation-guide)\n- [U-Sleep Demo](#demo)\n- [Full Reproduction of U-Sleep](#full-reproduction-of-u-sleep)\n- [U-Time Example](#u-time-example)\n- [U-Time and U-Sleep References](#references)\n\n\n## Overview\nThis document describes the official software package developed for and used to create the free and public sleep staging system *U-Sleep* [[2]](#usleep_ref).\nU-Sleep is a fully convolutional deep neural network for automated sleep staging. A single instance of the model may be trained to perform accurate and resilient sleep staging \nacross a wide range of clinical populations and polysomnography (PSG) acquisition protocols.\n\nThis software allows simultaneous training of U-Sleep across any number of PSG datasets using on-the-fly random selection of input channel configurations. It features a command-line interface for initializing, training and evaluating models without needing to modify the underlying codebase.\n\n\n#### Pre-trained U-Sleep\nIn the following we will introduce the software behind U-Sleep in greater detail. Please note that:\n\n* If you are interested to re-implement, extend, or train U-Sleep yourself e.g. on other datasets, you are at the right place!\n* If you are looking to use our pre-trained U-Sleep model for automated sleep staging, please refer to https://sleep.ai.ku.dk and follow the displayed guide. See also [this repository](https://github.com/perslev/U-Sleep-API-Python-Bindings) for Python bindings to the webserver API.\n* U-Sleep is also available under research and commercial licenses on the [youSleep BETA platform](https://yousleep.ai).\n\n\n#### U-Time and U-Sleep - What's the Difference?\nThis repository stores code for training and evaluating the *U-Sleep* sleep staging model. It builds upon and significantly extends our [U-Time](https://github.com/perslev/U-Time/tree/utime-latest) repository, published at NeurIPS 2019 [[1]](#utime_ref). In the following, we will use the term *U-Sleep* to denote the resilient high frequency sleep staging model [[2]](#usleep_ref), and *U-Time* to denote this repository of code used to train and evaluate the U-Sleep model.\n\nYou can still use this repository to train the older U-Time model, see [U-Time Example](#u-time-example) below.\n\n## System Requirements\n**Minimal Hardware Requirements**\n\nUsing an already trained U-Sleep model for sleep staging may typically be done on any modern laptop (subject to the software requirements listed below).\n\nFor training U-Sleep models from scratch, however, we highly recommend using a Linux based computer with at least the following hardware specifications:\n\n* 4+ CPU cores\n* 8+ GiB RAM\n* Significant physical storage space*\n* 1 CUDA enabled GPU (please refer to [https://developer.nvidia.com/cuda-gpus](https://developer.nvidia.com/cuda-gpus) for a detailed list).\n\nIt is possible to train the model on smaller machines, and without GPUs, but doing so may take considerable time. Likewise, more resources will speed up training. If the considered dataset exceeds the system memory (e.g. the 8 GiB of RAM suggested above), data must be preprocessed and streamed from disk as demonstrated in the [Demo](#demo) section below. On larger machines, one may benefit from maintaining a larger pool of data loaded in memory. For instance, we trained U-Sleep [[2]](#usleep_ref) using 8 CPU cores, 1 GPU and 40 GiB of RAM, please refer to the [Full Reproduction of U-Sleep](#full-reproduction-of-u-sleep) section below.\n\n*The required hard-disk space depends on the number and sizes of datasets considered. For a [Full Reproduction of U-Sleep](#full-reproduction-of-u-sleep) approximately 4 TiB of available storage is needed.\n\n**Software Requirements:**\n\n* A computer with a Linux operating system installed. We have developed and tested the software for Red Hat Enterprise (v7.8) and Ubuntu (v18.04) servers, but any modern distribution should work. The software has also been tested on MacOS Catalina (10.15.6) for CPU-based training and prediction only.\n* [Anaconda](https://www.anaconda.com) or [Miniconda](https://docs.conda.io/en/latest/miniconda.html), v4.5 or higher, 64-bit.\n\nIf you are going to train a U-Sleep model yourself from scratch, we highly recommend doing so on a GPU. In order to use the `U-Time` package with a GPU, the `tensorflow` (`v2.8.0`) library is required. For this, the following additional software is required on your system:\n\n* [NVIDIA GPU drivers](https://www.nvidia.com/drivers) v450.x or higher.\n* [CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit-archive) v11.2.\n* [cuDNN SDK](https://developer.nvidia.com/cudnn) v8.1.\n\nPlease refer to [https://www.tensorflow.org/install/gpu](https://www.tensorflow.org/install/gpu) for additional details. You do not need to install TensorFlow yourself (see [Installation Guide](#installation-guide) below), but the above software must be installed before proceeding.\n\n## Installation Guide\nOn a Linux machine with at least 1 CUDA enabled GPU available and `anaconda` \nor `miniconda` installed, run the following commands to download the software, create a conda environment named `u-sleep` \nand setup the latest U-Time software package and its dependencies:\n\n```\ngit clone https://github.com/perslev/U-Time.git\nconda env create --file U-Time/environment.yaml\nconda activate u-sleep\npip install U-Time/\n```\n\nAlternatively, you may install the package from [PyPi](https://pypi.org) (may be updated less frequently):\n\n```\npip install utime\n```\n\n## Demo\nIn this following we will demonstrate how to launch a short training session of U-Sleep on a significantly limited subset of the datasets used in [[2]](#usleep_ref).\n\n#### Requirements\n- Completion of the steps outlined in the [Installation Guide](#installation-guide).\n- This demo takes approximately `30 minutes` to complete on a typical computer and network connection. The majority of this time is spend downloading the required data from public databases. This step may take significantly longer depending on current database traffic.\n- Approximately `11 GiB` of available disk-space on your computer.\n\n\n#### Preparing a project directory\nFirst, we create a project directory that will store all of our data for this demo. The `ut init` command will create a folder and populate it with a set of default hyperparameter values:\n\n```\nut init --name demo --model usleep_demo\n```\n\nEntering the newly created project directory we will find a folder storing hyperparameters:\n\n```\ncd demo\nls\n\u003e hyperparameters\n```\n\n#### Download public PSG data\nWe will download 6 PSG studies from the public sleep databases [Sleep-EDF](https://doi.org/10.13026/C2X676) and [DCSM](https://sid.erda.dk/wsgi-bin/ls.py?share_id=fUH3xbOXv8) using the `ut fetch` command.\nYou will need approximately `10 GiB` of free hard-disk space to store the downloaded files. Depending on your internet speed and the current load on each of the two servers, downloading may take anywhere from 5 minutes to multiple hours:\n\n```\nut fetch --dataset sedf_sc --out_dir data/sedf_sc --N_first 6\nut fetch --dataset dcsm --out_dir data/dcsm --N_first 6\n```\n\nThe raw data that we will consider in this demo has now been downloaded. \nOur `demo` project folder now has roughly the following structure:\n\n```\n└─ demo\n   ├─ hyperparameters\n   └─ data\n      ├─ dcsm\n      │  ├─ tp005f7e68_a084_46bb_9f0a_b6a084155a1c\n      │  │  ├─ hypnogram.ids\n      │  │  └─ psg.h5\n      │  ├─ ...\n      └─ sedf_sc\n         ├─ SC4001E0\n         │  ├─ SC4001E0-PSG.edf\n         │  └─ SC4001EC-Hypnogram.edf\n         ├─ ...\n```\n\n#### Dataset splitting\nBefore proceeding to train the U-Sleep model we split each dataset into fixed train/validation/test splits using the `ut cv_split` command. \nThe command must be invoked twice each with a unique set of parameters specifying the naming conventions of dataset:\n\n```\n# Split dataset SEDF-SC\nut cv_split --data_dir data/sedf_sc/ \\\n            --subject_dir_pattern 'SC*' \\\n            --CV 1 \\\n            --validation_fraction 0.10 \\\n            --test_fraction 0.25 \\\n            --subject_matching_regex 'SC4(\\d{2}).*' \\\n            --seed 123\n            \n# Split dataset DCSM\nut cv_split --data_dir data/dcsm/ \\\n            --subject_dir_pattern 'tp*' \\\n            --CV 1 \\\n            --validation_fraction 0.10 \\\n            --test_fraction 0.25 \\\n            --seed 123\n```\n\nNote that the splitting of `SEDF-SC` is performed on a per-subject basis. All PSG records from the same subject will be placed into the same dataset split. \nThis is not needed for `DCSM` as all recordings are of unique subjects.\n\n*Please be aware that if you modify any of the above commands to e.g. use different output directory names, you will need to modify paths in dataset hyperparameter files stored under `hyperparameters/dataset_configurations` as appropriate before proceding with the next steps.*\n\n#### Data pre-processing\nRun the following command to prepare the data for training:\n\n```\nut preprocess --out_path data/processed_data.h5 --dataset_splits train_data val_data\n```\n\nThe `ut preprocess` script loads and processes all datasets as described by the parameters set in `hyperparameters/hparams.yaml` and all dataset-specific files in the folder `hyperparameters/dataset_configurations`.\nSpecifically, it loads the needed channels (ignoring the rest), re-samples, scales and clips the data, maps hypnogram stages to interger representations used internally during training and finally saves the processed data to an HDF5 archive.\nWhen training, data may be streamed directly from this archive to significantly reduce the required system memory.\n\nIt is also possible to skip this step all together and either **1)** load all data needed for training up front, or **2)** stream and apply preprocessing on-the-fly during training as shown in the [Full Reproduction of U-Sleep](#full-reproduction-of-u-sleep) section below.\n\n\n#### Training the model\nWe may now start training by invoking the `ut train` command. A default set of optimization hyperparameters have been pre-specified and are located in the `hyperparameters/hparams.yaml` \nfile of your project directory. In this demo, we are going to run only a very short training session, but feel free to modify any parameters in the `hparams.yaml` file as you see fit.\nRun the following command:\n\n```\nut train --num_gpus=1 --preprocessed --seed 123\n```\n\nYou may replace the `--num_gpus=1` parameter in the above command with `--num_gpus=0` if you do not have a GPU available, and wish to train on the CPU. Training on CPU may take up to 30 minutes.\n\nFollowing training, a set of candidate models will be available in the folder `model`. Using the best one observed (highest validation mean F1 score), \nwe may predict on the testing sets of both `SEDF-SC` and `DCSM` using all channel combinations as well as compute majority votes by invoking the following `ut predict` command:\n\n\n#### Predicting and evaluating on the test sets\n\n```\nut predict --num_gpus=1 \\\n           --data_split test_data \\\n           --strip_func strip_to_match \\\n           --one_shot \\\n           --save_true \\\n           --majority \\\n           --out_dir predictions\n```\n\nThe predicted hypnograms are now available under directory `predictions/test_data`. \nFinally, let us print a global confusion matrix (computed across all subjects) for dataset `sedf_sc` (replace `sedf_sc` -\u003e `dcsm` for DCSM evaluation):\n\n```\nut cm --true 'predictions/test_data/sedf_sc/*TRUE.npy' \\\n      --pred 'predictions/test_data/sedf_sc/majority/*PRED.npy' \\\n      --ignore 5 \\\n      --round 2 \\\n      --wake_trim_min 30\n\n\u003e\u003e\u003e  Looking for files...\n\u003e\u003e\u003e  Loading 2 pairs...\n\u003e\u003e\u003e  OBS: Wake trimming of 30 minutes (period length 30 sec)\n\u003e\u003e\u003e  OBS: Ignoring class(es): [5]\n\u003e\u003e\u003e  \n\u003e\u003e\u003e  Raw Confusion Matrix:\n\u003e\u003e\u003e  \n\u003e\u003e\u003e          Pred 0  Pred 1  Pred 2  Pred 3  Pred 4\n\u003e\u003e\u003e  True 0       0       0      17     234       0\n\u003e\u003e\u003e  True 1       0       0     132     146       0\n\u003e\u003e\u003e  True 2       0       0     790     157       0\n\u003e\u003e\u003e  True 3       0       0      25     189       0\n\u003e\u003e\u003e  True 4       0       0     243      99       0\n\u003e\u003e\u003e  \n\u003e\u003e\u003e  Raw Metrics:\n\u003e\u003e\u003e  \n\u003e\u003e\u003e             F1  Precision  Recall/Sens.\n\u003e\u003e\u003e  Class 0  0.00       0.00          0.00\n\u003e\u003e\u003e  Class 1  0.00       0.00          0.00\n\u003e\u003e\u003e  Class 2  0.73       0.65          0.83\n\u003e\u003e\u003e  Class 3  0.36       0.23          0.88\n\u003e\u003e\u003e  Class 4  0.00       0.00          0.00\n\u003e\u003e\u003e  mean     0.22       0.18          0.34 \n```\n\nIf you received an output *similar* to the above, congratulations! You have successfully installed, configured, trained and evaluated a U-Sleep model on two different datasets.\n\nPlease note that:\n* If you ran the above code on a GPU, you may not obtain the exact same numbers listed here, even if you specified the --seed arguments. This is because some computations used during the training of U-Sleep are fundamentally non-deterministic when evaluated on a GPU. \nHowever, predicting using a trained U-Sleep model will give deterministic outputs.\n\n* The performance of the obtained demo model is very low and not suitable for actual sleep staging. The reason is that we trained U-Sleep on a very limited set of data and for a very limited number of epochs.\nPlease refer to the [Full Reproduction of U-Sleep](#full-reproduction-of-u-sleep) section for details on how to prepare and train a complete version of U-Sleep.\n\n\n## Full Reproduction of U-Sleep\nThe [Demo](#demo) above in principle describes all steps needed to reproduce U-Sleep as reported in [[2]](#usleep_ref). \nThe main - and significant - difference is that in order to reproduce the full model, you will need to 1) be able to access 2) download and 3) preprocess all the required datasets. You may also need a computer with more resources as described in [System Requirements](#system-requirements). \n\n\n#### Prepare the datasets\nWe did our best to make this process as easy as possible. You should take the following steps:\n\n1) Carefully read (at least) the *Methods* and supplementary *Datasets* sections of our paper [[2]](#usleep_ref) to familiarize yourself with the datasets, preprocessing, training pipeline and more.\n2) Download all datasets from the [National Sleep Research Resource](https://sleepdata.org), [PhysioNet](https://sleepdata.org) or other sleep repositories as described and referenced in the Supplementary Material's *Dataset* section. For some datasets you must apply to gain access, while others are publicly available. Some datasets may be easily downloaded using the `ut fetch` command. Please invoke `ut fetch --help` to see an up-to-date list of which datasets may be downloaded this way.\n3) Place all downloaded data into a single folder `[LOCAL_PATH]` with 1 sub-folder for each dataset.\n4) Run `ut extract`, `ut extract_hypno`, and `ut cv_split` on all datasets as specified for each dataset separately in files under the folder `resources/usleep_dataset_pred` of this repository (also found [here](https://sid.erda.dk/wsgi-bin/ls.py?share_id=HE5nA4Xs37)). These commands will extract and place data into a folder-structure and format that U-Time accepts, as well as split the data into subsets.\n5) (optional) The `ut extract` command will select the relevant channels, re-sample them to 128 Hz and store the data in HDF5 archives. The original data will not be deleted by default. If you have limited hard-drive space, consider removing the old files before processing the next dataset.\n6) Initialize a U-Sleep project: `ut init --name u-sleep --model usleep`.\n7) For each dataset configuration file in `u-sleep/hyperparameters/dataset_configurations/` replace the string [LOCAL_PATH] with the `[LOCAL_PATH]` of your data.\n\n\n#### Train the model\nIf you have 40+ GiB system memory available, train U-Sleep using the following command:\n\n```\nut train --num_gpus 1 --max_loaded_per_dataset 40 --num_access_before_reload 32 --train_queue_type limitation --val_queue_type lazy --max_train_samples_per_epoch 1000000\n```\n\nOn systems with less memory, you may either 1) reduce the `--max_loaded_per_dataset` parameter from the current `40` to a lower value (this will keep fewer PSG records in the active memory pool, which will reduce randomness when selecting records), or 2) preprocess the data and stream data during training (as demonstrated in the Demo above) by invoking the following two commands (replacing [LOCAL_PATH] as applicable):\n\n```\nut preprocess --out_path '[LOCAL_PATH]/processed_data.h5' --dataset_splits train_data val_data\nut train --num_gpus 1 --preprocessed --max_train_samples_per_epoch 1000000\n```\n\nThis will apply all preprocessing, create a data archive suitable for streaming, and train U-Sleep using samples loaded on-the-fly from disk.\n\nDue to the vast size of the dataset considered, training U-Sleep with the default parameters may take very long. \nWe suggest increasing the learning rate (from the current `1e-7` to e.g. `1e-6`) unless you are looking to re-create U-Sleep under the exact conditions considered in [[2]](#usleep_ref).\n\n## U-Time Example\nYou can still use this repository to train the older U-Time model. \nIn the following we show an end-to-end example. The commands listed below prepares a project folder, downloads the sleep-edf-153 dataset, fits and evaluates\na U-Time model in a fixed train/val/test dataset split setup. Please note that the below code does not reproduce the sleep-edf-153 experiment of [[1]](#utime_ref) as 10-fold CV was used.\nTo run a CV experiment, please refer to the `ut cv_split --help` and `ut cv_experiment --help` commands.\n\n\u003cpre\u003e\n\u003cb\u003e# Obtain a public sleep staging dataset\u003c/b\u003e\nut fetch --dataset sedf_sc --out_dir datasets/sedf_sc\n\n\u003cb\u003e# Prepare a fixed-split experiment\u003c/b\u003e\nut cv_split --data_dir 'datasets/sedf_sc' \\\n            --subject_dir_pattern 'SC*' \\\n            --CV 1 \\\n            --validation_fraction 0.20 \\\n            --test_fraction 0.20 \\\n            --subject_matching_regex 'SC4(\\d{2}).*' \\\n            --file_list\n\n\u003cb\u003e# Initialize a U-Time project\u003c/b\u003e\nut init --name my_utime_project \\\n        --model utime \\\n        --data_dir datasets/sedf_sc/views/fixed_split\n\n\u003cb\u003e# Start training\u003c/b\u003e\ncd my_utime_project\nut train --num_gpus=1 --channels 'EEG Fpz-Cz'\n\n\u003cb\u003e# Predict and evaluate\u003c/b\u003e\nut evaluate --out_dir eval --one_shot\n\n\u003cb\u003e# Print a confusion matrix\u003c/b\u003e\nut cm --true 'eval/test_data/dataset_1/files/*/true.npz' \\\n      --pred 'eval/test_data/dataset_1/files/*/pred.npz'\n      \n\u003cb\u003e# Print per-subject summary statistics\u003c/b\u003e\nut summary --csv_pattern 'eval/test_data/*/evaluation_dice.csv' \\\n           --print_all\n\n\u003cb\u003e# Output sleep stages for every 3 seconds of 128 Hz signal \u003c/b\u003e\n\u003cb\u003e# Here, the 'folder_regex' matches 2 files in the dataset \u003c/b\u003e\nut predict --folder_regex '../datasets/sedf_sc/SC400[1-2]E0' \\\n           --out_dir high_res_pred \\\n           --data_per_prediction 384 \\\n           --one_shot\n\u003c/pre\u003e\n\n\n## References\n\n#### \u003ca name=\"utime_ref\"\u003e [1] U-Time\n\n```\n@incollection{NIPS2019_8692,\n\ttitle = {U-Time: A Fully Convolutional Network for Time Series Segmentation Applied to Sleep Staging},\n\tauthor = {Perslev, Mathias and Jensen, Michael and Darkner, Sune and Jennum, Poul J\\o rgen and Igel, Christian},\n\tbooktitle = {Advances in Neural Information Processing Systems 32},\n\teditor = {H. Wallach and H. Larochelle and A. Beygelzimer and F. d\\textquotesingle Alch\\'{e}-Buc and E. Fox and R. Garnett},\n\tpages = {4415--4426},\n\tyear = {2019},\n\tpublisher = {Curran Associates, Inc.},\n\turl = {http://papers.nips.cc/paper/8692-u-time-a-fully-convolutional-network-for-time-series-segmentation-applied-to-sleep-staging.pdf}\n}\n```\n\n#### \u003ca name=\"usleep_ref\"\u003e [2] U-Sleep\n```\nU-Sleep: Resilient High-Frequency Sleep Staging\nMathias Perslev (1), Sune Darkner (1), Lykke Kempfner (2), Miki Nikolic (2), Poul Jørgen Jennum (2) \u0026 Christian Igel (1)\nnpj Digital Medicine, 4, 72 (2021)\nhttps://doi.org/10.1038/s41746-021-00440-5\n\n(1) Department of Computer Science, University of Copenhagen, Denmark\n(2) Danish Center for Sleep Medicine, Rigshospitalet, Glostrup, Denmark\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperslev%2FU-Time","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fperslev%2FU-Time","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fperslev%2FU-Time/lists"}