人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

news2024/9/19 22:16:26

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

目录

人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码

1. 前言

2.人体关键点检测方法

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

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

3.人体关键点检测数据集

4.人体检测模型训练

5.人体关键点检测模型训练

(1)项目安装

(2)准备Train和Test数据

(3)配置文件configs

(4)开始训练

(5)Tensorboard可视化训练过程

6.人体关键点检测检测模型效果

7.人体关键点检测(推理代码)下载

8.人体关键点检测(训练代码)下载

9.人体关键点检测C++/Android版本


1. 前言

人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。

本项目将实现人体关键点检测算法,其中使用YOLOv5模型实现人体检测(Person Detection),使用HRNet,LiteHRNet和Mobilenet-v2模型实现人体关键点检测。项目分为数据集说明,模型训练C++/Android部署等多个章节,本篇是项目《人体关键点检测(人体姿势估计)》系列文章之Pytorch实现人体关键点检测(人体姿势估计);为了方便后续模型工程化和Android平台部署,项目支持高精度HRNet检测模型,轻量化模型LiteHRNet和Mobilenet模型训练和测试,并提供Python/C++/Android多个版本;

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

模型input-sizeparams(M)GFLOPsAP
HRNet-w32192×25628.48M5734.05M0.7585
LiteHRNet18192×2561.10M182.15M0.6237
Mobilenet-v2192×2562.63M529.25M0.6181

先展示一下人体关键点检测效果:

Android人体关键点检测APP Demo体验(下载):https://download.csdn.net/download/guyuealian/88610359

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


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

  • 人体关键点检测1:人体姿势估计数据集(含下载链接) https://blog.csdn.net/guyuealian/article/details/134703548
  • 人体关键点检测2:Pytorch实现人体关键点检测(人体姿势估计)含训练代码和数据集 https://blog.csdn.net/guyuealian/article/details/134837816
  • 人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测 https://blog.csdn.net/guyuealian/article/details/134881797
  • 人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测 https://blog.csdn.net/guyuealian/article/details/134881797
  • 手部关键点检测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/133931698
  • 手部关键点检测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(自下而上)方法高。本项目采用Top-Down(自上而下)方法,先使用YOLOv5模型实现人体检测,然后再使用HRNet进行人体关键点检测(人体姿势估计);

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

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


3.人体关键点检测数据集

本项目主要使用COCO数据集和MPII数据集,关于人体关键点检测数据集说明,请参考《人体关键点检测1:人体姿势估计数据集》https://blog.csdn.net/guyuealian/article/details/134703548


4.人体检测模型训练

本项目采用Top-Down(自上而下)方法,使用YOLOv5模型实现人体目标检测,使用HRNet进行人体关键点检测(人体姿势估计);关于人体检测模型训练方法,可参考 :

行人检测(人体检测)2:YOLOv5实现人体检测(含人体检测数据集和训练代码)


5.人体关键点检测模型训练

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

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

(1)项目安装

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

numpy==1.21.6
matplotlib==3.2.2
Pillow==8.4.0
bcolz==1.2.1
easydict==1.9
onnx==1.8.1
onnx-simplifier==0.2.28
onnxoptimizer==0.2.0
onnxruntime==1.6.0
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
sklearn==0.0
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
pycocotools==2.0.2
pybaseutils==0.9.4
basetrainer

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

  • 推荐使用Python3.8或Python3.7,更高版本可能存在版本差异问题
  • 项目开发使用教程和常见问题和解决方法
  • 视频教程:1 手把手教你安装CUDA和cuDNN(1)
  • 视频教程:2 手把手教你安装CUDA和cuDNN(2)
  • 视频教程:3 如何用Anaconda创建pycharm环境
  • 视频教程:4 如何在pycharm中使用Anaconda创建的python环境

(2)准备Train和Test数据

下载COCO数据集或者MPII数据集(建议使用COCO数据集),然后:

  • COCO数据集下载并解压到本地,存储目录结构参考如下(原始图片目录和标注信息文件在同一级目录)
─── COCO
    ├── train2017
    │   ├── images                           # COCO训练集原始图片目录
    │   └── person_keypoints_train2017.json  # COCO训练集标注信息文件
    └── val2017
        ├── images                           # COCO验证集原始图片目录
        └── person_keypoints_val2017.json    # COCO验证集标注信息文件

  • MPII数据集下载并解压到本地,存储目录结构参考如下
─── MPII
    ├── images      # MPII数据集原始图片目录
    ├── train.json  # MPII训练集标注信息文件
    └── valid.json  # MPII训练集标注信息文件

(3)配置文件configs

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

