diff --git a/README.md b/README.md index e41c6f91..25d4c473 100644 --- a/README.md +++ b/README.md @@ -189,6 +189,28 @@ data/TID2013/tid2013_labels_test.json For the AVA dataset we randomly assigned 90% of samples to the train set, and 10% to the test set, and throughout training a 5% validation set will be split from the training set to evaluate the training performance after each epoch. For the TID2013 dataset we split the train/test sets by reference images, to ensure that no reference image, and any of its distortions, enters both the train and test set. +## Serving NIMA with TensorFlow Serving +TensorFlow versions of both the technical and aesthetic MobileNet models are provided, +along with the script to generate them from the original Keras files, under the `contrib/tf_serving` directory. + +There is also an already configured TFS `Dockerfile` that you can use. + +To get predictions from the aesthetic or technical model: +1. Build the NIMA TFS Docker image `docker build -t tfs_nima contrib/tf_serving` +2. Run a NIMA TFS container with `docker run -d --name tfs_nima -p 8500:8500 tfs_nima` +3. Install python dependencies to run TF serving sample client +``` +virtualenv -p python3 contrib/tf_serving/venv_tfs_nima +source contrib/tf_serving/venv_tfs_nima/bin/activate +pip install -r contrib/tf_serving/requirements.txt +``` +4. Get predictions from aesthetic or technical model by running the sample client +``` +python -m contrib.tf_serving.tfs_sample_client --image-path src/tests/test_images/42039.jpg --model-name mobilenet_aesthetic +python -m contrib.tf_serving.tfs_sample_client --image-path src/tests/test_images/42039.jpg --model-name mobilenet_technical +``` + + ## Maintainers * Christopher Lennan, github: [clennan](https://github.com/clennan) * Hao Nguyen, github: [MrBanhBao](https://github.com/MrBanhBao) diff --git a/contrib/tf_serving/Dockerfile b/contrib/tf_serving/Dockerfile new file mode 100644 index 00000000..a5ea7815 --- /dev/null +++ b/contrib/tf_serving/Dockerfile @@ -0,0 +1,13 @@ +FROM tensorflow/serving:latest + +WORKDIR /tf_serving + +# copy project files +COPY tfs_models/mobilenet_aesthetic /models/mobilenet_aesthetic/1 +COPY tfs_models/mobilenet_technical /models/mobilenet_technical/1 +COPY tf_serving_models.cfg /tf_serving/tf_serving_models.cfg + +EXPOSE 8500 +ENTRYPOINT [] + +CMD ["tensorflow_model_server" ,"--port=8500", "--model_config_file=tf_serving_models.cfg"] \ No newline at end of file diff --git a/contrib/tf_serving/requirements.txt b/contrib/tf_serving/requirements.txt new file mode 100644 index 00000000..37b576a0 --- /dev/null +++ b/contrib/tf_serving/requirements.txt @@ -0,0 +1,3 @@ +Keras==2.2.* +Pillow==5.3.* +tensorflow-serving-api==1.12.* diff --git a/contrib/tf_serving/save_tfs_model.py b/contrib/tf_serving/save_tfs_model.py new file mode 100644 index 00000000..d177b5cc --- /dev/null +++ b/contrib/tf_serving/save_tfs_model.py @@ -0,0 +1,48 @@ +import keras.backend as K +import argparse +from keras.applications.mobilenet import DepthwiseConv2D, relu6 +from keras.utils.generic_utils import CustomObjectScope +from tensorflow.python.saved_model import builder as saved_model_builder +from tensorflow.python.saved_model import tag_constants +from tensorflow.python.saved_model.signature_def_utils_impl import \ + predict_signature_def + +from src.handlers.model_builder import Nima + + +def main(base_model_name, weights_file, export_path): + # Load model and weights + nima = Nima(base_model_name, weights=None) + nima.build() + nima.nima_model.load_weights(weights_file) + + # Tell keras that this will be used for making predictions + K.set_learning_phase(0) + + # CustomObject required by MobileNet + with CustomObjectScope({'relu6': relu6, 'DepthwiseConv2D': DepthwiseConv2D}): + builder = saved_model_builder.SavedModelBuilder(export_path) + signature = predict_signature_def( + inputs={'input_image': nima.nima_model.input}, + outputs={'quality_prediction': nima.nima_model.output} + ) + + builder.add_meta_graph_and_variables( + sess=K.get_session(), + tags=[tag_constants.SERVING], + signature_def_map={'image_quality': signature} + ) + builder.save() + + print(f'TF model exported to: {export_path}') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-b', '--base-model-name', help='CNN base model name', required=True) + parser.add_argument('-w', '--weights-file', help='path of weights file', required=True) + parser.add_argument('-ep', '--export-path', help='path to save the tfs model', required=True) + + args = parser.parse_args() + + main(**args.__dict__) diff --git a/contrib/tf_serving/tf_serving_models.cfg b/contrib/tf_serving/tf_serving_models.cfg new file mode 100644 index 00000000..5bc37ddb --- /dev/null +++ b/contrib/tf_serving/tf_serving_models.cfg @@ -0,0 +1,13 @@ +model_config_list: { + + config: { + name: "mobilenet_technical", + base_path: "/models/mobilenet_technical", + model_platform: "tensorflow" + }, + config: { + name: "mobilenet_aesthetic", + base_path: "/models/mobilenet_aesthetic", + model_platform: "tensorflow" + } +} diff --git a/contrib/tf_serving/tfs_models/mobilenet_aesthetic/saved_model.pb b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/saved_model.pb new file mode 100644 index 00000000..2603cc7d Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/saved_model.pb differ diff --git a/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.data-00000-of-00001 b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.data-00000-of-00001 new file mode 100644 index 00000000..f7d9971a Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.data-00000-of-00001 differ diff --git a/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.index b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.index new file mode 100644 index 00000000..1b3e4e4c Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_aesthetic/variables/variables.index differ diff --git a/contrib/tf_serving/tfs_models/mobilenet_technical/saved_model.pb b/contrib/tf_serving/tfs_models/mobilenet_technical/saved_model.pb new file mode 100644 index 00000000..1dcfde8e Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_technical/saved_model.pb differ diff --git a/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.data-00000-of-00001 b/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.data-00000-of-00001 new file mode 100644 index 00000000..3ad493c6 Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.data-00000-of-00001 differ diff --git a/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.index b/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.index new file mode 100644 index 00000000..c942d349 Binary files /dev/null and b/contrib/tf_serving/tfs_models/mobilenet_technical/variables/variables.index differ diff --git a/contrib/tf_serving/tfs_sample_client.py b/contrib/tf_serving/tfs_sample_client.py new file mode 100644 index 00000000..a8f0c274 --- /dev/null +++ b/contrib/tf_serving/tfs_sample_client.py @@ -0,0 +1,53 @@ +import json +import argparse +import keras +import numpy as np +import tensorflow as tf +from src.utils import utils +from grpc.beta import implementations +from tensorflow_serving.apis import predict_pb2, prediction_service_pb2 + +TFS_HOST = 'localhost' +TFS_PORT = 8500 + + +def normalize_labels(labels): + labels_np = np.array(labels) + return labels_np / labels_np.sum() + + +def calc_mean_score(score_dist): + score_dist = normalize_labels(score_dist) + return (score_dist * np.arange(1, 11)).sum() + + +def get_image_quality_predictions(image_path, model_name): + # Load and preprocess image + image = utils.load_image(image_path, target_size=(224, 224)) + image = keras.applications.mobilenet.preprocess_input(image) + + # Run through model + channel = implementations.insecure_channel(TFS_HOST, TFS_PORT) + stub = prediction_service_pb2.beta_create_PredictionService_stub(channel) + request = predict_pb2.PredictRequest() + request.model_spec.name = model_name + request.model_spec.signature_name = 'image_quality' + + request.inputs['input_image'].CopyFrom( + tf.contrib.util.make_tensor_proto(np.expand_dims(image, 0)) + ) + + response = stub.Predict(request, 10.0) + result = round(calc_mean_score(response.outputs['quality_prediction'].float_val), 2) + + print(json.dumps({'mean_score_prediction': np.round(result, 3)}, indent=2)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('-ip', '--image-path', help='Path to image file.', required=True) + parser.add_argument( + '-mn', '--model-name', help='mobilenet_aesthetic or mobilenet_technical', required=True + ) + args = parser.parse_args() + get_image_quality_predictions(**args.__dict__) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/activate b/contrib/tf_serving/venv_tfs_nima/bin/activate new file mode 100644 index 00000000..f4e5d244 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/activate @@ -0,0 +1,78 @@ +# This file must be used with "source bin/activate" *from bash* +# you cannot run it directly + +deactivate () { + unset -f pydoc >/dev/null 2>&1 + + # reset old environment variables + # ! [ -z ${VAR+_} ] returns true if VAR is declared at all + if ! [ -z "${_OLD_VIRTUAL_PATH+_}" ] ; then + PATH="$_OLD_VIRTUAL_PATH" + export PATH + unset _OLD_VIRTUAL_PATH + fi + if ! [ -z "${_OLD_VIRTUAL_PYTHONHOME+_}" ] ; then + PYTHONHOME="$_OLD_VIRTUAL_PYTHONHOME" + export PYTHONHOME + unset _OLD_VIRTUAL_PYTHONHOME + fi + + # This should detect bash and zsh, which have a hash command that must + # be called to get it to forget past commands. Without forgetting + # past commands the $PATH changes we made may not be respected + if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null + fi + + if ! [ -z "${_OLD_VIRTUAL_PS1+_}" ] ; then + PS1="$_OLD_VIRTUAL_PS1" + export PS1 + unset _OLD_VIRTUAL_PS1 + fi + + unset VIRTUAL_ENV + if [ ! "${1-}" = "nondestructive" ] ; then + # Self destruct! + unset -f deactivate + fi +} + +# unset irrelevant variables +deactivate nondestructive + +VIRTUAL_ENV="/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima" +export VIRTUAL_ENV + +_OLD_VIRTUAL_PATH="$PATH" +PATH="$VIRTUAL_ENV/bin:$PATH" +export PATH + +# unset PYTHONHOME if set +if ! [ -z "${PYTHONHOME+_}" ] ; then + _OLD_VIRTUAL_PYTHONHOME="$PYTHONHOME" + unset PYTHONHOME +fi + +if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT-}" ] ; then + _OLD_VIRTUAL_PS1="$PS1" + if [ "x" != x ] ; then + PS1="$PS1" + else + PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1" + fi + export PS1 +fi + +# Make sure to unalias pydoc if it's already there +alias pydoc 2>/dev/null >/dev/null && unalias pydoc + +pydoc () { + python -m pydoc "$@" +} + +# This should detect bash and zsh, which have a hash command that must +# be called to get it to forget past commands. Without forgetting +# past commands the $PATH changes we made may not be respected +if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then + hash -r 2>/dev/null +fi diff --git a/contrib/tf_serving/venv_tfs_nima/bin/activate.csh b/contrib/tf_serving/venv_tfs_nima/bin/activate.csh new file mode 100644 index 00000000..f1e4b3f6 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/activate.csh @@ -0,0 +1,36 @@ +# This file must be used with "source bin/activate.csh" *from csh*. +# You cannot run it directly. +# Created by Davide Di Blasi . + +alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate && unalias pydoc' + +# Unset irrelevant variables. +deactivate nondestructive + +setenv VIRTUAL_ENV "/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima" + +set _OLD_VIRTUAL_PATH="$PATH" +setenv PATH "$VIRTUAL_ENV/bin:$PATH" + + + +if ("" != "") then + set env_name = "" +else + set env_name = `basename "$VIRTUAL_ENV"` +endif + +# Could be in a non-interactive environment, +# in which case, $prompt is undefined and we wouldn't +# care about the prompt anyway. +if ( $?prompt ) then + set _OLD_VIRTUAL_PROMPT="$prompt" + set prompt = "[$env_name] $prompt" +endif + +unset env_name + +alias pydoc python -m pydoc + +rehash + diff --git a/contrib/tf_serving/venv_tfs_nima/bin/activate.fish b/contrib/tf_serving/venv_tfs_nima/bin/activate.fish new file mode 100644 index 00000000..9c3f3416 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/activate.fish @@ -0,0 +1,76 @@ +# This file must be used using `. bin/activate.fish` *within a running fish ( http://fishshell.com ) session*. +# Do not run it directly. + +function deactivate -d 'Exit virtualenv mode and return to the normal environment.' + # reset old environment variables + if test -n "$_OLD_VIRTUAL_PATH" + set -gx PATH $_OLD_VIRTUAL_PATH + set -e _OLD_VIRTUAL_PATH + end + + if test -n "$_OLD_VIRTUAL_PYTHONHOME" + set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME + set -e _OLD_VIRTUAL_PYTHONHOME + end + + if test -n "$_OLD_FISH_PROMPT_OVERRIDE" + # Set an empty local `$fish_function_path` to allow the removal of `fish_prompt` using `functions -e`. + set -l fish_function_path + + # Erase virtualenv's `fish_prompt` and restore the original. + functions -e fish_prompt + functions -c _old_fish_prompt fish_prompt + functions -e _old_fish_prompt + set -e _OLD_FISH_PROMPT_OVERRIDE + end + + set -e VIRTUAL_ENV + + if test "$argv[1]" != 'nondestructive' + # Self-destruct! + functions -e pydoc + functions -e deactivate + end +end + +# Unset irrelevant variables. +deactivate nondestructive + +set -gx VIRTUAL_ENV "/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima" + +set -gx _OLD_VIRTUAL_PATH $PATH +set -gx PATH "$VIRTUAL_ENV/bin" $PATH + +# Unset `$PYTHONHOME` if set. +if set -q PYTHONHOME + set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME + set -e PYTHONHOME +end + +function pydoc + python -m pydoc $argv +end + +if test -z "$VIRTUAL_ENV_DISABLE_PROMPT" + # Copy the current `fish_prompt` function as `_old_fish_prompt`. + functions -c fish_prompt _old_fish_prompt + + function fish_prompt + # Save the current $status, for fish_prompts that display it. + set -l old_status $status + + # Prompt override provided? + # If not, just prepend the environment name. + if test -n "" + printf '%s%s' "" (set_color normal) + else + printf '%s(%s) ' (set_color normal) (basename "$VIRTUAL_ENV") + end + + # Restore the original $status + echo "exit $old_status" | source + _old_fish_prompt + end + + set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV" +end diff --git a/contrib/tf_serving/venv_tfs_nima/bin/activate_this.py b/contrib/tf_serving/venv_tfs_nima/bin/activate_this.py new file mode 100644 index 00000000..f18193bf --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/activate_this.py @@ -0,0 +1,34 @@ +"""By using execfile(this_file, dict(__file__=this_file)) you will +activate this virtualenv environment. + +This can be used when you must use an existing Python interpreter, not +the virtualenv bin/python +""" + +try: + __file__ +except NameError: + raise AssertionError( + "You must run this like execfile('path/to/activate_this.py', dict(__file__='path/to/activate_this.py'))") +import sys +import os + +old_os_path = os.environ.get('PATH', '') +os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path +base = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +if sys.platform == 'win32': + site_packages = os.path.join(base, 'Lib', 'site-packages') +else: + site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages') +prev_sys_path = list(sys.path) +import site +site.addsitedir(site_packages) +sys.real_prefix = sys.prefix +sys.prefix = base +# Move the added items to the front of the path: +new_sys_path = [] +for item in list(sys.path): + if item not in prev_sys_path: + new_sys_path.append(item) + sys.path.remove(item) +sys.path[:0] = new_sys_path diff --git a/contrib/tf_serving/venv_tfs_nima/bin/easy_install b/contrib/tf_serving/venv_tfs_nima/bin/easy_install new file mode 100755 index 00000000..0152723f --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/easy_install @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/easy_install-3.6 b/contrib/tf_serving/venv_tfs_nima/bin/easy_install-3.6 new file mode 100755 index 00000000..0152723f --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/easy_install-3.6 @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from setuptools.command.easy_install import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/f2py b/contrib/tf_serving/venv_tfs_nima/bin/f2py new file mode 100644 index 00000000..ee74a088 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/f2py @@ -0,0 +1,28 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 +# See http://cens.ioc.ee/projects/f2py2e/ +from __future__ import division, print_function + +import os +import sys +for mode in ["g3-numpy", "2e-numeric", "2e-numarray", "2e-numpy"]: + try: + i = sys.argv.index("--" + mode) + del sys.argv[i] + break + except ValueError: + pass +os.environ["NO_SCIPY_IMPORT"] = "f2py" +if mode == "g3-numpy": + sys.stderr.write("G3 f2py support is not implemented, yet.\\n") + sys.exit(1) +elif mode == "2e-numeric": + from f2py2e import main +elif mode == "2e-numarray": + sys.argv.append("-DNUMARRAY") + from f2py2e import main +elif mode == "2e-numpy": + from numpy.f2py import main +else: + sys.stderr.write("Unknown mode: " + repr(mode) + "\\n") + sys.exit(1) +main() diff --git a/contrib/tf_serving/venv_tfs_nima/bin/freeze_graph b/contrib/tf_serving/venv_tfs_nima/bin/freeze_graph new file mode 100755 index 00000000..4ccd3c6e --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/freeze_graph @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorflow.python.tools.freeze_graph import run_main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/markdown_py b/contrib/tf_serving/venv_tfs_nima/bin/markdown_py new file mode 100755 index 00000000..7f6da472 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/markdown_py @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from markdown.__main__ import run + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/pip b/contrib/tf_serving/venv_tfs_nima/bin/pip new file mode 100755 index 00000000..6eced57c --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/pip @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/pip3 b/contrib/tf_serving/venv_tfs_nima/bin/pip3 new file mode 100755 index 00000000..6eced57c --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/pip3 @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/pip3.6 b/contrib/tf_serving/venv_tfs_nima/bin/pip3.6 new file mode 100755 index 00000000..6eced57c --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/pip3.6 @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from pip._internal import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/python b/contrib/tf_serving/venv_tfs_nima/bin/python new file mode 120000 index 00000000..039b719b --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/python @@ -0,0 +1 @@ +python3.6 \ No newline at end of file diff --git a/contrib/tf_serving/venv_tfs_nima/bin/python-config b/contrib/tf_serving/venv_tfs_nima/bin/python-config new file mode 100755 index 00000000..5956a0cc --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/python-config @@ -0,0 +1,78 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python + +import sys +import getopt +import sysconfig + +valid_opts = ['prefix', 'exec-prefix', 'includes', 'libs', 'cflags', + 'ldflags', 'help'] + +if sys.version_info >= (3, 2): + valid_opts.insert(-1, 'extension-suffix') + valid_opts.append('abiflags') +if sys.version_info >= (3, 3): + valid_opts.append('configdir') + + +def exit_with_usage(code=1): + sys.stderr.write("Usage: {0} [{1}]\n".format( + sys.argv[0], '|'.join('--'+opt for opt in valid_opts))) + sys.exit(code) + +try: + opts, args = getopt.getopt(sys.argv[1:], '', valid_opts) +except getopt.error: + exit_with_usage() + +if not opts: + exit_with_usage() + +pyver = sysconfig.get_config_var('VERSION') +getvar = sysconfig.get_config_var + +opt_flags = [flag for (flag, val) in opts] + +if '--help' in opt_flags: + exit_with_usage(code=0) + +for opt in opt_flags: + if opt == '--prefix': + print(sysconfig.get_config_var('prefix')) + + elif opt == '--exec-prefix': + print(sysconfig.get_config_var('exec_prefix')) + + elif opt in ('--includes', '--cflags'): + flags = ['-I' + sysconfig.get_path('include'), + '-I' + sysconfig.get_path('platinclude')] + if opt == '--cflags': + flags.extend(getvar('CFLAGS').split()) + print(' '.join(flags)) + + elif opt in ('--libs', '--ldflags'): + abiflags = getattr(sys, 'abiflags', '') + libs = ['-lpython' + pyver + abiflags] + libs += getvar('LIBS').split() + libs += getvar('SYSLIBS').split() + # add the prefix/lib/pythonX.Y/config dir, but only if there is no + # shared library in prefix/lib/. + if opt == '--ldflags': + if not getvar('Py_ENABLE_SHARED'): + libs.insert(0, '-L' + getvar('LIBPL')) + if not getvar('PYTHONFRAMEWORK'): + libs.extend(getvar('LINKFORSHARED').split()) + print(' '.join(libs)) + + elif opt == '--extension-suffix': + ext_suffix = sysconfig.get_config_var('EXT_SUFFIX') + if ext_suffix is None: + ext_suffix = sysconfig.get_config_var('SO') + print(ext_suffix) + + elif opt == '--abiflags': + if not getattr(sys, 'abiflags', None): + exit_with_usage() + print(sys.abiflags) + + elif opt == '--configdir': + print(sysconfig.get_config_var('LIBPL')) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/python3 b/contrib/tf_serving/venv_tfs_nima/bin/python3 new file mode 120000 index 00000000..039b719b --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/python3 @@ -0,0 +1 @@ +python3.6 \ No newline at end of file diff --git a/contrib/tf_serving/venv_tfs_nima/bin/python3.6 b/contrib/tf_serving/venv_tfs_nima/bin/python3.6 new file mode 100755 index 00000000..de039e2f Binary files /dev/null and b/contrib/tf_serving/venv_tfs_nima/bin/python3.6 differ diff --git a/contrib/tf_serving/venv_tfs_nima/bin/saved_model_cli b/contrib/tf_serving/venv_tfs_nima/bin/saved_model_cli new file mode 100755 index 00000000..01dec12c --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/saved_model_cli @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorflow.python.tools.saved_model_cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/tensorboard b/contrib/tf_serving/venv_tfs_nima/bin/tensorboard new file mode 100755 index 00000000..705f9098 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/tensorboard @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorboard.main import run_main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(run_main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/tflite_convert b/contrib/tf_serving/venv_tfs_nima/bin/tflite_convert new file mode 100755 index 00000000..1c1c5136 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/tflite_convert @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorflow.contrib.lite.python.tflite_convert import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/toco b/contrib/tf_serving/venv_tfs_nima/bin/toco new file mode 100755 index 00000000..1c1c5136 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/toco @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorflow.contrib.lite.python.tflite_convert import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/toco_from_protos b/contrib/tf_serving/venv_tfs_nima/bin/toco_from_protos new file mode 100755 index 00000000..4c7edafc --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/toco_from_protos @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from tensorflow.contrib.lite.toco.python.toco_from_protos import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/bin/wheel b/contrib/tf_serving/venv_tfs_nima/bin/wheel new file mode 100755 index 00000000..e869e218 --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/bin/wheel @@ -0,0 +1,11 @@ +#!/Users/christopher.lennan/github_repos/image-quality-assessment/contrib/tf_serving/venv_tfs_nima/bin/python3.6 + +# -*- coding: utf-8 -*- +import re +import sys + +from wheel.cli import main + +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/contrib/tf_serving/venv_tfs_nima/include/python3.6m b/contrib/tf_serving/venv_tfs_nima/include/python3.6m new file mode 120000 index 00000000..6e08b04b --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/include/python3.6m @@ -0,0 +1 @@ +/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/include/python3.6m \ No newline at end of file diff --git a/contrib/tf_serving/venv_tfs_nima/pip-selfcheck.json b/contrib/tf_serving/venv_tfs_nima/pip-selfcheck.json new file mode 100644 index 00000000..8354fcde --- /dev/null +++ b/contrib/tf_serving/venv_tfs_nima/pip-selfcheck.json @@ -0,0 +1 @@ +{"last_check":"2018-11-26T09:20:53Z","pypi_version":"18.1"} \ No newline at end of file