基于改进UNET的油页岩图像石油含油量基于UNet及其改进模型开发油页岩含油量智能识别系统,结合PyQt实现可视化界面 基于改进UNET的油页岩图像石油含油量基于UNet及其改进模型开发油页岩含油量智能识别系统结合PyQt实现可视化界面文章目录 基于改进 UNet 的油页岩图像石油含油量智能识别系统结合 PyQt 实现可视化界面 项目概述功能特点️ 技术栈 系统实现1. 数据准备与预处理数据集结构预处理代码2. 改进的 UNet 模型构建UNet 架构3. 训练与推理训练代码4. PyQt5 可视化界面主界面设计以下文字及代码仅供参考学习使用。基于改进UNET的油页岩图像石油含油量基于UNet及其改进模型开发油页岩含油量智能识别系统结合PyQt实现可视化界面 基于改进 UNet 的油页岩图像石油含油量智能识别系统结合 PyQt 实现可视化界面 项目概述本项目旨在开发一个基于UNet 及其改进模型的油页岩含油量智能识别系统并通过PyQt实现用户友好的可视化界面。系统能够对油页岩图像进行二分类分割识别出含油区域并计算含油量百分比。功能特点图像上传支持用户上传油页岩图像。自动检测使用训练好的 UNet 模型进行图像分割和含油量识别。结果展示在界面上显示分割结果和含油量百分比。结果下载允许用户下载处理后的图像和结果报告。️ 技术栈深度学习框架PyTorch模型架构UNet 及其改进版本如 ResUNet、Attention UNet 等前端界面PyQt5数据处理OpenCV, NumPy 系统实现1. 数据准备与预处理数据集结构oil_shale_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── masks/ │ ├── train/ │ ├── val/ │ └── test/ └── data.yaml预处理代码importcv2importnumpyasnpfromtorch.utils.dataimportDatasetclassOilShaleDataset(Dataset):def__init__(self,image_dir,mask_dir,transformNone):self.image_dirimage_dir self.mask_dirmask_dir self.transformtransform self.imagesos.listdir(image_dir)def__len__(self):returnlen(self.images)def__getitem__(self,index):img_pathos.path.join(self.image_dir,self.images[index])mask_pathos.path.join(self.mask_dir,self.images[index].replace(.jpg,.png))imagecv2.imread(img_path)maskcv2.imread(mask_path,cv2.IMREAD_GRAYSCALE)ifself.transform:augmentedself.transform(imageimage,maskmask)imageaugmented[image]maskaugmented[mask]returnimage,mask2. 改进的 UNet 模型构建UNet 架构importtorchimporttorch.nnasnnimporttorchvision.modelsasmodelsclassUNet(nn.Module):def__init__(self,in_channels3,out_channels1,features[64,128,256,512]):super(UNet,self).__init__()self.encodermodels.vgg16(pretrainedTrue).features self.upconv1nn.ConvTranspose2d(features[-1],features[-2],kernel_size2,stride2)self.decoder1nn.Sequential(nn.Conv2d(features[-2]*2,features[-2],kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.Conv2d(features[-2],features[-2],kernel_size3,padding1),nn.ReLU(inplaceTrue))self.upconv2nn.ConvTranspose2d(features[-2],features[-3],kernel_size2,stride2)self.decoder2nn.Sequential(nn.Conv2d(features[-3]*2,features[-3],kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.Conv2d(features[-3],features[-3],kernel_size3,padding1),nn.ReLU(inplaceTrue))self.upconv3nn.ConvTranspose2d(features[-3],features[-4],kernel_size2,stride2)self.decoder3nn.Sequential(nn.Conv2d(features[-4]*2,features[-4],kernel_size3,padding1),nn.ReLU(inplaceTrue),nn.Conv2d(features[-4],features[-4],kernel_size3,padding1),nn.ReLU(inplaceTrue))self.final_convnn.Conv2d(features[0],out_channels,kernel_size1)defforward(self,x):enc1self.encoder[:4](x)enc2self.encoder[4:9](enc1)enc3self.encoder[9:16](enc2)enc4self.encoder[16:](enc3)dec1self.upconv1(enc4)dec1torch.cat((dec1,enc3),dim1)dec1self.decoder1(dec1)dec2self.upconv2(dec1)dec2torch.cat((dec2,enc2),dim1)dec2self.decoder2(dec2)dec3self.upconv3(dec2)dec3torch.cat((dec3,enc1),dim1)dec3self.decoder3(dec3)returnself.final_conv(dec3)3. 训练与推理训练代码importtorch.optimasoptimfromtorch.utils.dataimportDataLoaderfromtqdmimporttqdmdeftrain(model,dataloader,criterion,optimizer,device):model.train()running_loss0.0forimages,masksintqdm(dataloader):imagesimages.to(device)masksmasks.to(device).unsqueeze(1).float()optimizer.zero_grad()outputsmodel(images)losscriterion(outputs,masks)loss.backward()optimizer.step()running_lossloss.item()*images.size(0)epoch_lossrunning_loss/len(dataloader.dataset)print(fTraining Loss:{epoch_loss:.4f})defmain():devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelUNet().to(device)criterionnn.BCEWithLogitsLoss()optimizeroptim.Adam(model.parameters(),lr0.001)datasetOilShaleDataset(data/images/train,data/masks/train)dataloaderDataLoader(dataset,batch_size4,shuffleTrue)num_epochs10forepochinrange(num_epochs):print(fEpoch{epoch1}/{num_epochs})train(model,dataloader,criterion,optimizer,device)if__name____main__:main()4. PyQt5 可视化界面主界面设计importsysfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButton,QVBoxLayout,QWidget,QLabel,QFileDialog,QMessageBoxfromPyQt5.QtGuiimportQPixmapimportcv2importnumpyasnpclassOilShaleApp(QMainWindow):def__init__(self):super().__init__()self.initUI()definitUI(self):self.setWindowTitle(油页岩含油量智能识别系统)self.setGeometry(100,100,800,600)self.central_widgetQWidget()self.setCentralWidget(self.central_widget)layoutQVBoxLayout()self.upload_buttonQPushButton(上传图片,self)self.upload_button.clicked.connect(self.upload_image)layout.addWidget(self.upload_button)self.detect_buttonQPushButton(开始检测,self)self.detect_button.clicked.connect(self.start_detection)layout.addWidget(self.detect_button)self.download_buttonQPushButton(结果下载,self)self.download_button.clicked.connect(self.download_result)layout.addWidget(self.download_button)self.result_labelQLabel(含油量识别结果,self)layout.addWidget(self.result_label)self.image_labelQLabel(self)layout.addWidget(self.image_label)self.central_widget.setLayout(layout)defupload_image(self):optionsQFileDialog.Options()file_name,_QFileDialog.getOpenFileName(self,选择油页岩图像,,Images (*.png *.jpg *.bmp);;All Files (*),optionsoptions)iffile_name:self.image_pathfile_name pixmapQPixmap(file_name)self.image_label.setPixmap(pixmap.scaled(600,400))defstart_detection(self):ifhasattr(self,image_path):# 调用模型进行检测oil_percentageself.detect_oil_percentage(self.image_path)self.result_label.setText(f含油量识别结果{oil_percentage:.2f}%)else:QMessageBox.warning(self,警告,请先上传一张图像)defdetect_oil_percentage(self,image_path):# 这里调用你的模型进行预测# 示例代码imagecv2.imread(image_path)# 使用模型预测# ...# 返回含油量百分比return25.487defdownload_result(self):ifhasattr(self,result_label):result_textself.result_label.text()optionsQFileDialog.Options()file_name,_QFileDialog.getSaveFileName(self,保存结果,,Text Files (*.txt);;All Files (*),optionsoptions)iffile_name:withopen(file_name,w)asf:f.write(result_text)QMessageBox.information(self,成功,结果已保存)else:QMessageBox.warning(self,警告,没有可保存的结果)if__name____main__:appQApplication(sys.argv)exOilShaleApp()ex.show()sys.exit(app.exec_())以上文字及代码仅供参考学习使用。