實時單人姿態估計,在自己手機上就能實現:)

本文介紹了如何使用 TensorFlow 在智能機上(包含安卓和 iOS 設備)執行實時單人姿態估計。

GitHub 地址:https://github.com/edvardHua/PoseEstimationForMobile

該 repo 使用 TensorFlow 實現 CPM 和 Hourglass 模型。這里未使用常規的卷積,而是在模型內部使用了反向卷積(又叫 Mobilenet V2),以便執行實時推斷。

實時單人姿態估計,在自己手機上就能實現:)安卓iOS都可以哦~

注:你可以修改網絡架構,來訓練更高 PCKh 的模型。架構地址:https://github.com/edvardHua/PoseEstimationForMobile/tree/master/training/src

該庫包含:

  • 訓練 CPM 和 Hourglass 模型的代碼;
  • 安卓 demo 的源代碼;
  • IOS demo 的源代碼。

下面的 gif 是在 Mi Mix2s 上截取的(~60 FPS)

實時單人姿態估計,在自己手機上就能實現:)安卓iOS都可以哦~

你可以下載以下 apk,在自己的設備上進行測試。

實時單人姿態估計,在自己手機上就能實現:)安卓iOS都可以哦~


  • PoseEstimation-Mace.apk:https://raw.githubusercontent.com/edvardHua/PoseEstimationForMobile/master/release/PoseEstimation-Mace.apk
  • PoseEstimation-TFlite.apk:https://raw.githubusercontent.com/edvardHua/PoseEstimationForMobile/master/release/PoseEstimation-TFlite.apk

訓練

依賴項

  • Python3
  • TensorFlow >= 1.4
  • Mace

數據集

訓練數據集:https://drive.谷歌.com/open?id=1zahjQWhuKIYWRRI2ZlHzn65Ug_jIiC4l

將其解壓縮,獲取以下文件結構:

# root @ ubuntu in ~/hdd/ai_challenger
$ tree -L 1 ..
├── ai_challenger_train.json
├── ai_challenger_valid.json
├── train
└── valid

該訓練數據集僅包含單人圖像,數據來源是 AI Challenger 競賽。共包含 22446 個訓練樣本和 1500 個測試樣本。

該 repo 作者使用 tf-pose-estimation 庫中的數據增強代碼將標注遷移為 COCO 格式。tf-pose-estimation 庫:https://github.com/ildoonet/tf-pose-estimation

超參數

訓練步驟中,使用 experiments 文件夾中的 cfg 文件傳輸超參數。

以下是 mv2_cpm.cfg 文件的內容:

[Train]
model: 'mv2_cpm'
checkpoint: False
datapath: '/root/hdd/ai_challenger'
imgpath: '/root/hdd/'
visible_devices: '0, 1, 2'
multiprocessing_num: 8
max_epoch: 1000
lr: '0.001'
batchsize: 5
decay_rate: 0.95
input_width: 192
input_height: 192
n_kpoints: 14
scale: 2
modelpath: '/root/hdd/trained/mv2_cpm/models'
logpath: '/root/hdd/trained/mv2_cpm/log'
num_train_samples: 20000
per_update_tensorboard_step: 500
per_saved_model_step: 2000
pred_image_on_tensorboard: True

該 cfg 文件覆蓋模型的所有參數,在 network_mv2_cpm.py 中仍有一些參數。

使用 nvidia-docker 訓練

通過以下命令構建 docker:

cd training/docker
docker build -t single-pose .

或者

docker pull edvardhua/single-pose

然后運行以下命令,訓練模型:

nvidia-docker run -it -d 
-v :/data5 -v /training:/workspace
-p 6006:6006 -e LOG_PATH=/root/hdd/trained/mv2_cpm/log
-e PARAMETERS_FILE=experiments/mv2_cpm.cfg edvardhua/single-pose

此外,它還在 port 6006 上創建了 tensorboard。確保安裝了 nvidia-docker。

按一般方法訓練

1. 安裝依賴項:

cd training
pip3 install -r requirements.txt

還需要安裝 cocoapi (https://github.com/cocodataset/cocoapi)。

2. 編輯 experiments 文件夾中的參數文件,它包含幾乎所有超參數和訓練中需要定義的其他配置。之后,傳輸參數文件,開始訓練:

cd training
python3 src/train.py experiments/mv2_cpm.cfg

在 3 張英偉達 1080Ti 顯卡上經過 12 個小時的訓練后,該模型幾乎收斂。以下是對應的 tensorboard 圖。

實時單人姿態估計,在自己手機上就能實現:)安卓iOS都可以哦~

基準(PCKh)

運行以下命令,評估 PCKh 值。

