diff options
| author | Adam Harvey <adam@ahprojects.com> | 2018-12-23 01:37:03 +0100 |
|---|---|---|
| committer | Adam Harvey <adam@ahprojects.com> | 2018-12-23 01:37:03 +0100 |
| commit | 4452e02e8b04f3476273574a875bb60cfbb4568b (patch) | |
| tree | 3ffa44f9621b736250a8b94da14a187dc785c2fe /megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb | |
| parent | 2a65f7a157bd4bace970cef73529867b0e0a374d (diff) | |
| parent | 5340bee951c18910fd764241945f1f136b5a22b4 (diff) | |
.
Diffstat (limited to 'megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb')
| -rw-r--r-- | megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb | 291 |
1 files changed, 291 insertions, 0 deletions
diff --git a/megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb b/megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb new file mode 100644 index 00000000..45e309d3 --- /dev/null +++ b/megapixels/notebooks/face_analysis/3d_face_plot_batch.ipynb @@ -0,0 +1,291 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# 3D Face Plot\n", + "\n", + "Attenzione visualization" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "import os\n", + "from os.path import join\n", + "import sys\n", + "import time\n", + "import cv2 as cv\n", + "import numpy as np\n", + "import imutils\n", + "import matplotlib.animation\n", + "%matplotlib notebook\n", + "from glob import glob\n", + "from matplotlib import cbook\n", + "from matplotlib import cm\n", + "from matplotlib.colors import LightSource\n", + "from random import randint\n", + "sys.path.append('/megapixels/3rdparty/face-alignment')\n", + "import face_alignment\n", + "import numpy as np\n", + "from mpl_toolkits.mplot3d import Axes3D\n", + "import matplotlib.pyplot as plt\n", + "import mpl_toolkits.mplot3d.axes3d as p3\n", + "from matplotlib import animation\n", + "import random\n", + "from skimage import io\n", + "from tqdm import tqdm_notebook as tqdm\n", + "from IPython.display import clear_output\n", + "from pathlib import Path\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate random hex colors\n", + "def rhex():\n", + " r = lambda: random.randint(0,255)\n", + " return '#%02X%02X%02X' % (r(), r(), r())" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Downloading the Face Alignment Network(FAN). Please wait...\n", + "Downloading the Face Alignment depth Network (FAN-D). Please wait...\n" + ] + } + ], + "source": [ + "# init 3d face\n", + "# Run the 3D face alignment on a test image, without CUDA.\n", + "fa = face_alignment.FaceAlignment(face_alignment.LandmarksType._3D, \n", + " enable_cuda=True, flip_input=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n" + ] + } + ], + "source": [ + "data_bodega = '/megapixels/data_bodega/'\n", + "fp = join(data_bodega,'images/senators/*.jpg')\n", + "face_files = glob(fp,recursive=True)\n", + "print(len(face_files))" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_3d_face(fpath,output_dir):\n", + " # load image\n", + " im = io.imread(fpath)\n", + " \n", + " # generate 3d predictions\n", + " preds = fa.get_landmarks(im)\n", + " if preds is None:\n", + " return\n", + " preds = preds[-1]\n", + " \n", + " # plot style\n", + " num_frames = 60\n", + " lw = 2 # line weight\n", + " bg_color = '#%02x%02x%02x' % (60,59,110)\n", + " mark_clr = '#%02x%02x%02x' % (255,255,255) \n", + " mark_type='$\\star$'\n", + " mark_size = 20\n", + " print(bg_color)\n", + " \n", + " dpi = 72\n", + " figsize = (16,16)\n", + " \n", + " # center x,y,z\n", + " xmm = (np.min(preds[:,0]),np.max(preds[:,0]))\n", + " ymm = (np.min(preds[:,1]),np.max(preds[:,1]))\n", + " zmm = (np.min(preds[:,2]),np.max(preds[:,2]))\n", + " \n", + " preds_orig = preds.copy()\n", + " xmm_sc = (1.2*np.min(preds[:,0]),1.2*np.max(preds_orig[:,0]))\n", + " xmm = (np.min(preds_orig[:,0]),np.max(preds_orig[:,0]))\n", + " ymm = (np.min(preds_orig[:,1]),np.max(preds_orig[:,1]))\n", + " zmm = (np.min(preds_orig[:,2]),np.max(preds_orig[:,2]))\n", + " \n", + " # swap the y and z components to improve 3d rotation angles\n", + " preds = np.zeros_like(preds_orig).astype(np.uint8)\n", + " for i,p in enumerate(preds_orig):\n", + " x,y,z = p\n", + " #preds[i] = np.array([x - xmm[0], y - ymm[0], z - zmm[0]]) # ?\n", + " preds[i] = np.array([x - xmm[0], z - zmm[0], y - ymm[0]])\n", + " \n", + " # Create plot\n", + " fig = plt.figure(figsize=figsize,dpi=dpi)\n", + " fig.tight_layout()\n", + " ax = fig.add_subplot(111, projection='3d')\n", + " ax.set_facecolor(bg_color) # background color\n", + " \n", + " preds_plot = np.zeros_like(preds)\n", + " for i,p in enumerate(preds):\n", + " x,y,z = p\n", + " preds_plot[i] = np.array([x,y,z])\n", + "\n", + " \n", + " # scatter plot the dots\n", + " ax.plot3D(preds_plot[:17,0]*1.2,preds_plot[:17,1], preds_plot[:17,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[17:22,0]*1.2,preds_plot[17:22,1],preds_plot[17:22,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[22:27,0]*1.2,preds_plot[22:27,1],preds_plot[22:27,2], \n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[27:31,0]*1.2,preds_plot[27:31,1],preds_plot[27:31,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[31:36,0]*1.2,preds_plot[31:36,1],preds_plot[31:36,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[36:42,0]*1.2,preds_plot[36:42,1],preds_plot[36:42,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[42:48,0]*1.2,preds_plot[42:48,1],preds_plot[42:48,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr,linewidth=lw)\n", + " ax.plot3D(preds_plot[48:,0]*1.2,preds_plot[48:,1],preds_plot[48:,2],\n", + " marker=mark_type,markersize=mark_size,color=mark_clr, linewidth=lw)\n", + "\n", + " \n", + " rh = '#ffffff'\n", + " ax.scatter(preds_plot[:,0]*1.2,preds_plot[:,1],preds_plot[:,2],c=rh, alpha=1.0, s=35, edgecolor=rh)\n", + " \n", + " # center points\n", + " cx = ((xmm[0] - xmm[1]) // 2) + xmm[1]\n", + " cy = ((ymm[1] - ymm[0]) // 2) + ymm[0]\n", + " cz = ((zmm[1] - zmm[0]) // 2) + zmm[0]\n", + "\n", + " #xpts = [cx,cx]\n", + " #ypts = [cy,cy]\n", + " #zpts = [zmm[0],zmm[1]]\n", + "\n", + " ax.view_init(elev=120., azim=70.)\n", + " \n", + " ax.set_xticks([])\n", + " ax.set_yticks([])\n", + " ax.set_zticks([])\n", + " ax.set_axis_off()\n", + " ax.set_xlabel('x')\n", + " ax.set_ylabel('y')\n", + " ax.set_zlabel('z')\n", + "\n", + " # write animation to disk\n", + " fname_out = join(output_dir, '{}.gif'.format(Path(fpath).stem))\n", + " print(fname_out)\n", + " # rotation increments\n", + " phi = np.linspace(0, 2*np.pi, num_frames)\n", + "\n", + " def update(phi):\n", + " ax.view_init(180,phi*180./np.pi)\n", + " \n", + " ani = matplotlib.animation.FuncAnimation(fig, update, frames=phi)\n", + " ani.save(fname_out, writer='imagemagick', fps=10)\n", + " #del ani" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "output_dir = join(data_bodega,'output','senators_3d_points')" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "for f in tqdm(face_files):\n", + " generate_3d_face(f,output_dir)\n", + " clear_output()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "cv.L" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:megapixels]", + "language": "python", + "name": "conda-env-megapixels-py" + }, + "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.6" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} |
