news 2026/2/28 7:59:00

基于opencv与深度学习Deeplab舌苔分割检测代码及教程 深度学习图像分割 舌苔分割图像数据集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于opencv与深度学习Deeplab舌苔分割检测代码及教程 深度学习图像分割 舌苔分割图像数据集

深度学习Deeplab舌苔分割检测代码及教程

引言

舌苔分割是中医诊断中的一个重要环节,通过对舌苔的分析可以辅助医生了解患者的健康状况。近年来,深度学习技术在医学图像处理领域取得了显著进展,Deeplab系列模型因其卓越的分割性能而被广泛应用于医学图像分割任务。本文将详细介绍如何使用Deeplab模型进行舌苔分割检测,包括环境搭建、数据准备、模型训练和推理等步骤。

环境搭建

首先,确保你的开发环境已经安装了必要的库。推荐使用Python 3.7或更高版本,并安装以下库:

  • torch
  • OpenCV
  • NumPy
  • Matplotlib
  • TensorFlow Addons (如果需要使用特定的损失函数或优化器)

可以通过以下命令安装这些库:

pipinstalltorch opencv-python-headless numpy matplotlib
数据准备
1. 数据集

你需要一个包含舌苔图像及其对应分割标签的数据集。数据集应包含以下内容:

  • 原始舌苔图像(通常是彩色图像)
  • 对应的分割标签图像(通常是灰度图像,每个像素值表示不同的类别)
2. 数据预处理

数据预处理是提高模型性能的关键步骤。常见的预处理步骤包括:

  • 图像缩放:将图像缩放到统一的大小(例如256x256)。
  • 数据增强:使用随机旋转、翻转、裁剪等方法增加数据多样性。
  • 归一化:将图像像素值归一化到[0, 1]区间。
importcv2importnumpyasnpfromtensorflow.keras.preprocessing.imageimportImageDataGeneratordefpreprocess_image(image_path,target_size=(256,256)):image=cv2.imread(image_path)image=cv2.resize(image,target_size)image=image/255.0# 归一化returnimagedefpreprocess_mask(mask_path,target_size=(256,256)):mask=cv2.imread(mask_path,cv2.IMREAD_GRAYSCALE)mask=cv2.resize(mask,target_size)mask=np.expand_dims(mask,axis=-1)# 添加通道维度returnmask# 数据增强data_gen_args=dict(rotation_range=10,width_shift_range=0.1,height_shift_range=0.1,shear_range=0.1,zoom_range=0.˜,horizontal_flip=True,fill_mode='nearest')image_datagen=ImageDataGenerator(**data_gen_args)mask_datagen=ImageDataGenerator(**data_gen_args)# 创建生成器defgenerator(batch_size,image_paths,mask_paths):whileTrue:batch_images=[]batch_masks=[]foriinrange(batch_size):idx=np.random.randint(len(image_paths))image=preprocess_image(image_paths[idx])mask=preprocess_mask(mask_paths[idx])batch_images.append(image)batch_masks.append(mask)yieldnp.array(batch_images),np.array(batch_masks)
模型构建

1. 加载Deeplab模型

torch提供了预训练的Deeplab模型,可以直接加载并进行微调。

