Copyright 2017 The Android Open Source Project

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
------------------------------------------------------------------

This directory contains models data for the Android Neural Networks API benchmarks.

Included models:

------------------------------------------------------------------
- mobilenet_float.tflite
MobileNet tensorflow lite model based on:
"MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications"
https://arxiv.org/abs/1704.04861
Apache License, Version 2.0

Downloaded from
http://download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz
on Aug 1 2018 and converted using ToT toco.
Golden output generated with ToT tensorflow (Linux, CPU).

------------------------------------------------------------------
- mobilenet_quantized.tflite
8bit quantized MobileNet tensorflow lite model based on:
"MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications"
https://arxiv.org/abs/1704.04861
Apache License, Version 2.0

Downloaded from
http://download.tensorflow.org/models/mobilenet_v1_2018_07_12/mobilenet_v1_1.0_224_quant.tgz
on Aug 1 2018.
Golden output generated with ToT tflite (Linux, CPU).

------------------------------------------------------------------
- hdrnet_float.tflite
Partial tensorflow lite model based on
"Deep Bilateral Learningfor Real-Time Image Enhancement"
https://groups.csail.mit.edu/graphics/hdrnet/
Apache License, Version 2.0

It's partial because Pack and Transpose operations were not supported at the time
of model creation.

------------------------------------------------------------------
- hdrnet_quantized.tflite
8bit quantized partial tensorflow lite model based on
"Deep Bilateral Learning for Real-Time Image Enhancement"
https://groups.csail.mit.edu/graphics/hdrnet/
Apache License, Version 2.0

------------------------------------------------------------------
- resnet_float.tflite
ResNet tensorflow lite model based on:
"Deep Residual Learning for Image Recognition"
https://arxiv.org/abs/1512.03385
Apache License, Version 2.0

------------------------------------------------------------------
- resnet_quantized.tflite
8bit quantized ResNet tensorflow lite model based on:
"Deep Residual Learning for Image Recognition"
https://arxiv.org/abs/1512.03385
Apache License, Version 2.0

------------------------------------------------------------------
- ssd_mobilenet_v1_coco_float.tflite
Float version of MobileNet SSD tensorflow model based on:
"Speed/accuracy trade-offs for modern convolutional object detectors."
https://arxiv.org/abs/1611.10012
Apache License, Version 2.0

Generated from
http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_coco_2018_01_28.tar.gz
on Sep 24 2018.
See also: https://github.com/tensorflow/models/tree/master/research/object_detection
Golden output generated with ToT tflite (Linux, x86_64 CPU).

------------------------------------------------------------------
- ssd_mobilenet_v1_coco_quantized.tflite
8bit quantized MobileNet SSD tensorflow lite model based on:
"Speed/accuracy trade-offs for modern convolutional object detectors."
https://arxiv.org/abs/1611.10012
Apache License, Version 2.0

Generated from
http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_quantized_300x300_coco14_sync_2018_07_18.tar.gz
on Sep 19 2018.
See also: https://github.com/tensorflow/models/tree/master/research/object_detection
Golden output generated with ToT tflite (Linux, CPU).

------------------------------------------------------------------
- tts_float.tflite
TTS tensorflow lite model based on:
"Fast, Compact, and High Quality LSTM-RNN Based Statistical Parametric Speech Synthesizers for
Mobile Devices"
https://ai.google/research/pubs/pub45379
Apache License, Version 2.0

Note that the tensorflow lite model is the acoustic model in the paper. It is used because it is
much heavier than the duration model.
------------------------------------------------------------------
- asr_float.tflite
ASR tensorflow lite model based on the ASR acoustic model in:
"Personalized Speech recognition on mobile devices"
https://arxiv.org/abs/1603.03185
Apache License, Version 2.0
------------------------------------------------------------------
- hotword_float.tflite
TFLite test hotword model, see:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/models/testdata/g3doc#hotword-model
Apache License, Version 2.0
------------------------------------------------------------------
- endpointer_float.tflite
TFLite test endpointer model, see:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite/models/testdata/g3doc#endpointer-model
Apache License, Version 2.0

------------------------------------------------------------------
Input files:
------------------------------------------------------------------
- ssd_mobilenet_v1_coco_*/tarmac.input
Photo of airport tarmac by krtaylor@google.com, Apache License, Version 2.0
- cup.input
Photo of cup by pszczepaniak@google.com, Apache License, Version 2.0
- tts_float/arctic_*.input
Linguistic features and durations generated from text sentences from the CMU Arctic set
(http://www.festvox.org/cmu_arctic/cmuarctic.data), Apache License, Version 2.0
- asr_float.input
Acoustic features of a test speech, Apache License, Version 2.0
- hotword_float.input
Acoustic features of a test speech, Apache License, Version 2.0
- endpointer_float.input
Acoustic features of a test speech, Apache License, Version 2.0
------------------------------------------------------------------


TODO(pszczepaniak): Update hdrnet to full model with pack and transpose
TODO(pszczepaniak): Provide at least 5 inputs outputs for each model

