{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# サナララメディア処理の基礎的検討(1)\n", "\n", "このドキュメントは、[ぴょこりんクラスタ Advent Calendar 2015](http://www.adventar.org/calendars/960)のために書いたものです。\n", "\n", "## はじめに\n", "\n", " ぶっちゃけOpenCV触ってみようと思っただけです。最近Deep Learningもてはやされてて、実際ChainerインストールしてGPGPUもぶん回せることを確認したものの、普通に画像処理方面のことしたことないよねってことで。基本的なところをきちんと触ってからDeep Learningに手を出してみて、じゃないとやっぱり一つ基準みたいなものを最初に持っておかないと、何がすごいってわかんないよねってことで。 \n", " 動かした環境はUbuntuなんだけど、apt-getでlibopencv-devとpython-opencvぶち込んだらオマケで古いnumpyが入ってきて、依存するライブラリ(matplotlibとかscikit-learnとか)が全部動かなくなってひゃっはーってなる呪い付なので注意。pipで動かなくなったやつらをuninstall=>installすると古いバージョンのnumpyに合わせてインストールしてくれるようで、なんとか動くようになるんだけど、何となくopencvのためにnumpyが古くなるというのもねぇ・・・。OpenCV使うときは仮想化かますなり何らかの手段で専用の環境用意した方が良いのかも。というわけでサナララメディア処理はじまるよ!!!\n", " \n", "## 映像中に複数いるめっちょかわいいヒロイン達を抽出し追従したい\n", " \n", " 自然なモチベーションです。追従したくない?追従したいよね!!とりあえず映像から女の子たちの顔画像を抽出するよ!一般的に現実は厳しいとされるから、[非現実向けにチューニングされた顔画像検出手法が提案されているよ](http://ultraist.hatenablog.com/entry/20110718/1310965532)。この記事でもこいつを活用させてもらったよ!!" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import cv2\n", "vidcap = cv2.VideoCapture('./learningset/snrrrmp4.mp4')\n", "success,image = vidcap.read()\n", "count = 0;\n", "cascade_path ='./lbpcascade_animeface.xml'\n", "cascade = cv2.CascadeClassifier(cascade_path)\n", "inddic={}\n", "while success:\n", " success,image = vidcap.read()\n", " facerect = cascade.detectMultiScale(image)\n", " tmp=[]\n", " for ind,rect in enumerate(facerect):\n", " #cv2.rectangle(image, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)\n", " tmp.append(image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]])\n", " inddic[count]=tmp\n", " count += 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 特徴量をつくる\n", "### 色の離散化\n", " 画像処理よくわかんないからとりあえず次元削減的な効果を狙ってk-meansで色を離散化するよ。" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "33930577\n" ] } ], "source": [ "colors=[l for i in inddic.items() if len(i[1])!=0 for j in i[1] for k in j for l in k]\n", "print len(colors)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "顔画像周辺のドットの総数。それぞれが3次元(色的な意味で)ベクトルを持っていると。これk-meansかけて色を離散化しようぜっていう。\n", "ちょっとデータ多すぎるから1%位に間引くことにする。1%にした理由はそれ以上にすると今晩この計算回すだけで終わってしまうから。" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "339651\n" ] } ], "source": [ "import random\n", "samples=[i for i in colors if random.random()>0.99]\n", "print len(samples)" ] }, { "cell_type": "code", "execution_count": 182, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from sklearn.cluster import KMeans\n", "results=[]\n", "for i in range(5,50):\n", " k_means = KMeans(n_clusters=i, n_init=4)\n", " k_means.fit(samples)\n", " results.append(k_means)\n", "#%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Bag of なんちゃら\n", " 顔画像フレームごとに離散化した諸々の色の出現回数を数えてこれを並べて特徴量をつくります。色のヒストグラムなのでBag of Colorsとか言うんでしょうかね。色の頭文字で構成されるサナララにふさわしい特徴量です!" ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "KMeans(copy_x=True, init='k-means++', max_iter=300, n_clusters=41, n_init=4,\n", " n_jobs=1, precompute_distances='auto', random_state=None, tol=0.0001,\n", " verbose=0)\n" ] } ], "source": [ "import warnings;warnings.filterwarnings('ignore')\n", "import numpy as np\n", "kmeans=results[35]\n", "print kmeans\n", "data=[(i[0],j) for i in inddic.items() if len(i[1])>0 for j in i[1]]\n", "BoC=[]\n", "for i in data:\n", " (s1,s2,s3)=i[1].shape\n", " clusters=kmeans.predict(np.reshape(i[1],(s1*s2,s3)))\n", " BoC.append([i[0] ,[len(np.where(clusters==s)[0]) for s in range(20)]])\n", " #print [list(clusters).count(s) for s in range(20)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 顔画像自体の分類\n", "眠くなって来たのでちゃちゃっと正規化してGMMにでもかけてみましょう。" ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "GMM(covariance_type='full', init_params='wmc', min_covar=0.001,\n", " n_components=10, n_init=1, n_iter=100, params='wmc', random_state=None,\n", " thresh=None, tol=0.001, verbose=0)" ] }, "execution_count": 181, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.preprocessing import normalize\n", "from sklearn.decomposition import KernelPCA\n", "from sklearn.mixture import GMM \n", "pca=KernelPCA(n_components=25)\n", "X=[i[1] for i in BoC]\n", "preX=normalize(X, norm='l2', axis=1)\n", "pca.fit(preX)\n", "preX=pca.transform(preX)\n", "g = GMM(covariance_type='full',n_components=10)\n", "g.fit(preX)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "動画における各フレームごとに、認識された顔画像がどのガウシアンに分類されたか表示する。" ] }, { "cell_type": "code", "execution_count": 179, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAApoAAADDCAYAAAAiErHpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xt4VOWdB/BvQsgFEjJQIIEQkgiEay5QoLSARuVSELFY\nyAqCEnG9ICCueOniPmLlIoWKRbu2j9XYahFht7vyEEAUEwmRBRVC6q3WMjOaAIFCBgK5k3f/+Hky\nGXKZZN65Jt/P88wzeU/OnHnne87M/HLOe3KClFIKRERERERuFuzrDhARERFRx8RCk4iIiIg8goUm\nEREREXkEC00iIiIi8ggWmkRERETkESHuWlBQUJC7FkVEREREAaSlf2Lk1j2aSineNG5PP/20z/sQ\n6DdmyPx8fWOGzNAfbsyQGXrz1hoeOiciIiIij2Ch6UcsFouvuxDwmKEe5qePGepjhvqYoT5m6B4s\nNP1Ienq6r7sQ8JihHuanjxnqY4b6mKE+ZugeQcrZwfW2LigoyOlxeiIiIiLqWFqrAd121jlRp5ST\nA1y+DEyfDphMMs1mA959F4iMBG65xbf960jWrAGOHwf69QNOn5b7b74BqqqAqCjg3DngwgXg/Hmg\na1cgIQFYuxb43e+Av/9dfp+WBvTtC/znfwJ/+Qvw9dfA5MlcT762Zg2QlSXrzGC1AtnZ8rvOICcH\nmDhRPkeMz5XDh+XWqxdQWyvzxccDQUHyHgBkWx8xouXtuPH75kc/kmWHhQEFBYBSQGgoEBMDhIcD\nQ4YAJSVAXJzcjxnTcv45OcDBg8DSpbKesrKA6Gh5X337rbQ70/pzN2MbOHYMqK6WaVVV8r6IjZX1\ndeoU0L+/rM/wcNkGJk6UdetPn2nKTdy4qE4rNzfX110IeF7PsKxMqSVL5FZW1rQdYPx6G7RYlBo0\nSKmoKKUGDFCqe3elgoKUApSKiFCqWzelgoOlDSgVFibtnj3t07p2VWrPHqUWLlQqOVmpRYvcvp78\nOkN/ZbEoNWqU3Culct96y6HdKZSVKbV0qf1zZOFC2d7j45WKjJRtOThYqS5dlAoJke0/KkqppKRm\nt+OG7bDx+yYpSakbb7S/H4z3CSDL7d5d3ltRUUoNHtx6/kYfhw9XKj9f7n/2M3u7A6w/n76Xje+S\nzExZfwMHynbQrZt9/cfFybpKTJRtwGKxb0Ne1loNyDGaRDpMJmDzZvl5+XK5ATLN2MNJ7pGQABw4\nIHsky8qAigr5qgSAykr5OSJC9m726SN7AerrZd6uXYGQENkT8NBDspfoRz8Ctm7levIHCQnA7t3A\nrFnAoUPAL34h7cZ7ODs6kwlYtw5YvVqOioSFAT/+MfDDH9rnqa8Hrl4F6upk++7VC5g0qfXtuPH7\n5uxZ2Qtp/N/rsDD73rKrV2WPWVmZ7OF8//3W8zeZgBdflP4tWQIMGADs3Qs88wzw4IOdb/25m/Hd\nEhUFpKTIeqmvt3+uVVXJdtKzp+yVXrUK+NWvZBvys880jtEkcgeLBUhKkp/NZiAx0Ze96dgOHZJD\nRC3ZsQPIzGw6/aWXgGXL7G2uJ/9jrNv8fCmgOiPjs8RslrbxudKStm7Hzt43jbUn/8affcZ7rDOv\nP3drnG9L8vNl3frwM621GpCFJpEum03+mjT2DISFcY+mp1itwM03A2fOOO7RBGRvZnCw3MLDZUym\noWtXmbdfP9mzGRwM/OQn3KPpT6xW2aP58sudd4+YzSZ7NB97TMYXV1fLOL3335ftvb7ePm9IiIyl\nvP5659tx4/dNVZUsRynHPZoA0KWLvHf69XO+R9Po7/LlwNGjMu/Bg8AbbwC//GXnXH/uZny3nD8v\ne6WvXpX1pZTslQ4PB37wA7nfuRP4/e99tkeztRqQh879SF5enq+7EPC8nqHxQQDIYaQXX5SfV62S\n3wUYv94GjS/Ls2flcFG3bvZDgBER8nNlJVBeLkVmWJgUlD17yokUdXXyRfvb38ohySNHgBUr3L6e\n/DpDf2UUmbt3A5MmIW/1amlbrb7umfcYRaZRKFRXyxCPTz+1zxMcLMVgSIhs3xcuyJ7KZrbjhu2w\n8fumb18pTI2CoLpalgPYi8yePYHSUmDKlNbzN4rMTz8FXn0VKC4GZswAnn5a/ljoAOvPp+9l47ul\nvBz4619lvQQH2z/XwsNlOykrA2pqZOfG44/bh174EZ51TqSjoACYOtXxrPPNm+Wsc3878y/QZWcD\nI0fKF6DOWedvvOF41jnXk+9lZzvuAYuNlXZnOmu5oMBeZObkSKH2gx9IsTlyZOtnnffv3/J23Ph9\nY5x1vmBB2846by3/ggJ53rVrZb69e+1nnb//fudbf+5mfLccOyafdYDzs84/+0y2IT/7TOOhcyIi\nIiJyGQ+dExEREZHXsdD0IxzbpY8Z6mF++pihPmaojxnqY4buwUKTiIiIiDyCYzSJiIiIyGUco0lE\nREREXsdC049wPIg+ZqiH+eljhvqYoT5mqI8ZugcLTSIiIiLyiDaN0dywYQPefPNNdOnSBSkpKcjO\nzkZoaKjjgjhGk4iIiKjT0RqjabVa8corr+D48eMoKipCXV0dtm/f7vZOEhEREVHH4rTQ7NGjB0JD\nQ3HlyhXU1dWhoqIC/fv390bfOh2OB9HHDPUwP33MUB8z1McM9TFD93BaaPbs2ROPPvooBg4ciLi4\nOJhMJkyZMsUbfSMiIiKiAOZ0jObJkycxa9YsHDp0CNHR0Zg7dy7mzZuHBQsWOC6IYzSJiIiIOp3W\nasAQZw/+5JNPMHHiRPTq1QsAcPvtt+Ojjz5qUmgCwOLFi5GYmAgAMJlMSE9PR0ZGBgD7Lmi22Wab\nbbbZZptttgO3XVhYCJvNBgCwWCxojdM9midOnMDChQvx8ccfIywsDFlZWRg3bhweeughxwVxj6a2\nvLy8hhVJrmGGepifPmaojxnqY4b6mGHbaZ11npaWhrvuugs//OEPkZaWBqUU7rvvPrd3koiIiIg6\nFl7rnIiIiIhcxmudExEREZHXsdD0I8aAW3IdM9TD/PQxQ33MUB8z1McM3YOFJhERERF5BMdoEhER\nEZHLOEaTiIiIiLyOhaYf4XgQfcxQD/PTxwz1MUN9zFAfM3QPFppERERE5BEco0lERERELuMYTSIi\nIiLyOhaafoTjQfQxQz3MTx8z1McM9QVchjk5gM0GrFkDZGcDTzwBFBUBCxYAWVnAkCFARgYwdChw\n553A6NFAYiKQkGC/v+46YMQIIDa25ftJk4AZM4AHHwRmz5b7uXPl+a/hkKHRv8Y/22z2x9lswA03\nAC+9ZJ9vwQJg507H5RcVAaNGAVar45NZrTK9qMhxupFBAAvxdQeIiIiok5s4EVi9Grj/fuCOO6Ro\nzMgAnn8euO8+ICQE+OYboE8fYNs2ICgIaG24Xmlpy/cREcChQ4DJBHz4oRSeEye2rX/r1snPq1bJ\n9M2bpbA0fnfrrbLs3/0OmDMHyMwEpk2TxxQVATfeCLz5JjBrFrB7txTIVqu0N22S3+fmAqmp9vlz\nc7Wi9TWO0SQiIiLfMwq2+fOlYBs9GigoAMaPB44cAXr1kkLRKDIbF5vOCs9rRURI8TpzphSFJlPb\n+/fYY8DatTLtqaekQFy3TpZRVCR7No0+/+hHwMcfA7//PfDAA/Yi0iguX35Z9qoaRadRXP7ud47z\n+7nWakAWmkREROQfLBYgKQnYsUP2BhpeeglYtsz9z2c2y6H3tjL6ZzZL2/i58TJ27rT33WyWQjMz\nU17TvHn2+Q4dAiZPBvLz5ZD+tY+/dn4/xpOBAkTAjanxQ8xQD/PTxwz1MUN9AZmhzSZ7B/Pz5XD5\njTcCoaFShD3yCBATI/MFBTneX/tzW0REAFFRwJNP2sdUXqNJhkb/zGbZo7l2rfy8aZN9GUVF0vdp\n04DoaBkKcP/9UjQ+8IB9DKbVKnsy8/Pl3hizWVQk8107fwBjoUlERES+ZRyWvv9+KdQmTgQKC+WQ\n85Ejcpi7tFTGaF572Bxo/2HzLl2kENy7Vwq6ForNJv0zDpEbTCaZtnq17KG84QZg+nTg7beBV14B\n9u8Hxo0Dpk6Vw+A33ijPaYzRnDRJ7mfNkunGmMx58+zzB3ixyUPnRERE5Fs5OVJcvvCCjFX86is5\nu/y554CwMCni4uKA06eBsWOBL74Aysoci84uXYDwcODCBRnP2dz94MGyJzMxESgpkWWeOydntt9y\ni/P+mUz2nwEZQ3rLLVKI3nabFIgLF8p8CxbICUFvv21fvnEWeU6OvE6D1Sq/37bNcUxmUZFksG2b\nR2J3F47RJCIiIiKP4BjNABGQY2r8DDPUw/z0MUN9zFAfM9THDN2DhSYREREReQQPnRMRERGRy3jo\nnIiIiIi8joWmH+F4EH3MUA/z08cM9TFDfcxQHzN0DxaaREREROQRHKNJRERERC7jGE0iIiIi8ro2\nFZoXL17EvHnzMHz4cIwcORJHjhzxdL86JY4H0ccM9TA/fcxQHzPUxwz1MUP3CGnLTA8//DBmzpyJ\nnTt3oq6uDhUVFZ7uFxFRx7RmjVyu7pFH7Jegs1qBLVvksnVr1viyd81bsADo0UMu/9evn9yHhgJ/\n/zswZgzwz3/KpfxKSoARI4DJk1u/nF9jffsCPXtKBv37AxUVQG2tXC4wJASoqwOCG+0T6dYNuO46\noKbGfmnBigp5vJHtzp1yHesLF+Ryg2VlQHm5LAuwX6owKAior5fXdOUKMHs2sGOH/L5/f2DCBHmt\nQUFyCcSKCumTcYjQZJL+nD4tj6mulnZISPOXQKyqkudr6bKJZWXSx8hIea6uXYHKSvtrN/JwxbWP\nDQqSm5FHba08n3F/9ar04/JleWxNjazzLl3kkpC1tfZlJSbKZRyrq+Wa3p99BkybBixZArz8MnDx\nIrBhg/zcnm2jM8rJkcwBuWa6ySSXsLxyBejeHfjyS2DlSvl948tfGj/7IadjNC9duoTRo0fjH//4\nR+sL4hhNIiLnrFb5EgaA/fvlvnG78fWP/UVRkRQIPXpI0dCtG1BaKgVgcLAUi+XlQO/ewKRJwNat\n8gXZFq+/LteB1rFjh1xj2sj24kXpX3v06SOFYPfuwJkz8roiIuS1njun1z+DUVx2VMbrmzRJ/ug4\nd05y3L4dePRRuUZ5e7aNzshmA1atkqI9LAz4j/8AnnoKOHoUGD8eWLsWePZZmXfzZrlfvRpYt86n\nuWqN0TSbzejduzeysrIwZswY3Hfffahs/BcWERG1XUKCvcC88Ua5Af5bZAJAaiqQnw9cumQvMgHZ\nO1dfD5w9K3vs2ltkAsDixUB2tut9M4pMwJ5tdLQUvW0VFCR7E3v1kj1ye/bItIoKxyLT2APoKmNP\npruW50/Cw2XbiIwECgtlT+yVK1JcrlzJIrOtTCYpIMPC5I+3adNkb/L48TKtcTFns/lFkemM0z2a\nn376KSZMmIDDhw9j7NixWLlyJaKjo/HMM884LigoCHfffTcSExMBACaTCenp6cjIyABgH+vAdsvt\nwsJCrPx+l7g/9CcQ28Y0f+lPoLWNaf7Sn0BsX5tli/P/9a/IWLFC2lu3AikpftH/VtvnzgGZmTBe\nYcb39w1tsxlITHRt+Rs3ImPfPgDACwDSm1v+te2VK4EtW5ou78UXgRUrnD++ubbZjDyLBfif/0HG\n1q3tf7yftAsBrPTF8+/YgbzMTGk/8wzw9NPy+7feQsYdd8j8/rI9+/Pn4ZkzyJg/X9qA5DdhApCU\nhLy33pL558+3b69e7l9hYSFsNhsAwGKx4I9//GPLR7WVE2fOnFFJSUkN7fz8fDVr1qwm87VhUeRE\nbm6ur7sQ8JihHuanr00ZWixKJScrlZQkt+RkmebPTpxQqkcPpWJilJL9KnILDlYqJESphASlFi1S\nqqys/cvOznZYZm7j5Tu77djhuCwj2969276MoCDH17Bnj1Jdusj0a+drT99aei53Lq+FW7sydMct\nPFyp7t2VioyUW2ysvL6bbpL14eq24UM++zwsK1NqyRKlMjMlu8xMpRYulGlms9wbPy9d6he5tlYD\nBjdfftrFxMQgPj4eX3/9NQDgwIEDGDFihLOHkQuMvxbIdcxQD/PT5zTDxmM0c3PlBsg0q9WjfXNZ\n4zGaFRVATIxMDw62j9G8cEFOmFmxQg7ptVUzYzQz2tO3zEw5+QdwHKP5z3+2fRlKyQlJFy4A770H\nzJwp07p1k7GbjefTce0YTQ+O18zw2JJbUFUl28bly0B6uoxv7d4d+OQT4IUX5L6924aP+eTzsPEY\nzagoGQoSGipjNKurHYdbmExy2Hz1ar/OtU3/sP3EiRO49957UVtbi+uuuw7Z2dmIjo52XBBPBiIi\nco5nnTtq7qzz4GB5Dp51zrPOO5sAPeu8tRqQVwbyI3l5edyjpIkZ6mF++pihPmaojxnqY4ZtxysD\nEREREZHXcY8mEREREbmMezSJiIiIyOtYaPqRxv+7i1zDDPUwP33MUB8z1McM9TFD92ChSUREREQe\nwTGaREREROQyjtEkIiIiIq9joelHOB5EHzPUw/z0MUN9zFAfM9THDN2DhSYREREReQTHaBIRXcu4\nlKHZLJcn/MUvZPqWLXKZvZISufSiP14ukjqGnBxg4kS5BKHBZpPrhn/2GdC7t/2SoFarXGLzm2+a\nXvpy8mTZZuPigGPHgJEj5VKY27bZl1lQAPz5z81fZjQ/v/nLaEZGAuPHA59/Lr/r2lUuoZmeLsst\nL5dLKbbnEqU5OcDBg8CwYXIpz+nT5dKVZ88CH30ExMfLcgcPBv72N3ldly41fznP5i4B2t5Lgnp6\nGdc+NjISGDgQiI21Z3buHDBvnvyucWZr1gBZWfbL2AKyHWRn++RziZegJCJqD6tVrtVcWSlfxL16\nyRfB1avSjokB3n/f8UOeyJ1sNmD1amDdOik2jfbjj8tt3z4pDC9elOuOV1W1vKy+fWVbjoqSAubA\nAWDSJMfn+PZbKQCNZXbrBpSWNl2WUUwBcg30vn2lwKysBCIi5Lr0V69Kf4KD5da3rxSIvXvL827d\n6lhAN37Ny5cDR48Co0dLoXv+PPDee/LYc+eAH/xA+hUe3vprbovGr8UXy2juseHhkl+fPlKo33yz\nfP5s3uyYmdUKzJoF7N4tn0PXtr2s1RpQuYkbF9Vp5ebm+roLAY8Z6mF+jVgsSiUnK9W/v1KAUiEh\nSnXvrtTgwfK7FjBDfczwe2VlSi1dqpTZLPdlZfbpmZlKRUUpFR4u2+c1t9xrp8XEKBUdrVR+fvPL\nVEqpEyeU6tFD5m1mmQ23oCD7z926KRUZqdSAAc33JzhY3jsJCUotWuT4fC295oULlRo0SKmBA6U/\n06ZJ3ydNkmWGhTXtR+Of23NrZRlNMnRhGS49Njxcqa5dlZo1S6klS1rOzGJRatQoWaejRrX6ueRp\nrdWAId6seImIAkZCAvDqq7KXBwDq6uSWnc09meQdJhPw2GNAUpIM4zD2aJlMwMaNwI4dbV9WaanM\nP2kSMGBA02UCQGoq8Ic/AJmZrS+r8Z6rigq537vX/l5prL5eblYr8MtfNr8nszGTCXj2WemfYf9+\n6bvRr+rqpv1wda+ir5fR3GONPbW7dzddR40lJAAvvyy55+f77ecSD50TETXHOHx++TJw6pQcJgwL\nk/FrPGxO3mAc2n7sMWDTJsfD6PffL8Wds8PmhpgYmW/3buCtt5ouEwCKiqRoiYho/rC5ofEh327d\n5PC4ydT8YXzj8HlcHHD99S0fNm/8mpcvBw4flmXZbMCECcCRI0BKCnDokLwPq6sd++HqIWxfL6O5\nxxqHz6dPl/V27WFzg3G4/OWXgQcf9Nlhc4BjNImI2odjNMnXOEaTYzQ7yBhNFpp+JC8vDxkZGb7u\nRkBjhnqY3/c0zjpnhvqYIbTPOs8LC0NGdTXPOtc4Y7whQ5517hQLzQDBD1d9zFAP89PHDPUxQ33M\nUB8zbDsWmkRERETkEbzWORERERF5HQtNP8LrqupjhnqYnz5mqI8Z6mOG+pihe7DQJCIiIiKP4BhN\nIiIiInIZx2gSERERkdex0PQjHA+ijxnqYX76mKE+ZqiPGepjhu7R5kKzvr4eY8aMwezZsz3ZHyIi\nIiLqINo8RnPLli349NNPcenSJezatavpgjhGs/MyrqKSlgbMmSNXsrBa5Soq4eEtXwWCiIiIAp72\nGM3i4mLs2bMH9957r1s7Rh1EVhawd69cL3fFCqCoSK4TvXs3cOqUXEaNiIiIOp02FZqPPPIINm3a\nhKCgIE/3p1ML2PEgCQnA/v1yfdcPPwQmTQJqa4Gf/ATYutXxWr0eFrAZ+gnmp48Z6mOG+pihPmbo\nHiHOZsjJyUFMTAzS09ORl5fX6uHxxYsXIzExEQBgMpmQnp7ecJ1QY4Wx3XK7sLDQr/rTrrbZDCxb\nhowVK6RdXg6sX4+M74tMb/XH4PM8ArRt8Jf+sN0524WFhX7Vn0BsB/T3iZ+0Df7SH39qFxYWwmaz\nAQAsFgta43SM5r//+7/jzTffREhICCorK1FeXo7bb78df/rTnxwXxDGanZvVKofLq6qAsjKgd2/Z\ns+nlPZpERETkXa3VgO36h+0ffvghfv3rX/NkIHJkFJlXr8rh8lWrgHnz7G0Wm0RERB0W/2F7gLh2\nd33AyM4GZswAVq+WojI1VcZszpoF9O8PFBR4rSsBm6GfYH76mKE+ZqiPGepjhu7hdIxmYzfccANu\nuOEGT/WFAtWaNU2nJSQAL7zg9a4QERGR/+C1zomIiIjIZTx0TkRERERex0LTj3A8iD5mqIf56WOG\n+pihPmaojxm6BwtNIiIiIvIIjtEkIiIiIpdxjCYREREReR0LTT/C8SD6mKEe5qePGepjhvqYoT5m\n6B4sNImIiIjIIzhGk4iIiIhc1loN2K4rAxG1as0awGYD0tKAOXPk+uZWK7BlCxAeDkyeDNxyi697\nSUTk/3JygMuXgWPHgKVL5WprNhvw7rvAlSvAt982f1U2CnzGup8+Xb5HAfu6j4wMuO9RHjr3IwE/\nHiQrC9i7F1i3DlixAigqAqZNA3bvBk6dAiZO9HgXAj5DH2N++pihPmYI+bx87z3AYgFmzJDP01Wr\ngL/8Bdi8WT5vW8EM9fksQ2Pdr1olBabNJj+/955XvkfdjYUmuU9CArB/P9ClC/Dhh8CkSUBtLfCT\nnwBbt9r/MiMiotaZTFJQRkUBQ4cC118PnDkD/PWv8gd9QoKve0ieYqx7AFi+XG6ATAvA71GO0ST3\nO3RIDpMbzGYgMdFn3SEiClgWC5CUZG/n58sf8dTxNV73fv492loNyEKT3MtqlcPlVVVAWRnQu7d8\nKHKPJhFR+xiHTM+fB3Jz5bP05Enu0ewMjHVfXS3tsDC/3qPJf9geIAJ+TI1RZF69Ctxwg+zZ7NoV\n+OgjGbNps3m8CwGfoY8xP33MUB8zhL3QKC8H/vY34OBBIDYWSEmRMZtWa6sPZ4b6fJahse4B4MUX\n5QbYx2wGGBaa5D7Z2fIBuHq17MFMTZUxm7NmAf37AwUFvu4hEVFgKCgApk6Vw6V798rn6ebNwO23\nS8GRne3rHpKnGOve2INpjNmcOjUgv0d56JyIiIiIXMZD50RERETkdSw0/QjH1OhjhnqYnz5mqI8Z\n6mOG+pihe7DQJCIiIiKP4BhNIiIiInIZx2gSERERkdex0PQjHA+ijxnqYX76mKE+ZqiPGepjhu7B\nQpOIiIiIPIJjNImIiIjIZVpjNIuLi3HTTTdh5MiRSElJwdatW93eQSIiIiLqeJwWmiEhIXj++efx\n+eef4/Dhw/jtb3+Lr776yht963Q4HkQfM9TTkN+aNcDKlcBttwEPPCDXVbZaZdrMmUC/fsDYsfL7\noiK5/u5LLwGzZwMPPggsWCC3Bx6wzwPI/dChcr3moUPt12s2lr1ypTx3AOM2qI8Z6mOG+pihe4Q4\nmyE2NhaxsbEAgMjISAwfPhwlJSUYNmyYxztHRD6SlQVMmwZUVgK5ucC+fUBQEHD1KlBWJvN8/TVQ\nWgpcfz0wfjxw5AjQowdw8KDcAGDyZJl2/fXAK68A994LdOsGnDkDxMXJc7z6KrBkCVBTA4SGAvv3\n++51ExGRW7VrjKbFYkFGRgY+++wzREZGOi6IYzSJOharVQrBy5eBU6eAkBAgLEz2Zv73fwPr1gF7\n9wK1tUBVFRATI/cHDwKpqbKMoiIpNiMipCg15nnrLdl7WVFhn96tmxSZCQm+fd1ERNQurdWATvdo\nGi5fvoy5c+fiN7/5TZMi07B48WIkJiYCAEwmE9LT05GRkQHAvguabbbZDqD2q68CkycjDwDq6pBR\nVwdkZyPvwgVgzhxk7Ngh8wNAaam0U1Mdl/eHPyAvM1PapaXAjh3Ii4gAli1DxooV8vjiYmDrVmR8\nX2T6zetnm2222Wa7SbuwsBA2mw2A7IRsTZv2aNbV1WHWrFmYMWMGHn744eYXxD2a2vLy8hpWJLmG\nGepxyI97NF3CbVAfM9THDPUxw7bTvjLQPffcgxEjRrRYZBJRB2MUmZWVQHm5FH8DBgC9esn4yokT\npciMjpbic+pUmTcqSsZjFhXZi8wePaS43LFD5omIkBOKrlyR4vKDD+S+pkae0zhBiIiIAp7TPZoF\nBQW4/vrrkZKSgqCgIAQFBWH9+vX46U9/6rgg7tEk6jjWrJEzyc1m2YP5i1/I9C1b5CSg48flZJ64\nOODZZ4GBA4E335Q9knFxwMWLMn+PHsDp0zJPaqoUn/PmyUk/NTX2PZhWqywbAEymgD/znIioM2mt\nBuQ/bCciIiIil2kfOifvMAbckuuYoR7mp48Z6mOG+pihPmboHiw0iYiIiMgjeOiciIiIiFzGQ+dE\nRERE5HUsNP0Ix4PoY4Z6mJ8+ZqiPGepjhvqYoXuw0CQiIiIij+AYTSIiIiJyGcdoEhEREZHXsdD0\nIxwPoo8Z6mF++pihPmaojxnqY4buEeLrDhARuV1ODnD5MjB9ulzSEpBLar77LhAZCdxyi2/7R0TU\nSXCMJhF1PDYbsGqV/Lx5s9w3bhvFJxERaeO1zomo8zGKzepqaYeFscgkIvIAngwUIDgeRB8z1NOh\n8jOZgKeaDGUIAAANJUlEQVSeAt58U25PPeWVIrNDZegjzFAfM9THDN2DhSYRdUw2G7B2LbBwodzW\nrpVpRETkNTx0TkQdD8doEhF5DcdoElHnwrPOiYi8hmM0AwTHg+hjhno6TH633AL8y7847rk0mWSa\nh4vMDpOhDzFDfcxQHzN0DxaaREREROQRPHRORERERC7joXMiIiIi8joWmn6E40H0MUM9zE8fM9TH\nDPUxQ33M0D1YaBIRERGRR3CMJhERERG5jGM0iYiIiMjr2lRo7tu3D8OGDUNycjI2btzo6T51WhwP\noo8Z6mF++pihPmaojxnqY4buEeJshvr6eixbtgwHDhxA//79MW7cONx2220YNmyYN/rXceTkABMn\nOv4DaZsNKCjgVUoAyefgQeCrr4B+/YDTp4FevYDjx4EhQ4DqaiAuDigpkfuLF4Ft29zzvJcvAzt3\nAr17A+HhwD33AF9+CZw7B+zfD1x3nay3NWv0n4/IX7T2nqupAS5ckHZVFfDjHwPl5fb3oLveE2vW\nAPv2AcOHy/MVFwNWK1BZKX2IjARqa6Vt6NZNnr9xHysq5HGGBQuAsjKgsBDo2RMIDQW++05eS02N\nvM+vXcb580BWFjBsGDBnDrB0KRAWJnkEBQHx8cClS4DZLG2lgC5dZFnGMpzdV1UB9fXy2OaWMXmy\n/bPugw+AsWMlkwkTZD1FRgJ9+khuf/kL8PHHsj7GjJFpa9bI90pamswHSC5btshzTJ7M7xt/1xFr\nBeXE4cOH1U9/+tOG9oYNG9Rzzz3XZL42LKpzKytTaulSuW+u3dmVlSm1cKFSiYlKRUUp1b+/Ul26\nKBUUpBSgVN++Mn3AAKWio5U6ccJ9z7tkiVI/+5lSPXrI8nv0UGrqVLkfOFCp5GSlLBb3PB+Rv3D2\nnjNuQUFyi42V+dz5nrBY5PlDQuT5IyIcn7uttx07HJd74oT0tT3Ly86WPJKTlVq0SKk9e6RfwcGS\nS0yMa327Nktn8xifdbGx8tw7dki/BgyQ38fHy+eVsd4GD7avC4tF+j9okLyGEycc2/y+8X8BWiu0\nVgM6rQ7/67/+S/3rv/5rQ/uNN95Qy5cvb9eT0PeMDcZsDogNx+uML774+Oa/8GJi3FtkNn7eJUuU\nmjlTvlgiIuQDPi6ORSZ1bM7ec9cWm554TxjFZmvP354i02AUm6GhbV+GkcegQUolJcnrDQlRqk+f\npoWiK31t6zKMz7o9e5QaNUrue/Sw/zEQEqJU9+6ORWbjPJOT5Q+CqCh5HSwyA0sA1gqt1YBOD523\nx+LFi5GYmAgAMJlMSE9PR0ZGBgD7WIdO337sMSApCXlvvQUUFjr8vrCwECtXrvSv/nq7/eyzkg9E\nxvf3eQBQWoqMHTuA1NQWH29Ma9fzm0zImzIFmD9fnq+uTp6vpAQZ+flAQoL/5OPhtjHNX/oTiO1r\ns/R1f5y2n30WeUlJ0v6+38YraGh/fzZpRkkJkJ+PPLMZMJvd8/wJCcj7t38DVqxoeL4XAKS31h+j\nvXIlMG9ey8t/9VUgM7PlxwPAypXI69MHyMtrPo+XXkLesmXS/j6HPABQynn/mmsrZW83Xl7j+UtL\ngaefRsaMGUBUFPImT5b2M8/Y56+rQ0Z2dtPPp4QE5C1bhsIVK7ASAMrLkbd+fZPvm2bzYtuhbUzz\n+vMXFgKTJyMjKQkwm6XtB3k0bhcWFsJmswEALBYLWuWsSj18+LCaPn16Q5uHzjU4+SslNzfXJ93y\nG27Yo+lShtyj2aDTb4NuEFAZ+ukezVzu0dTeo5lrHILnHk2X+ey93MH2aDqtDuvq6tSgQYOUxWJR\n1dXVKi0tTX3xxRftehJSATvuwms4RpPIuzhG0/HGMZrkDwK0VmitBmzTP2zft28fHn74YdTX12PJ\nkiV48sknm8zDf9juREc8k8ydeNY5kXf581nntbVyJjnPOnf9rPM5c2Qd8azzwBKgtUJrNSCvDORH\n8owxQuQyZqiH+eljhvqYoT5mqI8Zth2vDBQgCr8f8EuuY4Z6mJ8+ZqiPGepjhvqYoXuw0PQjxhlc\n5DpmqIf56WOG+pihPmaojxm6BwtNIiIiIvIIFpp+xOn/oiKnmKEe5qePGepjhvqYoT5m6B5uPRmI\niIiIiDqflspJt10ZiGecExEREVFjPHRORERERB7BQpOIiIiIPIKFJhERERF5hHahuW/fPgwbNgzJ\nycnYuHGjO/rUIRUXF+Omm27CyJEjkZKSgq1btwIAysrKMG3aNAwdOhTTp0/HxYsXGx6zYcMGDBky\nBMOHD8f+/ft91XW/Ul9fjzFjxmD27NkAmJ8rLl68iHnz5mH48OEYOXIkjhw5whzbacOGDRg5ciRS\nU1Nx5513oqamhhk6sWTJEsTExCA1NbVhmiuZHTt2DKmpqUhOTsbKlSu9+hp8rbkMH3/8cQwfPhzp\n6en4+c9/jkuXLjX8jhk21VyGhl//+tcIDg7GhQsXGqYxQzfQuYj61atX1aBBg5TFYlE1NTUqLS1N\nffnllzqL7LBOnz6tjh8/rpRSqry8XCUnJ6svv/xSPf7442rjxo1KKaWee+459cQTTyillPr8889V\nenq6qq2tVWazWQ0aNEjV19f7rP/+4vnnn1d33nmnuvXWW5VSivm54O6771avvfaaUkqp2tpaZbPZ\nmGM7WCwWlZSUpKqrq5VSSmVmZqrXX3+dGTqRn5+vjh8/rlJSUhqmuZLZ+PHj1dGjR5VSSs2YMUPt\n27fPy6/Ed5rL8L333lNXr15VSin1xBNPqCeffFIpxQxb0lyGSin13XffqenTp6vExER1/vx5pZRS\nX3zxBTN0A609mkePHsWQIUOQkJCArl274o477sA777zjrhq4Q4mNjUV6ejoAIDIyEsOHD0dxcTHe\neecd3H333QCAu+++G//7v/8LANi1axfuuOMOhISEIDExEUOGDMHRo0d91n9/UFxcjD179uDee+9t\nmMb82ufSpUvIz89HVlYWACAkJATR0dHMsR169OiB0NBQXLlyBXV1daisrERcXBwzdGLSpEno2bOn\nw7T2ZnbmzBmUl5dj3LhxAIC77rqr4TGdQXMZTpkyBcHB8lU+YcIEFBcXA2CGLWkuQwB45JFHsGnT\nJodp77zzDjN0A61Cs6SkBPHx8Q3tAQMGoKSkRLtTHZ3FYkFhYSEmTJiA0tJSxMTEAJBi9OzZswCa\nZhsXF9fpszU+CBr/z1bm1z5msxm9e/dGVlYWxowZg/vuuw8VFRXMsR169uyJRx99FAMHDkRcXByi\no6MxZcoUZuiCs2fPtiuzkpISDBgwoGE6v3Mcvfbaa5g5cyYAZtgeu3btQnx8PFJSUhymM0P34MlA\nXnb58mXMnTsXv/nNbxAZGdnkH93zH983LycnBzExMUhPT2/1f7Yyv9bV1dXh2LFjeOihh3Ds2DF0\n794dzz33HLfDdjh58iS2bNkCq9WKU6dO4cqVK/jzn//MDN2Amblu3bp16Nq1K+bPn+/rrgSUyspK\nrF+/Hs8884yvu9JhaRWacXFx+PbbbxvaxcXFiIuL0+5UR1VXV4e5c+di0aJFuO222wAAMTExKC0t\nBQCcOXMGffv2BSDZfvfddw2P7ezZFhQUYNeuXbjuuuswf/58fPDBB1i0aBFiY2OZXzsMGDAA8fHx\nGDt2LADg5z//OY4dO8btsB0++eQTTJw4Eb169UKXLl0wZ84cfPTRR8zQBe3NjFk27/XXX8eePXuw\nbdu2hmnMsG3+8Y9/wGKxIC0tDUlJSSguLsaYMWNw9uzZFmscZtg+WoXmuHHj8M0338BqtaKmpgbb\nt29vOBuYmrrnnnswYsQIPPzwww3TZs+ejddffx0A8Mc//rGhAJ09eza2b9+OmpoamM1mfPPNNxg/\nfrwvuu0X1q9fj2+//RYnT57E9u3bcdNNN+GNN97ArbfeyvzaISYmBvHx8fj6668BAAcOHMDIkSO5\nHbbD0KFD8X//93+oqqqCUgoHDhzAiBEjmGEbKKUcjki0N7PY2FhER0fj6NGjUErhT3/6U8NjOotr\nM9y3bx82bdqEXbt2ISwsrGE6M2xZ4wxHjRqFM2fO4OTJkzCbzRgwYACOHz+Ovn37Yvbs2Xj77beZ\noS7ds4n27t2rkpOT1eDBg9WGDRt0F9dhHTp0SAUHB6u0tDSVnp6uRo8erfbu3avOnz+vbr75ZpWc\nnKymTp2qysrKGh6zfv16NWjQIDVs2DD17rvv+rD3/iUvL6/hrHPm136FhYVq7NixKi0tTc2ZM0fZ\nbDbm2E6/+tWv1IgRI1RKSoq66667VE1NDTN0Yv78+apfv34qNDRUxcfHq9dee01duHCh3Zl98skn\natSoUWrw4MFqxYoVvngpPtNchoMHD1YDBw5Uo0ePVqNHj1YPPvhgw/zMsKnmMmwsKSmp4axzpZih\nOwQpxYuUExEREZH78WQgIiIiIvIIFppERERE5BEsNImIiIjII1hoEhEREZFHsNAkIiIiIo9goUlE\nREREHsFCk4iIiIg84v8BTyBEgvgnKUUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.figure(num=None, figsize=(11.5,3),dpi=80,facecolor='w',edgecolor='k')\n", "result=[(s[0], g.predict(pca.transform([s[1]]))[0]) for s in BoC]\n", "#result=[(s[0], g.predict([s[1]])) for s in BoC]\n", "plt.plot([i[0] for i in result],[i[1] for i in result],'rx')\n", "plt.xlim(0,count)\n", "plt.ylim(-0.5,9.5)\n", "plt.grid()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ちなみに使った動画は[これ](https://www.youtube.com/watch?v=iFvruJ98Gl0)。\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "動画長めながら上の図を眺めると、「あーこれはこれかな?」みたいなのがそこそこわかるんだけれど、それにしたってあんまり綺麗に分かれてなひ・・・。希望としては各コンポネントが各キャラに対応して欲しかった(キャラ数=5よりコンポネント数の方が多いのは5にしたとき結果がクソだったから増やしたということですご察しください)。なかなか難しい。ちなみに1300フレームはひかる氏が一人で座ってるところなんだけど何故か靴あたりがもう一つ顔として認識されて変なコンポネント(たぶん7番め)ができちゃってたりする。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 色々やってみて思ったこと\n", " 全部のフレーム顔画像検出して結果を枠で囲んだ画像生成して眺めることも一応やってて、やっぱりこれって正面からで顔全体が見えている画像を対象としていて、横を向いている、目をつむっている、顔の一部が隠れてる、ドアップで輪郭の一部がはみ出てしまってるみたいなケースでは検出出来ないことが多いなぁと感じた。動画の40秒あたりでひかる氏手が顔の両側にあるんだけど、これだけでひかる氏の顔は認識できなくなってたりする。性質上のぞみ先生は顔を何かで隠してることが多くて、こっちもなかなか認識しなくてもうみてるだけでニヤニヤしてるキモヲタでした。\n", " Bag of Colorsは基本肌色に持ってかれるだろうなぁと思いつつ何か前処理かましてやれば目と髪の色で結構識別出来るかなぁっと思ったんだけど結構いまいち。結果の詳細な分析や考察はまだ出来てないんだけどピンク髪の矢神さんは割と追えてる感じがした。特徴量つくる側では結構えいやとやってしまったのでもうちょいパラメタチューニングの余地があるかも。\n", " あと、一つ一つのデータを眺めるというクソ単調な作業でも対象に興味があると続けられるんだなぁと思いました。\n", "\n", "## まとめ\n", " 動画に対してOpenCVとかscikit-learnとか色々叩いて色々やってみたけど結果は微妙だった。" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }