From bc64358e580096b40dfc1e280976857604074bc2 Mon Sep 17 00:00:00 2001 From: PBPZA Date: Wed, 29 Jan 2020 13:42:21 +0100 Subject: [PATCH] Created using Colaboratory --- lectures/05_adabost_demo.ipynb | 342 +++++++++++++++++++++++++++++++-- 1 file changed, 321 insertions(+), 21 deletions(-) diff --git a/lectures/05_adabost_demo.ipynb b/lectures/05_adabost_demo.ipynb index ab549f1..e843249 100644 --- a/lectures/05_adabost_demo.ipynb +++ b/lectures/05_adabost_demo.ipynb @@ -3,7 +3,7 @@ "nbformat_minor": 0, "metadata": { "colab": { - "name": "05-adabost_demo.ipynb", + "name": "Copy of 05-adabost_demo.ipynb", "provenance": [], "collapsed_sections": [], "include_colab_link": true @@ -21,20 +21,7 @@ "colab_type": "text" }, "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "X6skjwooOn61", - "colab_type": "text" - }, - "source": [ - "# TODO\n", - "\n", - "The lecture notes are in not finished and should be expanded based on https://drive.google.com/open?id=0B5j9vIO_NjwcLVdPdUF1cU1EOHJoTExiZzZTOE40SnBHMFE4.\n", - "If you would like to help (for extra class credit), please use the associated GitHub issue for coordination." + "\"Open" ] }, { @@ -277,12 +264,148 @@ }, "source": [ "## Adabost Details\n", + "Mostly based on Rojas http://www.inf.fu-berlin.de/inst/ag-ki/adaboost4.pdf\n", + "\n", + "We will discuss setting with binary classes. Assume that we are given a training set $S := \\{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\\}$ where $(\\forall i \\in \\{1,...,n\\})$$(y_i \\in \\{ -1, 1 \\})$ and a set $\\mathcal{H}$ of hypothesis functions (aka weak classifiers) from which we want to pick $T$ hypotheses to form a boosted classifier $f_T$, which is a linear combination of the decisions of each of the chosen hypotheses. The decision about data point's class is then made by looking at sign of $f_T$:\n", + "$$f_T(x) = \\sum_{t = 1}^{T} \\gamma_{t}h_t(x)$$\n", + "$$H(x) = sign(f_T)$$\n", + "The AdaBoost algorithm sequentially chooses $h_t$ from $\\mathcal{H}$ and assigns this hypothesis a weight $\\gamma_{t}$.\n", + "\n", + "After the first $(t-1)$-th iterations we have $f_{t-1}(x) = \\sum_{k=1}^{t-1}\\gamma_{k}h_{k}$. At the $t$-th iteration we want to add add another $h_t$ with weight $\\gamma_t$ such that our boosted classifier is better. We know how to choose them from what follows:\n", + "\n", + "Let's define the total error $E$ of $f_t$ as the sum of its exponential loss on each data point:\n", + "$\\begin{align*}\n", + "E &= \\sum_{i = 1}^{n}e^{-y_{i}f_{t}(x_i)} \\\\\n", + " &= \\sum_{i = 1}^{n}e^{-y_{i}f_{t-1}(x_i)}e^{-y_{i}\\gamma_{t}h_{k}} && \\text{by unwrapping } f_t \\\\\n", + "& = \\sum_{i=1}^{n}w_{i}^{(t)}e^{-y_{i}\\gamma_{t}h_{t}} && \\text{let } w_{i}^{(1)} = \\frac{1}{n} \\text{ and } w_{i}^{(t)} = e^{-y_{i}f_{t-1}(x_{i})} \\\\\n", + " &= \\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}e^{-\\gamma_t}+\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{\\gamma_t} && \\text {split by correctly } (y_{i}h_{t}(x_{i}) = 1) \\text { and incorrectly } (y_{i}h_{t}(x_{i}) = -1) \\text { classified data points}\\\\\n", + "&= \\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}e^{-\\gamma_t}+ \\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{-\\gamma_t} - \\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{-\\gamma_t} + \\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{\\gamma_t} && \\text{add and subtract } \\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{-\\gamma_t} \\\\\n", + "&= \\sum_{i = 1}^{n}w_{i}^{(t)}e^{-\\gamma_t} + \\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}(e^{\\gamma_t} - e^{-\\gamma_t}) && \\text{group first sum with second and third with fourth}\n", + "\\end{align*}$\n", + "\n", + "\n", + "\n", + "We are seeking $h_t$ that minimizes $E$. But only the $\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}$ depends on $h_t$, so the best classifier is the one that minimizes this sum. \n", + "\n", + "The best weight we get by solving for $\\gamma_t$ the expression $\\frac{dE}{d\\gamma_t}=0$\n", + "\n", + "\n", + "$\\begin{align*}\n", + "\\frac{dE}{d\\gamma_t} = & -\\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}e^{-\\gamma_t}+\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{\\gamma_t}\\\\\n", + "& -\\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}e^{-\\gamma_t}+\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{\\gamma_t} &= 0 \\\\\n", + "& -\\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}+\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}e^{2\\gamma_t} &=0 && \\text{multiply both sides by } e^{\\gamma_t}\n", + "\\end{align*}$\n", + "\n", + "\n", "\n", - "We follow Murphy Chp. 16.4\n", + "So by solving for $\\gamma_t$ we get\n", + "$$\\gamma_t = \\frac{1}{2}\\ln\\left(\\frac{\\sum_{y_{i}=h_t(x_{i})}w_{i}^{(t)}}{\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}} \\right)$$\n", + "In the rest of this notebook we are calling the rate of errors given the weights $\\frac{\\sum_{y_{i}\\neq h_{t}(x_{i})}w_{i}^{(t)}}{\\sum_{i = 1}^{n}w_{i}^{(t)}}$ as $\\epsilon_t$ and so we can rewrite the above as\n", + "$$\\frac{1}{2}\\ln \\left( \\frac{1 - \\epsilon_t}{\\epsilon_t} \\right)$$\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "xMVkr4McF1KG", + "colab_type": "text" + }, + "source": [ + "##Pseudocode\n", + "Set initial weights $w_i^{(1)}=\\frac{1}{n}$ to all data points $x_i$\n", + "\n", + "For $t = 1$ to $T$\n", + "\n", + "1. Select from $\\mathcal{H}$ the classifier $h_t$ which minimizes \n", + "$$\\sum_{y_i \\neq h_t(x_i)}w_i^{(t)}$$\n", + "2. Set the weight $\\gamma_t$ of the classifier to \n", + "$$\\gamma_t = \\frac{1}{2} \\ln\\left( \\frac{1 - \\epsilon_t}{\\epsilon_t}\\right)$$\n", + "3. Update the weights to \n", + "$$w_i^{(t+1)} = \\frac{w_i^{(t)}e^{-y_i \\gamma_t h_t(x_i)}}{Z_t}$$ for all $i$ where $Z_t$ is normalization constant to make $w_i^{(t)}$ a distribution, that is to have\n", + "$$\\sum_i w_i^{(t+1)} = 1$$\n", "\n", - "Assume that the classes are binary, and encode them as $Y\\in\\{+1, -1\\}$.\n", "\n", - "TODO TODO- copy form paper." + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Mvloj9jeGFp3", + "colab_type": "text" + }, + "source": [ + "## Proof of upper bound of error\n", + "We follow https://www.cs.princeton.edu/courses/archive/fall07/cos402/readings/boosting.pdf\n", + "\n", + "Here we will prove that the training error of final classifier $H$ is at most $\\exp \\left( -2 \\sum_{t=1}^{T} \\left( \\frac{1}{2} - \\epsilon_t \\right)^2 \\right)$ \n", + "\n", + "Step 1: First we show that \\\n", + "$$w_i^{(T+1)} = \\frac{e^{-y_i f_T (x_i)}}{n \\prod_t Z_t}$$\n", + "Proof: the above can be rewritten as\n", + "$$w_i^{(t+1)} = \\frac{w_i^t e^{-\\gamma_ty_ih_t(x_1)}}{Z_t}$$ \n", + "By unwrapping this recurrence we get\n", + "\n", + "\\begin{aligned}\n", + "w_i^{(T+1)} &=w_i^{(1)} \\cdot \\frac{e^{-\\gamma_{1} y_{i} h_{1}\\left(x_{i}\\right)}}{Z_{1}} \\cdots \\cdot \\frac{e^{ -\\gamma_{T} y_{i} h_{T}\\left(x_{i}\\right)}}{Z_{T}} \\\\\n", + "&=\\frac{1}{n} \\cdot \\frac{e^{ -y_{i} \\sum_{t} \\gamma_{t} h_{t}\\left(x_{i}\\right)}}{\\prod_{t} Z_{t}} \\\\\n", + "&=\\frac{1}{n} \\cdot \\frac{e^{ -y_{i} f_T\\left(x_{i}\\right)}}{\\prod_{t} Z_{t}}\n", + "\\end{aligned}\n", + "Step 2: Now we show that the training error of the final classifier $H$ is at most\n", + "$$\\prod_{t=1}^{T}Z_t$$\n", + "Proof:\n", + "\n", + "\n", + "$\\begin{align*}\n", + " \\text { training error }(H) &= \\frac{1}{n} \\sum_{i}\\left\\{\\begin{array}{l}{1} &{\\text { if } y_{i} \\neq H\\left(x_{i}\\right) }\n", + " \\\\ {0} &{\\text { else }} \\end{array}\\right.\n", + " && {\\text {by definition of the training error}}\n", + " \\\\ &= \\frac{1}{n} \\sum_{i}\\left\\{\\begin{array}{l}{1} &{\\text { if } y_{i}f(x_{i})\\leq 0} \n", + "\\\\{0} &{\\text{ else }} \n", + "\\end{array}\\right.\n", + "&& {\\text {since } H(x) = sign(f(x)) \\text{ and } y_i \\in \n", + " \\left\\{ -1, +1 \\right\\} } \n", + "\\\\ &\\leq \\frac{1}{n} \\sum_{i}\\begin{array}{l} \n", + "e^{-y_if \\left(x_i\\right)}\n", + " \\end{array} \n", + " && \\text{since } e^{-z} \\geq 1 \\text{ if } z\\leq{0}\n", + " \\\\ &= \\sum_{i} w_i^{(T+1)}\\prod_tZ_t && \\text{by Step 1 above}\n", + " \\\\ &=\\prod_tZ_t &&{\\text{since }w^{(T+1)} \\text{is a distribution}}\n", + "\\end{align*}$\n", + "\n", + "Step 3: The last step is to compute $Z_t$\n", + "\n", + "$\\begin{align*}\n", + "Z_t &= \\sum_{i} w_i^{(t)} \\times \\left\\{ \\begin{array}{l} \n", + "{e^{-\\gamma_{t}}} & \\text{if } h_{t}(x_{i}) = y_{i} \\\\\n", + "{e^{\\gamma_{t}}} & \\text{if } h_{t}(x_{i}) \\neq y_{i}\n", + "\\end{array} \\right.\\\\\n", + "&= \\sum_{y_i = h_t(x_i)}w_{i}^{(t)}e^{-\\gamma_t} + \\sum_{y_i \\neq h_t(x_i)}w_i^{(t)}e^{\\gamma_t}\\\\\n", + "&= e^{-\\gamma_t} \\sum_{y_i = h_t(x_i)}w_i^{(t)} + e^{\\gamma_t} \\sum_{y_i = h_t(x_i)} w_i^{(t)}\\\\\n", + "&= e^{-\\gamma_t}(1 - \\epsilon_t) + e^{\\gamma_t} \\epsilon_t && \\text{by definition of } \\epsilon_t\\\\\n", + "&= e^{-\\frac{1}{2} \\ln( \\frac{1 - \\epsilon_t} {\\epsilon_t}) } (1 - \\epsilon_t) + e^{\\frac{1}{2} \\ln(\\frac{1 - \\epsilon_t}{\\epsilon_t})} \\epsilon_t && \\text {by our choice of } \\gamma_t\\\\\n", + "&= \\sqrt{\\frac{\\epsilon_t}{1 - \\epsilon_t}} (1 - \\epsilon_t) + \\sqrt{\\frac{1 - \\epsilon_t}{\\epsilon_t}} \\epsilon_t \\\\\n", + "&= 2 \\sqrt{\\epsilon_t (1 - \\epsilon_t)}\\\\\n", + "&= \\sqrt{1 - 4 \\alpha_t^2} && \\text{plugging in } \\epsilon_t = \\frac{1}{2} - \\alpha_t \\\\\n", + "&\\leq \\sqrt{e^{-4 \\alpha_t^2}} && \\text{using } 1+x \\leq e^x \\text{ for all real } x \\\\\n", + "&= e^{-2 \\alpha_t^2} \\\\\n", + "&= e^{-2 \\left(\\frac{1}{2} - \\epsilon_t\\right)^2}\n", + "\\end{align*}$\n", + "\n", + "And combining all of the above we have\n", + "\n", + "$\\begin{align*}\n", + "\\text {training error}(H) &=\\prod_t Z_t = \\prod_t 2 \\sqrt{\\epsilon_t (1 - \\epsilon_t)} \\leq \\prod_t e^{-2 (\\frac{1}{2} - \\epsilon_t)^2} = \\exp \\left(-2 \\sum_t \\left(\\frac{1}{2} - \\epsilon_t \\right)^2 \\right)\n", + "\\end{align*}$\n", + "\n", + "As claimed.\n", + "\n" ] }, { @@ -659,23 +782,200 @@ "colab_type": "text" }, "source": [ - "# Boosting uses\n", + "##Viola-Jones face recognizer\n", + "\n", + "Viola-Jones is the first object detection framework to provied competetive object detection rates in real-time proposed in 2001 by Paul Viola and Michael Jones. It was motivated primarly to identify human faces in digital images.\n", + "\n", + "##Details\n", + "The algorithm has four stages:\n", + "\n", + "\n", + "1. Haar-like Feature Selection\n", + "2. Creating an Integral Image\n", + "3. AdaBoost Training\n", + "4. Cascading Classifiers\n", + "\n", + "## Haar-like Feature Selection\n", + "They are called Haar-like because they are similar to so called Haar wavelets which are sequences of rescaled \"square-shaped\" functions which can essentially be used to aproximate other functions. And really the similarity is basically that both things look like rectangles.\n", + "\n", + "Mother function $\\psi(t)$ of Haar wavelet can be described as\n", + "$$\\psi(t) = \\left\\{ \\begin{array} {l} 1 && 0 \\leq t < \\frac{1}{2} \\\\\n", + "-1 && \\frac{1}{2} \\leq t < 1 \\\\\n", + "0 && \\text{otherwise}\n", + " \\end{array} \\right.\n", + "$$\n", + "\n", + "While the Haar-like features are black and white rectangular shapes that are used to match similarities of human faces\n", "\n", - "Viola-Jones face recognizer https://en.wikipedia.org/wiki/Viola%E2%80%93Jones_object_detection_framework" + "\n", + "\n", + "\n" ] }, + { + "cell_type": "code", + "metadata": { + "id": "Dio4EPXDk06h", + "colab_type": "code", + "colab": {} + }, + "source": [ + "##Example Haar-like Feature \n", + "!wget \"https://upload.wikimedia.org/wikipedia/commons/6/69/Haar_Feature_that_looks_similar_to_the_eye_region_which_is_darker_than_the_upper_cheeks_is_applied_onto_a_face.jpg\"" + ], + "execution_count": 0, + "outputs": [] + }, { "cell_type": "code", "metadata": { "id": "JfJAPAXhLVUc", "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 170 + }, + "outputId": "9d04ba52-6b13-488a-ef3c-ecd9b4cb4ef2" + }, + "source": [ + "import cv2\n", + "\n", + "img = cv2.imread(\"Haar_Feature_that_looks_similar_to_the_eye_region_which_is_darker_than_the_upper_cheeks_is_applied_onto_a_face.jpg\")\n", + "img_cvt=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n", + "plt.imshow(img_cvt)\n", + "plt.show()\n", + "## Attribution - By Soumyanilcsc - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=37353395]" + ], + "execution_count": 14, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\nSUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NL0BRwAKl9S4", + "colab_type": "text" + }, + "source": [ + "Haar-like feature in the above example is applied to the image, because in most humans the eye region is darker than upper cheeks" + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "CItsa35bjwS9", + "colab_type": "code", "colab": {} }, "source": [ - "" + "##Another example\n", + "!wget \"https://upload.wikimedia.org/wikipedia/commons/8/8a/Haar_Feature_that_looks_similar_to_the_bridge_of_the_nose_is_applied_onto_the_face.jpg\"" ], "execution_count": 0, "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "bmLYOu7NnSMp", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 158 + }, + "outputId": "847797f6-765a-4d0b-cac9-b87052876013" + }, + "source": [ + "img = cv2.imread(\"Haar_Feature_that_looks_similar_to_the_bridge_of_the_nose_is_applied_onto_the_face.jpg\")\n", + "img_cvt=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n", + "plt.imshow(img_cvt)\n", + "plt.show()\n", + "## Attribution - By Soumyanilcsc - Own work, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=37353327" + ], + "execution_count": 20, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n1PTAf40x5wAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "U3Hqlvlqr0Zk", + "colab_type": "text" + }, + "source": [ + "Here this Haar-like feature is used, because nose is brighter than cheeks" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SI66jgJWsdO7", + "colab_type": "text" + }, + "source": [ + "## Creating an Integral Image\n", + "\n", + "Integral Image (also called summed-area table) lets us quickly and efficiently generate the sum of values in rectangular part of an image. \n", + "The value at $(x,y)$ in the summed-area table is the sum of all the pixels above and to the left of $(x,y)$ inclusive\n", + "$$I(x,y) = \\sum_{x' \\leq x \\\\ y' \\leq y }i(x', y')$$\n", + "where the $i(x,y)$ is the value of the pixel at $(x,y)$.\n", + "\n", + "We can compute the $I(x,y)$ efficiently in a single pass over the image, because\n", + "$$I(x,y) = i(x,y) + I(x, y-1) + I(x-1, y) - I(x-1, y-1)$$\n", + "\n", + "And now if we want to evaluate the sum of intensities over any rectangle we need just four array references. Let $A = (x_0,y_0)$ be a top left corner, $B = (x_1, y_0)$ top right corner, $C = (x_0, y_1)$ bottom right and $D = (x_1, y_1)$ bottom left. Then the sum $i(x,y)$ over the rectangle spanned by $A,B,C,D$ is\n", + "$$\\sum_{x_0 \\leq x \\leq x_1 \\\\ y_0 \\leq y \\leq y_1} i(x,y) = I(D) + I(A) - I(B) - I(C)$$\n", + "\n", + "That's one of the main reason why Viola and Jones were using such simple features like rectangles instead of something more sophisticated - it's very fast. Especially considering that each feature's rectangle is adjacent to at least one other rectangle, so we need just six array references for two rectangles, eight references for 3 rectangles and nine references for four rectangles." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Lwn5ZbUgP_AN", + "colab_type": "text" + }, + "source": [ + "## AdaBoost training\n", + "\n", + "Unfortunately because the resolution of detector was $24 \\times 24$ there were over $180,000$ rectangular feature to chose from. So the authors used AdaBoost algorithm to choose the best features." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "OAJKhjJdQ_ks", + "colab_type": "text" + }, + "source": [ + "##Cascading Classsifiers\n", + "\n", + "The idea is to construct a cascade of more and more complex boosted classifiers, where smaller classifiers, which are more efficient, are first used to detect the sub-windows where there are no faces. Then the more complex classifiers are used to detect false positives not detected by weaker classfiers." + ] } ] } \ No newline at end of file