日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Face3D学习笔记(3)3DMM示例源码解析【上】准备工作

發(fā)布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Face3D学习笔记(3)3DMM示例源码解析【上】准备工作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

寫在前面

  • 為了保證整個示例項目更加直觀,方便理解,在展示一些函數(shù)的源碼時會使用numpy版本進行展示,而在示例程序中并未使用numpy版本的庫,在Cython版本與numpy版本出現(xiàn)差異的原碼前會有標注,希望讀者留意。
  • 3DMM實例程序的jupyter版本后續(xù)會更新,完全免費,歡迎大家下載

準備工作

3DMM的例程里面需要用到BFM模型,這些數(shù)據(jù)需要自行下載,下面是下載教程:

準備 BFM 數(shù)據(jù)

1.下載原始BFM模型

網(wǎng)站: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads
將上面的框全部打勾后在下方填上自己的姓名機構(gòu)和接受數(shù)據(jù)的郵箱再填一下驗證碼就可以了。
然后填寫的郵箱會收到這樣一封郵件:

會給你一個用戶名和密碼,用戶名就是郵箱,密碼是隨機的,復制這倆然后打開上面的鏈接,填寫信息之后就可以下載了。
下載好的文件解壓縮,在里面找到01_MorphabelModel.mat

然后在face3d/examples/Data/BFM目錄下新建一個文件夾raw,再將01_MorphabelModel.mat復制到raw/

2.從 3DDFA和 HFPE下載額外的 BFM 信息

網(wǎng)站: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
打開后在這里

下載圖中的[Face Profiling] 和 [3DDFA]

另一個網(wǎng)站: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/HPEN/main.htm
打開后找到Downloads:

下載第一個[HPEN]

將下載好的三個壓縮包解壓,分別在里面找到如下文件:
model_info.mat
Model_Expression.mat
Model_face_contour_trimed.mat
Model_tri_mouth.mat
Modelplus_nose_hole.mat
Modelplus_parallel.mat
vertex_code.mat

然后在face3d/examples/Data/BFM目錄下新建一個文件夾3ddfa
將上述文件拷貝進去。

3.從3DMMasSTN下載UV

網(wǎng)站: https://github.com/anilbas/3DMMasSTN/blob/master/util/BFM_UV.mat
點擊download下載后解壓,在face3d/examples/Data/BFM目錄下新建一個文件夾stn,再將BFM_UV.mat復制到stn/

4.生成模型數(shù)據(jù)
在BFM目錄下創(chuàng)建Out文件夾
在 Matlab 中打開文件generate.m并運行,我用的MATLAB R2018a,這個.m文件有不少地方有問題,修正后得到Out文件夾里面的三個輸出,Out輸出我會放在這,但是其他部分因為隱私條款暫不提供,請自行下載調(diào)試(可以找作者私聊)。

此外,修改后的generate.m代碼如下:

% addpath(genpath(pwd)) % --> model%% load raw BFM models load('raw/01_MorphableModel.mat');%% load 3ddfa data % 1. load bfm information. trim load('3ddfa/model_info.mat'); trimIndex_f = [3*trimIndex-2, 3*trimIndex-1, 3*trimIndex]'; trimIndex_f = trimIndex_f(:);model.shapeMU = shapeMU(trimIndex_f,:); model.shapePC = shapePC(trimIndex_f, :); model.shapeEV = shapeEV; model.texMU = texMU(trimIndex_f, :); model.texPC = texPC(trimIndex_f, :); model.texEV = texEV; model.tri = tri; model.kpt_ind = keypoints;model_info.kpt_ind = keypoints; model_info.trimIndex = trimIndex; model_info.symlist = symlist; model_info.symlist_tri = symlist_tri; %segbin: nose eyes mouth rest model_info.segbin = segbin(trimIndex, :)'; model_info.segbin_tri = segbin_tri';% 2. load expression load('3ddfa/Model_Expression.mat'); model.expMU = mu_exp; model.expPC = w_exp; model.expEV = sigma_exp;% 3. load mouth tri load('3ddfa/Model_tri_mouth.mat'); model.tri_mouth = tri_mouth; model_info.tri_mouth = tri_mouth;% 4. face contour load('3ddfa/Model_face_contour_trimed.mat'); model_info.face_contour = face_contour; model_info.face_contour_line = face_contour_line; model_info.face_contour_front = face_contour_front; model_info.face_contour_front_line = face_contour_front_line;% 5. nose hole load('3ddfa/Modelplus_nose_hole.mat'); model_info.nose_hole = nose_hole; model_info.nose_hole_right = nose_hole_right; model_info.nose_hole_left = nose_hole_left;% 6. parallel for key points load('3ddfa/Modelplus_parallel.mat') model_info.parallel = parallel; model_info.parallel_face_contour = parallel_face_contour;% 7. pncc copyfile('C:\Users\����\Desktop\BFM\3ddfa\vertex_code.mat', 'Out/pncc_code.mat') %這里用的是絕對路徑,請自行更改%% load 3DMMasSTN UV coords load('stn/BFM_UV.mat'); uv_coords = UV(trimIndex, :)';% modify bad vers bad_ind = [10032, 10155, 10280]; round1 = [10033, 10158 ]; round2 = [10534, 10157, 10661]; round3 = [10916, 10286]; uv_coords(:, bad_ind(1)) = mean(uv_coords(:, round1), 2); uv_coords(:, bad_ind(2)) = mean(uv_coords(:, round2), 2); uv_coords(:, bad_ind(3)) = mean(uv_coords(:, round3), 2);model_info.uv_coords = uv_coords'; UV = model_info.uv_coords;% modify tri mouth tm_inner = model.tri_mouth; tm_inner_add =[6420 6542 6664; %% add inner mouth triangles6420 6294 6167;6167 6297 6420;6167 6297 6296;6167 6296 6295;6167 6295 6039;6168 6295 6039]; ind_bad = 38; all_ind = 1:size(tm_inner, 2); tm_inner = tm_inner(:, setdiff(all_ind, bad_ind)); tm_inner = [tm_inner tm_inner_add']; model_info.tri_mouth = tm_inner; model.tri_mouth = tm_inner;% save clearvars -except model model_info UVsave 'C:\Users\����\Desktop\BFM\Out\BFM.mat' model %這里用的是絕對路徑,請自行更改 save 'C:\Users\����\Desktop\BFM\Out\BFM_info.mat' model_info %這里用的是絕對路徑,請自行更改 save 'C:\Users\����\Desktop\BFM\Out\BFM_UV.mat' UV %這里用的是絕對路徑,請自行更改 % copyfile('3ddfa/pncc_code.mat', 'Out/pncc_code.mat')

至此,準備工作完成。可以運行2_3dmm.py得到下面三個圖像輸出結(jié)果:


由于這部分是作者要研究的核心部分,所以將分片進行,下面將從原理出發(fā)逐步分析源碼,期待大家關(guān)注。

總結(jié)

以上是生活随笔為你收集整理的Face3D学习笔记(3)3DMM示例源码解析【上】准备工作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。