{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Converting efficientnet-lite from Tensorflow to ONNX" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Google recently [published a new flavor of efficientnet models](\n", "https://blog.tensorflow.org/2020/03/higher-accuracy-on-vision-models-with-efficientnet-lite.html) that show great performance and accuracy on all mobile CPU/GPU/EdgeTPU devices. The models are found [here](https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite). \n", "This tutorial shows how to convert them to ONNX.\n", "\n", "To start, we setup a few environment variables and download the pre-trained model." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "HOME = os.getcwd()\n", "MODEL = \"efficientnet-lite4\"\n", "os.environ['PYTHONPATH'] = os.path.join(HOME, \"tpu\")\n", "os.environ['MODEL'] = MODEL\n", "os.environ['CUDA_VISIBLE_DEVICES'] = \"\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "/mnt/sdb/home/ipython/notebooks/onnx\n", "Cloning into 'tpu'...\n", "remote: Enumerating objects: 229, done.\u001b[K\n", "remote: Counting objects: 100% (229/229), done.\u001b[K\n", "remote: Compressing objects: 100% (166/166), done.\u001b[K\n", "remote: Total 9392 (delta 112), reused 144 (delta 57), pack-reused 9163\u001b[K\n", "Receiving objects: 100% (9392/9392), 24.21 MiB | 18.79 MiB/s, done.\n", "Resolving deltas: 100% (6703/6703), done.\n", "Checking connectivity... done.\n" ] } ], "source": [ "%cd {HOME}\n", "!git clone https://github.com/tensorflow/tpu\n", "%cd {HOME}/tpu/models/official/efficientnet" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--2020-07-28 18:37:49-- https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/lite/efficientnet-lite4.tar.gz\n", "Resolving storage.googleapis.com (storage.googleapis.com)... 172.217.5.112, 172.217.6.48, 216.58.195.80, ...\n", "Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.5.112|:443... connected.\n", "HTTP request sent, awaiting response... 200 OK\n", "Length: 157170313 (150M) [application/octet-stream]\n", "Saving to: ‘efficientnet-lite4.tar.gz’\n", "\n", "efficientnet-lite4. 100%[===================>] 149.89M 20.4MB/s in 7.4s \n", "\n", "2020-07-28 18:37:57 (20.3 MB/s) - ‘efficientnet-lite4.tar.gz’ saved [157170313/157170313]\n", "\n" ] } ], "source": [ "!wget https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/lite/$MODEL.tar.gz\n", "!tar zxf $MODEL.tar.gz\n", "!wget -q https://upload.wikimedia.org/wikipedia/commons/f/fe/Giant_Panda_in_Beijing_Zoo_1.JPG -O panda.jpg\n", "!wget -q https://storage.googleapis.com/cloud-tpu-checkpoints/efficientnet/eval_data/labels_map.txt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Run a evaluation on tensorflow/cpu:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "predicted class for image panda.jpg: \n", " -> top_0 (85.58%): lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens \n", " -> top_1 (0.26%): cheetah, chetah, Acinonyx jubatus \n", " -> top_2 (0.24%): brown bear, bruin, Ursus arctos \n", " -> top_3 (0.16%): African elephant, Loxodonta africana \n", " -> top_4 (0.15%): American black bear, black bear, Ursus americanus, Euarctos americanus \n" ] } ], "source": [ "!python eval_ckpt_main.py --model_name=$MODEL --ckpt_dir=$MODEL --example_img=panda.jpg --labels_map_file=labels_map.txt --include_background_label" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can use the efficientnet ```export_model.py``` script to export the model as saved_model which makes exporting to ONNX very simple:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "I0728 18:38:38.648482 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_5/Relu6_1:0 shape: (1, 28, 28, 192)\n", "I0728 18:38:38.677552 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_5/Identity:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.681590 140369404610304 api.py:598] block_6 survival_prob: 0.96\n", "I0728 18:38:38.684866 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_5/Identity:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.688508 140369404610304 api.py:598] Block input depth: 56 output depth: 56\n", "I0728 18:38:38.718307 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_6/Relu6:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.748890 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_6/Relu6_1:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.779977 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_6/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.784030 140369404610304 api.py:598] block_7 survival_prob: 0.9533333333333334\n", "I0728 18:38:38.787296 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_6/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.790412 140369404610304 api.py:598] Block input depth: 56 output depth: 56\n", "I0728 18:38:38.821632 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_7/Relu6:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.853299 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_7/Relu6_1:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.885637 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_7/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.889702 140369404610304 api.py:598] block_8 survival_prob: 0.9466666666666667\n", "I0728 18:38:38.893043 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_7/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:38.896236 140369404610304 api.py:598] Block input depth: 56 output depth: 56\n", "I0728 18:38:38.928804 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_8/Relu6:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.961976 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_8/Relu6_1:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:38.996596 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_8/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:39.000830 140369404610304 api.py:598] block_9 survival_prob: 0.9400000000000001\n", "I0728 18:38:39.004113 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_8/Add:0 shape: (1, 28, 28, 56)\n", "I0728 18:38:39.007222 140369404610304 api.py:598] Block input depth: 56 output depth: 112\n", "I0728 18:38:39.040756 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_9/Relu6:0 shape: (1, 28, 28, 336)\n", "I0728 18:38:39.075290 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_9/Relu6_1:0 shape: (1, 14, 14, 336)\n", "I0728 18:38:39.110903 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_9/Identity:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.114987 140369404610304 api.py:598] block_10 survival_prob: 0.9333333333333333\n", "I0728 18:38:39.118490 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_9/Identity:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.121627 140369404610304 api.py:598] Block input depth: 112 output depth: 112\n", "I0728 18:38:39.157878 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_10/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.201611 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_10/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.241122 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_10/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.245910 140369404610304 api.py:598] block_11 survival_prob: 0.9266666666666667\n", "I0728 18:38:39.249292 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_10/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.252506 140369404610304 api.py:598] Block input depth: 112 output depth: 112\n", "I0728 18:38:39.291685 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_11/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.330427 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_11/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.369834 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_11/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.373920 140369404610304 api.py:598] block_12 survival_prob: 0.92\n", "I0728 18:38:39.377205 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_11/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.380327 140369404610304 api.py:598] Block input depth: 112 output depth: 112\n", "I0728 18:38:39.421236 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_12/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.462055 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_12/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.503492 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_12/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.507617 140369404610304 api.py:598] block_13 survival_prob: 0.9133333333333333\n", "I0728 18:38:39.510885 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_12/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.513988 140369404610304 api.py:598] Block input depth: 112 output depth: 112\n", "I0728 18:38:39.553794 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_13/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.595651 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_13/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.638064 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_13/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.642146 140369404610304 api.py:598] block_14 survival_prob: 0.9066666666666667\n", "I0728 18:38:39.645452 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_13/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.648560 140369404610304 api.py:598] Block input depth: 112 output depth: 112\n", "I0728 18:38:39.689387 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_14/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.730962 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_14/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.772864 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_14/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.777002 140369404610304 api.py:598] block_15 survival_prob: 0.9\n", "I0728 18:38:39.780298 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_14/Add:0 shape: (1, 14, 14, 112)\n", "I0728 18:38:39.783416 140369404610304 api.py:598] Block input depth: 112 output depth: 160\n", "I0728 18:38:39.825223 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_15/Relu6:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.868245 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_15/Relu6_1:0 shape: (1, 14, 14, 672)\n", "I0728 18:38:39.911654 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_15/Identity:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:39.915694 140369404610304 api.py:598] block_16 survival_prob: 0.8933333333333333\n", "I0728 18:38:39.918958 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_15/Identity:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:39.922041 140369404610304 api.py:598] Block input depth: 160 output depth: 160\n", "I0728 18:38:39.965641 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_16/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.009892 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_16/Relu6_1:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.054969 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_16/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.059117 140369404610304 api.py:598] block_17 survival_prob: 0.8866666666666667\n", "I0728 18:38:40.062381 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_16/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.065467 140369404610304 api.py:598] Block input depth: 160 output depth: 160\n", "I0728 18:38:40.110097 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_17/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.155143 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_17/Relu6_1:0 shape: (1, 14, 14, 960)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "I0728 18:38:40.201478 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_17/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.205547 140369404610304 api.py:598] block_18 survival_prob: 0.88\n", "I0728 18:38:40.208818 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_17/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.211917 140369404610304 api.py:598] Block input depth: 160 output depth: 160\n", "I0728 18:38:40.257478 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_18/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.304701 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_18/Relu6_1:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.352572 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_18/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.356803 140369404610304 api.py:598] block_19 survival_prob: 0.8733333333333334\n", "I0728 18:38:40.360150 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_18/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.363296 140369404610304 api.py:598] Block input depth: 160 output depth: 160\n", "I0728 18:38:40.410593 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_19/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.459501 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_19/Relu6_1:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.508780 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_19/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.512848 140369404610304 api.py:598] block_20 survival_prob: 0.8666666666666667\n", "I0728 18:38:40.516105 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_19/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.519201 140369404610304 api.py:598] Block input depth: 160 output depth: 160\n", "I0728 18:38:40.568380 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_20/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.618351 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_20/Relu6_1:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.668900 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_20/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.673120 140369404610304 api.py:598] block_21 survival_prob: 0.86\n", "I0728 18:38:40.676375 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_20/Add:0 shape: (1, 14, 14, 160)\n", "I0728 18:38:40.679481 140369404610304 api.py:598] Block input depth: 160 output depth: 272\n", "I0728 18:38:40.729505 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_21/Relu6:0 shape: (1, 14, 14, 960)\n", "I0728 18:38:40.780965 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_21/Relu6_1:0 shape: (1, 7, 7, 960)\n", "I0728 18:38:40.833344 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_21/Identity:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:40.837491 140369404610304 api.py:598] block_22 survival_prob: 0.8533333333333334\n", "I0728 18:38:40.840810 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_21/Identity:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:40.843961 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:40.898612 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_22/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:40.955486 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_22/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.009653 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_22/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.013726 140369404610304 api.py:598] block_23 survival_prob: 0.8466666666666667\n", "I0728 18:38:41.017010 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_22/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.020125 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:41.076108 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_23/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.133105 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_23/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.187577 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_23/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.191740 140369404610304 api.py:598] block_24 survival_prob: 0.8400000000000001\n", "I0728 18:38:41.195037 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_23/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.198164 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:41.255691 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_24/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.313794 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_24/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.369845 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_24/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.374505 140369404610304 api.py:598] block_25 survival_prob: 0.8333333333333334\n", "I0728 18:38:41.377782 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_24/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.380885 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:41.506290 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_25/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.566279 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_25/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.623643 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_25/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.627821 140369404610304 api.py:598] block_26 survival_prob: 0.8266666666666667\n", "I0728 18:38:41.631087 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_25/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.634181 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:41.694212 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_26/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.756402 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_26/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.816646 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_26/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.820887 140369404610304 api.py:598] block_27 survival_prob: 0.8200000000000001\n", "I0728 18:38:41.824216 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_26/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:41.827355 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:41.888928 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_27/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:41.952567 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_27/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:42.014322 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_27/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:42.018583 140369404610304 api.py:598] block_28 survival_prob: 0.8133333333333334\n", "I0728 18:38:42.021914 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_27/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:42.025097 140369404610304 api.py:598] Block input depth: 272 output depth: 272\n", "I0728 18:38:42.088882 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_28/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:42.153645 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_28/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:42.215824 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_28/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:42.219837 140369404610304 api.py:598] block_29 survival_prob: 0.8066666666666666\n", "I0728 18:38:42.223104 140369404610304 api.py:598] Block input: efficientnet-lite4/model/blocks_28/Add:0 shape: (1, 7, 7, 272)\n", "I0728 18:38:42.226201 140369404610304 api.py:598] Block input depth: 272 output depth: 448\n", "I0728 18:38:42.291969 140369404610304 api.py:598] Expand: efficientnet-lite4/model/blocks_29/Relu6:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:42.357661 140369404610304 api.py:598] DWConv: efficientnet-lite4/model/blocks_29/Relu6_1:0 shape: (1, 7, 7, 1632)\n", "I0728 18:38:42.419715 140369404610304 api.py:598] Project: efficientnet-lite4/model/blocks_29/Identity:0 shape: (1, 7, 7, 448)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "I0728 18:38:43.860869 140369404610304 saver.py:1293] Restoring parameters from efficientnet-lite4/model.ckpt\n", "W0728 18:38:44.179851 140369404610304 deprecation.py:323] From /opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:201: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info.\n", "I0728 18:38:44.180820 140369404610304 builder_impl.py:641] No assets to save.\n", "I0728 18:38:44.180942 140369404610304 builder_impl.py:461] No assets to write.\n", "I0728 18:38:45.091564 140369404610304 builder_impl.py:426] SavedModel written to: saved_model/saved_model.pb\n", "Saved model written to saved_model\n", "2020-07-28 18:38:45.207465: I tensorflow/core/grappler/devices.cc:69] Number of eligible GPUs (core count >= 8, compute capability >= 0.0): 0\n", "2020-07-28 18:38:45.207571: I tensorflow/core/grappler/clusters/single_machine.cc:356] Starting new session\n", "2020-07-28 18:38:45.288588: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:816] Optimization results for grappler item: graph_to_optimize\n", "2020-07-28 18:38:45.288632: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:818] function_optimizer: function_optimizer did nothing. time = 0.003ms.\n", "2020-07-28 18:38:45.288637: I tensorflow/core/grappler/optimizers/meta_optimizer.cc:818] function_optimizer: function_optimizer did nothing. time = 0ms.\n", "W0728 18:38:45.429831 140369404610304 deprecation.py:323] From /opt/anaconda3/lib/python3.7/site-packages/tensorflow/lite/python/util.py:275: convert_variables_to_constants (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Use `tf.compat.v1.graph_util.convert_variables_to_constants`\n", "W0728 18:38:45.430049 140369404610304 deprecation.py:323] From /opt/anaconda3/lib/python3.7/site-packages/tensorflow/python/framework/convert_to_constants.py:854: extract_sub_graph (from tensorflow.python.framework.graph_util_impl) is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "Use `tf.compat.v1.graph_util.extract_sub_graph`\n", "Traceback (most recent call last):\n", " File \"export_model.py\", line 164, in \n", " app.run(main)\n", " File \"/opt/anaconda3/lib/python3.7/site-packages/absl/app.py\", line 300, in run\n", " _run_main(main, args)\n", " File \"/opt/anaconda3/lib/python3.7/site-packages/absl/app.py\", line 251, in _run_main\n", " sys.exit(main(argv))\n", " File \"export_model.py\", line 142, in main\n", " \"Post training quantization requires data_dir flag to point to the \"\n", "ValueError: Post training quantization requires data_dir flag to point to the calibration dataset. To export a float model, set --quantize=False.\n" ] } ], "source": [ "!python export_model.py --model_name=efficientnet-lite4 --ckpt_dir=efficientnet-lite4 --output_saved_model_dir=saved_model --output_tflite=/tmp/t" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A look at the saved_model shows us the inputs and outputs of the model:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-28 18:39:04.610520: I tensorflow/stream_executor/platform/default/dso_loader.cc:48] Successfully opened dynamic library libcudart.so.10.1\n", "The given SavedModel SignatureDef contains the following input(s):\n", " inputs['input'] tensor_info:\n", " dtype: DT_FLOAT\n", " shape: (1, 224, 224, 3)\n", " name: images:0\n", "The given SavedModel SignatureDef contains the following output(s):\n", " outputs['output'] tensor_info:\n", " dtype: DT_FLOAT\n", " shape: (1, 1000)\n", " name: Softmax:0\n", "Method name is: tensorflow/serving/predict\n" ] } ], "source": [ "!saved_model_cli show --dir saved_model --tag_set serve --signature_def serving_default" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Install and run tf2onnx directly on the saved_model:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "!pip install git+https://github.com/onnx/tensorflow-onnx\n", "!pip install onnxruntime" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2020-07-28 18:46:47,661 - INFO - Using tensorflow=2.3.0, onnx=1.7.0, tf2onnx=1.6.3/d4abc8\n", "2020-07-28 18:46:47,661 - INFO - Using opset \n", "2020-07-28 18:46:54,218 - INFO - Optimizing ONNX model\n", "2020-07-28 18:47:02,196 - INFO - After optimization: BatchNormalization -84 (91->7), Const -402 (609->207), Identity -33 (33->0), Reshape -30 (30->0), Transpose -395 (396->1)\n", "2020-07-28 18:47:02,219 - INFO - \n", "2020-07-28 18:47:02,219 - INFO - Successfully converted TensorFlow model saved_model to ONNX\n", "2020-07-28 18:47:02,290 - INFO - ONNX model is saved at efficientnet-lite4.onnx\n" ] } ], "source": [ "!python -m tf2onnx.convert --opset 11 --saved-model saved_model --output $MODEL.onnx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have the ONNX model we can write a quick demo using onnxruntime:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "import numpy as np\n", "import math\n", "import matplotlib.pyplot as plt\n", "import onnxruntime as rt\n", "import cv2\n", "import json\n", "\n", "labels = json.load(open(\"labels_map.txt\", \"r\"))\n", "\n", "\n", "def img_stats(a, name={}):\n", " return {\n", " \"name\": name,\n", " \"size\": a.shape,\n", " \"mean\": \"{:.2f}\".format(a.mean()),\n", " \"std\": \"{:.2f}\".format(a.std()),\n", " \"max\": a.max(),\n", " \"min\": a.min(),\n", " \"median\": \"{:.2f}\".format(np.median(a)),\n", " }\n", "\n", "\n", "def center_crop(img, out_height, out_width):\n", " height, width, _ = img.shape\n", " left = int((width - out_width) / 2)\n", " right = int((width + out_width) / 2)\n", " top = int((height - out_height) / 2)\n", " bottom = int((height + out_height) / 2)\n", " img = img[top:bottom, left:right]\n", " return img\n", "\n", "\n", "def resize_with_aspectratio(img, out_height, out_width, scale=87.5, inter_pol=cv2.INTER_LINEAR):\n", " height, width, _ = img.shape\n", " new_height = int(100. * out_height / scale)\n", " new_width = int(100. * out_width / scale)\n", " if height > width:\n", " w = new_width\n", " h = int(new_height * height / width)\n", " else:\n", " h = new_height\n", " w = int(new_width * width / height)\n", " img = cv2.resize(img, (w, h), interpolation=inter_pol)\n", " return img\n", "\n", "\n", "def pre_process_edgetpu(img, dims):\n", " output_height, output_width, _ = dims\n", " img = resize_with_aspectratio(img, output_height, output_width, inter_pol=cv2.INTER_LINEAR)\n", " img = center_crop(img, output_height, output_width)\n", " img = np.asarray(img, dtype='float32')\n", " img -= [127.0, 127.0, 127.0]\n", " img /= [128.0, 128.0, 128.0]\n", " return img\n", "\n", "\n", "# read the image\n", "fname = \"panda.jpg\"\n", "fname = \"grizzly.jpg\"\n", "img = cv2.imread(fname)\n", "img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n", "\n", "# pre-process the image like mobilenet and resize it to 300x300\n", "img = pre_process_edgetpu(img, (224, 224, 3))\n", "plt.axis('off')\n", "plt.imshow(img)\n", "plt.show()\n", "\n", "# create a batch of 1 (that batch size is buned into the saved_model)\n", "img_batch = np.expand_dims(img, axis=0)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# load the model\n", "sess = rt.InferenceSession(MODEL + \".onnx\")" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "294 brown bear, bruin, Ursus arctos 0.99992037\n", "295 American black bear, black bear, Ursus americanus, Euarctos americanus 5.6639532e-05\n", "297 sloth bear, Melursus ursinus, Ursus ursinus 4.688604e-06\n", "342 wild boar, boar, Sus scrofa 9.999384e-07\n", "364 three-toed sloth, ai, Bradypus tridactylus 6.836822e-07\n" ] } ], "source": [ "# run inference and print results\n", "results = sess.run([\"Softmax:0\"], {\"images:0\": img_batch})[0]\n", "result = reversed(results[0].argsort()[-5:])\n", "for r in result:\n", " print(r, labels[str(r)], results[0][r])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }