Skip to content

Instantly share code, notes, and snippets.

@hgaiser
Last active August 24, 2017 15:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hgaiser/a2c053ce8dfdd6a829e56c4b3ede5ad3 to your computer and use it in GitHub Desktop.
Save hgaiser/a2c053ce8dfdd6a829e56c4b3ede5ad3 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"Using TensorFlow backend.\n"
]
}
],
"source": [
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"from ipywidgets import IntProgress\n",
"from keras_tqdm import TQDMNotebookCallback\n",
"\n",
"import keras\n",
"import keras.preprocessing.image\n",
"from keras.applications.imagenet_utils import get_file\n",
"\n",
"import keras_resnet.models\n",
"import keras_retinanet.layers\n",
"import keras_retinanet.models\n",
"\n",
"import matplotlib.pyplot as plt\n",
"import cv2\n",
"import numpy as np\n",
"import sys\n",
"import math\n",
"\n",
"import tensorflow as tf\n",
"\n",
"def get_session():\n",
" config = tf.ConfigProto()\n",
" config.gpu_options.allow_growth = True\n",
" return tf.Session(config=config)\n",
"\n",
"keras.backend.tensorflow_backend.set_session(get_session())\n",
"\n",
"WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/releases/download/v0.2/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/usr/lib/python3.6/site-packages/ipykernel/__main__.py:15: UserWarning: Output \"classification_softmax\" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to \"classification_softmax\" during training.\n",
"/usr/lib/python3.6/site-packages/ipykernel/__main__.py:15: UserWarning: Output \"concatenate_8\" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to \"concatenate_8\" during training.\n",
"/usr/lib/python3.6/site-packages/ipykernel/__main__.py:15: UserWarning: Output \"focal_loss_1\" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to \"focal_loss_1\" during training.\n",
"/usr/lib/python3.6/site-packages/ipykernel/__main__.py:15: UserWarning: Output \"concatenate_7\" missing from loss dictionary. We assume this was done on purpose, and we will not be expecting any data to be passed to \"concatenate_7\" during training.\n"
]
}
],
"source": [
"def create_model(num_classes=2, *args, **kwargs):\n",
" image = keras.layers.Input((512, 512, 3))\n",
" im_info = keras.layers.Input((3,))\n",
" gt_boxes = keras.layers.Input((None, 5))\n",
" \n",
" return keras_retinanet.models.ResNet50RetinaNet([image, im_info, gt_boxes], num_classes=num_classes)\n",
"\n",
"model = create_model()\n",
"\n",
"# load imagenet weights\n",
"weights_path = get_file('resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5', WEIGHTS_PATH_NO_TOP, cache_subdir='models', md5_hash='a268eb855778b3df3c7506639542a6af')\n",
"model.load_weights(weights_path, by_name=True)\n",
"\n",
"# compile model\n",
"model.compile(loss=None, optimizer=keras.optimizers.sgd(lr=0.01, momentum=0.9, decay=0.0001))\n",
"#print(model.summary())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n/w9qpJblviy9MgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f530a2d5cf8>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 512, 512, 3) (1, 3) (1, 1, 5)\n"
]
}
],
"source": [
"# generate really simple image with one object\n",
"image = np.zeros((512, 512, 3), dtype=keras.backend.floatx())\n",
"image[100:300, 100:300, :] = 1.0\n",
"plt.imshow(image)\n",
"plt.show()\n",
"\n",
"# create input batch blobs\n",
"image_batch = np.expand_dims(image, axis=0)\n",
"im_info_batch = np.array([[512, 512, 1.0]])\n",
"gt_boxes_batch = np.array([[[100, 100, 300, 300, 1]]])\n",
"\n",
"inputs = [image_batch, im_info_batch, gt_boxes_batch]\n",
"\n",
"def simple_data_generator():\n",
" while True:\n",
" yield inputs, None\n",
"\n",
"print(image_batch.shape, im_info_batch.shape, gt_boxes_batch.shape)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Epoch 1/15\n",
"100/100 [==============================] - 16s - loss: 0.4958 \n",
"Epoch 2/15\n",
"100/100 [==============================] - 10s - loss: 6.1573e-05 \n",
"Epoch 3/15\n",
"100/100 [==============================] - 10s - loss: 3.1098e-05 \n",
"Epoch 4/15\n",
"100/100 [==============================] - 10s - loss: 2.0863e-05 \n",
"Epoch 5/15\n",
"100/100 [==============================] - 10s - loss: 1.5440e-05 \n",
"Epoch 6/15\n",
"100/100 [==============================] - 10s - loss: 1.2124e-05 \n",
"Epoch 7/15\n",
"100/100 [==============================] - 10s - loss: 9.8986e-06 \n",
"Epoch 8/15\n",
"100/100 [==============================] - 10s - loss: 8.3127e-06 \n",
"Epoch 9/15\n",
"100/100 [==============================] - 10s - loss: 7.1460e-06 \n",
"Epoch 10/15\n",
"100/100 [==============================] - 10s - loss: 6.2527e-06 \n",
"Epoch 11/15\n",
"100/100 [==============================] - 10s - loss: 5.5488e-06 \n",
"Epoch 12/15\n",
"100/100 [==============================] - 10s - loss: 4.9827e-06 \n",
"Epoch 13/15\n",
"100/100 [==============================] - 10s - loss: 4.5180e-06 \n",
"Epoch 14/15\n",
"100/100 [==============================] - 10s - loss: 4.1302e-06 \n",
"Epoch 15/15\n",
"100/100 [==============================] - 10s - loss: 3.8022e-06 \n"
]
},
{
"data": {
"text/plain": [
"<keras.callbacks.History at 0x7f535b465a90>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# train for some iterations\n",
"model.fit_generator(\n",
" generator=simple_data_generator(),\n",
" steps_per_epoch=100,\n",
" epochs=15,\n",
" verbose=1\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# predict the same image again\n",
"classification, labels, cls_loss, anchors = model.predict_on_batch(inputs)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(1, 12240) (1, 12240, 2) (1, 12240, 4)\n",
"1.0 [ 0.00666258 0.99333739]\n",
"1.0 [ 3.34702025e-04 9.99665260e-01]\n",
"1.0 [ 0.0110987 0.98890126]\n",
"1.0 [ 0.00323502 0.99676502]\n",
"1.0 [ 4.17040610e-05 9.99958277e-01]\n",
"1.0 [ 8.02129125e-06 9.99992013e-01]\n",
"1.0 [ 3.94867238e-04 9.99605119e-01]\n",
"1.0 [ 1.02005768e-04 9.99897957e-01]\n",
"1.0 [ 3.95044044e-04 9.99605000e-01]\n",
"1.0 [ 0.01033688 0.98966306]\n",
"1.0 [ 0.0094928 0.99050713]\n",
"1.0 [ 9.11216432e-07 9.99999046e-01]\n",
"1.0 [ 2.16826210e-11 1.00000000e+00]\n",
"1.0 [ 7.33204400e-11 1.00000000e+00]\n",
"1.0 [ 2.50683530e-16 1.00000000e+00]\n",
"1.0 [ 8.84166695e-08 9.99999881e-01]\n",
"1.0 [ 1.91244744e-08 1.00000000e+00]\n",
"1.0 [ 3.98018580e-15 1.00000000e+00]\n",
"1.0 [ 1.07011005e-13 1.00000000e+00]\n",
"1.0 [ 4.25768623e-24 1.00000000e+00]\n",
"1.0 [ 5.34723266e-10 1.00000000e+00]\n",
"1.0 [ 7.58171720e-11 1.00000000e+00]\n",
"1.0 [ 1.73536567e-11 1.00000000e+00]\n",
"1.0 [ 3.06059519e-04 9.99693990e-01]\n",
"1.0 [ 0.00720659 0.99279344]\n",
"1.0 [ 2.09298378e-06 9.99997854e-01]\n",
"1.0 [ 0.00124534 0.99875462]\n",
"1.0 [ 2.72659673e-10 1.00000000e+00]\n",
"1.0 [ 7.90482986e-08 9.99999881e-01]\n",
"1.0 [ 1.61399162e-22 1.00000000e+00]\n",
"1.0 [ 1.61693231e-06 9.99998331e-01]\n",
"1.0 [ 1.30369202e-10 1.00000000e+00]\n",
"1.0 [ 3.09675452e-05 9.99969006e-01]\n",
"1.0 [ 7.38852389e-29 1.00000000e+00]\n",
"1.0 [ 1.19105447e-04 9.99880910e-01]\n",
"1.0 [ 3.54203564e-08 1.00000000e+00]\n",
"1.0 [ 0.01634809 0.98365188]\n",
"1.0 [ 0.02008545 0.97991461]\n",
"1.0 [ 0.0170248 0.98297518]\n",
"1.0 [ 0.02075755 0.97924244]\n",
"1.0 [ 0.02280544 0.97719461]\n"
]
},
{
"data": {
"image/png": "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\nEJYAABrCEgBAQ1gCAGgISwAADWEJAKCxVFiqqs9V1aer6pNV9fC07PlV9WBVfXb6+bxpeVXVO6vq\nalV9qqpeuc03AACwTav0LH3PGOMVY4w7p/tvT/LQGOOOJA9N95PkdUnumP5dSfKuTRULALBr6xyG\nuzvJ/dPt+5O84dTy944TH01yS1W9eI3XAQDYm2XD0kjyB1X1SFVdmZa9aIzxhSSZfr5wWn5rksdO\nPffatAwA4ODcvOR6rx5jPF5VL0zyYFX9WbNunbFsPGOlk9B15Yx1AQBmY6mepTHG49PPJ5J8MMmr\nknzx+uG16ecT0+rXktx+6um3JXn8jG3eN8a489QYKACA2VkYlqrqm6rqW67fTvL9ST6T5IEk90yr\n3ZPkQ9PtB5K8ZTor7q4kT14/XAcAcGiWOQz3oiQfrKrr6//mGOO/VdXHk7y/qu5N8vkkb5rW//0k\nr09yNclXk7x141UDAOxIjfGM4US7L6Jq/0UAAJfNI8sMBzKDNwBAQ1gCAGgISwAADWEJAKAhLAEA\nNIQlAICGsAQA0Fj22nDb9ldJ/t/0k3n7tminQ6CdDoN2Ogza6TBcpJ3+2TIrzWJSyiSpqoddJ27+\ntNNh0E6HQTsdBu10GLbZTg7DAQA0hCUAgMacwtJ9+y6ApWinw6CdDoN2Ogza6TBsrZ1mM2YJAGCO\n5tSzBAAwO3sPS1X12qr686q6WlVv33c9l1lVvaeqnqiqz5xa9vyqerCqPjv9fN60vKrqnVO7faqq\nXrm/yi+Xqrq9qj5SVY9W1Z9U1dum5dpqRqrquVX1P6vqf03t9B+n5S+tqo9N7fTbVfXsaflzpvtX\np8dfss/6L5uquqmqPlFVvzfd104zVFWfq6pPV9Unq+rhadnW9317DUtVdVOSX0nyuiTfkeSHq+o7\n9lnTJfdrSV57w7K3J3lojHFHkoem+8lJm90x/buS5F07qpHkqSQ/OcZ4eZK7kvzY9L3RVvPyd0le\nM8b4ziSvSPLaqroryS8mecfUTl9Ocu+0/r1JvjzGeFmSd0zrsTtvS/Loqfvaab6+Z4zxilPTBGx9\n37fvnqVXJbk6xvjLMcbfJ3lfkrv3XNOlNcb4oyRfumHx3Unun27fn+QNp5a/d5z4aJJbqurFu6n0\nchtjfGGM8cfT7b/JyQ7+1mirWZn+v/92uvus6d9I8pokH5iW39hO19vvA0m+t6pqR+VealV1W5If\nSPKr0/2KdjokW9/37Tss3ZrksVP3r03LmI8XjTG+kJz8kk7ywmm5tpuB6RDAdyX5WLTV7EyHdj6Z\n5IkkDyb5iyRfGWM8Na1yui2+1k7T408mecFuK760fjnJTyX5x+n+C6Kd5mok+YOqeqSqrkzLtr7v\n2/flTs5K407POwzabs+q6puT/E6SHx9j/HXzx6222pMxxj8keUVV3ZLkg0leftZq00/ttAdV9YNJ\nnhhjPFJV33198Rmraqd5ePUY4/GqemGSB6vqz5p1N9ZW++5Zupbk9lP3b0vy+J5q4WxfvN5tOf18\nYlqu7faoqp6Vk6D0G2OM350Wa6uZGmN8Jckf5mSM2S1Vdf0P1dNt8bV2mh7/1jzzsDib9+okP1RV\nn8vJUJDX5KSnSTvN0Bjj8ennEzn5A+RV2cG+b99h6eNJ7pjOOnh2kjcneWDPNfF0DyS5Z7p9T5IP\nnVr+lulsg7uSPHm9G5TtmsZHvDvJo2OMXzr1kLaakar69qlHKVX1jUm+Lyfjyz6S5I3Taje20/X2\ne2OSDw8T4W3dGONnxhi3jTFekpPfQR8eY/xItNPsVNU3VdW3XL+d5PuTfCY72PftfVLKqnp9TlL8\nTUneM8b4+b0WdIlV1W8l+e6cXLn5i0l+Lsl/TfL+JP80yeeTvGmM8aXpF/Z/ycnZc19N8tYxxsP7\nqPuyqap/neR/JPl0vj7G4mdzMm5JW81EVf2LnAw2vSknf5i+f4zxn6rqn+ekB+P5ST6R5N+NMf6u\nqp6b5NdzMgbtS0nePMb4y/1UfzlNh+H+wxjjB7XT/Ext8sHp7s1JfnOM8fNV9YJsed+397AEADBn\n+z4MBwAwa8ISAEBDWAIAaAhLAAANYQkAoCEsAQA0hCUAgIawBADQ+P9wTnMqFaZ6CwAAAABJRU5E\nrkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f52220b28d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# visualize the positive anchors\n",
"indices = np.where(labels[0, :] > 0)[0]\n",
"im = image_batch[0, ...].copy()\n",
"print(labels.shape, classification.shape, anchors.shape)\n",
"for idx in indices:\n",
" # print the label and the classification scores\n",
" print(labels[0, idx], classification[0, idx, :])\n",
" b = anchors[0, idx, :].astype(int)\n",
" cv2.rectangle(im, (b[0], b[1]), (b[2], b[3]), (0, 1, 0), 3)\n",
" \n",
"plt.figure(figsize=(10, 10))\n",
"plt.imshow(im)\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Generate anchors for a certain image size"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import keras_retinanet.layers\n",
"\n",
"im_info = keras.layers.Input((3,))\n",
"gt_boxes = keras.layers.Input((None, 5))\n",
"\n",
"shapes = [(64, 64), (32, 32), (16, 16), (8, 8), (4, 4)]\n",
"strides = [8, 16, 32, 64, 128]\n",
"sizes = [32, 64, 128, 256, 512]\n",
"idx = 2\n",
"\n",
"labels, bbox_reg_targets, anchors = keras_retinanet.layers.AnchorTarget(shapes[idx], strides[idx], sizes[idx])([im_info, gt_boxes])\n",
"anchor_model = keras.models.Model(inputs=[im_info, gt_boxes], outputs=[labels, anchors])\n",
"\n",
"l, a = anchor_model.predict([im_info_batch, gt_boxes_batch])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# show labeled anchors\n",
"indices = np.where(l[0, :] > 0)[0]\n",
"im = image_batch[0, ...].copy()\n",
"for idx in indices:\n",
" b = a[0, idx, :].astype(int)\n",
" cv2.rectangle(im, (b[0], b[1]), (b[2], b[3]), (0, 1, 0), 3)\n",
" \n",
"plt.figure(figsize=(10, 10))\n",
"plt.imshow(im)\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"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.6.2"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment