注:在 pytorch 进行模型保存的时候,一般有两种保存方式:
torch.save(model.state_dict(), "my_model.pth") # 只保存模型的参数
torch.save(model, "my_model.pth") # 保存整个模型
项目地址:
https://github.com/1adrianb/face-alignment
# 2D-Plot
plot_style = dict(marker='o',
markersize=4,
linestyle='-',
lw=2)
pred_type = collections.namedtuple('prediction_type', ['slice', 'color'])
pred_types = {'face': pred_type(slice(0, 17), (0.682, 0.780, 0.909, 0.5)),
'eyebrow1': pred_type(slice(17, 22), (1.0, 0.498, 0.055, 0.4)),
'eyebrow2': pred_type(slice(22, 27), (1.0, 0.498, 0.055, 0.4)),
'nose': pred_type(slice(27, 31), (0.345, 0.239, 0.443, 0.4)),
'nostril': pred_type(slice(31, 36), (0.345, 0.239, 0.443, 0.4)),
'eye1': pred_type(slice(36, 42), (0.596, 0.875, 0.541, 0.3)),
'eye2': pred_type(slice(42, 48), (0.596, 0.875, 0.541, 0.3)),
'lips': pred_type(slice(48, 60), (0.596, 0.875, 0.541, 0.3)),
'teeth': pred_type(slice(60, 68), (0.596, 0.875, 0.541, 0.4))
fig = plt.figure(figsize=plt.figaspect(.5))
ax = fig.add_subplot(1, 2, 1)
ax.imshow(input_img)
for pred_type in pred_types.values():
ax.plot(preds[pred_type.slice, 0],
preds[pred_type.slice, 1],
color=pred_type.color, **plot_style)
ax.axis('off')
# 3D-Plot
ax = fig.add_subplot(1, 2, 2, projection='3d')
surf = ax.scatter(preds[:, 0] * 1.2,
preds[:, 1],
preds[:, 2],
c='cyan',
alpha=1.0,
edgecolor='b')
for pred_type in pred_types.values():
ax.plot3D(preds[pred_type.slice, 0] * 1.2,
preds[pred_type.slice, 1],
preds[pred_type.slice, 2], color='blue')
ax.view_init(elev=90., azim=90.)
ax.set_xlim(ax.get_xlim()[::-1])
plt.show()
2、人体姿态估计
→ sh scripts/one_click.sh
3、设置 SMPL-X/MANO 型号
① 下载 SMPLX 模型:在网站 https://smpl-x.is.tue.mpg.de/ 下载文件 SMPLX_NEUTRAL.pkl 。将其放入目录 ./externals/frankmocap/extra_data/smpl/SMPLX_NEUTRAL.pkl,用于手模块和全身模块。
② 下载 MANO 模型:在网站 https://mano.is.tue.mpg.de/ 下载文件 models/MANO_LEFT.pkl 和models/MANO_RIGHT.pkl。将其放入目录 ./externals/mano/。
4、运行项目
① → python -m demo.demo_image --filename demo/test.jpg --out output/ -e weights/
② → python -m demo.demo_image --filename demo/test.jpg --out output/ -e weights/mow/
python -m models.ihoi --config experiments/obman.yaml --slurm
python -m models.ihoi --config experiments/mow.yaml --ckpt PATH_TO_OBMAN_MODEL/obman/checkpoints/last.ckpt --slurm
python -m models.ihoi --config experiments/ho3d.yaml --ckpt PATH_TO_OBMAN_MODEL/obman/checkpoints/last.ckpt --slurm
虚拟形象驱动 AI 集成项目 - Kalidokit
Kalidokit 是基于 Mediapipe/Tensorflow.js 面部、眼睛、姿势和手跟踪模型的混合形状和运动学解算器,并与 Facemesh、Blazepose、Handpose 和 Holistic 算法兼容。它采用预测的3D图标,并计算简单的欧拉旋转和混合形状面值。KalidoKit 是 Vtuber web 应用程序 Kalidoace 和 Kalidoase 3D 的核心,专门为装配 3D VRM 模型和 Live2D 而设计。
注:TypeScript 是 JavaScript 的一个超集,支持 ECMAScript 6 标准。TypeScript 由微软开发的自由和开源的编程语言。TypeScript 设计目标是开发大型应用,它可以编译成纯 JavaScript,编译出来的 JavaScript 可以运行在任何浏览器上。TypeScript 是一种给 JavaScript 添加特性的语言扩展。
# Kalidokit 由3个类组成,用于面部、姿势和手计算。
# 他们接受 Facemesh、Blazepose、Handpose 和 Holistic等模型的标志性输出。
// 接受矢量 Array( 468或478,带虹膜跟踪)
Kalidokit.Face.solve(facelandmarkArray, {
runtime: "tfjs", // `mediapipe` or `tfjs`
video: HTMLVideoElement,
imageSize: { height: 0, width: 0 },
smoothBlink: false,
blinkSettings: [0.25, 0.75],
// 接受姿势关键点和 3D 姿势关键点的 Array(33)
Kalidokit.Pose.solve(poseWorld3DArray, poseLandmarkArray, {
runtime: "tfjs", // `mediapipe` or `tfjs`
video: HTMLVideoElement,
imageSize: { height: 0, width: 0 },
enableLegs: true,
// 接受手标志向量的 Array(21),指定 “右侧” 或 “左侧”
Kalidokit.Hand.solve(handLandmarkArray, "Right");
// 直接使用导出的类
Face.solve(facelandmarkArray);
Pose.solve(poseWorld3DArray, poseLandmarkArray);
Hand.solve(handLandmarkArray, "Right");
# 基本用途
# 实现可能会因您选择使用的姿势和面部检测模型而异,但原理仍然相同。
# 本示例使用Mediapipe整体式,将它们简洁地结合在一起。
import * as Kalidokit from 'kalidokit'
import '@mediapipe/holistic/holistic';
import '@mediapipe/camera_utils/camera_utils';
let holistic = new Holistic({locateFile: (file) => {
return `https://cdn.jsdelivr.net/npm/@mediapipe/holistic@0.4.1633559476/${file}`;
holistic.onResults(results=>{
// do something with prediction results
// landmark names may change depending on TFJS/Mediapipe model version
let facelm = results.faceLandmarks;
let poselm = results.poseLandmarks;
let poselm3D = results.ea;
let rightHandlm = results.rightHandLandmarks;
let leftHandlm = results.leftHandLandmarks;
let faceRig = Kalidokit.Face.solve(facelm,{runtime:'mediapipe',video:HTMLVideoElement})
let poseRig = Kalidokit.Pose.solve(poselm3d,poselm,{runtime:'mediapipe',video:HTMLVideoElement})
let rightHandRig = Kalidokit.Hand.solve(rightHandlm,"Right")
let leftHandRig = Kalidokit.Hand.solve(leftHandlm,"Left")
// 使用 Mediapipe 的网络摄像头将视频发送到每一帧
const camera = new Camera(HTMLVideoElement, {
onFrame: async () => {
await holistic.send({image: HTMLVideoElement});
width: 640,
height: 480
camera.start();