UNet - 预测数据predict(多个图像的分割)
创始人
2024-01-30 00:45:45

目录

1. 介绍

2. predict 预测分割图片

3. 结果展示

4. 完整代码


1. 介绍

之前已经将unet的网络模块、dataset数据加载和train训练数据已经解决了,这次要将unet网络去分割图像,下面是之前的链接

unet 网络:UNet - unet网络

dataset 数据处理:UNet - 数据加载 Dataset

train 网络训练:UNet - 训练数据train

待分割的图像如下:

 存放的路径在U-net项目的predict里面

我们的目标是将predict里面所有的图片分割出来,按照名称顺序保存在result文件夹里面:

2. predict 预测分割图片

首先定义图片的预处理,按照dataset里面相同的方式进行预处理

然后是加载网络的模型和网络参数

 然后加载predict里面所有待处理图片的路径

需要注意的是,os.listdir 加载的只是里面每个图片,并不是图片的具体路径。tests_path 里面的内容如下面的注释所示:

接下来就可以分割图片了

因为tests_path 里面每个文件是 x.png 即文件名+后缀的方式。通过split的 '.' 分割成x和后缀名png的形式,[-2]代表取倒数第二个值,就可以将每个文件名x取出来,然后将路径拼接就可以存放到result里面

open图像的时候,也要注意,test_path 只是遍历tests_path 里面的文件,需要加上之前的predict路径才能正确的读取到每个待分割的图片

因为这里处理图像会改变size成480*480的形式,想要将输出的结果保持不变的话,在网络预测前将图像的大小保存下来就可以了。(注:这里的size和opencv里面的shape返回值是反过来的)

这里不清楚的可以通过调试,打印每个变量的内容看一下就可以了

接下来就是网络预测的部分,这里输出的size是(batch,channel,height,width),因为这里的batch是1,channel 灰度图片因此也是1,这里通过squeeze将1的维度删去,只需要图像的大小

下面是squeeze的用法

然后图像保存的话,要转到cpu上面 ,这一步不知道为啥,但是不加这一步会报错

 最后就是保存图像了,将网络的结果二值化后,还原图像再保存就可以了

3. 结果展示

predict里面待预测的图片

result 里面分割好的图片

下面是 参考文章 博主的分割结果

 

对比发现,有些小的细节会丢失,但是大概的轮廓分割出来了

4. 完整代码

完整的项目可以在 这里 下载

import numpy as np
import torch
import cv2
from model import UNet
from torchvision import transforms
from PIL import Image
import os# 预处理
transform = transforms.Compose([transforms.Resize((480,480)),        # 缩放图像transforms.ToTensor(),
])# 加载模型
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
net = UNet(in_channels=1, num_classes=1)
net.load_state_dict(torch.load('Unet.pth', map_location=device))
net.to(device)# 测试模式
net.eval()
# 读取所有图片路径
tests_path = os.listdir('./predict/')   # 获取 './predict/' 路径下所有文件,这里的路径只是里面文件的路径
''''
print(tests_path)
['0.png', '1.png', '10.png', '11.png', '12.png', '13.png', '14.png', 
'15.png', '16.png', '17.png', '18.png', '19.png', '2.png', '20.png', 
'21.png', '22.png', '23.png', '24.png', '25.png', '26.png', '27.png','28.png', '29.png', '3.png', '4.png', '5.png', '6.png', '7.png', '8.png', '9.png']
'''with torch.no_grad():                   # 预测的时候不需要计算梯度for test_path in tests_path:        # 遍历每个predict的文件save_pre_path = './result/'+test_path.split('.')[-2] + '_res.png'    # 将保存的路径按照原图像的后缀,按照数字排序保存img = Image.open('./predict/' +test_path)           # 预测图片的路径width,height = img.size[0],img.size[1]              # 保存图像的大小img = transform(img)img = torch.unsqueeze(img,dim = 0)                  # 扩展图像的维度pred = net(img.to(device))                          # 网络预测pred = torch.squeeze(pred)                          # 将(batch、channel)维度去掉pred = np.array(pred.data.cpu())                    # 保存图片需要转为cpu处理pred[pred >= 0] = 255                               # 处理结果二值化pred[pred < 0] = 0pred = np.uint8(pred)                               # 转为图片的形式pred = cv2.resize(pred,(width,height),cv2.INTER_CUBIC)          # 还原图像的sizecv2.imwrite(save_pre_path, pred)                    # 保存图片

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
安徒生童话有哪些 安徒生童话的... 从德国汉堡港乘轮船渡波罗的海抵丹麦王国,就到了安徒生的祖邦。安徒生(1805-1875)以童话作品闻...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
安徒生童话有哪些 安徒生童话的... 从德国汉堡港乘轮船渡波罗的海抵丹麦王国,就到了安徒生的祖邦。安徒生(1805-1875)以童话作品闻...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...