{ "info": { "author": "Henri-Louis Girard", "author_email": "hl.girard@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "# CrystalML\n\n[![PyPI version](https://badge.fury.io/py/crystalml.svg)](https://badge.fury.io/py/crystalml)\n[![Travis CI status](https://travis-ci.com/hlgirard/CrystalML.svg?branch=master)](https://travis-ci.com/hlgirard/CrystalML/branches)\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://github.com/hlgirard/CrystalML/blob/master/LICENSE)\n\n**Disclaimer:** This program is undergoing active development and should _not_ be used for production. All APIs and commands are susceptible to change without notice.\n\nIntegrated tool to measure the nucleation rate of protein crystals from the crystallization kinetics of an array of independent identical droplets.\n\nFrom a directory containing a time-series of images of mutliple droplets, the tool segments individual droplet and uses a pre-trained CNN model to determine the presence or absence of crystals in each drop.\nThe nucleation rate is evaluated from the rate of decay of the proportion of drops that _do not_ exhibit visible crystals.\n\n![Schematic](docs/CrystalML_demo.jpg)\n\n## Installation\n\n### Install with pip\n\nCrystalML is on PyPI so it can be installed with pip\n\n```\npip install crystalml\n```\n\n### Install from source\n\nClone the repository to your computer\n\n```\ngit clone https://github.com/hlgirard/CrystalML.git\n```\n\nand install with pip \n\n```\ncd CrystalML\npip install .\n```\n\n## Usage\n\n### Quickstart\n\nA time series of images of an emulsion of protein-ladden droplets must be stored in a directory prior to usage of CrystalML\nThe application can then be used to process the images as follows:\n```\ncrystalml process --save-plot path/to/directory\n```\n\n### `crystalml process` command\n\nThe `process` command takes a directory of images, segments the droplets in each image and determines how many droplets are present and how many of these contain crystals.\nThe program saves a `.csv` file at the root of that directory with the name of each image, the time it was taken (from EXIF data) and the number of droplets (total, clear and containing crystals).\n\n#### Arguments\n\n- `-c`, `--check-segmentation` displays the result of segmenting an image (selected at approximately 80% of the time series) to verify that the segementation algorithm works well before processing.\n- `-o`, `--save-overlay` resaves all images in the directory with an overlay showing detected droplets in red (no crystal) or green (crystal detected) for process control.\n- `-p`, `--save-plot` generates and saves plots of crystal contents over time\n- `-v`, `--verbose` increases the verbosity level\n\n### `crystalml segment` command\n\nThe `segment` command runs the segmentation algorithm on an image or a directory of images and saves the segmented droplet images to disk.\n\n#### Arguments\n\n- `-o`, `--save-overlay` resaves all images in the directory with an overlay showing detected droplets\n- `-v`, `--verbose` increases the verbosity level\n\n### `crystalml train` command\n\nThe `train` command is used to train the machine learning models used to label the segmented droplets as containing crystals or not. A directory of training data is expected containing subdirectories named `Crystal` and `Clear` containing grayscale images of segmented droplets (use the `segment` command to generate the images).\n\n#### Arguments\n\n- `-m`, `--model` selects the type of model to train (svm|cnn|cnn-transfer)\n- `-tb`, `--tensorboard` saves logs for tensorboard visualization in `/logs`\n- `-v`, `--verbose` increases the verbosity level\n\n## Repository strutcture\n\n- `models`: pre-trained machine learning models for crystal presence discrimination\n- `notebooks`: jupyer notebooks evaluating different image segmentation strategies\n- `src`: source code for the project\n - `crystal_processing`: processing pipeline from directory to nucleation rate\n - `data`: data processing methods, including cropping, segmentation, extraction\n - `models`: model definition and training scripts for the droplet binary labelling task\n - `visualization`: visualization and plotting methods\n - `cli.py`: entry point to the command line interface\n- `tests`: unittesting\n\n## License\n\nThis project is licensed under the GPLv3 License - see the [LICENSE.md](LICENSE.md) file for details.\n\n## Credit\n\nInitial models were built starting from the example at:\nhttps://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html\n\nLive data visualization class TrainingPlot originally from:\nhttps://github.com/kapil-varshney/utilities/blob/master/training_plot/trainingplot.py\n\n\n", "description_content_type": "text/markdown", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/hlgirard/CrystalML", "keywords": "", "license": "GPLv3", "maintainer": "", "maintainer_email": "", "name": "crystalml", "package_url": "https://pypi.org/project/crystalml/", "platform": "", "project_url": "https://pypi.org/project/crystalml/", "project_urls": { "Homepage": "https://github.com/hlgirard/CrystalML" }, "release_url": "https://pypi.org/project/crystalml/0.1/", "requires_dist": [ "click", "bleach (>=2.1.0)", "docutils (>=0.13.1)", "Pygments", "tensorflow", "matplotlib", "numpy", "opencv-python", "pkginfo (>=1.4.2)", "pandas", "joblib", "pillow", "plotly", "scikit-image", "setuptools", "scipy", "seaborn", "tensorboard", "tqdm" ], "requires_python": "", "summary": "Integrated tool to measure the nucleation rate of protein crystals.", "version": "0.1" }, "last_serial": 5699291, "releases": { "0.0.1": [ { "comment_text": "", "digests": { "md5": "f825f830f11145d6150a4d274332e58d", "sha256": "30d3f786f35695fa8a93d5ad336f19fa5d1d8faf1787249e255307413b3e5009" }, "downloads": -1, "filename": "crystalml-0.0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "f825f830f11145d6150a4d274332e58d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31518125, "upload_time": "2019-05-06T20:58:31", "url": "https://files.pythonhosted.org/packages/2f/94/129c53658f55815a6a03a685503cfc6abf4e4d809a50df363fcbfc749129/crystalml-0.0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "346626bef6cade33004627b5ae3ee33a", "sha256": "6f6d241b1a3215f91b18ff8a317d4cd9109a0f84dca3944c2f764e0947c592ce" }, "downloads": -1, "filename": "crystalml-0.0.1.tar.gz", "has_sig": false, "md5_digest": "346626bef6cade33004627b5ae3ee33a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31504213, "upload_time": "2019-05-06T20:58:38", "url": "https://files.pythonhosted.org/packages/67/1b/7873c3acaaeefe32ae7479cc3907b31ca3b50e01c3a260cf57cb6ff5cbcf/crystalml-0.0.1.tar.gz" } ], "0.0.2": [ { "comment_text": "", "digests": { "md5": "4cf2050a728e9dcc221f9132a2a43ee0", "sha256": "c56655f377bcc9556f082292d4ff45ffa5ef96a93a2207c9a0f0574dacf4deb9" }, "downloads": -1, "filename": "crystalml-0.0.2-py3-none-any.whl", "has_sig": false, "md5_digest": "4cf2050a728e9dcc221f9132a2a43ee0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 31518160, "upload_time": "2019-05-09T20:02:13", "url": "https://files.pythonhosted.org/packages/69/5b/e8eafb330eae03cf1d6d24b211d0d5d138bad313581befa1f5f17f249d5b/crystalml-0.0.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "02ed2037efb47fc9ba6f46c5d541b4ee", "sha256": "cce61828bd572f8ea35c80679f9cb5a81146f60ca86e8637dd3d21ce706c976f" }, "downloads": -1, "filename": "crystalml-0.0.2.tar.gz", "has_sig": false, "md5_digest": "02ed2037efb47fc9ba6f46c5d541b4ee", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 31504268, "upload_time": "2019-05-09T20:02:25", "url": "https://files.pythonhosted.org/packages/e8/94/307365615b150d0a762ef3d9b3cb65ccc460732a7ee0c5ac6044a39468dc/crystalml-0.0.2.tar.gz" } ], "0.0.3": [ { "comment_text": "", "digests": { "md5": "e27ad9ee63e5cddda7246e25756a5555", "sha256": "f394586b9266cf97bddaaf18d51cabef1b3a3c7c327ceeb82862df80e3a70502" }, "downloads": -1, "filename": "crystalml-0.0.3-py3-none-any.whl", "has_sig": false, "md5_digest": "e27ad9ee63e5cddda7246e25756a5555", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36051394, "upload_time": "2019-05-16T13:49:49", "url": "https://files.pythonhosted.org/packages/6c/c9/42a5d3c6affe4f2fa4c265ca6105575b392cda35c9a54840832efe0eeb17/crystalml-0.0.3-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b30548ef09f6937fff663347c38c0e82", "sha256": "fba8ca2dd2b1d21b4cbe4bbdd843e5ed50e1b6e45ada45649e7dcdce7bff2b31" }, "downloads": -1, "filename": "crystalml-0.0.3.tar.gz", "has_sig": false, "md5_digest": "b30548ef09f6937fff663347c38c0e82", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36036211, "upload_time": "2019-05-16T13:50:12", "url": "https://files.pythonhosted.org/packages/4b/86/b6467fb8f0a07da1bec972b4c35e6639ca2aeb18f4fb4a51bed43bd1d8b3/crystalml-0.0.3.tar.gz" } ], "0.0.3b0": [ { "comment_text": "", "digests": { "md5": "ba8f2d44d4f3f8771951c84ca9b4f834", "sha256": "daf9638faca6e1e19e84dc927efa2bddb7767a42b4ce64c2eb4ca20730f41e88" }, "downloads": -1, "filename": "crystalml-0.0.3b0-py3-none-any.whl", "has_sig": false, "md5_digest": "ba8f2d44d4f3f8771951c84ca9b4f834", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36054304, "upload_time": "2019-05-16T21:58:55", "url": "https://files.pythonhosted.org/packages/70/96/30d7ea406f201962fddb1c877ab971f31715f60593975512f1c389013184/crystalml-0.0.3b0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "510b1f7fd52a1d90b49d9bdb95d5a903", "sha256": "75ff67d1fcb72f6155dd95c9d4fc5d9aa7639c4af883b41049613f729b71e963" }, "downloads": -1, "filename": "crystalml-0.0.3b0.tar.gz", "has_sig": false, "md5_digest": "510b1f7fd52a1d90b49d9bdb95d5a903", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36038250, "upload_time": "2019-05-16T21:59:13", "url": "https://files.pythonhosted.org/packages/cd/6f/b066b27c42ca7f51e35ecf23961f7d0bf6e74c9a29e83efca95d2efca42a/crystalml-0.0.3b0.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "e4f59b64e8ef8c1c450a2f74b256329d", "sha256": "2acecfcc695bcfba6e5819e547adbc9cc2b485dd470f8bf8c3eaa3c50b33bd9a" }, "downloads": -1, "filename": "crystalml-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "e4f59b64e8ef8c1c450a2f74b256329d", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36054278, "upload_time": "2019-05-17T13:33:37", "url": "https://files.pythonhosted.org/packages/1d/9a/6dbc84584c431f14bbeda159e45405aea1f628bdb1cdd5ed967a21f20cd4/crystalml-0.0.4-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "48d23c8f56b894d81dc415f99f7d78fd", "sha256": "5e999648e73d5eb087705b2b48bec21551af64e36c19b472e0a93cba0c0e93bd" }, "downloads": -1, "filename": "crystalml-0.0.4.tar.gz", "has_sig": false, "md5_digest": "48d23c8f56b894d81dc415f99f7d78fd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36038193, "upload_time": "2019-05-17T13:34:07", "url": "https://files.pythonhosted.org/packages/d1/6d/52e04688177a69fe220812fa1afc1d4a1f3722873a877998db9af2c44744/crystalml-0.0.4.tar.gz" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "5c14f5289a4f2d3fef8aeefa359ed4dd", "sha256": "332baac2544e21b0ab44302c319a2ef3d21b57bed602537adb68870455493199" }, "downloads": -1, "filename": "crystalml-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "5c14f5289a4f2d3fef8aeefa359ed4dd", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 36058663, "upload_time": "2019-05-21T15:11:28", "url": "https://files.pythonhosted.org/packages/dd/ab/f14880ca2fe02c6bed7c4266ec4753617695d16c1903cecab1bd1769abf4/crystalml-0.0.5-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "32f031a20385cc61cc1cec77d18d0bab", "sha256": "142e6525e407d404191f672109917c631ed2a813ffe44f7b1fcaa938bb5c26ec" }, "downloads": -1, "filename": "crystalml-0.0.5.tar.gz", "has_sig": false, "md5_digest": "32f031a20385cc61cc1cec77d18d0bab", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 36040858, "upload_time": "2019-05-21T15:12:05", "url": "https://files.pythonhosted.org/packages/e8/9b/19e6f45c6b49177be46317ae0965197247e62cc4ec99fabdedea18ac7158/crystalml-0.0.5.tar.gz" } ], "0.0.5.1": [ { "comment_text": "", "digests": { "md5": "1394ce13348541325e6e44c04592b43b", "sha256": "9906433c97f157e4711f88c13f155128dd07976fa5ca0fe47c60bb53113d4b3b" }, "downloads": -1, "filename": "crystalml-0.0.5.1.tar.gz", "has_sig": false, "md5_digest": "1394ce13348541325e6e44c04592b43b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4556153, "upload_time": "2019-06-10T18:51:36", "url": "https://files.pythonhosted.org/packages/07/a5/3f63a0253f9e46adee5000e01c2ec82af1814a8de9a6dada8bfc5407795b/crystalml-0.0.5.1.tar.gz" } ], "0.0.5.2": [ { "comment_text": "", "digests": { "md5": "9f7c7b64906cbbed183501732a8660a5", "sha256": "329b5b639abfa2bfad6a24f3de90cdeb0e159a22ec0f1baf2f2a724fefbcc144" }, "downloads": -1, "filename": "crystalml-0.0.5.2-py3-none-any.whl", "has_sig": false, "md5_digest": "9f7c7b64906cbbed183501732a8660a5", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9113895, "upload_time": "2019-06-11T21:19:45", "url": "https://files.pythonhosted.org/packages/5a/9f/71d8ea8e3d1072e0183387220ee88ab295b6c1b4122fd435666d764353c2/crystalml-0.0.5.2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "b8e21c41296cf64293d7f38ae5b8b583", "sha256": "080f040ecc4601c2d419cb2c7e21e6198d88855c2cd10c70b4c043881bd1668a" }, "downloads": -1, "filename": "crystalml-0.0.5.2.tar.gz", "has_sig": false, "md5_digest": "b8e21c41296cf64293d7f38ae5b8b583", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9097267, "upload_time": "2019-06-11T21:20:08", "url": "https://files.pythonhosted.org/packages/e6/34/1a90d5c5936b3f91d90c6cbc7b3139b576884c1ac2d80e85f7d361d94590/crystalml-0.0.5.2.tar.gz" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "1be938d9d20e2c56273ccec30e5b4041", "sha256": "d4c8bd9c056ffd48c512260ef624186befbc409026318b200f91c75305042684" }, "downloads": -1, "filename": "crystalml-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "1be938d9d20e2c56273ccec30e5b4041", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9113939, "upload_time": "2019-08-05T19:20:08", "url": "https://files.pythonhosted.org/packages/ff/63/7532face7f3b85b79300bf7e6cd7f0405b53c81acade91b330823416cd8e/crystalml-0.0.6-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "3a6844074f4c709f6c0384a4e6088e59", "sha256": "c8378e43696ecead382dce3b71ce7b69c1bc7bca569c3c46bd2402b43634eb65" }, "downloads": -1, "filename": "crystalml-0.0.6.tar.gz", "has_sig": false, "md5_digest": "3a6844074f4c709f6c0384a4e6088e59", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9097374, "upload_time": "2019-08-05T19:23:40", "url": "https://files.pythonhosted.org/packages/b5/37/a20905bfa2d3786cbe40e04ed3c2342b96cac854d770ef64e1da00172f53/crystalml-0.0.6.tar.gz" } ], "0.1": [ { "comment_text": "", "digests": { "md5": "712620ac8afdf58c5a47d2b4547dc47f", "sha256": "d0fbbfe64c35f31e4eed6d276e23e9ea64ebe4fd82943c57978405a32e48545e" }, "downloads": -1, "filename": "crystalml-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "712620ac8afdf58c5a47d2b4547dc47f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9113908, "upload_time": "2019-08-19T15:58:01", "url": "https://files.pythonhosted.org/packages/99/4f/ffb08719522c8f27719daafb649128e37e889c0edd8f926bc6d06f5275ca/crystalml-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7233fc82e2175bb4bff09de70e673cfa", "sha256": "9284a97edef278e06ed2fc082e84555b50bde0ffb5de062499b5404bdef971f6" }, "downloads": -1, "filename": "crystalml-0.1.tar.gz", "has_sig": false, "md5_digest": "7233fc82e2175bb4bff09de70e673cfa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9097341, "upload_time": "2019-08-19T16:26:37", "url": "https://files.pythonhosted.org/packages/43/f5/9210f7ad8f694dc230e1463bed02f74e160484d0d704377779070223c40e/crystalml-0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "712620ac8afdf58c5a47d2b4547dc47f", "sha256": "d0fbbfe64c35f31e4eed6d276e23e9ea64ebe4fd82943c57978405a32e48545e" }, "downloads": -1, "filename": "crystalml-0.1-py3-none-any.whl", "has_sig": false, "md5_digest": "712620ac8afdf58c5a47d2b4547dc47f", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 9113908, "upload_time": "2019-08-19T15:58:01", "url": "https://files.pythonhosted.org/packages/99/4f/ffb08719522c8f27719daafb649128e37e889c0edd8f926bc6d06f5275ca/crystalml-0.1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "7233fc82e2175bb4bff09de70e673cfa", "sha256": "9284a97edef278e06ed2fc082e84555b50bde0ffb5de062499b5404bdef971f6" }, "downloads": -1, "filename": "crystalml-0.1.tar.gz", "has_sig": false, "md5_digest": "7233fc82e2175bb4bff09de70e673cfa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9097341, "upload_time": "2019-08-19T16:26:37", "url": "https://files.pythonhosted.org/packages/43/f5/9210f7ad8f694dc230e1463bed02f74e160484d0d704377779070223c40e/crystalml-0.1.tar.gz" } ] }