Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【Hackathon 7th PPSCI No.7】No.7 AI-aided geometric design of anti-infection catheters 论文复现 #986

Open
wants to merge 21 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
203 changes: 203 additions & 0 deletions docs/zh/examples/catheter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
# Catheter

<a href="https://aistudio.baidu.com/aistudio/projectdetail/6169897?sUid=455441&shared=1&ts=1684122038217" class="md-button md-button--primary" style>AI Studio 快速体验</a>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image

这个链接不太对啊....


=== "模型训练命令"

``sh python geofno.py ``

=== "模型评估命令"

``sh python geofno.py mode=eval ``

| 预训练模型 |
| :------------------------------------------------------------------------------------------------------ |
| [GeoFno.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/GeoFNO/GeoFNO_pretrained.pdparams) |

## 1. 背景简介

[论文](https://www.science.org/doi/pdf/10.1126/sciadv.adj1741)提出了一种基于人工智能的导尿管几何设计方法,可以有效抑制细菌逆流,从而预防 CAUTI。该方法通过流体动力学和粒子动力学模拟研究细菌运动机制,并使用人工智能模型优化导尿管几何形状,使其能够最大程度地抑制细菌逆流。实验结果表明,该设计能够将细菌逆流的程度降低一到两个数量级,具有安全、有效、易于实施和成本低等优点,有望成为未来 CAUTI 预防的重要手段。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

人工智能辅助的抗感染导管几何创新设计

在狭窄管道内的流体环境中,细菌能借助流体动力学作用逆流迁移,对使用植入性导管的患者构成泌尿道感染的严重威胁。尽管已有提议采用涂层与结构化表面来抑制导管内的细菌滋生,但遗憾的是,至今尚无一种表面结构或涂层技术能从根本上解决污染难题。鉴于此,我们依据逆流游动的物理原理,创新性地提出了一种几何设计方案,并通过人工智能模型对细菌流入动力学进行预测与优化。相较于传统模拟方法,所采用的傅立叶神经算子人工智能技术实现了显著的速度提升。

在准二维微流体实验中,我们以大肠杆菌为对象,验证了该设计的抗感染机制,并在临床相关流速下,通过3D打印的导管原型对其有效性进行了评估。实验结果显示,我们的导管设计在抑制导管上游端细菌污染方面,实现了1-2个数量级的提升,有望大幅延长导管的安全留置时间,并整体降低导管相关性尿路感染的风险。


本案例通过深度学习的方式对论文所提及的模型进行复现。

## 2. 问题定义

为了描述了细菌在流体中的主动运动,通常使用 ABP 模型进行表示:

$$
\frac{d\vec{q}}{dt} = \frac{1}{2} \vec{\omega} + \frac{2}{\tau_R} \eta(t) \times \vec{q}
$$

其中

- `dt(q)` 代表细菌方向变化率
- `ω ⃗ ` 代表流体涡量
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

此处第二个字符是不是不能正常显示?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

确实,他有一个乱码了

- `η(t)` 代表高斯噪声
- `q` 代表细菌方向向量

## 3. 问题求解

接下来开始讲解如何将问题一步一步地转化为 PaddleScience 代码,用深度学习的方法进行优化设计,有效抑制细菌逆流,预防 CAUTI。
为了快速理解 PaddleScience,接下来仅对模型构建、方程构建、计算域构建等关键步骤进行阐述,而其余细节请参考 [API 文档](../api/arch.md)。

### 3.1 数据集介绍

本案例数据集使用论文作者所提供的数据集,共 8 个 npy 文件,[下载地址](https://aistudio.baidu.com/datasetdetail/291940)

数据文件说明如下:

`./data.zip/training/`

| 字段名 | 说明 |
| :----------------------: | :----------------: |
| x_1d_structured_mesh.npy | 形状为(2001, 3003) |
| y_1d_structured_mesh.npy | 形状为(2001, 3003) |
| data_info.npy | 形状为(7, 3003) |
| density_1d_data.npy | 形状为(2001, 3003) |

`./data.zip/test/`

| 字段名 | 说明 |
| :----------------------: | :---------------: |
| x_1d_structured_mesh.npy | 形状为(2001, 300) |
| y_1d_structured_mesh.npy | 形状为(2001, 300) |
| data_info.npy | 形状为(7, 300) |
| density_1d_data.npy | 形状为(2001, 300) |

在加载数据之后,需要将 x、y 进行合并,同时对于合并后的训练数据重新 `reshape` 为 `(1000, 2001, 2)` 的格式,具体代码如下

```py
--8<--
examples/geofno/geofno.py:29:61
--8<--
```

### 3.2 GeoFNO 模型

GeoFNO 是一种基于 **几何聚焦傅里叶神经算子 (Geo-FNO** ) 的机器学习模型,它将几何形状转换到傅里叶空间,从而更好地捕捉形状的特征,并利用傅里叶变换的可逆性,可以将结果转换回物理空间。

根据论文所提供 pytorch 模型代码,现用 PaddleScience 代码表示如下

```py
--8<--
examples/geofno/catheter.py:64:146
--8<--
```

为了在计算时,准确快速地访问具体变量的值,我们在这里指定网络模型的输入变量名是 `("input",)`,输出变量名是 `("output",)`,这些命名与后续代码保持一致。

接着通过指定 FNO1d 的层数、特征通道数,神经元个数,并通过加载上文所提及的初始化权重模型,我们就实例化出了一个神经网络模型 `model`。

### 3.3 约束构建

#### 3.3.1 监督约束

由于我们以监督学习方式进行训练,此处采用监督约束 `SupervisedConstraint`:

```py
--8<--
examples/geofno/geofno.py:76:92
--8<--
```

`SupervisedConstraint` 的第一个参数是监督约束的读取配置,里面包好数据的 `label`,已便后续进行索引使用。同时定义了数据的 batch_size 以及其他相关配置;

第二个参数是损失函数,此处我们选用论文代码仓中的 `LPLoss`损失函数,其定义可看 [Loss 构建](#36);

第三个参数是约束条件的名字,我们需要给每一个约束条件命名,方便后续对其索引。

### 3.4 优化器构建

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器,同时使用 `PaddleScience` 中的 `Step` 生成动态学习率。

```py
--8<--
examples/geofno/geofno.py:100:102
--8<--
```

### 3.5 评估器构建

在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.SupervisedValidator` 构建评估器。

```py
--8<--
examples/geofno/geofno.py:110:127
--8<--
```

评价指标 `metric` 选择 `ppsci.metric.L2Rel` 即可。

其余配置与 [约束构建](#33) 的设置类似。

### 3.6 loss 构建

在论文中所给的损失函数公式为:

$$
L(Y, \hat{Y}) = \left( \frac{1}{n} \sum_{i=1}^{n} \|\hat{y}_i - y_i\|_p^p \right)^{\frac{1}{p}}
$$

loss 构建代码如下:

```py
--8<--
examples/geofno/utilities3.py:8:56
--8<--
```

### 3.7 模型训练、评估

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练、评估。

```py
--8<--
examples/geofno/geofno.py:130:141
--8<--
```

## 4. 完整代码

=== "geofno.py"

```py
--8<--
examples/geofno/geofno.py
--8<--
```

=== "catheter.py"

```py
--8<--
examples/geofno/catheter.py
--8<--
```

=== "utilities3.py"

```py
--8<--
examples/geofno/utilities3.py
--8<--
```

## 5. 结果展示

下方展示了训练后模型对测试数据的第一次预测结果以及最后一次预测结果。

=== "第一次预测结果"

![1725427977357](image/catheter/1725427977357.png)

=== "最后一次预测结果"

![1725428017615](image/catheter/1725428017615.png)

可以看到模型预测结果与真实结果基本一致,模型泛化效果良好。

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Training Test Loss 也放一下

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已经加了

## 6. 参考资料

参考文献: [AI-aided geometric design of anti-infection catheters](https://www.science.org/doi/pdf/10.1126/sciadv.adj1741)

参考代码: [Geo-FNO-catheter](https://github.com/zongyi-li/Geo-FNO-catheter)
Binary file added docs/zh/examples/image/catheter/1725427977357.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
48 changes: 20 additions & 28 deletions docs/zh/examples/laplace2d.md
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

请不要修改无关文件

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

复原laplace2.md

Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,23 @@

=== "模型训练命令"

``` sh
python laplace2d.py
```
``sh python laplace2d.py ``

=== "模型评估命令"

``` sh
python laplace2d.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/laplace2d/laplace2d_pretrained.pdparams
```
``sh python laplace2d.py mode=eval EVAL.pretrained_model_path=https://paddle-org.bj.bcebos.com/paddlescience/models/laplace2d/laplace2d_pretrained.pdparams ``

=== "模型导出命令"

``` sh
python laplace2d.py mode=export
```
``sh python laplace2d.py mode=export ``

=== "模型推理命令"

``` sh
python laplace2d.py mode=infer
```
``sh python laplace2d.py mode=infer ``

| 预训练模型 | 指标 |
|:--| :--|
| [laplace2d_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/laplace2d/laplace2d_pretrained.pdparams) | loss(MSE_Metric): 0.00002<br>MSE.u(MSE_Metric): 0.00002 |
| 预训练模型 | 指标 |
| :-------------------------------------------------------------------------------------------------------------------------- | :---------------------------------------------------------- |
| [laplace2d_pretrained.pdparams](https://paddle-org.bj.bcebos.com/paddlescience/models/laplace2d/laplace2d_pretrained.pdparams) | loss(MSE_Metric): 0.00002`<br>`MSE.u(MSE_Metric): 0.00002 |

## 1. 背景简介

Expand Down Expand Up @@ -60,7 +52,7 @@ $$

上式中 $f$ 即为 MLP 模型本身,用 PaddleScience 代码表示如下

``` py linenums="23"
```py
--8<--
examples/laplace/laplace2d.py:23:24
--8<--
Expand All @@ -74,7 +66,7 @@ examples/laplace/laplace2d.py:23:24

由于 2D-Laplace 使用的是 Laplace 方程的2维形式,因此可以直接使用 PaddleScience 内置的 `Laplace`,指定该类的参数 `dim` 为2。

``` py linenums="26"
```py
--8<--
examples/laplace/laplace2d.py:26:27
--8<--
Expand All @@ -85,7 +77,7 @@ examples/laplace/laplace2d.py:26:27
本文中 2D Laplace 问题作用在以 (0.0, 0.0), (1.0, 1.0) 为对角线的二维矩形区域,
因此可以直接使用 PaddleScience 内置的空间几何 `Rectangle` 作为计算域。

``` py linenums="29"
```py
--8<--
examples/laplace/laplace2d.py:29:34
--8<--
Expand All @@ -97,7 +89,7 @@ examples/laplace/laplace2d.py:29:34

在定义约束之前,需要给每一种约束指定采样点个数,表示每一种约束在其对应计算域内采样数据的数量,以及通用的采样配置。

``` yaml linenums="30"
```yaml
--8<--
examples/laplace/conf/laplace2d.yaml:30:31
--8<--
Expand All @@ -107,7 +99,7 @@ examples/laplace/conf/laplace2d.yaml:30:31

以作用在内部点上的 `InteriorConstraint` 为例,代码如下:

``` py linenums="50"
```py
--8<--
examples/laplace/laplace2d.py:50:59
--8<--
Expand All @@ -131,7 +123,7 @@ examples/laplace/laplace2d.py:50:59

同理,我们还需要构建矩形的四个边界的约束。但与构建 `InteriorConstraint` 约束不同的是,由于作用区域是边界,因此我们使用 `BoundaryConstraint` 类,代码如下:

``` py linenums="60"
```py
--8<--
examples/laplace/laplace2d.py:60:72
--8<--
Expand All @@ -141,7 +133,7 @@ examples/laplace/laplace2d.py:60:72

第二个参数是指我们约束对象的真值如何获得,这里我们直接通过其解析解进行计算,定义解析解的代码如下:

``` py linenums="36"
```py
--8<--
examples/laplace/laplace2d.py:36:40
--8<--
Expand All @@ -153,7 +145,7 @@ examples/laplace/laplace2d.py:36:40

接下来我们需要在配置文件中指定训练轮数,此处我们按实验经验,使用两万轮训练轮数,评估间隔为两百轮。

``` yaml linenums="45"
```yaml
--8<--
examples/laplace/conf/laplace2d.yaml:45:50
--8<--
Expand All @@ -163,7 +155,7 @@ examples/laplace/conf/laplace2d.yaml:45:50

训练过程会调用优化器来更新模型参数,此处选择较为常用的 `Adam` 优化器。

``` py linenums="74"
```py
--8<--
examples/laplace/laplace2d.py:74:75
--8<--
Expand All @@ -173,7 +165,7 @@ examples/laplace/laplace2d.py:74:75

在训练过程中通常会按一定轮数间隔,用验证集(测试集)评估当前模型的训练情况,因此使用 `ppsci.validate.GeometryValidator` 构建评估器。

``` py linenums="77"
```py
--8<--
examples/laplace/laplace2d.py:77:92
--8<--
Expand All @@ -185,7 +177,7 @@ examples/laplace/laplace2d.py:77:92

本文中的输出数据是一个区域内的二维点集,因此我们只需要将评估的输出数据保存成 **vtu格式** 文件,最后用可视化软件打开查看即可。代码如下:

``` py linenums="94"
```py
--8<--
examples/laplace/laplace2d.py:94:103
--8<--
Expand All @@ -195,15 +187,15 @@ examples/laplace/laplace2d.py:94:103

完成上述设置之后,只需要将上述实例化的对象按顺序传递给 `ppsci.solver.Solver`,然后启动训练、评估、可视化。

``` py linenums="105"
```py
--8<--
examples/laplace/laplace2d.py:105:125
--8<--
```

## 4. 完整代码

``` py linenums="1" title="laplace2d.py"
```py
--8<--
examples/laplace/laplace2d.py
--8<--
Expand Down
Loading