手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

news2024/11/25 5:44:41

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

目录

手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集

1. 前言

2.手部关键点检测(手部姿势估计)方法

(1)Top-Down(自上而下)方法

(2)Bottom-Up(自下而上)方法:

3.手部关键点检测数据集

4.手部关键点检测模型训练

(1)项目安装

(2)准备Train和Test数据

(3)配置文件configs

(4)开始训练

(5)Tensorboard可视化训练过程

5.手部关键点检测模型效果

6.手部关键点检测(推理代码)

7.手部关键点检测(训练代码)

8.手部关键点检测C++/Android版本


1. 前言

本篇文章是项目《手部关键点检测(手部姿势估计)》系列文章之《Pytorch实现手部关键点检测(手部姿势估计)》;项目基于Pytorch深度学习框架,实现手部关键点检测(手部姿势估计)模型,其中手部检测采用YOLOv5模型,手部关键点检测是基于开源的HRNet进行改进,构建了整套手部关键点检测的训练和测试流程;为了方便后续模型工程化和Android平台部署,项目支持高精度HRNet检测模型,轻量化模型LiteHRNet和Mobilenet模型训练和测试,并提供Python/C++/Android多个版本;

轻量化Mobilenet-v2模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约50ms左右,GPU约30ms左右 ,基本满足业务的性能需求。下表格给出HRNet,以及轻量化模型LiteHRNet和Mobilenet的计算量和参数量,以及其检测精度

模型input-sizeparams(M)GFLOPsAP
HRNet-w32192×19228.48M5734.05M0.8570
LiteHRNet18192×1921.10M182.15M0.8023
Mobilenet-v2192×1922.63M529.25M0.7574

先展示一下手部检测以及手部关键点检测(手部姿势估计)效果:

Android手部关键点检测(手部姿势估计)APP Demo体验:

https://download.csdn.net/download/guyuealian/88418582

【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/133277726


更多项目《手部关键点检测(手部姿势估计)》系列文章请参考:

  • 手部关键点检测1:手部关键点(手部姿势估计)数据集(含下载链接)https://blog.csdn.net/guyuealian/article/details/133277630
  • 手部关键点检测2:YOLOv5实现手部检测(含训练代码和数据集)https://blog.csdn.net/guyuealian/article/details/133279222
  • 手部关键点检测3:Pytorch实现手部关键点检测(手部姿势估计)含训练代码和数据集https://blog.csdn.net/guyuealian/article/details/133277726
  • 手部关键点检测4:Android实现手部关键点检测(手部姿势估计)含源码 可实时检测https://blog.csdn.net/guyuealian/article/details/133277732
  • 手部关键点检测5:C++实现手部关键点检测(手部姿势估计)含源码 可实时检测https://blog.csdn.net/guyuealian/article/details/133277748

 


2.手部关键点检测(手部姿势估计)方法

手部关键点检测(手部姿势估计)的方法,目前主流的方法主要两种:一种是Top-Down(自上而下)方法,另外一种是Bottom-Up(自下而上)方法;

(1)Top-Down(自上而下)方法

将手部检测和手部关键点估计分离,在图像上首先进行手部目标检测,定位手部位置;然后crop每一个手部图像,再估计每个手部的关键点;这类方法往往比较慢,但姿态估计准确度较高。目前主流模型主要有CPN,Hourglass,CPM,Alpha Pose,HRNet等。

(2)Bottom-Up(自下而上)方法:

先估计图像中所有手部的关键点,然后在通过Grouping的方法组合成一个一个手部实例;因此这类方法在测试推断的时候往往更快速,准确度稍低。典型就是COCO2016年人体关键点检测冠军Open Pose。

通常来说,Top-Down具有更高的精度,而Bottom-Up具有更快的速度;就目前调研而言, Top-Down的方法研究较多,精度也比Bottom-Up(自下而上)方法高。

本项目基于开源的HRNet进行改进,关于HRNet项目请参考GitHub

HRNet: https://github.com/leoxiaobin/deep-high-resolution-net.pytorch


3.手部关键点检测数据集

项目收集了三个手部检测数据集和三个手部关键点数据集:

  • 手部检测数据集(Hand Detection Dataset)共收集了三个:Hand-voc1,Hand-voc2和Hand-voc3,总共60000+张图片;标注格式统一转换为VOC数据格式,标注名称为hand,可用于深度学习手部目标检测模型算法开发
  • 手部关键点数据集(Hand Keypoints Dataset,Hand Pose Estimation共收集了三个:分别为HandPose-v1,HandPose-v2和HandPose-v3,总共80000+张图片,标注了手部21个关键点,可用于深度学习手部姿态检测模型算法开发。

关于手部关键点检测数据集说明,请参考:手部关键点(手部姿势估计)数据集(含下载链接) https://blog.csdn.net/guyuealian/article/details/133277630​​


4.手部关键点检测模型训练

 整套工程项目基本结构如下:

.
├── configs              # 训练配置文件
├── data                 # 一些数据
├── libs                 # 一些工具库
├── pose                 # 姿态估计模型文件
├── work_space           # 训练输出工作目录
├── demo.py              # 模型推理demo文件
├── README.md            # 项目工程说明文档
├── requirements.txt     # 项目相关依赖包
└── train.py             # 训练文件

(1)项目安装

项目依赖python包请参考requirements.txt,使用pip安装即可,项目代码都在Ubuntu系统和Windows系统验证正常运行,请放心使用;若出现异常,大概率是相关依赖包版本没有完全对应

numpy==1.16.3
matplotlib==3.1.0
Pillow==6.0.0
easydict==1.9
opencv-contrib-python==4.5.2.52
opencv-python==4.5.1.48
pandas==1.1.5
PyYAML==5.3.1
scikit-image==0.17.2
scikit-learn==0.24.0
scipy==1.5.4
seaborn==0.11.2
tensorboard==2.5.0
tensorboardX==2.1
torch==1.7.1+cu110
torchvision==0.8.2+cu110
tqdm==4.55.1
xmltodict==0.12.0
basetrainer
basetrainer
pybaseutils==0.9.4
pycocotools==2.0.6

项目安装教程请参考(初学者入门,麻烦先看完下面教程,配置好开发环境):

  • 项目开发使用教程和常见问题和解决方法
  • 视频教程:1 手把手教你安装CUDA和cuDNN(1)
  • 视频教程:2 手把手教你安装CUDA和cuDNN(2)
  • 视频教程:3 如何用Anaconda创建pycharm环境
  • 视频教程:4 如何在pycharm中使用Anaconda创建的python环境

(2)准备Train和Test数据

下载手部关键点检测数据集:HandPose-v1,HandPose-v2和HandPose-v3,然后解压到本地

(3)配置文件configs

项目支持HRNet以及轻量化模型LiteHRNet和Mobilenet模型训练,并提供对应的配置文件;你需要修改对应配置文件的数据路径;本篇以训练HRNet-w32为例子,其配置文件在configs/coco/hrnet/w32_adam_hand_192_192.yaml,修改该文件的训练数据集路径TRAIN_FILE(支持多个数据集训练)和测试数据集TEST_FILE的数据路径为你本地数据路径,其他参数保持默认即可,如下所示:

WORKERS: 8
PRINT_FREQ: 10
DATASET:
  DATASET: 'custom_coco'
  TRAIN_FILE:
    - 'D:/dataset/HandPose-v1/train/train_anno.json'
    - 'D:/dataset/HandPose-v2/train/train_anno.json'
    - 'D:/dataset/HandPose-v3/train/train_anno.json'
  TEST_FILE: 'D:/dataset/HandPose-v1/test/test_anno.json'
  FLIP: true
  ROT_FACTOR: 45
  SCALE_FACTOR: 0.3
  SCALE_RATE: 1.25
  JOINT_IDS: [ ]
  FLIP_PAIRS: [ ]
  SKELETON: [ [ 0, 1 ], [ 1, 2 ], [ 2, 3 ], [ 3, 4 ], [ 0, 5 ], [ 5, 6 ], [ 6, 7 ], [ 7, 8 ],  [ 5, 9 ], [ 9, 10 ], [ 10, 11 ], [ 11, 12 ], [ 9, 13 ], [ 13, 14 ], [ 14, 15 ], [ 15, 16 ], [ 13, 17 ], [ 17, 18 ], [ 18, 19 ], [ 19, 20 ], [ 0, 17 ] ]

配置文件的一些参数说明,请参考

参数类型参考值说明
WORKERSint8数据加载处理的进程数
PRINT_FREQint10打印LOG信息的间隔
DATASETstrcustom_coco数据集类型,目前仅支持COCO数据格式
TRAIN_FILEList-训练数据集文件列表(COCO数据格式),支持多个数据集
TEST_FILEstring-测试数据集文件(COCO数据格式),仅支持单个数据集
FLIPboolTrue是否翻转图片进行测试,可提高测试效果
ROT_FACTORfloat45训练数据随机旋转的最大角度,用于数据增强
SCALE_FACTORfloat1.25图像缩放比例因子
SCALE_RATEfloat0.25图像缩放率
JOINT_IDSlist[ ][ ]表示所有关键点,也可以指定需要训练的关键点序号ID
FLIP_PAIRSlist[ ]图像翻转时,关键点不受翻转影响的ID号
SKELETONlist[ ]关键点连接线的序列列表,用于可视化效果

(4)开始训练

修改好配置文件后,就可以开始准备训练了:

  • 训练高精度模型HRNet-w48或者HRNet-w32
# 高精度模型:HRNet-w48
python train.py  -c "configs/coco/hrnet/w48_adam_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
# 高精度模型:HRNet-w32
python train.py  -c "configs/coco/hrnet/w32_adam_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
  • 训练轻量化模型LiteHRNet
# 轻量化模型:LiteHRNet
python train.py  -c "configs/coco/litehrnet/litehrnet18_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"
  • 训练轻量化模型Mobilenetv2
# 轻量化模型:Mobilenet
python train.py  -c "configs/coco/mobilenet/mobilenetv2_hand_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/hand"

下表格给出HRNet,以及轻量化模型LiteHRNet和Mobilenet的计算量和参数量,以及其检测精度AP; 高精度检测模型HRNet-w32,AP可以达到0.8570,但其参数量和计算量比较大,不合适在移动端部署;LiteHRNet18和Mobilenet-v2参数量和计算量比较少,合适在移动端部署;虽然LiteHRNet18的理论计算量和参数量比Mobilenet-v2低,但在实际测试中,发现Mobilenet-v2运行速度更快。轻量化Mobilenet-v2模型在普通Android手机上可以达到实时的检测效果,CPU(4线程)约50ms左右,GPU约30ms左右 ,基本满足业务的性能需求

模型input-sizeparams(M)GFLOPsAP
HRNet-w32192×19228.48M5734.05M0.8570
LiteHRNet18192×1921.10M182.15M0.8023
Mobilenet-v2192×1922.63M529.25M0.7574

(5)Tensorboard可视化训练过程

训练过程可视化工具是使用Tensorboard,使用方法,在终端输入:
# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir="work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/log"

点击终端TensorBoard打印的链接,即可在浏览器查看训练LOG信息等:


5.手部关键点检测模型效果

demo.py文件用于推理和测试模型的效果,填写好配置文件,模型文件以及测试图片即可运行测试了;demo.py命令行参数说明如下:

参数类型参考值说明
-c,--config_filestr-配置文件
-m,--model_filestr-模型文件
targetstr-骨骼点类型,如hand,coco_person,mpii
image_dirstrdata/image测试图片的路径
video_filestr,int-测试的视频文件
out_dirstroutput保存结果,为空不保存
thresholdfloat0.3关键点检测置信度
devicestrcuda:0GPU ID

下面以运行HRNet-w32为样例,其他模型修改--config_file或者--model_file即可

  • 测试图片
python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --image_dir "data/hand"   --out_dir "output"
  • 测试视频文件
python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --video_file "data/hand/test-video.mp4"   --out_dir "output"
  •  测试摄像头
 python demo.py   -c "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/w32_adam_hand_192_192.yaml"    -m "work_space/hand/hrnet_w32_21_192_192_custom_coco_20231007_083128_2043/model/best_model_189_0.8570.pth"   --target "hand"   --video_file 0   --out_dir "output"

运行效果:

 


6.手部关键点检测(推理代码)

手部关键点检测推理代码下载地址:Pytorch实现手部关键点检测(手部姿势估计)-推理代码

手部关键点检测推理代码内容包含:

(1)手部关键点检测推理代码(Pytorch)

  1. 提供YOLOv5手部检测推理代码(不包含训练代码)
  2. 提供手部关键点检测推理代码demo.py(不包含训练代码)
  3. 提供高精度版本HRNet手部关键点检测(不包含训练代码)
  4. 提供轻量化模型LiteHRNet,以及Mobilenet-v2手部关键点检测(不包含训练代码)
  5. 提供训练好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行demo.py
  6. 推理代码demo.py支持图片,视频和摄像头测试

 如果你需要配套的训练数据集和训练代码,请查看下面部分


7.手部关键点检测(训练代码)

手部关键点检测训练代码下载地址: Pytorch实现手部关键点检测(手部姿势估计)》 含训练代码和数据集

手部关键点检测训练代码内容包含:手部检测数据集和手部关键点数据集 + 手部关键点检测训练和测试代码

(1)手部检测数据集和手部关键点数据集:

  1. 手部检测数据集:包含Hand-voc1,Hand-voc2和Hand-voc3,总共60000+张图片;标注格式统一转换为VOC数据格式,标注名称为hand,可用于深度学习手部目标检测模型算法开发。

  2. 手部关键点数据集:包含HandPose-v1,HandPose-v2和HandPose-v3,总共80000+张图片;标注了手部区域目标框box,标注名称为hand,同时也标注了手部21个关键点,标注格式统一转换为COCO数据格式,可直接用于深度学习手部关键点检测模型训练。

  3. 数据集详细说明,请查看《手部关键点(手部姿势估计)数据集(含下载链接)》https://blog.csdn.net/guyuealian/article/details/133277630

(2)手部关键点检测训练代码和测试代码(Pytorch)

  1. 提供YOLOv5手部检测推理代码(不包含训练代码)
  2. 提供整套完整的手部关键点检测项目工程代码,包含手部关键点检测的训练代码train.py和推理测试代码demo.py
  3. 提供高精度版本HRNet手部关键点检测训练和测试
  4. 提供轻量化模型LiteHRNet,以及Mobilenet-v2手部关键点检测训练和测试
  5. 根据本篇博文说明,简单配置即可开始训练:train.py
  6. 提供训练好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型,配置好环境,可直接运行demo.py
  7. 测试代码demo.py支持图片,视频和摄像头测试

8.手部关键点检测C++/Android版本

  • 手部关键点检测4:Android实现手部关键点检测(手部姿势估计)含源码 可实时检测https://blog.csdn.net/guyuealian/article/details/133277732
  • 手部关键点检测5:C++实现手部关键点检测(手部姿势估计)含源码 可实时检测https://blog.csdn.net/guyuealian/article/details/133277748

  Android手部关键点检测(手部姿势估计)APP Demo体验:https://download.csdn.net/download/guyuealian/88418582

  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1101574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mac虚拟机安装homebrew时的问题

安装了mac虚拟机&#xff0c;结果在需要通过“brew install svn”安装svn时&#xff0c;才注意到没有下载安装homebrew。 于是便想着先安装homebrew&#xff0c;网上查的教程大多是通过类似以下命令 “ruby <(curl -fsSkL raw.github.com/mxcl/homebrew/go)” 但是都会出现…

防火墙管理工具增强网络防火墙防御

防火墙在网络安全中起着至关重要的作用。现代企业具有多个防火墙&#xff0c;如&#xff1a;电路级防火墙、应用级防火墙和高级下一代防火墙&#xff08;NGFW&#xff09;的复杂网络架构需要自动化防火墙管理和集中式防火墙监控工具来确保边界级别的安全。 网络防火墙安全和日…

STM32F0的TIM1高级定时器(未完待续)

文章目录 1.高级、通用和基本定时器的区别2.TIM1高级定时器介绍2.1 时基单元2.1.1寄存器2.1.2 预分频器2.1.3 计数器2.1.4 重复计数器 2.2 计数时钟2.3 捕捉/比较通道2.3.1 通道结构 输出类型14-12&#xff1a;定时器霍尔传感器配置结构定义 函数14-100 1.高级、通用和基本定时…

探索云原生技术之容器编排引擎-Kubernetes/K8S详解(8)

❤️作者简介&#xff1a;2022新星计划第三季云原生与云计算赛道Top5&#x1f3c5;、华为云享专家&#x1f3c5;、云原生领域潜力新星&#x1f3c5; &#x1f49b;博客首页&#xff1a;C站个人主页&#x1f31e; &#x1f497;作者目的&#xff1a;如有错误请指正&#xff0c;将…

【Python微信机器人】第一篇:在windows11上编译python

前言 我打算写一个系列&#xff0c;内容是将python注入到其他进程实现inline hook和主动调用。本篇文章是这个系列的第一篇&#xff0c;后面用到的案例是注入python到PC微信实现基本的收发消息。文章着重于python方面的内容&#xff0c;所以对于微信找收发消息的call不会去讲过…

挚文集团:股票回购速度、收入指引均不及预期,令投资者失望

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 挚文集团未来将不再公布MAU数据 今年6月初&#xff0c;挚文集团(MOMO)在公布2023年第一季度业绩时透露&#xff0c;“陌陌应用的月活跃用户(MAU)”已经从去年3月的1.109亿下降到了今年3月的1.065亿&#xff0c;同比下降了-…

大数据Hadoop之——部署hadoop+hive+Mysql环境(window11)

一、安装JDK8 【温馨提示】对应后面安装的hadoop和hive版本&#xff0c;这里使用jdk8&#xff0c;这里不要用其他jdk了&#xff0c;可能会出现一些其他问题。 1&#xff09;JDK下载地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html 按正常下载是需要…

【Python语义分割】Segment Anything(SAM)模型交互式分割+掩膜保存(三)

我之前分享了Segment Anything&#xff08;SAM&#xff09;模型的基本操作&#xff0c;这篇给大家分享下交互式语义分割代码&#xff0c;可以通过鼠标点击目标物生成对应的掩膜&#xff0c;同时我还加入了掩膜保存的代码。 1 Segment Anything介绍 1.1 概况 Meta AI 公司的 S…

HarmonyOS 音视频开发概述

在音视频开发指导中&#xff0c;将介绍各种涉及音频、视频播放或录制功能场景的开发方式&#xff0c;指导开发者如何使用系统提供的音视频 API 实现对应功能。比如使用 TonePlayer 实现简单的提示音&#xff0c;当设备接收到新消息时&#xff0c;会发出短促的“滴滴”声&#x…

【API篇】三、转换算子API(上)

文章目录 0、demo数据1、基本转换算子&#xff1a;映射map2、基本转换算子&#xff1a;过滤filter3、基本转换算子&#xff1a;扁平映射flatMap4、聚合算子&#xff1a;按键分区keyBy5、聚合算子&#xff1a;简单聚合sum/min/max/minBy/maxBy6、聚合算子&#xff1a;归约聚合re…

第三章 内存管理 七、具有快表的地址变换结构

目录 一、什么是快表 二、快表有什么用&#xff1f; 例子&#xff1a; 三、快表和慢表同时查询 四、局部性原理 五、总结 一、什么是快表 快表&#xff0c;又称联想寄存器&#xff08;TLB&#xff0c;translation lookaside buffer)&#xff0c;是一种访问速度比内存快很…

教程更新 | 持续开源 RK3568驱动指南-驱动基础进阶篇

《iTOP-RK3568开发板驱动开发指南》手册文档更新&#xff0c;手册内容对应视频教程&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 ✦ 第一篇 驱动基础 第1章 前言 第2章 你好&#xff01;内核源码 第3章 …

如何部署WampServer并结合cpolar内网穿透工具实现公网访问本地服务?

文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境&#xff0c;是一组常用来…

苏东坡在元丰五年

北宋神宗元丰二年&#xff08;1079年&#xff09;十二月二十八日&#xff0c;震惊朝野上下的“乌台诗案” 正式结案&#xff1a;“祠部员外郎、直史馆苏轼责授检校水部员外郎、黄州团练副使&#xff0c;本州安置、不得签书公事&#xff0c;令御史台差人转押前去。” 元丰三年&…

PAM从入门到精通(三)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;二&#xff09; 本文参考以下博文&#xff1a; PAM模块详解及sudo命令 PAM 的应用开发和内部实现源码分析 PAM详解&#xff08;一&#xff09;PAM介绍 Linux进阶_PAM认证机制 Oracle Solaris 10 开发者安全性指南 ——…

[Jdk版本不一致问题 ]终端查看jdk版本不一致

目录 前言: 原因 是因为环境变量配置在读取的时候 顺序不一致,或者有多个jdk版本 安装 去对应环境变量 里面查找对应 jdk配置的路径信息: 前言: cmd 终端 在查看java版本的时候, 发现 使用java -version 显示的是 :1.8 版本, javac -version 显示的是 javac11 版本 原因 是因…

Linux | 一篇文章带你深刻理解粘滞位

目录 前言 一、为什么需要粘滞位 二、粘滞位是什么&#xff1f; 三、怎么设置粘滞位 前言 关于粘滞位的学习&#xff0c;首先你得了解Linux下的权限&#xff0c;当然&#xff0c;文章会稍稍带着复习关键知识点&#xff0c;具体关于权限&#xff0c;请移步 Linux权限 一、为…

关于ts的keyof

type props_type {name: string,age: number }const props: props_type {name: tjq,age: 18 }for (const key in props) { //props[key]出现红色波浪线const value props[key]; }why&#xff1f; 经过我查阅多方资料&#xff0c;在网上看到一个比较合适的例子 地址&#xf…

如何在Python中更新代码但还想保留原有代码

Python作为一门功能强大的编程语言&#xff0c;为开发者提供了许多方便的方法来更新代码并且还能保留原有代码。在本文中&#xff0c;我们将从多个方面来详细阐述如何在Python中更新代码但还想保留原有代码。 一、使用函数参数 许多Python程序员通过将函数的参数作为字典或者…

Selenium工作原理详解

前言 Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持的浏览器包括IE&#xff08;7, 8, 9, 10, 11&#xff09;&#xff0c;Mozilla Firefox&#xff0c;Safari&#xff0c;Google Chrome&#xff0…