Spaces:
Sleeping
Sleeping
File size: 40,340 Bytes
40ac571 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "0939da8a-784f-43ba-b6a9-c6f70c7bf0bb",
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"import cv2\n",
"import csv\n",
"import json\n",
"import math\n",
"import random\n",
"import decord\n",
"import numpy as np\n",
"import imageio\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"from glob import glob\n",
"from PIL import Image, ImageSequence\n",
"from io import BytesIO\n",
"from IPython.display import Video\n",
"from IPython.display import display, Image as IPyImage\n",
"import torchvision.transforms as T\n",
"\n",
"import sys\n",
"from media_pipe.mp_utils import LMKExtractor\n",
"from media_pipe.draw_util import FaceMeshVisualizer\n",
"from media_pipe.pose_util import project_points_with_trans, matrix_to_euler_and_translation, euler_and_translation_to_matrix\n",
"\n",
"\n",
"ROOT = 'root_path'\n",
"\n",
"def show_img(img, title=''):\n",
" plt.figure(figsize=(10, 10))\n",
" plt.title(title)\n",
" plt.imshow(img)\n",
" plt.show()\n",
" \n",
"def read_video(video_path):\n",
" vr = decord.VideoReader(video_path)\n",
" frames = vr.get_batch(list(range(len(vr))))\n",
" return frames\n",
" \n",
"def display_gif(image_array, duration=100):\n",
" # 将NumPy数组转换为PIL图像列表\n",
" images = [Image.fromarray(frame) for frame in image_array]\n",
"\n",
" # 将图像保存为GIF并将其读入内存缓冲区\n",
" buffer = BytesIO()\n",
" images[0].save(buffer, format='GIF', save_all=True, append_images=images[1:], duration=duration, loop=0)\n",
"\n",
" # 在Jupyter Notebook中显示GIF\n",
" buffer.seek(0)\n",
" display(IPyImage(data=buffer.getvalue()))"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "940dca3f-6820-4c03-8c0e-7fb585ba3ac3",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: Logging before InitGoogleLogging() is written to STDERR\n",
"W20240527 09:29:14.175659 2415689 face_landmarker_graph.cc:168] Face blendshape model contains CPU only ops. Sets FaceBlendshapesGraph acceleration to Xnnpack.\n",
"INFO: Created TensorFlow Lite XNNPACK delegate for CPU.\n"
]
}
],
"source": [
"lmk_extractor = LMKExtractor()\n",
"vis = FaceMeshVisualizer(forehead_edge=False)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "2f199844-f458-40a1-8704-e2eff2d21fff",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAycAAAMyCAYAAAB3sr6BAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAA9hAAAPYQGoP6dpAABidElEQVR4nO39eXhd1YHne//W3mfQeDTakjzIGDAYY+bBUZFUuoILh3alM9C3qVyeKp5UbuUmMblJ4OW58X0qpKrfuk3e1H26ulKVJvV2vR1y+3YXKbqbVEMREscEkwRjjMHBGDA22JYHDbYlnaPhjHuv948tyxaSZ1lnHfn7eZ4F0t7r7LOOvS2d31mTsdZaAQAAAECZeeVuAAAAAABIhBMAAAAAjiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOKGs4+d73vqfLLrtMVVVVWrVqlV555ZVyNgcAAABAGZUtnPzoRz/Sgw8+qG9961t67bXXdMMNN2jNmjXq7+8vV5MAAAAAlJGx1tpyPPGqVat022236W/+5m8kSWEYavHixfrKV76ib3zjG6d9bBiGOnz4sOrr62WMmY3mAgAAADiJtVbDw8NasGCBPG9m+jxiM3KVc1QoFLRt2zatX79+4pjneVq9erU2b948pX4+n1c+n5/4/tChQ1qxYsWstBUAAADAqR04cECLFi2akWuVZVjX0aNHFQSB2traJh1va2tTb2/vlPqPPvqoGhoaJgrBBAAAAHBDfX39jF2rIlbrWr9+vdLp9EQ5cOBAuZsEAAAAQJrRaRZlGdbV2toq3/fV19c36XhfX5/a29un1E8mk0omk7PVPAAAAABlUJaek0QioVtuuUUbN26cOBaGoTZu3Kiurq5yNAkAAABAmZWl50SSHnzwQd1///269dZbdfvtt+vf/bt/p9HRUX3uc58rV5MAAAAAlFHZwsm9996rI0eO6JFHHlFvb69uvPFGPffcc1MmyQMAAAC4NJRtn5MLkclk1NDQUO5mAAAAAJe8dDqtVCo1I9eqiNW6AAAAAMx9hBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkAAAAAJxBOAAAAADiBcAIAAADACYQTAAAAAE4gnAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkAAAAAJxBOAAAAADiBcAIAAADACYQTAAAAAE4gnAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkAAAAAJxBOAAAAADiBcAIAAADACYQTAAAAAE4gnAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkAAAAAJxBOAAAAADiBcAIAAADACYQTAAAAAE4gnAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkAAAAAJxBOAAAAADiBcAIAAADACYQTAAAAAE4gnAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJxAOAEAAADgBMIJAAAAACcQTgAAAAA4gXACAAAAwAmEEwAAAABOIJwAAAAAcALhBAAAAIATCCcAAAAAnEA4AQAAAOAEwgkA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V1eXfvKTn0yc5z7C+fr2t78tY4y+9rWvTRzjfsLZ+tM//VMZYyaV5cuXT5yfzXup4sLJj370Iz344IP61re+pddee0033HCD1qxZo/7+/nI3DY4ZHR3VDTfcoO9973vTnv/Od76j7373u/r+97+vLVu2qLa2VmvWrFEul5uoc99992nnzp3asGGDnnnmGb344ov6whe+MFsvAY7YtGmT1q1bp5dfflkbNmxQsVjUXXfdpdHR0Yk6X//61/X000/rySef1KZNm3T48GF95jOfmTgfBIHWrl2rQqGgl156ST/84Q/1+OOP65FHHinHS0KZLFq0SN/+9re1bds2vfrqq/rYxz6mT37yk9q5c6ck7iOcn61bt+pv//Zvdf311086zv2Ec3Httdeqp6dnovzqV7+aODer95KtMLfffrtdt27dxPdBENgFCxbYRx99tIytgusk2aeeemri+zAMbXt7u/2Lv/iLiWNDQ0M2mUzav//7v7fWWvvWW29ZSXbr1q0TdX7yk59YY4w9dOjQrLUd7unv77eS7KZNm6y10b0Tj8ftk08+OVHn7bfftpLs5s2brbXWPvvss9bzPNvb2ztR57HHHrOpVMrm8/nZfQFwSlNTk/27v/s77iOcl+HhYbts2TK7YcMG+9GPftR+9atftdbycwnn5lvf+pa94YYbpj032/dSRfWcFAoFbdu2TatXr5445nmeVq9erc2bN5exZag0e/fuVW9v76R7qaGhQatWrZq4lzZv3qzGxkbdeuutE3VWr14tz/O0ZcuWWW8z3JFOpyVJzc3NkqRt27apWCxOup+WL1+uzs7OSffTddddp7a2tok6a9asUSaTmfjUHJeWIAj0xBNPaHR0VF1dXdxHOC/r1q3T2rVrJ903Ej+XcO52796tBQsW6PLLL9d9992n7u5uSbN/L8Vm4LXMmqNHjyoIgkkvXJLa2tr0zjvvlKlVqES9vb2SNO29dPxcb2+v5s+fP+l8LBZTc3PzRB1cesIw1Ne+9jXdcccdWrlypaToXkkkEmpsbJxU94P303T32/FzuHTs2LFDXV1dyuVyqqur01NPPaUVK1Zo+/bt3Ec4J0888YRee+01bd26dco5fi7hXKxatUqPP/64rr76avX09OjP/uzP9JGPfERvvvnmrN9LFRVOAKDc1q1bpzfffHPSWFzgXFx99dXavn270um0/ut//a+6//77tWnTpnI3CxXmwIED+upXv6oNGzaoqqqq3M1Bhbv77rsnvr7++uu1atUqLVmyRP/wD/+g6urqWW1LRQ3ram1tle/7U1YH6OvrU3t7e5lahUp0/H453b3U3t4+ZaGFUqmkgYEB7rdL1AMPPKBnnnlGv/jFL7Ro0aKJ4+3t7SoUChoaGppU/4P303T32/FzuHQkEgldeeWVuuWWW/Too4/qhhtu0F/91V9xH+GcbNu2Tf39/br55psVi8UUi8W0adMmffe731UsFlNbWxv3E85bY2OjrrrqKu3Zs2fWfzZVVDhJJBK65ZZbtHHjxoljYRhq48aN6urqKmPLUGmWLl2q9vb2SfdSJpPRli1bJu6lrq4uDQ0Nadu2bRN1nn/+eYVhqFWrVs16m1E+1lo98MADeuqpp/T8889r6dKlk87fcsstisfjk+6nXbt2qbu7e9L9tGPHjkmBd8OGDUqlUlqxYsXsvBA4KQxD5fN57iOckzvvvFM7duzQ9u3bJ8qtt96q++67b+Jr7iecr5GREb333nvq6OiY/Z9N5zydv8yeeOIJm0wm7eOPP27feust+4UvfME2NjZOWh0AsDZaweT111+3r7/+upVk/+2//bf29ddft/v377fWWvvtb3/bNjY22n/8x3+0b7zxhv3kJz9ply5darPZ7MQ1Pv7xj9ubbrrJbtmyxf7qV7+yy5Yts5/97GfL9ZJQJl/60pdsQ0ODfeGFF2xPT89EGRsbm6jzxS9+0XZ2dtrnn3/evvrqq7arq8t2dXVNnC+VSnblypX2rrvustu3b7fPPfecnTdvnl2/fn05XhLK5Bvf+IbdtGmT3bt3r33jjTfsN77xDWuMsT/72c+stdxHuDAnr9ZlLfcTzt5DDz1kX3jhBbt3717761//2q5evdq2trba/v5+a+3s3ksVF06stfav//qvbWdnp00kEvb222+3L7/8crmbBAf94he/sJKmlPvvv99aGy0n/M1vftO2tbXZZDJp77zzTrtr165J1zh27Jj97Gc/a+vq6mwqlbKf+9zn7PDwcBleDcppuvtIkv3BD34wUSebzdovf/nLtqmpydbU1NhPf/rTtqenZ9J19u3bZ++++25bXV1tW1tb7UMPPWSLxeIsvxqU0x/90R/ZJUuW2EQiYefNm2fvvPPOiWBiLfcRLswHwwn3E87Wvffeazs6OmwikbALFy609957r92zZ8/E+dm8l4y11p53nw8AAAAAzJCKmnMCAAAAYO4inAAAAABwAuEEAAAAgBMIJwAAAACcQDgBAAAA4ATCCQAAAAAnEE4AAAAAOIFwAgAAAMAJhBMAAAAATiCcAAAAAHAC4QQAAACAEwgnAAAAAJzw/wdD0b5/amlMAwAAAABJRU5ErkJggg==",
"text/plain": [
"<Figure size 1000x1000 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# 测试能否被检测到landmark\n",
"\n",
"ref_image_path = f'{ROOT}/image_path'\n",
"ref_image_pil = Image.open(ref_image_path).convert(\"RGB\")\n",
"ref_image_np = cv2.cvtColor(np.array(ref_image_pil), cv2.COLOR_RGB2BGR)\n",
"# show_img(ref_image_pil)\n",
"\n",
"face_result = lmk_extractor(ref_image_np)\n",
"assert face_result is not None, \"Can not detect a face in the reference image.\"\n",
"face_result['width'] = ref_image_np.shape[1]\n",
"face_result['height'] = ref_image_np.shape[0]\n",
"\n",
"save_path = ref_image_path.replace('.png', '_mppose.npy')\n",
"np.save(save_path, face_result)\n",
"\n",
"lmks = face_result['lmks'].astype(np.float32)\n",
"ref_pose = vis.draw_landmarks((ref_image_np.shape[1], ref_image_np.shape[0]), lmks, normed=True)\n",
"show_img(ref_pose)"
]
},
{
"cell_type": "markdown",
"id": "731aa87d-a42f-47f1-9d4d-6f3023d22320",
"metadata": {},
"source": [
"## 模板提取"
]
},
{
"cell_type": "code",
"execution_count": 9,
"id": "08ef94e9-3a38-4924-a9be-21755df80169",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
" 0%| | 1420/9223372036854775807 [00:28<50561808764202:56:32, 50.67it/s]\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1420\n",
"/apdcephfs_cq8/share_1367250/mayuema/emoji_source_video/temple45.mov done\n",
"/apdcephfs_cq8/share_1367250/mayuema/emoji_source_video/temple45.mov done\n"
]
}
],
"source": [
"from tqdm import tqdm\n",
"\n",
"video_path = f'{ROOT}/video_path'\n",
"frames = imageio.get_reader(video_path)\n",
"face_results = []\n",
"motions = []\n",
"for frame in tqdm(frames):\n",
" frame_bgr = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)\n",
" \n",
" face_result = lmk_extractor(frame_bgr)\n",
" assert face_result is not None, \"Can not detect a face in the reference image.\"\n",
" face_result['width'] = frame_bgr.shape[1]\n",
" face_result['height'] = frame_bgr.shape[0]\n",
" \n",
" face_results.append(face_result)\n",
" lmks = face_result['lmks'].astype(np.float32)\n",
" motion = vis.draw_landmarks((frame_bgr.shape[1], frame_bgr.shape[0]), lmks, normed=True)\n",
" motions.append(motion)\n",
"\n",
"print(len(motions))\n",
"\n",
"save_path = video_path.replace('.mp4', '_mppose.gif')\n",
"imageio.mimsave(save_path, motions, 'GIF', duration=0.2, loop=0)\n",
"print(save_path, 'done')\n",
"\n",
"save_path = video_path.replace('.mp4', '_mppose.npy')\n",
"np.save(save_path, face_results)\n",
"print(save_path, 'done')"
]
},
{
"cell_type": "markdown",
"id": "c4f5a9b7-09e3-4d64-82b0-128239ee8d71",
"metadata": {},
"source": [
"## Align"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "32274bcb-9aa2-492b-914b-b87d73d5d8d5",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.8.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
|