Face3D学习笔记(3)3DMM示例源码解析【上】准备工作
寫在前面
- 為了保證整個示例項目更加直觀,方便理解,在展示一些函數的源碼時會使用numpy版本進行展示,而在示例程序中并未使用numpy版本的庫,在Cython版本與numpy版本出現差異的原碼前會有標注,希望讀者留意。
- 3DMM實例程序的jupyter版本后續會更新,完全免費,歡迎大家下載
準備工作
3DMM的例程里面需要用到BFM模型,這些數據需要自行下載,下面是下載教程:
準備 BFM 數據
1.下載原始BFM模型
網站: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads
將上面的框全部打勾后在下方填上自己的姓名機構和接受數據的郵箱再填一下驗證碼就可以了。
然后填寫的郵箱會收到這樣一封郵件:
會給你一個用戶名和密碼,用戶名就是郵箱,密碼是隨機的,復制這倆然后打開上面的鏈接,填寫信息之后就可以下載了。
下載好的文件解壓縮,在里面找到01_MorphabelModel.mat
然后在face3d/examples/Data/BFM目錄下新建一個文件夾raw,再將01_MorphabelModel.mat復制到raw/
2.從 3DDFA和 HFPE下載額外的 BFM 信息
網站: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
打開后在這里
下載圖中的[Face Profiling] 和 [3DDFA]
另一個網站: 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
網站: https://github.com/anilbas/3DMMasSTN/blob/master/util/BFM_UV.mat
點擊download下載后解壓,在face3d/examples/Data/BFM目錄下新建一個文件夾stn,再將BFM_UV.mat復制到stn/
4.生成模型數據
在BFM目錄下創建Out文件夾
在 Matlab 中打開文件generate.m并運行,我用的MATLAB R2018a,這個.m文件有不少地方有問題,修正后得到Out文件夾里面的三個輸出,Out輸出我會放在這,但是其他部分因為隱私條款暫不提供,請自行下載調試(可以找作者私聊)。
此外,修改后的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得到下面三個圖像輸出結果:
由于這部分是作者要研究的核心部分,所以將分片進行,下面將從原理出發逐步分析源碼,期待大家關注。
總結
以上是生活随笔為你收集整理的Face3D学习笔记(3)3DMM示例源码解析【上】准备工作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UIImage 裁剪图片和等比列缩放图片
- 下一篇: vim使用教程(全)-最好的编辑器