{ "info": { "author": "Jeff Maggio, Nathan Dileas, Ryan Hartzell", "author_email": "jmaggio14@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Science/Research", "License :: OSI Approved :: MIT License", "Natural Language :: English", "Operating System :: MacOS :: MacOS X", "Operating System :: Microsoft :: Windows", "Operating System :: POSIX", "Programming Language :: Python", "Programming Language :: Python :: 2", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.4", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Programming Language :: Python :: Implementation :: CPython", "Topic :: Scientific/Engineering :: Artificial Intelligence", "Topic :: Scientific/Engineering :: Image Recognition", "Topic :: Scientific/Engineering :: Information Analysis" ], "description": "\n\n# imagepypelines\n\n![build](https://www.travis-ci.com/jmaggio14/imagepypelines.svg?branch=master \"master build success\")\n[![codecov](https://codecov.io/gh/jmaggio14/imagepypelines/branch/master/graph/badge.svg)](https://codecov.io/gh/jmaggio14/imagepypelines)\n\n\nThe `imagepypelines` package consists of high level tools which simplify the construction of complex image processing, computer vision, and machine learning frameworks. During our time in the undergrad Imaging Science program at the Rochester Institute of Technology, we found ourselves writing and rewriting code for things as simple as data type casting and displaying imagery when debugging, causing more trouble than mathematical or logical bugs themselves! Our hope is that the plug-and-play, easily-customizable nature of `imagepypelines` will allow all data-driven scientists to construct complex frameworks quickly for prototyping applications, and serve as a valuable educational tool for those interested in learning traditionally tough subject matter in a friendly environment!\n\nTo achieve this goal, our development team always adheres to the following 5 core principles:\n\n1. Legos are fun\n2. Coding should be fun\n3. Therefore coding should be like playing with Legos\n4. Imagery is fun, so that will always be our focus\n5. We must suffer, lest our users suffer\n\n**_This project is currently in alpha_**\n\n## Installation\n_(make sure you see the **dependencies** section)_\n\nPython compatibility: 3.4-3.6 (Python 2.7 backwards) 64bit\n\n**via pip**:\n```\npip install imagepypelines --user\n```\n**from source**:\n```console\ngit clone https://github.com/jmaggio14/imagepypelines.git\ncd imagepypelines\npython setup.py install\n```\n### dependencies\nfor full functionality, imagepypelines requires _opencv_ and _tensorflow_ to be installed\non your machine\n##### tensorflow\n```console\npip install tensorflow-gpu --user\n```\n(or for cpu only)\n```console\npip install tensorflow --user\n```\n##### opencv\nwe strongly recommend that you [build opencv from source](https://docs.opencv.org/3.4/df/d65/tutorial_table_of_content_introduction.html). **_However_** unofficial bindings for opencv can be installed with\n```console\npip install opencv-python --user\n```\n(while we haven't encountered many problems with these unofficial bindings,\nwe do not guarantee support)\n\n\n## Documentation\nFull documentation for `imagepypelines`, including examples and tutorials, can be found on our website: www.imagepypelines.org\n\n\n## Licensing / Credit\n`imagepypelines` is licensed under the [MIT](https://choosealicense.com/licenses/mit/) permissive software license. You may use this code for research or commercial use so long as it conforms to the terms of the license included in this repo as well as the licenses of `imagepypelines` dependencies.\n\nPlease credit us if you use `imagepypelines` in your research\n```\n@misc{imagepypelines,\n title=\"imagepypelines - imaging science acceleration library\",\n author=\"Hartzell, Dileas, Maggio\",\n YEAR=\"2018\",\n howpublished=\"\\url{https://github.com/jmaggio14/imagepypelines}\",\n}\n```\n\n# What Makes Us Unique?\n\n## The Pipeline\n`imagepypelines`'s most powerful feature is a high level interface to create data processing pipelines which apply a sequence of algorithms to input data automatically.\n\nIn our experience as imaging scientists, processing pipelines in both corporate or academic settings are not always easy to adapt for new purposes and are therefore too often relegated to _proof-of-concept_ applications only. Many custom pipelines may also not provide step-by-step error checking, which can make debugging a challenge.\n![xkcd](https://imgs.xkcd.com/comics/data_pipeline.png \"cracked pipelines\")\n\n(source: [XKCD](https://www.xkcd.com/2054/))\n\n\nThe `Pipeline` object of `imagepypelines` allows for quick construction and prototyping, ensures end-to-end compatibility through each layer of a workflow, and leverages helpful in-house debugging utilities for use in image-centric or high-dimensional data routines.\n\n\n## The Block\nPipelines in `imagepypelines` are constructed of processing `blocks` which apply an algorithm to a sequence of data passed into it.\n\n![pipeline](https://raw.githubusercontent.com/jmaggio14/imagepypelines/91b5f297632df16c2c246492782e37ea0a263b45/docs/images/pipeline-example.png \"pipeline example\")\n\nEach `block` _takes in_ a list of data and _returns_ a list of data, passing it onto the next block or out of the pipeline. This system ensures that blocks are compatible with algorithms that process data in batches or individually. Blocks also support label handling, and thus are **compatible with supervised machine learning systems or other algorithms that require training**\n\nBroadly speaking, each box can be thought of as a black box which simply applies an operation to input data\n![block](https://raw.githubusercontent.com/jmaggio14/imagepypelines/91b5f297632df16c2c246492782e37ea0a263b45/docs/images/block.png \"block example\")\n\na _datum_ can be anything: an image array, a filename, a label -- pretty much an pythonic type.\n\n\nBlocks can also output more or less datums than they take in and are thus capable of being used for culling or injecting data into the pipeline.\n\n### Hang on? are all blocks compatible with one another?\nnot entirely, each block has predefined acceptable inputs and outputs. However the `Pipeline` object will validate the pipeline integrity before any data is processed\n\n\n## Building a pipeline\nbuilding a pipeline is super easy\n\n### Image Display Pipeline\n```python\nimport imagepypelines as ip\n\npipeline = ip.Pipeline(name='image display')\npipeline.add( ip.ImageLoader() ) # each one of these elements are 'blocks'\npipeline.add( ip.Resizer() )\npipeline.add( ip.BlockViewer() )\n\n# now let's display some example data!\npipeline.process( ip.standard_image_filenames() )\n```\nWe just made a processing pipeline that can read in images, resize them and display them! but we can do much more complicated operations.\n\n### Lowpass Filter Pipeline\n```python\nimport imagepypelines as ip\n\nload = ip.ImageLoader()\nresize = ip.Resizer(512,512)\nfft = ip.FFT()\nlowpass = ip.Lowpass(cut_off=32)\nifft = ip.IFFT()\ndisplay = ip.BlockViewer(pause_time=1)\n\npipeline = ip.Pipeline(blocks=[load,resize,fft,lowpass,ifft,display])\n\n\n# process a set of images (using imagepypelines' example data)\nfilenames = ip.standard_image_filenames()\npipeline.process(filenames)\n```\n\n### Machine Learning Applications\nOne of the more powerful applications of `imagepypelines` is it's ease of use in\n_machine learning_ and _feature engineering_ applications.\nwe can easily tailor a pipeline to perform image classification\n\nthis classifier is available as a builtin Pipeline with fully tweakable hyperparameters as **ip.SimpleImageClassifier**\n```python\nimport imagepypelines as ip\n\nfeatures = ip.PretrainedNetwork() # image feature block\npca = ip.PCA(256) # principle component analysis block\nneural_network = ip.MultilayerPerceptron(neurons=512, num_hidden=2) # neural network block\n\nclassifier = ip.Pipeline([features,pca,neural_network])\n\n# loading example data\ncifar10 = ip.Cifar10()\ntrain_data, train_labels = cifar10.get_train()\ntest_data, ground_truth = cifar10.get_test()\n\nclassifier.train(train_data,train_labels) # train the classifier\npredictions = classifier.process(test_data) # test the classifier\n\n# print the accuracy\naccuracy = ip.accuracy(predictions,ground_truth) * 100\nprint('pipeline classification accuracy is {}%!'.format(accuracy))\n```\n\nWe just trained a full neural network classifier!\n\n\n### Processing Blocks built into imagepypelines\n_more are being added with every commit!_\n\n#### I/O operations\n- Image Display\n- Camera Capture\n- Image Loader\n- Image Writing\n\n#### Machine Learning\n- Linear Support Vector Machine\n- Rbf Support Vector Machine\n- Poly Support Vector Machine\n- Sigmoid Support Vector Machine\n- trainable neural networks\n- 8 Pretrained Neural Networks (for feature extraction)\n- Principle Component Analysis\n\n#### Image Processing\n- colorspace conversion\n- fast fourier transform\n- frequency filtering\n- Otsu Image Segmentation\n- ORB keypoint and description\n- Image resizing\n\n\n### Designing your own processing blocks\nThere are two ways to create a block\n\n#### 1) quick block creation\nfor operations that can be completed in a single function that\naccepts one datum, you can create a block with a single line.\n```python\nimport imagepypelines as ip\n\n# create the function we use to process images\ndef normalize_image(img):\n\treturn img / img.max()\n\n# set up the block to work with grayscale and color imagery\nio_map = {ip.ArrayType([None,None]):ip.ArrayType([None,None]),\n\t\t\tip.ArrayType([None,None,3]):ip.ArrayType([None,None,3])}\n\n\nblock = ip.quick_block(normalize_image, io_map)\n```\n\n#### 2) object inheritance\n_this is covered in more detail on our tutorial pages. this example will not cover training or label handling_\n```python\nimport imagepypelines as ip\n\nclass NormalizeBlock(ip.SimpleBlock):\n\t\"\"\"normalize block between 0 and max_count, inclusive\"\"\"\n\tdef __init__(self,max_count=1):\n\t\tself.max_count = max_count\n\t\t# set up the block to work with grayscale and color imagery\n\t\tio_map = {ip.ArrayType([None,None]):ip.ArrayType([None,None]),\n\t\t\t\t\tip.ArrayType([None,None,3]):ip.ArrayType([None,None,3])}\n\n\t\tsuper(NormalizeBlock,self).__init__(io_map)\n\n\tdef process(self,img):\n\t\t\"\"\"overload the processing function for this block\"\"\"\n\t\treturn img.astype(np.float32) / img.max() * self.max_count\n```\n\n# Imaging Science Convenience Functions\nIn addition to the Pipeline, imagepypelines also contains convenience\nutilities to accelerate the development of imaging science and computer vision\ntasks\n\n\n## Getting Standard Test Imagery\n`imagepypelines` contains helper functions to quickly retrieve imagery that\nare frequently used as benchmarks in the Imaging Science community\n```python\nimport imagepypelines as ip\nlenna = ip.lenna()\nlinear_gradient = ip.linear()\n```\nA full list of standard images can be retrieved with `ip.list_standard_images()`\n\nfor those of you in the Imaging Science program at RIT, there are a\ncouple easter eggs for ya ;)\n```python\nimport imagepypelines as ip\nip.quick_image_view( ip.carlenna() )\nip.quick_image_view( ip.roger() )\nip.quick_image_view( ip.pig() )\n```\n\n\n## Viewing Imagery\nViewing imagery can be an surprisingly finicky process that differs machine\nto machine or operating over X11. `imagepypelines` contains helper functions and objects for this purpose\n\n### quick image viewer:\n\nwhen you want to quickly display an image without any bells and whistles,\nyou can use the `quick_image_view` function\n\n```python\nimport imagepypelines as ip\nlenna = ip.lenna()\n\n# Now lets display Lenna\nip.quick_image_view( lenna )\n\n# display lenna normalized to 255\nip.quick_image_view(lenna, normalize_and_bin=True)\n```\n\n### Robust Image Viewer:\n\nWhen you want a tool that can display multiple images at once, resize\nimages when desired and an optional frame_counter, you can use the `Viewer` object\n```python\nimport imagepypelines as ip\nimport time\n\n# lets build our Viewer and have it auto-resize images to 512x512\nviewer = ip.Viewer('Window Title Here', size=(512,512))\n# let's enable the frame counter, so we know what image we are on\nviewer.enable_frame_counter()\n\n# get all standard images\nstandard_images = ip.standard_image_gen()\n\n# now let's display all images sequentially!\nfor img in standard_images:\n\tviewer.view( img )\n\ttime.sleep(.1)\n```\n\n### Normalizing and binning an image\nforgetting to do this gets ya more often than you might think when displaying\nan image\n\n```python\nimport imagepypelines as ip\nimport numpy as np\nrandom_pattern = np.random.rand(512,512).astype(np.float32)\n\ndisplay_safe = ip.normalize_and_bin(random_pattern)\nip.Viewer().view(display_safe)\n```\n### Array Summarization\nwhen debugging an image pipeline, printing out an image\ncan be counter productive. Imaging scientists frequently default\nto printing out the shape or size of the data. `imagepypelines` contains\na helper class to quickly summarize an image in a formatted string\n```python\nimport imagepypelines as ip\nlenna = ip.lenna()\n\nsummary = ip.Summarizer(lenna)\nprint(summary)\n```\nproduces the following\n```\n'[ARRAY SUMMARY | shape: (512, 512, 3) | size: 786432 | max: 255 | min: 3 | mean: 128.228 | dtype: uint8]'\n```\n\n### Image Coordinates\nhelper functions to get image coordinates quickly, useful if your\napplications involve a mix of color and grayscale images.\nMostly useful to clean up code and avoid silly mistakes\n```python\nimport imagepypelines as ip\nlenna = ip.lenna()\n\n# center pixel in the image\ncenter_row, center_col = ip.centroid(lenna)\n\n# number of rows and columns\nrows, cols = ip.frame_size(lenna)\n\n# shape and dtype\nrows, cols, bands, dtype = ip.dimensions(lenna)\n```\n\n### Timing\nMany imaging tasks are time sensitive or computationally\nintensive. `imagepypelines` includes simple tools to time your process or function\n\n#### Timer Objects\n`imagepypelines` also includes a separate timer for timing things inside a function\nor code block\n\n##### absolute timing:\n```python\nfrom imagepypelines.util import Timer\nimport time\n\nt = Timer()\ntime.sleep(5)\nprint( t.time(),\"seconds\" ) # or t.time_ms() for milliseconds\n```\n\n##### lap timing:\n```python\nfrom imagepypelines.util import Timer\nimport time\n\nt = Timer()\nfor i in range(10):\n\ttime.sleep(1)\n\tprint( t.lap(),\"seconds\" ) # or t.lap_ms() for milliseconds\n```\n\n##### perform operation for N seconds:\n```python\nfrom imagepypelines.util import Timer\nimport time\n\ndef do_something():\n\tpass\n\n# set the countdown\nN = 10 #seconds\nt = Timer()\nt.countdown = N\nwhile t.countdown:\n\tdo_something()\n```\n\n\n#### timing Decorator\nlet's say we have a function that we think may be slowing down our pipeline.\nWe can add `@function_timer` on the line above the function\nand see it automatically print how long the function took to run\n```python\nfrom imagepypelines.util import function_timer\nfrom imagepypelines.util import function_timer_ms\nimport time\n\n# add the decorator here\n@function_timer\ndef we_can_time_in_seconds():\n\ttime.sleep(1)\n\n# we can also time the function in milliseconds using '@function_timer_ms'\n@function_timer_ms\ndef or_in_milliseconds():\n\ttime.sleep(1)\n\nwe_can_time_in_seconds()\nor_in_milliseconds()\n```\nprints the following when the above code is run\n```\n( function_timer )[ INFO ] ran function 'we_can_time_in_seconds' in 1.001sec\n( function_timer )[ INFO ] ran function 'or_in_milliseconds' in 1000.118ms\n```\n\n# Development Tools in `imagepypelines`\n**_This section is for developers of `imagepypelines` or people who want `imagepypelines` closely integrated with their projects_**\n\n## Printers\nAre you a scientist???\nIf so, then you probably use millions of print statements to debug your code. (don't worry, we are all guilty of it)\n\n`imagepypelines` encourages code traceability through the use of an object known as a **`Printer`**. Printers are objects that simply print out what's happening in a manner that's easy to read, color coded, and traceable to the object that is performing the current action. **Printers are extremely low overhead and will not affect the speed of your code more than a print statement.**\n\nThe functionality is similar to python's [`logging`](https://docs.python.org/3.7/library/logging.html) module\n\n### making printers\nprinters can be created or retrieved using the `get_printer` function\n```python\nimport imagepypelines as ip\nprinter = ip.get_printer('name your printer here')\n```\n\n### printer levels\nprinter messages can be filtered be priority so that only desired messages can be seen. In `imagepypelines`, printer levels are also color coded so they can be read easily in a console\n```python\nimport imagepypelines as ip\n\nexample_printer = ip.get_printer('example!')\nexample_printer.debug('message') # prints 'message' at level 10 - blue text\nexample_printer.info('message') # prints 'message' at level 20 - white text\nexample_printer.warning('message') # prints 'message' at level 30 - yellow text\nexample_printer.comment('message') # prints 'message' at level 30 - green text\nexample_printer.error('message') # prints 'message' at level 40 - red text\nexample_printer.critical('message') # prints 'message' at level 50 - bold red text\n```\nAny level that is less than the current `GLOBAL_LOG_LEVEL` will **NOT** be printed. This makes it easy to filter out statements which may be erroneous or too numerous to make sense of.\n\nthis value can be set with the `set_global_printout_level` function\n```python\nimport imagepypelines as ip\nip.set_global_printout_level('warning') # debug and info statements will not print now\n```\nlocal printer levels can be set with `Printer.set_log_level`\n```python\nimport imagepypelines as ip\nprinter = ip.get_printer('Example Printer')\nprinter.set_log_level('error') # only error and critical functions will print\n```\n\n(this system is exactly the same as log_levels in python's [`logging`](https://docs.python.org/3.7/library/logging.html) module )\n\n### disable or enabling certain printers\nSometimes you may only want to see printouts from a specific class or function. you can do this\nwith the `whitelist_printer`, `blacklist_printer`, or `disable_all_printers` functions\n\n### default printer\nthere's a default printer in `imagepypelines` which is accessible through functions in the main module\n```python\nip.debug('debug message') # level=10 --> ( imagepypelines )[ DEBUG ] debug message\nip.info('info message') # level=20 --> ( imagepypelines )[ INFO ] debug message\nip.warning('warning message') # level=30 --> ( imagepypelines )[ WARNING ] warning message\nip.error('error message') # level=40 --> ( imagepypelines )[ ERROR ] error message\nip.critical('critical message') # level=50 --> ( imagepypelines )[ CRITICAL ] critical message\nip.comment('comment message') # level=30 --> ( imagepypelines )[ COMMENT ] comment message\n```\n\n### class printers\na good strategy to encourage traceability is to create a printer object as a class instance attribute\n```python\nimport imagepypelines as ip\n\nclass ExampleClass(object):\n\tdef __init__(self,*args,**kwargs):\n\t\tname_of_class = self.__class__.__name__\n\t\tself.printer = ip.get_printer(name_of_class)\n\t\tself.printer.info(\"object instantiated!\")\n\n\t\tself.do_something()\n\n\tdef do_something(self):\n\t\tself.printer.warning(\"did something!\")\n\nExampleClass()\n```\nproduces the following\n```\n( ExampleClass )[ INFO ] object instantiated!\n( ExampleClass )[ WARNING ] did something!\n```\nThis way it's easy track what stage of the pipeline your code is in, because each object will have it's own printer and be distinguishable in the terminal!\n\n## development decorators\n`imagepypelines` contains four decorators that are made for use by developers in the backend\n\n### @deprecated\nmade to decorate functions or classes that are deprecated\n```python\nimport imagepypelines as ip\n\n@ip.util.deprecated(\"'old_function' has been renamed to 'new_function'. references will be removed in a future version!\")\ndef old_function():\n\tpass # real code will do something\n\nold_function()\n```\n\nproduces the following\n```\n( imagepypelines )[ WARNING ] DEPRECIATION WARNING: 'old_function' has been renamed to 'new_function'. references will be removed in a future version!\n```\n### @experimental\nmade to decorate functions or classes that are experimental and may not be fully tested yet\n```python\nimport imagepypelines as ip\n\n@ip.util.experimental() # you can include a custom message here if you want\ndef new_feature():\n\tpass\n\nnew_feature()\n```\nproduces the following\n```\n( imagepypelines )[ WARNING ] EXPERIMENTAL WARNING: 'new_feature' is an experimental feature\n```\n\n### @human_test\nThis is a decorator made for unit tests which require a human to verify functionality. (for example: functions that display images)\n\n**WARNING: unlike most decorators, this will not return the output of the wrapped function, but instead True or False.\nThis is because it is meant for Unit Tests, NOT actual use in a pipeline**\n```python\nimport imagepypelines as ip\n@ip.util.human_test\ndef unit_test_for_quick_image_view():\n\tip.quick_image_view( ip.lenna() )\n\nprint('test succeeded ': unit_test_for_quick_image_view())\n```\n_lenna will display_\n\nproduces the following the terminal for the user to answer\n```\ndid the test for 'unit_test_for_quick_image_view' succeed? Yes? No?\n```\n\n\n### @print_args\nDecorator to print out the arguments a function is running with. Unlike other decorators described here, we encourage you to use this decorator frequently in your code during development to avoid silly mistakes\n```python\nimport imagepypelines as ip\n@ip.util.print_args\ndef func_with_lots_of_args(a, b, c=3, d=4):\n\t\t\tpass\nfunc_with_lots_of_args(1, b=2, c='not 3')\n```\nproduces the following in the terminal\n```\n(func_with_lots_of_args)[ INFO ] running 'func_with_lots_of_args' with the following args:\n positional | a : 1\n keyword | b : 2\n keyword | c : not 3\n default | d : 4\n```\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "https://github.com/jmaggio14/imagepypelines", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://www.imagepypelines.org", "keywords": "imaging-science machine-learning computer-vision data-pipelines", "license": "MIT", "maintainer": "Jeff Maggio", "maintainer_email": "jmaggio14@gmail.com", "name": "imagepypelines", "package_url": "https://pypi.org/project/imagepypelines/", "platform": "Windows", "project_url": "https://pypi.org/project/imagepypelines/", "project_urls": { "Download": "https://github.com/jmaggio14/imagepypelines", "Homepage": "https://www.imagepypelines.org" }, "release_url": "https://pypi.org/project/imagepypelines/0.1.4a0/", "requires_dist": [ "setuptools (>=39.0)", "Pillow (>=4.0)", "colorama (>=0.4.0)", "keras (>=2.2.4)", "numpy (>=1.14)", "scikit-learn (>=0.20.0)", "scipy (>=1.1.0)", "termcolor (>=1.0)" ], "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "summary": "data pipeline and convienence library targeted at accelerating the development of imaging projects and research", "version": "0.1.4a0" }, "last_serial": 4891943, "releases": { "0.1.0a0": [ { "comment_text": "", "digests": { "md5": "69ceb77247796e915770095208d7858a", "sha256": "5a737270b3bac94c693b6552d920c8caf265f6933f015fdb9a5208d5983345d2" }, "downloads": -1, "filename": "imagepypelines-0.1.0a0-py3-none-any.whl", "has_sig": false, "md5_digest": "69ceb77247796e915770095208d7858a", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 7267363, "upload_time": "2018-10-26T01:32:30", "url": "https://files.pythonhosted.org/packages/36/fe/fa6886b8b3d0b40c3cd1205e58c3451923271bb75a71ff2155d0694bf66f/imagepypelines-0.1.0a0-py3-none-any.whl" } ], "0.1.1a0": [ { "comment_text": "", "digests": { "md5": "a5a57af6259e2c064df045dc36179810", "sha256": "40f7b83905e2decca55a66b40515be1704b54c37c0656727c89e9f4b7cf535a3" }, "downloads": -1, "filename": "imagepypelines-0.1.1a0-py3.6.egg", "has_sig": false, "md5_digest": "a5a57af6259e2c064df045dc36179810", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 7486632, "upload_time": "2018-10-27T00:39:04", "url": "https://files.pythonhosted.org/packages/ad/8b/47a097c4f827fb5ffc8b4f621f082e48e087310fca718b069aa795c80be6/imagepypelines-0.1.1a0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "455d4e374c8d1e314284fad57570e6e9", "sha256": "03720134f9ad167c954612d089d51c0258bd083124bfd1f97f8bb30ce481ef5b" }, "downloads": -1, "filename": "imagepypelines-0.1.1a0.tar.gz", "has_sig": false, "md5_digest": "455d4e374c8d1e314284fad57570e6e9", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3620385, "upload_time": "2018-10-27T00:39:09", "url": "https://files.pythonhosted.org/packages/b6/93/484dcf718888da2ef546317b3ae3d18ed436febe8e0efb8bf07e2804aa4d/imagepypelines-0.1.1a0.tar.gz" } ], "0.1.2a0": [ { "comment_text": "", "digests": { "md5": "1e072225345f62a60570e52a900fa7d1", "sha256": "3444a2d9318fae3d4777f2a94d439f11009c34e4dde4e999fd5ff20d04db328d" }, "downloads": -1, "filename": "imagepypelines-0.1.2a0-py3.6.egg", "has_sig": false, "md5_digest": "1e072225345f62a60570e52a900fa7d1", "packagetype": "bdist_egg", "python_version": "3.6", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3738300, "upload_time": "2018-12-04T17:26:44", "url": "https://files.pythonhosted.org/packages/37/66/76e5307cee0a556ff1a30a460f9e16b29cccd3b8102811e47507bb8afe98/imagepypelines-0.1.2a0-py3.6.egg" }, { "comment_text": "", "digests": { "md5": "b1009e30884085bb340fc0727efa1a38", "sha256": "b6b5e6f676b527b90c76d4634b5c918bb0d9ddb403577cc16ad1e50c1e1b790d" }, "downloads": -1, "filename": "imagepypelines-0.1.2a0-py3-none-any.whl", "has_sig": false, "md5_digest": "b1009e30884085bb340fc0727efa1a38", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3634395, "upload_time": "2018-12-04T17:56:04", "url": "https://files.pythonhosted.org/packages/a8/db/76b222cd984e999952e02ba502d09207b9a0aefe58dd6568de373ba00ba4/imagepypelines-0.1.2a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "9631c7ac71e61eaf214fd5c4a1db679e", "sha256": "483fadba1c40fb16a9068ee85d80ab6362a32dcbf164b84035285f38a5faa098" }, "downloads": -1, "filename": "imagepypelines-0.1.2a0.tar.gz", "has_sig": false, "md5_digest": "9631c7ac71e61eaf214fd5c4a1db679e", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3622273, "upload_time": "2018-12-04T17:21:23", "url": "https://files.pythonhosted.org/packages/5a/83/6155f87966dd6c5ab8d6820f44de8917ffad18cfc4feba9f878a52ddc6af/imagepypelines-0.1.2a0.tar.gz" } ], "0.1.3a0": [ { "comment_text": "", "digests": { "md5": "045aa82b39ea40bf3ca100b4f60a3e71", "sha256": "b6c35723b0faba266174f5d9d3013d4467aa416f4e0f524b23798599c12ee02d" }, "downloads": -1, "filename": "imagepypelines-0.1.3a0-py3-none-any.whl", "has_sig": false, "md5_digest": "045aa82b39ea40bf3ca100b4f60a3e71", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3634395, "upload_time": "2018-12-04T17:59:04", "url": "https://files.pythonhosted.org/packages/85/36/d310e39125ff83349dd43e28bf01ce407db94d9fef36971ebe652e8d137b/imagepypelines-0.1.3a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "753b03d337d75a91294dff10216e24f3", "sha256": "b6d84472ce333c8189f39e596b3755079d1a84b416bd31194f28039ad007a81c" }, "downloads": -1, "filename": "imagepypelines-0.1.3a0.tar.gz", "has_sig": false, "md5_digest": "753b03d337d75a91294dff10216e24f3", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3622310, "upload_time": "2018-12-04T17:59:09", "url": "https://files.pythonhosted.org/packages/4e/0c/4d815c8d4d555807658d41c436e1ca77be568e405c97562a0daeaa02c0ae/imagepypelines-0.1.3a0.tar.gz" } ], "0.1.4a0": [ { "comment_text": "", "digests": { "md5": "c5a66861c7d28d3980a754c0a7c65bd0", "sha256": "d9af1f3a1b114136d0b12faad27a2d56286c9f2cc2cf174be6cdb958a9e70efe" }, "downloads": -1, "filename": "imagepypelines-0.1.4a0-py3-none-any.whl", "has_sig": false, "md5_digest": "c5a66861c7d28d3980a754c0a7c65bd0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3621412, "upload_time": "2018-12-23T03:00:21", "url": "https://files.pythonhosted.org/packages/08/10/e51b8946147a62b5652f623d3b51ae7b628307224feec9348761092a6740/imagepypelines-0.1.4a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a270f0a153f9f4dca4440c491a7fe918", "sha256": "b446fe070b1930d6cfc42ad4f758d286ac90132537d1f586bb19af99d2ac3782" }, "downloads": -1, "filename": "imagepypelines-0.1.4a0.tar.gz", "has_sig": false, "md5_digest": "a270f0a153f9f4dca4440c491a7fe918", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3547872, "upload_time": "2018-12-23T03:00:27", "url": "https://files.pythonhosted.org/packages/a8/a3/76b3560965f0bb153b58186b6d9958e57b428526125792d51533d7c9349d/imagepypelines-0.1.4a0.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "c5a66861c7d28d3980a754c0a7c65bd0", "sha256": "d9af1f3a1b114136d0b12faad27a2d56286c9f2cc2cf174be6cdb958a9e70efe" }, "downloads": -1, "filename": "imagepypelines-0.1.4a0-py3-none-any.whl", "has_sig": false, "md5_digest": "c5a66861c7d28d3980a754c0a7c65bd0", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3621412, "upload_time": "2018-12-23T03:00:21", "url": "https://files.pythonhosted.org/packages/08/10/e51b8946147a62b5652f623d3b51ae7b628307224feec9348761092a6740/imagepypelines-0.1.4a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "a270f0a153f9f4dca4440c491a7fe918", "sha256": "b446fe070b1930d6cfc42ad4f758d286ac90132537d1f586bb19af99d2ac3782" }, "downloads": -1, "filename": "imagepypelines-0.1.4a0.tar.gz", "has_sig": false, "md5_digest": "a270f0a153f9f4dca4440c491a7fe918", "packagetype": "sdist", "python_version": "source", "requires_python": ">=2.7.*,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.7.*", "size": 3547872, "upload_time": "2018-12-23T03:00:27", "url": "https://files.pythonhosted.org/packages/a8/a3/76b3560965f0bb153b58186b6d9958e57b428526125792d51533d7c9349d/imagepypelines-0.1.4a0.tar.gz" } ] }