python3 src/benchmark.py --frozen_pb_path=hourglass/model-360000.pb 
--anno_json_path=/root/hdd/ai_challenger/ai_challenger_valid.json
--img_path=/root/hdd
--output_node_name=hourglass_out_3

預訓練模型

  • CPM:https://github.com/edvardHua/PoseEstimationForMobile/tree/master/release/cpm_model
  • Hourglass:https://github.com/edvardHua/PoseEstimationForMobile/tree/master/release/hourglass_model

安卓 demo

由于 mace 框架,你可以使用 GPU 在安卓智能機上運行該模型。

依照以下命令將模型轉換為 mace 格式:

cd # You transer hourglass or cpm model by changing `yml` file.
python tools/converter.py convert --config=/release/mace_ymls/cpm.yml

然后根據 mace 文檔的說明,將模型集成到安卓設備中。

至于如何調用模型、解析輸出,可以參見安卓源代碼:https://github.com/edvardHua/PoseEstimationForMobile/tree/master/android_demo。

一些芯片的平均推斷時間基準如下所示:


實時單人姿態估計,在自己手機上就能實現:)安卓iOS都可以哦~

以下是該 repo 作者構建該 demo 的環境:

  • 操作系統:macOS 10.13.6(mace 目前不支持 windows)
  • Android Studio:3.0.1
  • NDK 版本:r16

在構建 mace-demo 時,不同環境可能會遇到不同的錯誤。為避免這種情況,作者建議使用 docker。

docker pull registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite
docker run -it
--privileged -d --name mace-dev
--net=host
-v to/you/path/PoseEstimationForMobile/android_demo/demo_mace:/demo_mace
registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite
docker run -it --privileged -d --name mace-dev --net=host
-v to/you/path/PoseEstimationForMobile/android_demo/demo_mace:/demo_mace
registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite
# Enter to docker
docker exec -it mace-dev bash
# Exec command inside the dockercd /demo_mace && ./gradlew build

或者將模型轉換為 tflite:

# Convert to frozen pb.cd training
python3 src/gen_frozen_pb.py
--checkpoint=/model-xxx --output_graph=/model-xxx.pb
--size=192 --model=mv2_cpm_2
# If you update tensorflow to 1.9, run following command.
python3 src/gen_tflite_coreml.py
--frozen_pb=forzen_graph.pb
--input_node_name='image'
--output_node_name='Convolutional_Pose_Machine/stage_5_out'
--output_path='./'
--type=tflite
# Convert to tflite.# See https://github.com/tensorflow/tensorflow/blob/master/tensorflow/docs_src/mobile/tflite/devguide.md for more information.
bazel-bin/tensorflow/contrib/lite/toco/toco
--input_file=/model-xxx.pb
--output_file=/mv2-cpm.tflite
--input_format=TENSORFLOW_GRAPHDEF --output_format=TFLITE
--inference_type=FLOAT
--input_shape="1,192,192,3"
--input_array='image'
--output_array='Convolutional_Pose_Machine/stage_5_out'

然后,將 tflite 文件放在 android_demo/app/src/main/assets 中,修改 ImageClassifierFloatInception.kt 中的參數。

............// parameters need to modify in ImageClassifierFloatInception.kt/** * Create ImageClassifierFloatInception instance * * @param imageSizeX Get the image size along the x axis. * @param imageSizeY Get the image size along the y axis. * @param outputW The output width of model * @param outputH The output height of model * @param modelPath Get the name of the model file stored in Assets. * @param numBytesPerChannel Get the number of bytes that is used to store a single * color channel value. */
fun create(
activity: Activity,
imageSizeX: Int = 192,
imageSizeY: Int = 192,
outputW: Int = 96,
outputH: Int = 96,
modelPath: String = "mv2-cpm.tflite",
numBytesPerChannel: Int = 4
): ImageClassifierFloatInception =
ImageClassifierFloatInception(
activity,
imageSizeX,
imageSizeY,
outputW,
outputH,
modelPath,
numBytesPerChannel)............

最后,將該項目導入 Android Studio,在智能機設備上運行。

iOS Demo

首先,將模型轉換為 CoreML 模型:

# Convert to frozen pb.cd training
python3 src/gen_frozen_pb.py
--checkpoint=/model-xxx --output_graph=/model-xxx.pb
--size=192 --model=mv2_cpm_2
# Run the following command to get mlmodel
python3 src/gen_tflite_coreml.py
--frozen_pb=forzen_graph.pb
--input_node_name='image'
--output_node_name='Convolutional_Pose_Machine/stage_5_out'
--output_path='./'
--type=coreml