WORKERS: 8
PRINT_FREQ: 10
DATASET:
  DATASET: 'custom_coco'
  TRAIN_FILE:
    - 'D:/COCO/train2017/person_keypoints_train2017.json'
  TEST_FILE: 'D:/COCO/val2017/person_keypoints_val2017.json'
  FLIP: true
  ROT_FACTOR: 45
  SCALE_FACTOR: 0.3
  SCALE_RATE: 1.25
  JOINT_IDS: [0,1]
  FLIP_PAIRS: [ ]
  SKELETON: [ ]

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

参数类型参考值说明
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-w32
python train.py  -c "configs/coco/hrnet/w48_adam_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
# 高精度模型:HRNet-w48
python train.py  -c "configs/coco/hrnet/w32_adam_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
  • 训练轻量化模型LiteHRNet
# 轻量化模型:LiteHRNet
python train.py  -c "configs/coco/litehrnet/litehrnet18_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
  • 训练轻量化模型Mobilenetv2
# 轻量化模型:Mobilenet
python train.py  -c "configs/coco/mobilenet/mobilenetv2_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"

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

模型input-sizeparams(M)GFLOPsAP
HRNet-w32192×25628.48M5734.05M0.7585
LiteHRNet18192×2561.10M182.15M0.6237
Mobilenet-v2192×2562.63M529.25M0.6181

(5)Tensorboard可视化训练过程

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

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


6.人体关键点检测检测模型效果

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

参数类型参考值说明
-c,--config_filestr-配置文件
-m,--model_filestr-模型文件
targetstr-骨骼点类型,如hand,coco_person,mpii_person
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/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --image_dir data/test_images --out_dir output
  • 测试视频文件
python demo.py -c work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --video_file data/video-test.mp4 --out_dir output
  •  测试摄像头
python demo.py -c work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --video_file 0 --out_dir output

项目同时支持MPII数据集格式人体关键点检测

  • 测试图片(MPII格式的人体关键点检测)
python demo.py -c work_space/person/hrnet_w32_16_192_256_mpii_20231127_113836_6644/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_16_192_256_mpii_20231127_113836_6644/model/best_model_148_89.4041.pth --image_dir data/test_images --out_dir output --target mpii_person

运行效果(支持单人和多人人体关键点检测):


7.人体关键点检测(推理代码)下载

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

资源内容包含:

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

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


8.人体关键点检测(训练代码)下载

人体关键点检测训练代码下载地址: 

资源内容包含:

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

9.人体关键点检测C++/Android版本

  • 人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测 https://blog.csdn.net/guyuealian/article/details/134881797
  • 人体关键点检测4:C/C++实现人体关键点检测(人体姿势估计)含源码 可实时检测 https://blog.csdn.net/guyuealian/article/details/134881797

 Android人体关键点检测APP Demo体验(下载):https://download.csdn.net/download/guyuealian/88610359 

  

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

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

相关文章

Python实战 | 如何抓取腾讯视频

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 爬虫: 作用: 批量采集数据 / 模拟用户行为 原理: 模拟成 客户端 向 服务器 发送网络请求 环境介绍: python 3.8 解释器 pycharm 编辑器 第三方模块: reques…

《地理信息系统原理》笔记/期末复习资料(12. 地理信息工程)

目录 12. 地理信息工程 12.1. 地理信息系统工程的概念 12.2. 地理信息系统工程建设过程 12.2.1. 应用型地理信息系统设计步骤和方法 12.2.2. 需求分析 12.2.3. 系统设计 12.2.4. 系统开发与实施 12.2.5. 系统的评价和维护 12.3. GIS标准 12.4. 习题 12. 地理信息工程…

java--Collection的常用方法

1.集合体系结构 ①Collection代表单列集合,每个元素(数据)只包含一个值 ②Map代表双列集合,每个元素包含两个值(键值对) 2.Collection集合体系 3.Collection集合特点 1.List系列集合:添加的元素是有序、可重复、有索引 ①ArrayList、Line…

Python接口自动化浅析requests请求封装原理

以下主要介绍如何封装请求 还记得我们之前写的get请求、post请求么? 大家应该有体会,每个请求类型都写成单独的函数,代码复用性不强。 接下来将请求类型都封装起来,自动化用例都可以用这个封装的请求类进行请求 将常用的get、p…

为什么现在招聘C++程序员这么难?

为什么现在招聘C程序员这么难? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「C的资料从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家!&#x…

mars3d加载arcgis发布的服务,⽀持4523坐标

问题 1.从这个服务地址加载,具体在哪⾥去转坐标呢? 加个 usePreCachedTilesIfAvailable:false 参数即可 坐标系为4490的arcgis影像服务图层,配置后瓦片加载不出来,没报错 甚至可以跳转 没有看出问题,或者测…

SD-WAN跨国网络加速的原理

