- 人工智能
- 深度学习
- 机器学习
- 强化学习
【免费下载链接】TensorLayer
Deep Learning and Reinforcement Learning Library for Scientists and Engineers
导读
本指南以 TensorLayer 仓库中的 examples/app_tutorials/README.md 为核心,系统讲解两个开箱即用的计算机视觉应用:基于 COCO 2017 数据集训练的 YOLOv4 目标检测,以及基于 ICCV 2019 论文(Optimizing Network Structure for 3D Human Pose Estimation)实现的 LCN 2D→3D 人体姿态估计。读完本文,你将掌握两个应用的完整运行流程:如何下载与放置预训练权重、如何组织目录结构与输入数据、如何修改脚本参数并运行图像/视频推理,同时理解底层 tensorlayer/app/computer_vision.py 的统一封装调用机制,以及 yolov4.py、LCN.py 的源码级实现原理。
两个演示应用都通过 TensorLayer 的tl.app.computer_vision高层接口对外提供服务——一行代码拿到完整预训练模型,再传入一张图片或一帧视频,即可获得结构化 JSON 检测结果或 3D 关节点坐标。这使它们既适合作为入门 TensorLayer 推理流程的教程,也适合作为快速验证算法效果的实用工具。
一、应用总览与统一封装接口
在动手运行前,先理解两个应用的定位与它们在 TensorLayer 中的代码位置:
| 应用 | 核心能力 | 预训练数据 | 对应教程脚本 | 底层实现 |
|---|---|---|---|---|
| YOLOv4 目标检测 | 检测图像/视频中的目标并输出边界框与类别 | COCO 2017(80 类) | tutorial_object_detection_yolov4_image.py、tutorial_object_detection_yolov4_video.py | yolov4.py |
| LCN 3D 人体姿态估计 | 将 2D 人体关节点映射为 3D 坐标 | H3.6M(Human3.6M 数据集预处理结果) | tutorial_human_3dpose_estimation_LCN.py | LCN.py |
两个应用共用同一套高层封装:tensorlayer/app/computer_vision.py 中定义了object_detection与human_pose_estimation两个类,分别通过model_name参数选择模型:
object_detection('yolo4-mscoco'):内部实例化YOLOv4(NUM_CLASS=80, pretrained=True);human_pose_estimation('3D-pose'):内部实例化CGCNN(pretrained=True)。
调用时只需net(input_data)即可完成推理:YOLOv4 路径会依次执行yolo4_input_processing(缩放、归一化、组 batch)→ 前向计算 →yolo4_output_processing(解码特征图、NMS 后处理)→result_to_json(转成结构化结果);3D 姿态路径则直接调用 CGCNN 网络前向。这种“模型名即接口”的设计让后续扩展新模型非常容易——在类中新增一个model_name分支即可。
注意:
__init__阶段pretrained=True会立即触发预训练权重加载(见下文“权重文件与加载机制”),因此必须在模型文件就位后再运行脚本。
二、YOLOv4 目标检测实战
2.1 数据准备:下载权重并组织目录
YOLOv4 演示在 COCO 2017 数据集上训练。首先需要下载预训练权重文件yolov4_model.npz(原 README 提供的网盘链接提取码为idsz,该下载信息同样记录在 yolov4.py 的weights_url字典中),并将其放入./examples/app_tutorials/model/目录。最终目录结构如下:
${root}/examples └── app_tutorials └── model ├── yolov4_model.npz ├── coco.names └── yolov4_weights_config.txt其中三个文件各有分工:
yolov4_model.npz:预训练权重文件(NumPy 压缩格式),由restore_params加载;coco.names:COCO 数据集的 80 个类别名称列表(person、bicycle、car……),用于将类别 ID 映射为可读名称,read_class_names 会逐行读取它;yolov4_weights_config.txt:权重加载配置文件,共 541 行,逐行列出模型中每个可训练变量在.npz文件中的键名(形如layer_with_weights-0/kernel/.ATTRIBUTES/VARIABLE_VALUE、layer_with_weights-1/beta/...等)。加载逻辑见 yolov4.py 的 restore_params:遍历配置文件每一行,把对应键名的权重数组逐个assign到network.all_weights[i]。
准备好模型文件后,把待检测的图片或视频放到./examples/app_tutorials/data/目录下,如*.jpg、*.png、*.mp4等:
${root}/examples └── app_tutorials └── data └── *.jpg/*.png/*.mp4/..2.2 图像检测演示
编辑 tutorial_object_detection_yolov4_image.py 中的image_path变量,指向你自己的输入图片(脚本默认值是'./data/kite.jpg'),然后运行:
python tutorial_object_detection_yolov4_image.py脚本核心流程(约 15 行):
read_class_names('./model/coco.names')读取 80 个类别名;- 用 OpenCV 读取图片并转为 RGB;
net = computer_vision.object_detection('yolo4-mscoco')创建封装模型(此时加载预训练权重);json_result = net(original_image)推理,得到结构化检测结果;visualize.draw_boxes_and_labels_to_image_with_json(image, json_result, class_names)在原图上绘制边界框与类别标签;- 用 PIL 显示结果图。
检测结果以 JSON 列表形式返回,每个元素形如{'image': None, 'category_id': 类别ID, 'bbox': [x1, y1, x2, y2], 'score': 置信度},生成逻辑见 result_to_json。bbox为像素坐标系下的左上角与右下角坐标[x1, y1, x2, y2],score为置信度分数。
下图是官方演示中图像检测的典型输出效果:
2.3 视频检测演示
编辑 tutorial_object_detection_yolov4_video.py 中的video_path(默认'./data/road.mp4'),然后运行:
python tutorial_object_detection_yolov4_video.py视频脚本与图像脚本的差异在于:
- 使用
cv2.VideoCapture(video_path)逐帧读取;若想调用摄像头,可改成cv2.VideoCapture(0)(0 为设备上的摄像头序号,脚本中已以注释形式给出示例); - 逐帧调用
net(frame)推理,并把每帧的绘制结果通过cv2.imshow("result", result)实时显示,按q键退出循环; - 帧读取失败时,若已处理到最后一帧则打印
"Video processing complete"正常结束,否则抛出ValueError("No image! Try with another video format")提示检查视频格式。
2.4 底层原理:从特征图到检测框
理解源码能帮你更好地调参与排查问题。YOLOv4 网络由 yolov4.py 用 TensorLayer 层 API 搭出:主干网络cspdarknet53(CSPDarknet53,含 Mish 激活的残差块与 SPP 多尺度池化拼接),配合 PANet 式的上采样路径,最终在三个尺度输出特征图conv_sbbox / conv_mbbox / conv_lbbox,每个输出通道数为3 * (NUM_CLASS + 5)(3 个 anchor、每个 anchor 有 4 个坐标、1 个置信度、NUM_CLASS 个类别概率)。
推理后处理集中在 common.py:
- 输入处理
yolo4_input_processing:将图片cv2.resize到 416×416、除以 255 归一化、扩展 batch 维度; - 特征解码
decode_tf:结合网格坐标与 STRIDES([8, 16, 32])还原预测框中心与宽高,再用 sigmoid 得到置信度与类别概率; - 框过滤
filter_boxes:按score_threshold=0.2过滤低分框; - 最终用
tf.image.combined_non_max_suppression做 NMS(iou_threshold=0.45、score_threshold=0.25、每类最多 50 个框、总数最多 50 个),输出归一化坐标的检测框。
如果你需要调整检测灵敏度,可以在 yolo4_output_processing 中修改这些阈值参数。
三、LCN 3D 人体姿态估计实战
3.1 数据准备:权重与 H3.6M 数据
本应用复现的是 ICCV 2019 论文Optimizing Network Structure for 3D Human Pose Estimation中的 LCN(Local Connected Network)方法,参考实现为 pose_lcn。需要准备两类文件:
(1)预训练权重:下载lcn_model.npz(原 README 网盘链接提取码为ec07,同样记录在 LCN.py 的weights_url中),放入./examples/app_tutorials/model/:
${root}/examples └── app_tutorials └── model ├── lcn_model.npz └── pose_weights_config.txtpose_weights_config.txt共 44 行,记录 CGCNN 网络各权重在.npz中的键名(如linear_model/w1、linear_model/b1、linear_model/two_linear_0/w2_0等)。与 YOLOv4 不同,LCN 的加载逻辑(restore_params)会对二维权重额外执行mask_weight处理(应用骨骼邻接掩码),再赋给network.all_weights[i]。
(2)数据集:下载经 Stacked Hourglass 检测器微调(finetuned detections)并预处理的 H3.6M 数据压缩包(原 README 网盘链接提取码为kw9i),解压后放入./examples/app_tutorials/data/:
${root}/examples └── app_tutorials └── data ├── h36m_sh_dt_ft.pkl ├── h36m_test.pkl └── h36m_train.pkl三个.pkl文件(h36m_sh_dt_ft.pkl为 2D 检测结果,h36m_train.pkl/h36m_test.pkl为训练/测试集标注)由 common.py 中的 DataReader 读取。每个样本是一个长度为 34 的列表,表示 17 个人体关节点(每点[x, y]两个坐标)。17 个关节点依次为:Hip、RHip、RKnee、RFoot、LHip、LKnee、LFoot、Belly、Neck、Nose、Head、LShoulder、LElbow、LHand、RShoulder、RElbow、RHand(定义见 H36M_NAMES)。
如需了解 H3.6M 原始数据的准备细节,可参考上游项目 pose_lcn 的说明(README 中给出了对应链接,但注意数据格式与预处理方式以本仓库教程脚本的实际读取逻辑为准)。
3.2 运行 3D 姿态演示
数据就位后,直接在examples/app_tutorials/目录下运行:
python tutorial_human_3dpose_estimation_LCN.py脚本流程如下:
DataReader().read_2d(which='scale', mode='gt', read_confidence=False)读取 2D 关节点(归一化到[-1, 1]区间,reshape 为[N, 17*2]);read_3d(which='scale', mode='gt')读取对应的 3D 真值([N, 17*3]);network = computer_vision.human_pose_estimation('3D-pose')创建预训练 CGCNN 模型;flip_data(test_data)对测试数据做水平翻转扩充(把左右关节互换、x 坐标取反),以利用模型对镜像样本的预测结果;result = network(test_data)推理,输出 3D 预测;- 分别用
denormalize3D/denormalize2D把预测、输入、真值还原回原始尺度; visualize_3D_pose(test_data, test_labels, result)绘制 4 个样例的对比图:每行展示 2D 输入、3D 真值、3D 预测三幅子图。
该演示把 2D 关节点映射到 3D 空间,输出结果中每个样本是长度为 51 的列表,表示 17 个关节点各自的[x, y, z]坐标。visualize_3D_pose绘制的是 4 个样例(注释中提示可按需修改),效果类似下图:
3.3 底层原理:LCN / CGCNN 网络结构
从 LCN.py 源码看,模型是一个掩码全连接网络:
- 输入形状为
(BATCH_SIZE=200, 17*2); - 首层
Mask_layer(17×2 → 17×F,F=64)后接 BatchNorm(LeakyReLU)+ Dropout(0.8); - 中间堆叠 3 个双线性残差块
two_linear_*:每个块内含两层Mask_layer(各接 BatchNorm 与 Dropout),并用Elementwise(tf.add)做残差连接; - 末层映射到
17*3,再由End_layer把 2D 输入坐标与预测的 3D 位移相加,得到最终绝对 3D 坐标。
核心在于Mask_layer:它依据 common.py 中的 neighbour_matrix(一个 17×17 的骨骼邻接矩阵,非零位置表示两个关节点在解剖学上相邻)对全连接权重做掩码——mask_weight将权重 reshape 成[17, in_F, 17, out_F]后与邻接掩码逐元素相乘,从而只保留相邻关节之间的连接,实现“局部连接”结构,这正是 LCN 名称的由来。此外训练版本还支持locally_connected_learnable掩码(可学习)与不同初始化方式,详见Base_layer._initialize_mask。
四、运行环境与常见问题
4.1 环境要求
- 本仓库为 TensorFlow 2.x 时代的 TensorLayer 实现,两个应用均基于 TensorFlow 编写,运行前需安装 TensorFlow 与 TensorLayer(依赖清单可参考 requirements/requirements.txt);
- 额外需要 OpenCV(
cv2)、NumPy、Pillow、Matplotlib(3D 可视化用)等依赖,教程脚本顶部均有对应import。
4.2 权重加载失败的排查
两个模型的restore_params都采用 try/except 包裹np.load:若找不到.npz文件,会打印提示“Download the model file, placed in the /model”,并输出weights_url中的下载链接与提取码。因此遇到此类提示,请先确认:
.npz文件是否已下载并放置在examples/app_tutorials/model/目录;- 运行脚本时的工作目录是否为
examples/app_tutorials/(脚本中'model/yolov4_model.npz'、'model/lcn_model.npz'均为相对路径); yolov4_weights_config.txt/pose_weights_config.txt是否与.npz文件同目录且内容完整(前者的行数需覆盖全部 541 个可训练变量,后者 44 行)。
4.3 路径与输入格式注意事项
- 图像/视频脚本中的
image_path、video_path都是相对路径,默认指向./data/目录;视频脚本若读取失败,会提示检查视频格式(OpenCV 对部分编码的 mp4 支持有限,可先转成常见 H.264 编码再试); - 3D 姿态脚本的
DataReader通过ROOT_PATH = '../../examples/app_tutorials/data/'(common.py)定位数据文件,该路径以仓库根目录为基准设计,请勿移动教程脚本位置; - 若想调整 3D 可视化展示的样例数量,可修改 visualize_3D_pose 中的
nsamples参数。
五、扩展与参考
5.1 直接使用高层 API 集成到自己的项目
两个应用的封装接口同样可以在你自己的代码中直接复用:
from tensorlayer.app import computer_vision import cv2 # 目标检测:输入 BGR 图片,输出 JSON 列表 net = computer_vision.object_detection('yolo4-mscoco') img = cv2.imread('your_image.jpg') results = net(img) # [{'category_id': int, 'bbox': [x1,y1,x2,y2], 'score': float}, ...] # 3D 姿态估计:输入 2D 关节点数组 [N, 34],输出 3D 坐标 [N, 51] net2 = computer_vision.human_pose_estimation('3D-pose') pose3d = net2(two_d_poses) # 每个样本为 17 个点的 [x, y, z]object_detection.list与human_pose_estimation.list属性会打印当前支持的模型名列表('yolo4-mscoco'与'3D-pose')。检测结果绘制可配合 tensorlayer/visualize.py 中的draw_boxes_and_labels_to_image_with_json使用。
5.2 源码导航清单
- 应用封装入口:tensorlayer/app/computer_vision.py
- YOLOv4 网络定义与权重加载:tensorlayer/app/computer_vision_object_detection/yolov4.py
- YOLOv4 输入输出处理与 NMS 后处理:tensorlayer/app/computer_vision_object_detection/common.py
- LCN / CGCNN 网络定义:tensorlayer/app/human_pose_estimation/LCN.py
- 姿态数据读取、归一化与 3D 可视化:tensorlayer/app/human_pose_estimation/common.py
- 四个演示脚本与权重配置文件:examples/app_tutorials/
- 官方结果图:docs/images/(含
yolov4_image_result.png、yolov4_video_result.gif、human_pose_points.jpg、3d_human_pose_result.jpg)
致谢说明
按原 README 的说明:YOLOv4 部分基于 darknet(AlexeyAB)与 tensorflow-yolov4-tflite(hunglc007)两个开源实现构建;3D 人体姿态估计部分基于 pose_lcn(rujiewu)与 3d-pose-baseline(una-dinosauria)构建。两个应用的原始论文分别为 YOLOv4: Optimal Speed and Accuracy of Object Detection 与上述 ICCV 2019 论文,相关文献信息保留在 examples/app_tutorials/README.md 末尾的参考链接中。
至此,你已经掌握了 TensorLayer 内置的两个计算机视觉应用从数据准备、权重下载、脚本运行到源码原理的完整链路。建议按“先跑通 YOLOv4 图像检测 → 再尝试视频与摄像头 → 最后运行 3D 姿态估计并修改可视化参数”的顺序实践,可以最快建立对 TensorLayer 高层推理接口的整体认知。
- 人工智能
- 深度学习
- 机器学习
- 强化学习
【免费下载链接】TensorLayer
Deep Learning and Reinforcement Learning Library for Scientists and Engineers
相关推荐
ALS网络监控平台:核心功能解析与实战部署指南
ALS网络监控平台:核心功能解析与实战部署指南 Another Looking glass Server ALS 是一个功能全面的网络性能监控与测试平台,专为服
后端网络BitCPM4-CANN-1B-gguf:华为昇腾NPU原生1.58位大语言模型完整指南
BitCPM4 CANN 1B gguf:华为昇腾NPU原生1.58位大语言模型完整指南 BitCPM4 CANN 1B gguf是基于华为昇腾NPU原生构建的
ViTPose人体姿态估计:零基础快速上手实战指南
ViTPose人体姿态估计:零基础快速上手实战指南 还在为复杂的人体姿态估计项目头疼吗?ViTPose通过革命性的Vision Transformer架构,让骨
人工智能计算机视觉深度学习
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考