資料介紹
描述
介紹
雖然 2D 計算機視覺取得了巨大進步,但 3D 計算機視覺仍然是一項艱巨的任務。我們生成大量 2D 數據(圖像、視頻),但 3D 數據集很少見且創建成本高。該項目將探索從單個圖像獲得的 2D 數據獲取 3D 人體姿態信息的不同方法。
這項工作基于兩篇文章:
- Julieta Martinez、Rayat Hossain、Javier Romero 和 James J. Little為 3d 人體姿態估計提供了一個簡單而有效的基線
- 可以僅從 2D 投影中學習 3D 姿勢嗎?作者:Dylan Drover、Rohith MV、Ching-Hang Chen、Amit Agrawal、Ambrish Tyagi 和 Cong Phuoc Huynh
第一篇文章探索了一種簡單而有效的方法,通過使用相對簡單的 DNN 將 2D 數據“提升”到 3D。本文中提出的模型將進一步稱為“文章模型”或 article.xmodel(來自用于在 VCK5000 卡上進行推理的文件名)。
嘗試了“文章”模型的替代方案,一層上的神經元較少,但層數較多。這種替代模型進一步稱為“殘差”或“res.xmodel”。
這兩個模型是在Human3.6M 數據集上訓練的。這包含通過在工作室中使用昂貴的高分辨率相機設置、拍攝專業演員而獲得的 3D 數據。據作者所知,這是唯一可用于 3D 數據的數據集。
第三個模型,稱為 gan (gan.xmodel) 使用了一個新穎的想法:生成對抗網絡僅從 2D 數據生成 3D 數據。該模型由生成器(使用殘差模型)和鑒別器組成。
生成器的工作是獲取 2D 姿勢并為它們生成深度,將它們轉換為 3D 姿勢。鑒別器的工作是采取 2D 姿勢并返回它們是真的還是假的(由生成器生成)。生成器生成的 3D 姿勢被隨機旋轉,轉換回相機的坐標并以 2D 的形式投影回來。然后將它們反饋給鑒別器。主要思想是,如果生成器能夠創建良好的 3D 姿勢估計,那么那些隨機旋轉并投影回 2D 的 3D 姿勢對于鑒別器來說將看起來無法區分。生成器和判別器一起訓練,一個目標是創建“假” 2D 姿勢,而另一個目標是檢測“假”。該模型是根據從 YouTube 上的 35 個有關瑜伽姿勢的視頻中獲得的圖像進行訓練的。GAN 是出了名的難以訓練,判別器和生成器都產生良好結果的狀態是一種轉瞬即逝的狀態,而不是穩定的狀態。
入門
- 按照此處所述安裝 Vitis AI 。對于訓練和模型量化,需要構建 GPU Docker,因為它將大大加快該過程。(提示:GPU Docker 構建需要大量 DRAM,如果構建失敗,請考慮啟用 swap )
- 按照此處所述設置 VCK5000-ES1 卡。如果您有 VCK5000-PROD 卡,那么最新的 Vitis AI 庫將有一個類似的頁面描述如何操作
- 運行openpose 演示以驗證所有內容都已正確安裝
- 克隆Vitis AI 目錄中的Yoga AI存儲庫
- 啟動 gpu docker 鏡像:
./docker_run.sh xilinx/vitis-ai-gpu:1.4.1.978
修改了 docker_run.sh 文件以添加對 X11 和 USB 網絡攝像頭的支持:
docker_run_params=$(cat <<-END
-v /dev/shm:/dev/shm \
-v /opt/xilinx/dsa:/opt/xilinx/dsa \
-v /opt/xilinx/overlaybins:/opt/xilinx/overlaybins \
-v /etc/xbutler:/etc/xbutler \
-e USER=$user -e UID=$uid -e GID=$gid \
-e VERSION=$VERSION \
-e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v $HOME/.Xauthority:/tmp/.Xauthority \
-v $DOCKER_RUN_DIR:/vitis_ai_home \
-v $HERE:/workspace \
-w /workspace \
--device /dev/video0 \
--rm \
--network=host \
--ipc=host \
${DETACHED} \
${RUN_MODE} \
$IMAGE_NAME \
$DEFAULT_COMMAND
END
)
此處描述了完整的命令列表。
2D 姿態估計
這是通過使用此處所述的 Vitis AI 庫完成的。
在使用 2D 姿態估計器之前,必須下載模型:
cd /workspace/models/AI-Model-Zoo
sudo mkdir /usr/share/vitis_ai_library/models
tar -xzvf openpose_pruned_0_3-vck5000-DPUCVDX8H-r1.4.1.tar.gz
sudo cp openpose_pruned_0_3 /usr/share/vitis_ai_library/models -r
從 2D 提升到 3D
雖然有很好的 2D 姿態估計器,但 3D 問題仍然懸而未決。主要有兩種方法:
- 從圖像開始,使用非常大且復雜的 CNN 進行端到端訓練
- 使用現有的 2D 姿勢估計器并將 2D 結果“提升”為 3D
本項目將使用第二種方法,并嘗試使用兩篇文章中的想法將 2D 結果“提升”為 3D:
- Julieta Martinez、Rayat Hossain、Javier Romero 和 James J. Little為 3d 人體姿態估計提供了一個簡單而有效的基線
- 可以僅從 2D 投影中學習 3D 姿勢嗎?作者:Dylan Drover、Rohith MV、Ching-Hang Chen、Amit Agrawal、Ambrish Tyagi 和 Cong Phuoc Huynh
第一個是使用簡單的 DNN 來學習如何從 2D 開始估計 3D 位置。這需要大量的 3D 姿勢數據集。(使用了 Human3.6M 數據集)
生成的 DNN 對于在 Human3.6M 數據集中找到的位置表現良好,但對于在那里沒有找到的位置(例如瑜伽位置)表現不佳。另一個缺點是創建 3D 數據集非常昂貴,因此很少有公開可用的。
第二篇文章提出了一個生成對抗網絡,它不需要 3D 數據的基本事實。這使得獲取訓練數據變得非常容易,因為有大量數據(視頻、圖像)可用。缺點是訓練 GAN 更像是一門藝術而不是科學,因為它依賴于校準兩個不穩定的神經網絡。
用于回歸 3D 數據的簡單 DNN
在使用 Human3.6M 數據集之前,對數據進行了預處理,然后保存在 .tfrecords 文件中以便于訓練。每個 3D 姿勢數據為:
- 縮放以使頭部錨點和臀部錨點之間的距離為 1 個單位長度
- 以臀部錨點為中心
- 圍繞 z 軸在 0 到 360 度之間隨機旋轉
- 轉換為相機坐標
- 在 2D 數據(用作 DNN 的輸入)和將作為 DNN 輸出的第三個“深度”值之間拆分
這是由 prepare_data.py 腳本完成的:
python prepare_data.py
ls -al ./data/Human36M_subject*
-rw-r--r-- 1 andrei andrei 12172996 mar 19 19:52 ./data/Human36M_subject11_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 12977646 mar 19 19:47 ./data/Human36M_subject1_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 20707511 mar 19 19:48 ./data/Human36M_subject5_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 13055394 mar 19 19:49 ./data/Human36M_subject6_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 21238789 mar 19 19:50 ./data/Human36M_subject7_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 13517702 mar 19 19:51 ./data/Human36M_subject8_joint_3d.tfrecords
-rw-r--r-- 1 andrei andrei 16598153 mar 19 19:51 ./data/Human36M_subject9_joint_3d.tfrecords
提出了三種模型:
- 文章(article.xmodel)中描述的DNN:
python train-article.py
python -u quantize.py --float_model model/article/article.h5 --quant_model model/article/quant_article.h5 --batchsize 64 --evaluate 2>&1 | tee quantize.log
vai_c_tensorflow2 --model model/article/quant_article.h5 --arch /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK5000/arch.json --output_dir model/article --net_name article
- 一個 DNN,每層神經元較少,但層數比文章中描述的層多(res.xmodel):
python train-res.py
python -u quantize.py --float_model model/residual/res.h5 --quant_model model/residual/quant_res.h5 --batchsize 64 --evaluate 2>&1 | tee quantize.log
vai_c_tensorflow2 --model model/residual/quant_res.h5 --arch /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK5000/arch.json --output_dir model/residual --net_name res
- 一個 GAN 模型(gan.xmodel)
本教程介紹了 TensorFlow2 和 Vitis AI 設計流程。
推理
該項目使用兩個 DNN:
- cf_openpose_aichallenger_368_368_0.3_189.7G ,可在 Vitis AI 模型動物園中找到
使用 OpenPose 進行推理非常簡單:
auto image = cv::imread("sample_openpose.jpg");
auto det = vitis::ai::OpenPose::create("openpose_pruned_0_3");
auto results = det->run(image);
此 API 負責處理圖像所需的任何預處理(調整大小等)
- 自定義 DNN 將姿勢從 2D 提升到 3D
代碼有點復雜,使用 VART API:
auto graph = Graph::deserialize(model);
auto subgraph = get_dpu_subgraph(graph.get());
auto runner = Runner::create_runner(subgraph[0],"run");
TensorShape inshapes[1];
TensorShape outshapes[1];
GraphInfo shapes;
shapes.inTensorList = inshapes;
shapes.outTensorList = outshapes;
getTensorShape(runner.get(), &shapes, 1, 1);
auto inTensors = cloneTensorBuffer(runner->get_input_tensors());
auto outTensors = cloneTensorBuffer(runner->get_output_tensors());
int batchSize = inTensors[0]->get_shape().at(0);
int inSize = inshapes[0].size;
int outSize = outshapes[0].size;
auto input_scale = get_input_scale(runner->get_input_tensors()[0]);
auto output_scale = get_output_scale (runner->get_output_tensors()[0]);
int8_t *datain = new int8_t[inSize * batchSize];
int8_t *dataresult = new int8_t[outSize * batchSize];
/* Copy the data in datain buffer.
Don't forget to scale it by multiplying it with input_scale*/
vector> inputs, outputs;
inputs.push_back(make_unique(datain, inTensors[0].ge() ));
outputs.push_back(make_unique(dataresult, outTensors[0].get() ));
vector inputsPtr, outputsPtr;
inputsPtr.push_back(inputs[0].get());
outputsPtr.push_back(outputs[0].get());
auto job_id = runner->execute_async(inputsPtr, outputsPtr);
runner->wait(job_id.first, -1);
/* Copy the result from dataresult
Don't forget to scale it by mupliplying with output_scale*/
delete[] datain;
delete[] dataresult;
運行演示
首先必須編譯演示程序和系統設置。啟動 docker gpu 映像后,在 docker 終端中運行以下命令:
cp /tmp/.Xauthority ~/
sudo chown vitis-ai-user:vitis-ai-group ~/.Xauthority
sudo usermod -a -G video $(whoami)
sudo su $(whoami)
cd /workspace/setup/vck5000/
source setup.sh
cd /workspace/models/AI-Model-Zoo
wget https://www.xilinx.com/bin/public/openDownload?filename=openpose_pruned_0_3-vck5000-DPUCVDX8H-r1.4.1.tar.gz -O openpose_pruned_0_3-vck5000-DPUCVDX8H-r1.4.1.tar.gz
sudo mkdir /usr/share/vitis_ai_library/models
tar -xzvf openpose_pruned_0_3-vck5000-DPUCVDX8H-r1.4.1.tar.gz
sudo cp openpose_pruned_0_3 /usr/share/vitis_ai_library/models -r
sudo usermod -a -G video vitis-ai-user
/usr/bin/pip3 install matplotlib
conda activate vitis-ai-tensorflow2
cd /workspace/yoga-ai/
sh build.sh
要使用文章中的模型運行 3D 估計器以獲取單張圖片,請運行以下命令:(如果在冷重啟后第一次運行,則需要大約 30 秒來對卡進行編程)
./build/yoga-ai-picture ./model/article/article.xmodel ./data/temp/emily-sea-coiWR0gT8Cw-unsplash.jpg
generated ./data/temp/emily-sea-coiWR0gT8Cw-unsplash_result.jpg
generated ./data/temp/emily-sea-coiWR0gT8Cw-unsplash_1_plot.jpg
在這張圖片上運行 3D 姿態估計器:
將生成此 2D 姿勢結果:
以及以下 3D 結果:
更深層次的 DNN(res.xmodel):
./build/yoga-ai-picture ./model/residual/res.xmodel ./data/temp/emily-sea-coiWR0gT8Cw-unsplash.jpg
generated ./data/temp/emily-sea-coiWR0gT8Cw-unsplash_result.jpg
generated ./data/temp/emily-sea-coiWR0gT8Cw-unsplash_1_plot.jpg
對于多個主題:
./build/yoga-ai-picture ./model/article/article.xmodel ./data/temp/i-yunmai-BucQCjOvDyM-unsplash.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_result.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_1_plot.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_2_plot.jpg
./build/yoga-ai-picture ./model/residual/res.xmodel ./data/temp/i-yunmai-BucQCjOvDyM-unsplash.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_result.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_1_plot.jpg
generated ./data/temp/i-yunmai-BucQCjOvDyM-unsplash_2_plot.jpg
圖片中有三個主題,但其中只有兩個擁有所有錨點。
實時運行 3D 姿態估計器:
./build/yoga-ai-mt ./model/article/article.xmodel
or
./build/yoga-ai-mt ./model/residual/res.xmodel
這將打開它找到的第一個網絡攝像頭并運行 3D 姿勢估計器
FPS 受到房間照明的限制,而不是 2D 估計器或 2D 到 3D DNN 的限制,它們非常快,尤其是在批處理時(批處理最多 8 幀)。
不幸的是,我找不到 c++ 原生的 3D 繪圖庫,所以我使用了 python 中的 matplotlib 庫和 c++ 包裝器。它可以創建繪圖的速度約為 2-3 FPS,遠低于相機或姿勢估計器。
GAN 示例
將以 10 FPS 的速率從視頻中提取第一幀:
mkdir -p ./data/video/frames
find ./data/video -maxdepth 1 -name '*.webm' -print0 | xargs -0 -i sh -c 'fullfile="{}"; filename=${fullfile##*/}; name=${filename%%.*}; ffmpeg -i "$fullfile" -r 10/1 ./data/video/frames/"$name"%010d.jpg'
然后 2D 估計器將在每個圖像上運行:
./build/yoga-ai-multiple ./data/video/frames > ./data/video/frames.json
最后,帶有 2D 姿勢的 json 將被預處理(縮放、居中)并保存為 .tfrecords 文件:
python prepare_data_gan.py ./data/video/
訓練:
rm -rf ./logs/
rm -rf ./model/gan/*
python train-gan.py
選擇型號:
tensorboard --logdir logs/ --bind_all
生成器和鑒別器網絡都必須保持平衡,損失函數朝著不同的目標工作。
理想情況下,生成器和判別器的損失函數都應盡可能接近 1,這意味著判別器很難區分生成的解決方案和真實的解決方案。
Epoch 100 - 12.01 sec, Gen Loss: 1.3215000629425049, Disc Loss: 1.0641013383865356
Epoch 101 - 12.04 sec, Gen Loss: 1.4143874645233154, Disc Loss: 1.0295127630233765
Epoch 102 - 12.00 sec, Gen Loss: 1.3275189399719238, Disc Loss: 1.0719201564788818
Epoch 103 - 12.00 sec, Gen Loss: 1.3471262454986572, Disc Loss: 1.0649248361587524
Epoch 104 - 12.03 sec, Gen Loss: 1.3648614883422852, Disc Loss: 1.0483965873718262
Epoch 105 - 12.00 sec, Gen Loss: 1.387969732284546, Disc Loss: 1.0464917421340942
Epoch 106 - 12.01 sec, Gen Loss: 1.369732141494751, Disc Loss: 1.0375384092330933
Epoch 107 - 12.01 sec, Gen Loss: 1.3962113857269287, Disc Loss: 1.0418665409088135
Epoch 108 - 12.03 sec, Gen Loss: 1.391349196434021, Disc Loss: 1.0387295484542847
Epoch 109 - 12.02 sec, Gen Loss: 1.4321180582046509, Disc Loss: 1.0043883323669434
Epoch 110 - 12.02 sec, Gen Loss: 1.4454706907272339, Disc Loss: 1.0133466720581055
train-gan.py 腳本在每個 epoch 保存生成器網絡,我從 epoch 102 中選擇了網絡:
cp ./model/gan/gan_102.h5 ./model/gan/gan.h5
量化和編譯:
python -u quantize.py --float_model model/gan/gan.h5 --quant_model model/gan/quant_gan.h5 --batchsize 64 --evaluate 2>&1 | tee quantize.log
vai_c_tensorflow2 --model model/gan/quant_gan.h5 --arch /opt/vitis_ai/compiler/arch/DPUCVDX8H/VCK5000/arch.json --output_dir model/gan --net_name gan
結果:
./build/yoga-ai-mt ./model/gan/gan.xmodel
訓練
所有模型都訓練了 200 個 epoch,batch_size 為 64。
article.xmodel 和 res.xmodel 都使用 Human3.6M 數據集。
gan.xmodel 在一個包含 35 個來自 YouTube 的瑜伽視頻的數據庫上進行了訓練。從這些視頻中,使用 ffmpeg 提取了 859812 張圖像,然后使用 build/yoga-ai-multiple 實用程序(運行 2D open_pose)提取了 112210 個姿勢(存在所有錨點)。
更多結果
源文件
用于預處理數據集的腳本:
https://github.com/andrei-ace/yoga-ai/blob/master/prepare_data.py
https://github.com/andrei-ace/yoga-ai/blob/master/prepare_data_gan.py
https://github.com/andrei-ace/yoga-ai/blob/master/src/yoga-ai-multiple.cpp
用于訓練神經網絡的腳本:
https://github.com/andrei-ace/yoga-ai/blob/master/train-article.py
https://github.com/andrei-ace/yoga-ai/blob/master/train-res.py
https://github.com/andrei-ace/yoga-ai/blob/master/train-gan.py
演示程序:
https://github.com/andrei-ace/yoga-ai/blob/master/src/yoga-ai-picture.cpp
https://github.com/andrei-ace/yoga-ai/blob/master/src/yoga-ai-mt.cpp
結論
在 Human3.6M 數據集中找到的姿勢結果非常好,但對于看不見的姿勢卻不是很準確。該數據集不包含任何瑜伽姿勢,因此準確度有些低。創建更多數據集將大大提高預測的準確性,但最大的問題是它們需要昂貴的設備來生產。
GAN 方法似乎是最有前途的方法,因為它只需要大量存在的 2D 數據。一個簡單的改進是從不同角度拍攝相同的姿勢,使用的 YouTube 視頻大多具有相同的角度。這不需要專業工作室中的任何昂貴設備,可以使用任何消費級相機,并且不需要同步它們,甚至不需要拍攝相同的演員。
- VT6000系列激光共聚焦掃描顯微鏡3D測量,圖像形態細節更清晰!
- XKF3 - 使用慣性和磁感應的 3D 方向的低功耗優化估計
- AD常用3D封裝庫(STEP)下載 370次下載
- 在AD19 PCB中添加3D封裝模型的詳細步驟 0次下載
- 3D Master產品使用手冊英文版 0次下載
- 基于視覺注意力的全卷積網絡3D內容生成方法 11次下載
- 采用自監督CNN進行單圖像深度估計的方法 13次下載
- 可有效區分復雜3D方向關系的3DR46模型 34次下載
- 基于全局背景光估計和顏色校正的圖像增強算法 6次下載
- Altium Designer的LED 3D封裝集成 212次下載
- 2D到3D視頻自動轉換系統 1次下載
- 3D卷積神經網絡的手勢識別 2次下載
- 基于局部姿態先驗的深度圖像3D人體運動捕獲方法 0次下載
- 裸眼3D詳解 0次下載
- 利用PADS實現3D可視化 477次下載
- 從單張圖像中揭示全局幾何信息:實現高效視覺定位的新途徑 416次閱讀
- 使用Python從2D圖像進行3D重建過程詳解 2024次閱讀
- 3D打印技術的種類 2201次閱讀
- 探索3D檢測需要做哪些適配 886次閱讀
- 基于幾何單目3D目標檢測的密集幾何約束深度估計器 845次閱讀
- iNeRF對RGB圖像進行類別級別的物體姿態估計 1331次閱讀
- 什么是3D成像_3D成像應用 8385次閱讀
- 3D CAD 設計軟件SolidWorks進行力學分析的教程 9810次閱讀
- 機器視覺中獲得3D圖像的幾種方法詳細資料說明 7300次閱讀
- 3D智能電視概念及原理分析 2217次閱讀
- 你知道3D運動雕塑嗎?利用AI檢測人體2D圖像并恢復成3D模型 4481次閱讀
- 基于DensePose的姿勢轉換系統,僅根據一張輸入圖像和目標姿勢 1w次閱讀
- 一款只通過單個普通的2D攝像頭就能實時捕捉視頻中的3D動作的系統 1.2w次閱讀
- 裸眼3d電視機趨勢分析 3729次閱讀
- FAIR和INRIA的合作提出人體姿勢估計新模型,適用于人體3D表面構建 5715次閱讀
下載排行
本周
- 1使用單片機實現七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 2聯想E46L DAOLL6筆記本電腦圖紙
- 1.10 MB | 2次下載 | 5 積分
- 3MATLAB繪圖合集
- 27.12 MB | 2次下載 | 5 積分
- 4PR735,使用UCC28060的600W交錯式PFC轉換器
- 540.03KB | 1次下載 | 免費
- 5UCC38C42 30W同步降壓轉換器參考設計
- 428.07KB | 1次下載 | 免費
- 6DV2004S1/ES1/HS1快速充電開發系統
- 2.08MB | 1次下載 | 免費
- 7模態分解合集matlab代碼
- 3.03 MB | 1次下載 | 2 積分
- 8美的電磁爐維修手冊大全
- 1.56 MB | 1次下載 | 5 積分
本月
- 1使用單片機實現七人表決器的程序和仿真資料免費下載
- 2.96 MB | 44次下載 | 免費
- 2UC3842/3/4/5電源管理芯片中文手冊
- 1.75 MB | 15次下載 | 免費
- 3DMT0660數字萬用表產品說明書
- 0.70 MB | 13次下載 | 免費
- 4TPS54202H降壓轉換器評估模塊用戶指南
- 1.02MB | 8次下載 | 免費
- 5STM32F101x8/STM32F101xB手冊
- 1.69 MB | 8次下載 | 1 積分
- 6HY12P65/HY12P66數字萬用表芯片規格書
- 0.69 MB | 6次下載 | 免費
- 7華瑞昇CR216芯片數字萬用表規格書附原理圖及校正流程方法
- 0.74 MB | 6次下載 | 3 積分
- 8華瑞昇CR215芯片數字萬用表原理圖
- 0.21 MB | 5次下載 | 3 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935119次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420061次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233084次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191367次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183335次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81581次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73807次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65987次下載 | 10 積分
評論
查看更多