许多企业需要在全球范围内高效传输和交流数据,然而,跨国网络连接面临着多种挑战,如网络延迟、拥塞和数据包丢失,这些问题可能会显著降低企业的运作效率和客户体验。为了克服这些问题,越来越多的企业正在采用SD-WAN跨国…

Java毕业设计——vue+SpringBoot汽车销售管理系统

项目介绍 本项目基于spring boot以及Vue开发,前端实现基于PanJiaChen所提供的开源后台项目vue-element-admin改造。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、财务报表等功能,提供经理和销售两种角色进行管理。 技术栈 前端 Vue…

使用Java将图片添加到Excel的几种方式

1、超链接 使用POI&#xff0c;依赖如下 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency>Java代码如下,运行该程序它会在桌面创建ImageLinks.xlsx文件。 …

(七)函数

目录 1. 函数的概念 2. 库函数 2.1 标准库和头文件 2.2 库函数的使用方法 2.2.1 功能 2.2.2 头文件包含 2.2.3 库函数文档的一般格式 3. 自定义函数 3.1 函数的语法形式 4. 形参和实参 4.1 实参 4.2 形参 4.3 实参和形参的关系 5. return 语句 6. 数组做函数参数…

python将资源打包进exe

前言 之前py打包的exe一直是不涉及图片等资源的&#xff0c;直到我引入图片后打包&#xff0c;再双击exe发现直接提示未找到资源。 分析 我py代码中的图片引入使用的是项目相对路径&#xff0c;打包时pyinstaller只会引入py模块&#xff0c;这种路径引入的资源其实是不会打包…

生成式模型对比:扩散模型、GAN 与 VAE

引言 深度生成式模型应用于图像、音频、视频合成和自然语言处理等不同领域。随着深度学习技术的快速发展&#xff0c;近年来不同的深度生成模型出现了爆炸式的增长。这导致人们越来越有兴趣比较和评估这些模型的性能和对不同领域的适用性。在 本文中&#xff0c;我们的目标是…

RCG Self-conditioned Image Generation via Generating Representations

RCG: Self-conditioned Image Generation via Generating Representations TL; DR&#xff1a;将图像的无监督表征作为&#xff08;自&#xff09;条件&#xff08;而非是将文本 prompt 作为条件&#xff09;&#xff0c;生成与原图语义内容一致的多样且高质量结果。视觉训练能…

如何在Android中旋转屏幕时避免重新绘制Activity

如何在Android中旋转屏幕时避免重新绘制Activity 在Android开发中&#xff0c;设备旋转通常导致当前活动&#xff08;Activity&#xff09;被销毁并重新创建&#xff0c;这可能导致用户界面重置和不必要的资源重新加载。然而&#xff0c;有时我们希望避免这种行为&#xff0c;…

3.4_3GBN课后题的思考

首先思考最大平均数据传输速率&#xff0c;看到是GBN协议&#xff0c;无法直接带入信道带宽&#xff1b; 其次比较RRT传输时延和信道带宽传输所有数据的时间 把图中划分为三个公式分别为abc 1.a是1000个窗口尺寸&#xff0c;每个尺寸抖音1000字节数据帧&#xff0c;除以信道带宽…

邮件营销软件:10个创新邮件策略,持续提升投资回报(二)

在上一篇文章中&#xff0c;我们了解到内容、个性化和适当的策略有助于在增加邮件营销中客户的参与度。在这篇文章中&#xff0c;我们将深入研究客户行为、自动化和评估等方面。 1、根据客户行为发送电子邮件 从购买到放弃购物车&#xff0c;客户的行为可能千差万别。跟踪这…

胡桃工具箱 原神多功能工具箱

胡桃工具箱 原神胡桃工具箱是一款非常实用的游戏工具辅助软件&#xff0c;可以为用户们提供优质的原神游戏工具&#xff0c;体验更精彩的游戏辅助&#xff0c;提供帧率解锁游戏功能&#xff0c;包括数据查询、游戏详解以及各种实用的功能。 安装使用 1.获取胡桃工具箱 请点击…

linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行

sed系列文章 linux常用命令(9)&#xff1a;sed命令(编辑/替换/删除文本)linux sed命令删除一行/多行_sed删除第一行/linux删除文件某一行 文章目录 sed系列文章一、sed删除某一行内容/删除最后一行二、sed删除多行三、扩展3.1、-i命令 本文主要讲解如何删除txt文件中的某一行内…

瓶装饮用水行业分析:全国市场产量约4789万吨

水根据自身的硬度首先分为软水和硬水两种。水的硬度是指溶解在水中的盐类物质的含量&#xff0c;也就是钙盐与镁盐的含量&#xff0c;硬度单位是ppm&#xff0c;1ppm代表水中碳酸钙含量1毫克/升(mg/L)。低于142的水称为软水&#xff0c;高于285ppm的水称为硬水&#xff0c;介于…