Commit 40c01b2f authored by liucong's avatar liucong
Browse files

提交unet推理代码和文档

parents
# Convolutional Networks for Biomedical Image Segmentation(U-Net)
## 模型介绍
语义分割(Semantic Segmentation)是图像处理和机器视觉一个重要分支。与分类任务不同,语义分割需要判断图像每个像素点的类别,进行精确分割。语义分割目前在自动驾驶、自动抠图、医疗影像等领域有着比较广泛的应用。其中,Unet模型是最常用、最简单的一种分割模型,它简单、高效、易懂、容易构建、可以从小数据集中训练,具有较好的分割效果。
## 模型结构
U-net模型整体为U型结构,主要分为三部分:下采样、上采样以及跳跃连接。首先,在左半部分进行编码阶段,通过卷积和下采样降低图像尺寸,提取一些浅层特征。其次,在右半部分进行解码阶段,通过卷积和上采样来获取一些深层次的特征。其中卷积采用无填充方式来保证结果都是基于没有缺失上下文特征得到的,因此每次经过卷积后,图像的大小会减小。最后,通过concat的方式,将编码阶段获得的feature map同解码阶段获得的feature map结合在一起,得到更加精细的细节,从而根据feature map进行预测分割。
## 推理
### 环境配置
在光源可拉取推理的docker镜像,U-Net模型推理的镜像如下:
```python
docker pull image.sourcefind.cn:5000/dcu/admin/base/custom:ort_dcu_1.14.0_migraphx2.5.2_dtk22.10.1
```
在光合开发者社区可下载MIGraphX安装包,python依赖安装:
```python
pip install -r requirement.txt
```
### 运行示例
我们提供了基于MIGraphX的推理脚本,版本依赖:
- Migraphx(DCU版本) >= 2.5.2
bert.py是基于Migraphx的推理脚本,使用需安装好MIGraphX。使用方法:
```python
# 执行推理
python unet.py
```
推理结果为:
<img src="./Sample_picture.jpg" style="zoom:90%;" align=middle>
## 历史版本
https://developer.hpccube.com/codes/modelzoo/unet_migraphx
## 参考资料
https://github.com/ROCmSoftwarePlatform/AMDMIGraphX/tree/develop/examples/vision/python_unet
car.jpeg

912 KB

opencv-python
numpy
\ No newline at end of file
import numpy as np
from PIL import Image
import cv2
import migraphx
def Preprocess(pil_img, newW, newH):
assert newW > 0 and newH > 0, 'Scale is too small'
pil_img = pil_img.resize((newW, newH))
img_nd = np.array(pil_img)
if len(img_nd.shape) == 2:
img_nd = np.expand_dims(img_nd, axis=2)
# HWC to CHW
img_print = pil_img
img_trans = img_nd.transpose((2, 0, 1))
if img_trans.max() > 1:
img_trans = img_trans / 255
img_trans = np.expand_dims(img_trans, 0)
return img_trans, img_print
def Sigmoid(x):
return 1 / (1 + np.exp(-x))
if __name__ == '__main__':
# 加载模型
model = migraphx.parse_onnx("./model/unet_13_256.onnx")
inputName = model.get_parameter_names()
inputShape = model.get_parameter_shapes()
print("inputName:{0} \ninputShape:{1}".format(inputName, inputShape))
# 编译模型
model.compile(migraphx.get_target("gpu"), device_id=0) # device_id: 设置GPU设备,默认为0号设备
# 图像预处理
img = Image.open("./car.jpeg")
img, imPrint = Preprocess(img, 256, 256)
input_img = np.zeros((1,3,256,256),dtype='float32')
np.lib.stride_tricks.as_strided(input_img, shape=img.shape, strides=input_img.strides)[:] = img
# 模型推理
mask = model.run({'inputs':input_img})
output_mask = np.array(mask[0])[0] # 获取推理结果,shape为(1,256,256)
probs = Sigmoid(output_mask) # 计算sigmoid值
# 0/1像素值,当大于0.996时,值为255,小于等于0.996时,值为0
output_mask[probs > 0.996] = 255
output_mask[probs <= 0.996] = 0
output = output_mask.astype(np.uint8)[0] # 将浮点型转换为uint8整型,shape为(256,256)
cv2.imwrite("output.jpg", output) # 保存图像分割结果
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment