news 2026/8/2 16:25:40

MRI脊椎分割数据集 脊椎分割识别数据集 脊椎分割项目解决方法如何 标签分别2460张

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MRI脊椎分割数据集 脊椎分割识别数据集 脊椎分割项目解决方法如何 标签分别2460张

MRI 脊椎分割数据集/脊椎分割项目解决

包含脊椎分割数据集:
原图,标签分别2460张

代码仅供参考

MRI 脊椎分割数据集/脊椎分割项目解决
包含脊椎分割数据集:
原图,标签分别2460张

完整的基于YOLOv5的MRI脊椎分割项目的实现。我们将涵盖以下内容:

  1. 项目结构
  2. 依赖项安装
  3. 数据准备
  4. 模型训练
  5. 评估模型
  6. 推理界面

完整项目结构

spine_segmentation/ ├── main.py ├── train.py ├── evaluate.py ├── infer.py ├── ui_files/ │ ├── infer_ui.ui │ ├── infer_ui.qrc │ └── infer_ui_rc.py ├── datasets/ │ ├── spine/ │ │ ├── images/ │ │ ├── labels/ │ │ ├── train.txt │ │ └── val.txt ├── best_spine.pt ├── requirements.txt └── data.yaml

文件内容

requirements.txt
opencv-python==4.5.3.56 torch==1.9.0+cu111 PyQt5==5.15.4 labelme shutil matplotlib scikit-image numpy pandas
data.yaml
train:./datasets/spine/images/trainval:./datasets/spine/images/valnc:1names:['vertebra']
train.py
importtorchfromyolov5importtrain# 设置随机种子以保证可重复性torch.manual_seed(42)# 定义数据集路径dataset_config='data.yaml'# 训练模型results=train.run(imgsz=640,batch=16,epochs=50,data=dataset_config,weights='yolov5s.pt',name='spine',project='runs/train')# 打印训练结果print(results)
evaluate.py
fromyolov5importval# 初始化YOLOv5模型model_path='runs/train/spine/weights/best.pt'# 评估模型results=val.run(data='data.yaml',weights=model_path,imgsz=640,task='val')# 打印评估结果print(results)
infer.py
importsysimportcv2importnumpyasnpfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QFileDialog,QMessageBox,QLabel,QPushButton,QVBoxLayout,QWidget,QProgressBarfromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQTimerimporttorchfrompathlibimportPathfromyolov5.utils.generalimportnon_max_suppression,scale_coordsfromyolov5.models.experimentalimportattempt_loadfromyolov5.utils.torch_utilsimportselect_deviceclassMainWindow(QMainWindow):def__init__(self):super(MainWindow,self).__init__()self.setWindowTitle("MRI 脊椎分割")self.setGeometry(100,100,800,600)# 初始化YOLOv5模型self.device=select_device('')self.model=attempt_load('runs/train/spine/weights/best.pt',map_location=self.device)self.stride=int(self.model.stride.max())# model strideself.imgsz=640# 创建界面元素self.label_display=QLabel(self)self.label_display.setAlignment(Qt.AlignCenter)self.button_select_image=QPushButton("选择图片",self)self.button_select_folder=QPushButton("选择文件夹",self)self.button_select_video=QPushButton("选择视频",self)self.button_start_camera=QPushButton("开始摄像头",self)self.button_stop_camera=QPushButton("停止摄像头",self)self.progress_bar=QProgressBar(self)self.progress_bar.setVisible(False)layout=QVBoxLayout()layout.addWidget(self.label_display)layout.addWidget(self.button_select_image)layout.addWidget(self.button_select_folder)layout.addWidget(self.button_select_video)layout.addWidget(self.button_start_camera)layout.addWidget(self.button_stop_camera)layout.addWidget(self.progress_bar)container=QWidget()container.setLayout(layout)self.setCentralWidget(container)self.button_select_image.clicked.connect(self.select_image)self.button_select_folder.clicked.connect(self.select_folder)self.button_select_video.clicked.connect(self.select_video)self.button_start_camera.clicked.connect(self.start_camera)self.button_stop_camera.clicked.connect(self.stop_camera)self.timer=QTimer()self.timer.timeout.connect(self.update_frame)self.cap=Noneself.results=[]defload_image(self,image_path):frame=cv2.imread(image_path,cv2.IMREAD_GRAYSCALE)frame=cv2.cvtColor(frame,cv2.COLOR_GRAY2BGR)results=self.detect(frame)annotated_frame=self.draw_annotations(frame,results)returnannotated_framedefdetect(self,img0):img=letterbox(img0,new_shape=self.imgsz,stride=self.stride)[0]img=img[:,:,::-1].transpose(2,0,1)# BGR to RGB, to 3x416x416img=np.ascontiguousarray(img)img=torch.from_numpy(img).to(self.device)img=img.float()# uint8 to fp16/32img/=255.0# 0 - 255 to 0.0 - 1.0ifimg.ndimension()==3:img=img.unsqueeze(0)pred=self.model(img,augment=False)[0]pred=non_max_suppression(pred,0.25,0.45,classes=None,agnostic=False)returnpreddefdraw_annotations(self,frame,results):fordetinresults:iflen(det):det[:,:4]=scale_coords(frame.shape[2:],det[:,:4],frame.shape).round()for*xyxy,conf,clsinreversed(det):label=f'{self.model.names[int(cls)]}{conf:.2f}'plot_one_box(xyxy,frame,label=label,color=(0,255,0),line_thickness=3)returnframedefdisplay_image(self,frame):rgb_image=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,ch=rgb_image.shape bytes_per_line=ch*w qt_image=QImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pixmap=QPixmap.fromImage(qt_image)self.label_display.setPixmap(pixmap.scaled(self.label_display.width(),self.label_display.height()))defselect_image(self):options=QFileDialog.Options()file_path,_=QFileDialog.getOpenFileName(self,"选择图片","","图片 (*.jpg *.jpeg *.png *.tif);;所有文件 (*)",options=options)iffile_path:annotated_frame=self.load_image(file_path)self.display_image(annotated_frame)self.results.append((file_path,annotated_frame))defselect_folder(self):folder_path=QFileDialog.getExistingDirectory(self,"选择文件夹")iffolder_path:files=[os.path.join(folder_path,f)forfinos.listdir(folder_path)iff.endswith(('.jpg','.jpeg','.png','.tif'))]total_files=len(files)self.progress_bar.setMaximum(total_files)self.progress_bar.setValue(0)self.progress_bar.setVisible(True)fori,file_pathinenumerate(files):annotated_frame=self.load_image(file_path)self.display_image(annotated_frame)self.results.append((file_path,annotated_frame))self.progress_bar.setValue(i+1)self.progress_bar.setVisible(False)defselect_video(self):options=QFileDialog.Options()file_path,_=QFileDialog.getOpenFileName(self,"选择视频","","视频 (*.mp4 *.avi);;所有文件 (*)",options=options)iffile_path:self.process_video(file_path)defprocess_video(self,video_path):self.cap=cv2.VideoCapture(video_path)whileself.cap.isOpened():ret,frame=self.cap.read()ifnotret:breakresults=self.detect(frame)annotated_frame=self.draw_annotations(frame,results)self.display_image(annotated_frame)self.results.append((video_path,annotated_frame))ifcv2.waitKey(1)&0xFF==ord('q'):breakself.cap.release()defstart_camera(self):self.cap=cv2.VideoCapture(0)self.timer.start(30)defstop_camera(self):self.timer.stop()ifself.capisnotNone:self.cap.release()self.label_display.clear()defupdate_frame(self):ret,frame=self.cap.read()ifnotret:returnresults=self.detect(frame)annotated_frame=self.draw_annotations(frame,results)self.display_image(annotated_frame)self.results.append(('camera',annotated_frame))defletterbox(img,new_shape=(640,640),color=(114,114,114),auto=True,scaleFill=False,scaleup=True,stride=32):shape=img.shape[:2]# current shape [height, width]r=min(new_shape[0]/shape[0],new_shape[1]/shape[1])ifnotscaleup:# only scale down, do not scale up (for better test mAP)r=min(r,1.0)ratio=r,r# width, height ratiosnew_unpad=int(round(shape[1]*r)),int(round(shape[0]*r))dw,dh=new_shape[1]-new_unpad[0],new_shape[0]-new_unpad[1]# wh paddingifauto:# minimum rectangledw,dh=np.mod(dw,stride),np.mod(dh,stride)# wh paddingelifscaleFill:# stretchdw,dh=0.0,0.0new_unpad=(new_shape[1],new_shape[0])ratio=new_shape[1]/shape[1],new_shape[0]/shape[0]# width, height ratiosdw/=2# divide padding into 2 sidesdh/=2ifshape[::-1]!=new_unpad:# resizeimg=cv2.resize(img,new_unpad,interpolation=cv2.INTER_LINEAR)top,bottom=int(round(dh-0.1)),int(round(dh+0.1))left,right=int(round(dw-0.1)),int(round(dw+0.1))img=cv2.copyMakeBorder(img,top,bottom,left,right,cv2.BORDER_CONSTANT,value=color)# add borderreturnimg,ratio,(dw,dh)defplot_one_box(x,img,color=None,label=None,line_thickness=None):tl=line_thicknessorround(0.002*(img.shape[0]+img.shape[1])/2)+1# line/font thicknesscolor=coloror[random.randint(0,255)for_inrange(3)]c1,c2=(int(x[0]),int(x[1])),(int(x[2]),int(x[3]))cv2.rectangle(img,c1,c2,color,thickness=tl,lineType=cv2.LINE_AA)iflabel:tf=max(tl-1,1)# font thicknesst_size=cv2.getTextSize(label,0,fontScale=tl/3,thickness=tf)[0]c2=c1[0]+t_size[0],c1[1]-t_size[1]-3cv2.rectangle(img,c1,c2,color,-1,cv2.LINE_AA)# filledcv2.putText(img,label,(c1[0],c1[1]-2),0,tl/3,[225,255,255],thickness=tf,lineType=cv2.LINE_AA)if__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())

运行步骤总结

  1. 克隆项目仓库(如果有的话)

    gitclone https://github.com/yourusername/spine_segmentation.gitcdspine_segmentation
  2. 安装依赖项

    conda create--namespine_envpython=3.8conda activate spine_env pipinstall-rrequirements.txt
  3. 下载YOLOv5代码

    gitclone https://github.com/ultralytics/yolov5.gitcdyolov5 pipinstall-rrequirements.txtcd..
  4. 准备数据集

    • 将你的MRI脊椎图像放入datasets/spine/images目录。
    • 将对应的标注文件(假设为YOLO格式的TXT文件)放入datasets/spine/labels目录。
    • 使用脚本划分数据集为训练集和验证集,并生成train.txtval.txt文件。
  5. 训练模型

    python train.py
  6. 评估模型

    python evaluate.py
  7. 运行推理界面

    python infer.py

操作界面

  • 选择图片进行检测:点击“选择图片”按钮,选择一张图片进行检测。
  • 选择文件夹批量检测:点击“选择文件夹”按钮,选择一个包含多张图片的文件夹进行批量检测。
  • 选择视频进行检测:点击“选择视频”按钮,选择一个视频文件进行检测。
  • 摄像头检测:点击“开始摄像头”按钮,使用摄像头进行实时检测;点击“停止摄像头”按钮停止检测。

详细解释

requirements.txt

列出项目所需的所有Python包及其版本。

data.yaml

配置数据集路径和类别信息,用于YOLOv5模型训练。

train.py

加载预训练的YOLOv5s模型并使用自定义数据集进行训练。训练完成后打印训练结果。

evaluate.py

加载训练好的YOLOv5模型并对验证集进行评估,打印评估结果。

infer.py

创建一个GUI应用程序,支持选择图片、文件夹、视频或使用摄像头进行实时检测,并显示检测结果。

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

魔兽争霸3终极性能优化指南:告别卡顿,畅享300FPS流畅体验

魔兽争霸3终极性能优化指南:告别卡顿,畅享300FPS流畅体验 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为《魔兽争霸3》…

作者头像 李华
网站建设 2026/8/2 16:25:08

Arduino Grove录音模块应用指南:从APR9600芯片到语音留言盒实战

1. 项目概述:Grove - 录音模块是什么?如果你玩过Arduino,肯定遇到过想给项目加点“声音”的时候,比如做个会说话的闹钟、一个语音留言机,或者一个简单的录音门铃。这时候,一个独立的、好用的录音模块就成了…

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

情境感知多模态抑郁症数据集:每日短信和行为记录

摘要:情境感知多模态抑郁数据集是一个专门用于抑郁症研究的情境感知多模态数据集,包含文本条目、音频记录和图像数据,捕捉参与者的日常活动、社交互动和情绪模式。每条记录包含情境信息(如活动类型、环境、互动水平、睡眠时长、压…

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

企业级AI编程落地最后一公里:如何用OpenTelemetry监控提示词漂移、用SARIF标准化漏洞反馈、用Diff测试验证生成代码一致性?

更多请点击: https://codechina.net 第一章:企业级AI编程落地的最后一公里挑战本质 企业级AI编程的“最后一公里”,并非技术能力的边界,而是工程化、组织协同与业务语义对齐的交汇地带。当模型在实验室中达到98%的准确率&#xf…

作者头像 李华
网站建设 2026/8/2 16:23:29

抖音无水印下载神器:5分钟学会批量保存高清视频的完整指南

抖音无水印下载神器:5分钟学会批量保存高清视频的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…

作者头像 李华
网站建设 2026/8/2 16:22:32

如何5分钟掌握DouK-Downloader:抖音TikTok数据采集与批量下载终极指南

如何5分钟掌握DouK-Downloader:抖音TikTok数据采集与批量下载终极指南 【免费下载链接】TikTokDownloader TikTok 发布/喜欢/合辑/直播/视频/图集/音乐;抖音发布/喜欢/收藏/收藏夹/视频/图集/实况/直播/音乐/合集/评论/账号/搜索/热榜数据采集工具/下载工…

作者头像 李华