尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
舌苔语义分割数据集 舌苔识别 基于UNet模型的舌苔语义分割:从数据准备到模型训练到建立gui
使用UNet模型训练舌苔语义分割数据集步骤安装依赖、准备数据集、配置UNet模型、训练和评估模型、以及构建GUI应用程序来展示分割结果。文章目录使用UNet模型训练舌苔语义分割数据集步骤安装依赖、准备数据集、配置UNet模型、训练和评估模型、以及构建GUI应用程序来展示分割结果。1. 安装依赖2. 数据集准备3. 配置UNet模型4. 训练模型5. 构建GUI应用程序以下文字及代码仅供参考。舌苔语义分割数据集2460张数据jpg和mask掩码png6类 红色舌苔厚腻 白色舌苔厚腻 黑色舌苔 白霉舌苔 紫色舌苔 红色舌苔黄腻厚111使用UNet模型训练舌苔语义分割数据集步骤安装依赖、准备数据集、配置UNet模型、训练和评估模型、以及构建GUI应用程序来展示分割结果。1. 安装依赖首先确保你的环境中已经安装了必要的库pipinstalltorch torchvision torchaudio opencv-python albumentations matplotlib tqdm2. 数据集准备假设你已经有了一个标注好的数据集包括图像及其对应的掩码文件.png。组织你的数据集如下tongue_dataset/ ├── images/ │ ├── img1.jpg │ ├── img2.jpg │ └── ... └── masks/ ├── mask1.png ├── mask2.png └── ...每个类别在mask中用不同的灰度值表示如0代表背景1代表红色舌苔厚腻等。创建一个自定义的PyTorch Dataset类来加载数据importosfromtorch.utils.dataimportDatasetimportcv2importnumpyasnpfromtorchvisionimporttransformsclassTongueDataset(Dataset):def__init__(self,img_dir,mask_dir,transformNone):self.img_dirimg_dir self.mask_dirmask_dir self.transformtransform self.imagesos.listdir(img_dir)def__len__(self):returnlen(self.images)def__getitem__(self,idx):img_pathos.path.join(self.img_dir,self.images[idx])mask_pathos.path.join(self.mask_dir,self.images[idx].replace(.jpg,.png))imagecv2.imread(img_path)imagecv2.cvtColor(image,cv2.COLOR_BGR2RGB)maskcv2.imread(mask_path,cv2.IMREAD_GRAYSCALE)ifself.transform:augmentationsself.transform(imageimage,maskmask)imageaugmentations[image]maskaugmentations[mask]# 将mask转换为long类型并保证是6类背景(共7类)maskmask.long()mask[mask6]0# 如果有超出范围的像素设为背景returnimage,mask3. 配置UNet模型这里我们采用一个基本的UNet架构importtorch.nnasnnimporttorchclassUNet(nn.Module):def__init__(self,n_channels,n_classes):super(UNet,self).__init__()# 这里省略了UNet的具体实现你可以使用现成的UNet实现或者自己定义passdefforward(self,x):# 假设此处为UNet的前向传播过程pass# 初始化模型modelUNet(n_channels3,n_classes7)# 3通道输入7类输出6种舌苔背景4. 训练模型定义损失函数和优化器并开始训练fromtorch.utils.dataimportDataLoaderimporttorch.optimasoptim# 准备数据集和数据加载器transformtransforms.Compose([# 添加你需要的数据增强操作])datasetTongueDataset(img_dirpath/to/images/,mask_dirpath/to/masks/,transformtransform)dataloaderDataLoader(dataset,batch_size4,shuffleTrue)# 损失函数和优化器criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 训练循环forepochinrange(epochs):model.train()running_loss0.0forimages,masksindataloader:optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,masks)loss.backward()optimizer.step()running_lossloss.item()*images.size(0)print(fEpoch{epoch1}, Loss:{running_loss/len(dataloader.dataset)})5. 构建GUI应用程序接下来我们将构建一个简单的PyQt5 GUI应用程序来展示UNet的分割结果。importsysfromPyQt5.QtWidgetsimportQApplication,QLabel,QVBoxLayout,QWidget,QPushButton,QFileDialogfromPyQt5.QtGuiimportQPixmap,QImageimportcv2importnumpyasnpfromPILimportImageclassAppDemo(QWidget):def__init__(self):super().__init__()self.setWindowTitle(Tongue Segmentation)self.setGeometry(100,100,800,600)self.image_labelQLabel(self)self.buttonQPushButton(Load Image,self)self.button.clicked.connect(self.load_image)vboxQVBoxLayout()vbox.addWidget(self.image_label)vbox.addWidget(self.button)self.setLayout(vbox)# 加载已训练的UNet模型self.modeltorch.load(path/to/your/trained_model.pth)self.model.eval()defload_image(self):fname,_QFileDialog.getOpenFileName(self,Open file,,Image files (*.jpg *.png))iffname:self.show_image(fname)defshow_image(self,image_path):imagecv2.imread(image_path)image_tensortransforms.ToTensor()(image).unsqueeze(0)withtorch.no_grad():predictionself.model(image_tensor)_,predstorch.max(prediction,dim1)pred_maskpreds.squeeze().cpu().numpy()pred_maskImage.fromarray(pred_mask.astype(np.uint8),modeP)pred_mask.putpalette([0,0,0,255,0,0,0,255,0,0,0,255,255,255,0,128,0,128])# 根据需要调整颜色板pred_maskpred_mask.convert(RGB)height,width,channelpred_mask.shape bytes_per_line3*width q_imgQImage(pred_mask.data,width,height,bytes_per_line,QImage.Format_RGB888)pixmapQPixmap.fromImage(q_img)self.image_label.setPixmap(pixmap)if__name____main__:appQApplication(sys.argv)demoAppDemo()demo.show()sys.exit(app.exec_())请根据实际情况调整上述代码中的路径、参数和逻辑。
RELATED