importtensorflowastffromtensorflow_examples.models.pix2piximportpix2pixdefbuild_deeplab_model(input_shape,num_classes):base_model=tf.keras.applications.MobileNetV2(input_shape=input_shape,include_top=False)layer_names=['block_1_expand_relu',# 64x64'block_3_expand_relu',# 32x32'block_6_expand_relu',# 16x16'block_13_expand_relu',# 8x8'block_16_project',# 4x4]layers=[base_model.get_layer(name).outputfornameinlayer_names]# 创建特征提取器模型down_stack=tf.keras.Model(inputs=base_model.input,outputs=layers)down_stack.trainable=Falseup_stack=[pix2pix.upsample(512,3),# 4x4 -> 8x8pix2pix.upsample(256,3),# 8x8 -> 16x16pix2pix.upsample(128,3),# 16x16 -> 32x32pix2pix.upsample(64,3),# 32x32 -> 64x64]inputs=tf.keras.layers.Input(shape=input_shape)x=inputs# 下采样skips=down_stack(x)x=skips[-1]skips=reversed(skips[:-1])# 上采样forup,skipinzip(up_stack,skips):x=up(x)concat=tf.keras.layers.Concatenate()x=concat([x,skip])# 最后一层last=tf.keras.layers.Conv2DTranspose(num_classes,3,strides=2,padding='same')# 64x64 -> 128x128x=last(x)returntf.keras.Model(inputs=inputs,outputs=x)
2. 编译模型

定义损失函数、优化器和评估指标。

defdice_loss(y_true,y_pred):smooth=1e-6y_true_f=tf.reshape(y_true,[-1])y_pred_f=tf.reshape(y_pred,[-1])intersection=tf.reduce_sum(y_true_f*y_pred_f)return1-(2.0*intersection+smooth)/(tf.reduce_sum(y_true_f)+tf.reduce_sum(y_pred_f)+smooth)defdice_coef(y_true,y_pred):smooth=1e-6y_true_f=tf.reshape(y_true,[-1])y_pred_f=tf.reshape(y_pred,[-1])intersection=tf.reduce_sum(y_true_f*y_pred_f)return(2.0*intersection+smooth)/(tf.reduce_sum(y_true_f)+tf.reduce_sum(y_pred_f)+smooth)model=build_deeplab_model(input_shape=(256,256,3),num_classes=1)model.compile(optimizer='adam',loss=dice_loss,metrics=[dice_coef])
模型训练
1. 准备数据

假设你已经有了图像路径列表image_paths和对应的掩码路径列表mask_paths

batch_size=8train_generator=generator(batch_size,image_paths,mask_paths)

2. 训练模型

设置训练参数并开始训练。

epochs=50steps_per_epoch=len(image_paths)//batch_size history=model.fit(train_generator,steps_per_epoch=steps_per_epoch,epochs=epochs,callbacks=[tf.keras.callbacks.ModelCheckpoint('tongue_segmentation.h5',save_best_only=True),tf.keras.callbacks.EarlyStopping(patience=5,restore_best_weights=True)])
模型推理
1. 加载模型

加载训练好的模型。

model=tf.keras.models.load_model('tongue_segmentation.h5',custom_objects={'dice_loss':dice_loss,'dice_coef':dice_coef})
2. 进行推理

对新的舌苔图像进行分割。

defpredict_and_visualize(image_path,model,target_size=(256,256)):image=preprocess_image(image_path,target_size)image=np.expand_dims(image,axis=0)# 添加批次维度prediction=model.predict(image)prediction=(prediction>0.5).astype(np.uint8)# 二值化prediction=np.squeeze(prediction,axis=-1)# 移除通道维度# 可视化结果original_image=cv2.imread(image_path)original_image=cv2.resize(original_image,target_size)overlay=np.zeros_like(original_image)overlay[prediction==1]=(0,255,0)# 绿色result=cv2.addWeighted(original_image,0.7,overlay,0.3,0)plt.figure(figsize=(10,5))plt.subplot(1,3,1)plt.title('Original Image')plt.imshow(cv2.cvtColor(original_image,cv2.COLOR_BGR2RGB))plt.axis('off')plt.subplot(1,3,2)plt.title('Prediction')plt.imshow(prediction,cmap='gray')plt.axis('off')plt.subplot(1,3,3)plt.title('Overlay')plt.imshow(cv2.cvtColor(result,cv2.COLOR_BGR2RGB))plt.axis('off')plt.show()# 测试predict_and_visualize('test_image.jpg',model)
总结

通过上述步骤,你可以使用Deeplab模型进行舌苔分割检测。从环境搭建、数据准备、模型构建、训练到推理,每一步都非常重要。通过合理的数据预处理和模型调优,可以显著提高分割的准确性。希望这篇教程能为你在医学图像分割领域的研究和实践提供有价值的参考。如果你有任何问题或需要进一步的帮助,请随时提问。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/26 7:39:28

Docker搭建Web安全渗透测试靶场

目录 DVWA搭建 一,获取靶场镜像 二,Docker搭建 三,查看靶场 Pikachu搭建 一,获取靶场镜像 二,Docker搭建 三,查看靶场 Sql-labs搭建 一,获取靶场镜像 二,Docker搭建 三&…

作者头像 李华
网站建设 2026/2/25 15:06:42

振动下机械臂鲁棒快控制-EXP-振动控制-机械臂

振动下机械臂鲁棒快控制-EXP-振动控制-机械臂实验目的 摘要: ​ 针对基座振动和负载变化的机械臂实验,设计鲁棒有限时间控制器。在两连杆机械臂实验装置上测试,能快速定位目标位置,抗干扰能力强,为控制实现和实验搭建提…

作者头像 李华
网站建设 2026/2/26 16:27:03

华为OD技术面真题 - Mysql相关 - 4

文章目录简单介绍一下Mysql中BinLog、RedoLog和UndoLogRedoLogBinLogUndoLogMysql中事务为什么需要两阶段提交简单介绍一下两阶段提交的流程什么是读写分离怎样实现读写分离说说Mysql主从复制流程怎么避免主从延迟简单介绍一下Mysql中BinLog、RedoLog和UndoLog RedoLog 重做日…

作者头像 李华
网站建设 2026/2/27 3:58:34

一维(1D)CNN模型下轴承故障诊断(Python,TensorFlow框架下,很容易改为其它模型,解压缩后可以直接运行,无需修改任何目录)

1.数据集使用凯斯西储大学轴承数据集,一共有4种负载下采集的数据,每种负载下有10种 故障状态:三种不同尺寸下的内圈故障、三种不同尺寸下的外圈故障、三种不同尺寸下的滚动体故障和一种正常状态。2.模型(1DCNN)使用数据…

作者头像 李华
网站建设 2026/2/8 4:24:42

RAG上下文构建完全指南:从召回策略到最佳实践,一篇搞定!建议收藏

文章探讨了RAG系统中构建上下文的关键问题,特别是当语义召回的多个chunk来自不同段落时如何选择上下文内容。分析了直接使用召回chunk与召回完整段落两种方案的优缺点,指出应根据文档长度、场景需求选择折中方案。有时为减少token消耗并提升模型准确性&a…

作者头像 李华
网站建设 2026/2/26 23:02:25

AI产品经理深度转型指南!

🔥AI产品经理,最近的市场又开始变得火热了起来。💡大部分公司已经开始从原来的巨量投入,变成盈利的状态了。另外算力成本、数据采集和标注成本也在不断下降📉!AI行业已经开始迎来了新的拐点📈&a…

作者头像 李华