然后,依照 PoseEstimation-CoreML 中的說明來操作(https://github.com/tucan9389/PoseEstimation-CoreML)。

上一篇:華為5G手機開賣 華為概念活躍5股漲停
下一篇:華為Mate 20 X (5G)今日首銷 5G雙模手機真的來了
彩神帝 乌鲁木齐市 | 罗江县 | 炉霍县 | 浮梁县 | 罗甸县 | 绵阳市 | 怀仁县 | 宝坻区 | 广河县 | 新蔡县 | 平定县 | 安宁市 | 宕昌县 | 铁岭市 | 安化县 | 彩票 | 沙坪坝区 | 开阳县 | 绥德县 | 枣强县 | 扬州市 | 海门市 | 临洮县 | 威海市 | 商河县 | 甘孜 | 霍州市 | 敦煌市 | 宿迁市 | 确山县 | 江油市 | 措勤县 | 景谷 | 桂林市 | 满城县 | 胶州市 | 济宁市 | 溆浦县 | 高碑店市 | 通江县 | 枞阳县 | 珲春市 | 东至县 | 南靖县 | 漠河县 | 呼图壁县 | 会宁县 | 常德市 | 密云县 | 长兴县 | 海丰县 | 麟游县 | 洮南市 | 黄冈市 | 双牌县 | 乌拉特后旗 | 沐川县 | 长沙市 | 光山县 | 靖江市 | 贵南县 | 望谟县 | 城步 | 平果县 | 金门县 | 三穗县 | 都兰县 | 尉犁县 | 南昌县 | 天峨县 | 赤壁市 | 休宁县 | 绥芬河市 | 太原市 | 兴海县 | 抚州市 | 广昌县 | 额济纳旗 | 日喀则市 | 怀来县 | 石柱 | 巴里 | 屏东市 | 闽侯县 | 贵州省 | 杂多县 | 宕昌县 | 德令哈市 | 岚皋县 | 吴忠市 | 盐源县 | 沐川县 | 通山县 | 凤阳县 | 中宁县 | 平邑县 | 葫芦岛市 | 黄大仙区 | 绥中县 | 平舆县 | 蒙自县 | 高州市 | 滦南县 | 中牟县 | 蕉岭县 | 平昌县 | 岳阳县 | 漳浦县 | 赤壁市 | 太康县 | 福州市 | 高平市 | 景泰县 | 三门峡市 | 青河县 | 贺州市 | 灯塔市 | 山东 | 铁力市 | 高要市 | 新晃 | 永靖县 | 宝坻区 | 闵行区 | 义乌市 | 洪泽县 | 固安县 | 洪泽县 | 科尔 | 长汀县 | 肃南 | 朝阳区 | 阿勒泰市 | 章丘市 | 伊吾县 | 永吉县 | 新化县 | 博湖县 | 容城县 | 九台市 | 大丰市 | 宜丰县 | 万源市 | 会理县 | 湄潭县 | 澄江县 | 新丰县 | 佛坪县 | 巴中市 | 广饶县 | 焉耆 | 通道 | 东平县 | 龙游县 | 张北县 | 水富县 | 洱源县 | 三江 | 米脂县 | 施秉县 | 漠河县 | 顺义区 | 上林县 | 汝州市 | 绵阳市 | 廉江市 | 道孚县 | 西乌 | 灌阳县 | 崇信县 | 陇南市 | 曲阜市 | 同江市 | 包头市 | 衡水市 | 忻城县 | 乐陵市 | 河南省 | 株洲市 | 玛沁县 | 永城市 | 建昌县 | 乐山市 | 和龙市 | 禄丰县 | 安乡县 | 涟水县 | 阳江市 | 芜湖县 | 布尔津县 | 和政县 | 常州市 | 滕州市 | 平乐县 | 甘南县 | 宁国市 | 凯里市 | 安远县 | 宁强县 | 彰化市 | 长葛市 | 张北县 | 都安 | 巴林右旗 | 治多县 | 南昌县 | 垦利县 | 呼玛县 | 恩施市 | 饶平县 | 山东省 | 泗水县 | 永定县 | 固安县 | 东安县 | 桐柏县 | 湖南省 | 洛阳市 | 峨山 | 五莲县 | 嘉善县 | 镇安县 | 翁牛特旗 | 克什克腾旗 | 双江 | 临城县 | 图木舒克市 | 古田县 | 郧西县 | 宝鸡市 | 志丹县 | 屏东县 | 商都县 | 淮南市 | 鄂托克旗 | 陵川县 | 台中县 | 吴桥县 | 南江县 | 洪泽县 | 固原市 | 修武县 | 呈贡县 | 壤塘县 | 江达县 | 开封县 | 文安县 | 遂平县 | 泌阳县 | 阿勒泰市 | 庐江县 |