相关推荐

基于QT C++与open62541的OPC UA客户端开发实战指南

基于QT C++与open62541的OPC UA客户端开发实战指南

简介:本资源是一套基于Qt C开发的OPC UA客户端完整源码工程,面向工业自动化领域开发者、嵌入式与工控系统学习者,解决跨平台OPC UA通信客户端快速搭建与二次开发难题。压缩包共11个文件,含2个头文件(widget.h、open625…

📅 2026/9/22 16:18:16
c语言学习从0到1的那些事——准备与起步

c语言学习从0到1的那些事——准备与起步

前言 随着人工智能的不断发展,C语言的高级人才缺口也日渐明显。而C学习难度较高,周期长,迭代速度快,需要长期学学习。因此本文将从一个C语言学习者的角度讲述该语言的学习时易出现的错误,并分享作者本人的一些经验。一…

📅 2026/9/7 4:40:15
陶瓷电容直流偏压特性解析:从原理到选型避坑指南

陶瓷电容直流偏压特性解析:从原理到选型避坑指南

陶瓷电容的直流偏压特性,是硬件设计里一个容易被忽略但实际影响巨大的细节。很多新手工程师,甚至一些有经验的同行,在选型时只看容值和耐压,结果板子做出来,实际电容值比标称值小了一大截,导致电源纹波超标…

📅 2026/9/7 23:22:20
MORE NEWS

更多资讯

📰

链表反转:程序员必会的基础算法与工程实践

1. 为什么链表反转是程序员的基本功 第一次在技术面试中被要求手写链表反转时,我的手心全是汗。指针在纸上跳来跳去,明明逻辑清晰的算法,写出来却漏洞百出。后来才发现,链表反转这个看似简单的操作,其实是检验程序员对…

📰

从零手搓AI工程:告别调包,掌握核心链路与排查能力

1. 从零搭建AI工程能力:为什么“手搓”比调包更值得投入 这两年AI应用层的工具链成熟得吓人,LangChain、LlamaIndex、各种Agent框架几乎把“调用大模型”这件事压缩成了几行代码。但我观察到一个挺有意思的现象:越是能快速跑通Demo的人&#…

📰

用大模型检测钓鱼邮件的工程实战:结构化信号、确定性分层与置信度校准(2026)

用大模型检测钓鱼邮件的工程实战:结构化信号、确定性分层与置信度校准(2026)法律红线声明:本文全部检测代码在自有测试环境与公开数据集(PhishNChips)上运行,所涉钓鱼样本均为公开基准数据或虚构…

📰

Windows下Docker部署Dify的502错误解决方案

1. 问题现象与背景分析 最近在Windows系统上通过Docker部署Dify时,不少用户反馈在install界面卡住,浏览器开发者工具显示step请求返回502错误。这种情况通常发生在首次安装或升级过程中,表现为安装向导无法正常跳转到下一步,控制台…

📰

解决Windows Docker部署Dify时502错误的完整指南

1. 问题现象与初步排查 最近在Windows系统上部署Dify时遇到了一个典型问题:Docker容器启动后,在install界面卡住,前端页面发起step请求返回502错误。这个问题看似简单,但涉及Docker网络、后端服务健康检查、代理配置等多个环节。经…

📰

轻量级复盘系统hindsight:用预期、实际、偏差三字段把后见之明变成先见之明

1. 为什么“事后复盘”这件事值得单独拿出来做 “hindsight”这个词,直译过来就是“后见之明”,也就是我们常说的“事后诸葛亮”。但有意思的是,在真实的工作和生活里,事后诸葛亮往往是最不值钱的——事情都过去了,你再…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