{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Faster Classification with ResNet50\n\nAs deep learning workloads getting bigger, specialized hardware units were developed or adapted from existing products to **accelerate tasks like training and inference**.\n\nKaggle, tried to make users' life easier, providing free access to two types of accelerators(GPUs and TPUs) except the standard CPU. Another option that gets a lot of attention and research, but it isn't yet available here, is the [FPGAs](https://inaccel.com/).\n\nThis notebook shows how to classify images using the native Keras or **InAccel's Keras-like framework** in order to increase performance. With this modified Keras API, we can take advantange of FPGA acceleration, while developing a Machine Learning Workflow the same way as before.\n\nSince, there are no FPGA resources here, you can execute the same accelerated example on [Inaccel Studio](https://labs.inaccel.com:8000/), an open platform that lets **professionals**, **students** and **researchers** develop accelerated applications from their browsers, with **free access to FPGAs**.\n\nFor this experiment we used 10 thousand images of the dog-breed-verification/test dataset and the pretrained on IMageNet ResNet50 Keras model.\nThe following runtime screenshots show the performance of the classification, measuring FPS(Frames/Images per Second) on the three hardware units.\n\n![cpuFPS.png](attachment:cpuFPS.png)\n![gpuFPS.png](attachment:gpuFPS.png)\n![fpgaFPS.png](attachment:fpgaFPS.png)\n\nWe notice that the FPGA accelerated solution processes more than 2000 Images per Second and achieves **170x speedup compared to CPU-only and 6.5x compared to the Kaggle offered GPU(P100) execution**.","attachments":{"cpuFPS.png":{"image/png":"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"},"gpuFPS.png":{"image/png":"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"},"fpgaFPS.png":{"image/png":"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"}},"execution_count":null},{"metadata":{},"cell_type":"markdown","source":"Firstly, we import the necessary libraries and load the pretrained ResNet50 model.\n\nFor FPGA acceleration comment `tensorflow.keras` imports and comment out `inaccel.keras`.","execution_count":null},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import numpy as np\nimport time\nimport os\nimport pandas as pd\n\nfrom tensorflow.keras.applications.resnet50 import decode_predictions, ResNet50\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator, load_img\n\n# from inaccel.keras.applications.resnet50 import decode_predictions, ResNet50\n# from inaccel.keras.preprocessing.image import ImageDataGenerator, load_img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model = ResNet50(weights='imagenet')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Then we create an Image Generator for batch predictions","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"test_filenames = os.listdir(\"../input/dog-breed-identification/test\")\ntest_df = pd.DataFrame({\n    'filename': test_filenames\n})","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"images = ImageDataGenerator().flow_from_dataframe(\n    test_df, \n    \"../input/dog-breed-identification/test\", \n    x_col='filename',\n    y_col=None,\n    class_mode=None,\n    target_size=(224, 224),\n    batch_size=64\n)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"Now, it's time to feed the model with the images and predict their class.\n\nWe also measure the performance as the number of Images processed Per Second.","execution_count":null},{"metadata":{"_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"begin = time.monotonic()\npredictions = model.predict(images, workers=16)\nend = time.monotonic()\n\nprint('Duration for', len(predictions), 'images: %.3f sec' % (end - begin))\nprint('FPS on GPU: %.3f' % (len(predictions) / (end - begin)))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Accuracy Check\n\nFinally, we load some random images and plot them to check that the predictions are accurate.","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"from IPython.display import Image, display\n\nmost_likely_labels = decode_predictions(predictions, top=3)\n\nfor i, img_path in enumerate(test_filenames[0:3]):\n    display(Image('../input/dog-breed-identification/test/' + img_path))\n    print(most_likely_labels[i])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Conclusion\n\nTo learn more about Accelerated Machine Learning, be sure to check out:\n\n* [Inaccel Cloud](https://labs.inaccel.com:8000/)\n* [Github](https://github.com/inaccel)\n* [Docs](https://docs.inaccel.com/)\n* [Blog](https://inaccel.com/blog/)","execution_count":null}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}