智能医学检测超声图像甲状腺结节检测数据集甲状腺结节检测、超声影像检测、甲状腺良恶性判别、医疗超声AI检测YOLOv11n医疗检测、甲状腺病灶识别、医疗影像目标检测、PyQt5医疗检测界面 智能医学检测超声图像甲状腺结节检测数据集5000张yolovoccoco三种标注方式图像尺寸:500*718类别数量:2类训练集图像数量:4508; 验证集图像数量:294 测试集图像数量:198类别名称: 每一类图像数 每一类标注数0 良性结节: 1426,14261 恶性结节: 3574,3574image num: 5000一、数据集信息表1.1 基础信息项目详情数据集名称超声图像甲状腺结节检测数据集总图像数量5000 张图像尺寸500×718标注格式YOLO、VOC、COCO 三种格式类别总数2 类训练集4508 张验证集294 张测试集198 张训练模型YOLOv11n训练轮数80 epoch1.2 类别标注明细序号中文标签含该类别图像数标注框总数0良性结节142614261恶性结节357435741.3 YOLO 类别列表names[良性结节,恶性结节]模型代码采用 YOLOv11n 网络训练训练轮次80 个 epoch提供全部训练 测试源代码训练精度 mAP 效果如图所示PyQt5 界面功能界面使用 PyQt5 开发提供全部源码.ui、.qrc、.py 及图标文件支持图片检测、视频检测、摄像头实时检测界面实时显示目标位置、目标总数、置信度等信息支持检测结果保存导出二、应用场景医疗辅助诊断医院超声科室辅助筛查甲状腺结节区分良恶性提升诊断效率。基层医疗筛查社区、体检中心批量分析超声影像初步风险预判。医学AI研发超声影像目标检测算法训练、学术研究、模型对比测试。智能医疗设备集成至超声仪器实时检测、标注结节位置与风险等级。离线影像分析搭配PyQt可视化界面离线批量处理历史超声影像并保存结果。三、YOLOv11n 训练 测试代码3.1 环境依赖安装pipinstallultralytics torch opencv-python PyQt5 numpy3.2 数据集配置文件thyroid.yamlpath:./thyroid_datasettrain:images/trainval:images/valtest:images/testnc:2names:0:良性结节1:恶性结节3.3 数据集目录结构thyroid_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ # YOLO txt标注 │ ├── train/ │ ├── val/ │ └── test/ ├── voc_annotations/ # VOC xml标注 ├── coco_annotations/# COCO json标注 └── thyroid.yaml3.4 训练代码train_thyroid.pyfromultralyticsimportYOLOdeftrain_thyroid():modelYOLO(yolov11n.yaml)model.train(datathyroid.yaml,epochs80,imgsz(500,718),batch8,devicecpu,# 有GPU改为 device0workers4,patience15,ampTrue,mosaic1.0,projectruns/train,namethyroid_nodule_det,exist_okTrue)print(训练完成权重已保存至 runs/train/thyroid_nodule_det/weights)if__name____main__:train_thyroid()3.5 测试推理代码test_thyroid.pyfromultralyticsimportYOLO modelYOLO(runs/train/thyroid_nodule_det/weights/best.pt)if__name____main__:# 单张图片检测resmodel(test.jpg,saveTrue,conf0.25)# 批量图片检测# res model(./test_imgs/, saveTrue, conf0.25)# 视频/摄像头检测# res model(0, saveTrue, conf0.25)print(推理测试完成)四、PyQt5 可视化界面完整源码thyroid_ui.pyimportsysimportcv2importosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QPushButton,QLabel,QFileDialog,QTextEdit,QVBoxLayout,QWidget,QHBoxLayout)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromultralyticsimportYOLOclassDetectThread(QThread):frame_sigpyqtSignal(object)info_sigpyqtSignal(str)def__init__(self,model,source,save_path):super().__init__()self.modelmodel self.sourcesource self.save_pathsave_path self.runningTruedefrun(self):os.makedirs(self.save_path,exist_okTrue)capcv2.VideoCapture(self.source)idx0whileself.running:ret,framecap.read()ifnotret:breakresultsself.model(frame,conf0.25)draw_frameresults[0].plot()totallen(results[0].boxes)cls_dict{}conf_list[]forboxinresults[0].boxes:cidint(box.cls[0])cnameself.model.names[cid]confround(float(box.conf[0]),2)cls_dict[cname]cls_dict.get(cname,0)1conf_list.append(str(conf))infof目标总数{total}\n类别统计{cls_dict}\n置信度{conf_list}self.frame_sig.emit(draw_frame)self.info_sig.emit(info)cv2.imwrite(f{self.save_path}/res_{idx}.jpg,draw_frame)idx1cap.release()defstop_task(self):self.runningFalseclassThyroidDetectUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(甲状腺结节超声检测系统)self.resize(1280,800)self.modelYOLO(runs/train/thyroid_nodule_det/weights/best.pt)self.work_threadNoneself.save_dir./detect_result# 主布局main_widgetQWidget()self.setCentralWidget(main_widget)main_layoutQHBoxLayout(main_widget)# 图像显示区self.show_labelQLabel()self.show_label.setStyleSheet(background:#111;)self.show_label.setAlignment(Qt.AlignCenter)main_layout.addWidget(self.show_label,3)# 控制面板ctrl_widgetQWidget()ctrl_layoutQVBoxLayout(ctrl_widget)self.btn_imgQPushButton(图片检测)self.btn_videoQPushButton(视频检测)self.btn_cameraQPushButton(摄像头检测)self.btn_stopQPushButton(停止检测)self.log_editQTextEdit()self.log_edit.setReadOnly(True)self.btn_img.clicked.connect(self.detect_image)self.btn_video.clicked.connect(self.detect_video)self.btn_camera.clicked.connect(self.detect_camera)self.btn_stop.clicked.connect(self.stop_detect)ctrl_layout.addWidget(self.btn_img)ctrl_layout.addWidget(self.btn_video)ctrl_layout.addWidget(self.btn_camera)ctrl_layout.addWidget(self.btn_stop)ctrl_layout.addWidget(QLabel(检测日志))ctrl_layout.addWidget(self.log_edit)main_layout.addWidget(ctrl_widget,1)defrefresh_frame(self,frame):rgbcv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb.shape bytes_per_linech*w qimgQImage(rgb.data,w,h,bytes_per_line,QImage.Format_RGB888)self.show_label.setPixmap(QPixmap.fromImage(qimg).scaled(self.show_label.size(),Qt.KeepAspectRatio))defappend_log(self,text):self.log_edit.append(text)defstart_stream(self,source):self.stop_detect()self.work_threadDetectThread(self.model,source,self.save_dir)self.work_thread.frame_sig.connect(self.refresh_frame)self.work_thread.info_sig.connect(self.append_log)self.work_thread.start()defdetect_image(self):path,_QFileDialog.getOpenFileName(self,选择超声图片,,Image(*.jpg *.png *.jpeg))ifnotpath:returnimgcv2.imread(path)resself.model(img,conf0.25)draw_imgres[0].plot()self.refresh_frame(draw_img)totallen(res[0].boxes)cls_d{}confs[]forboxinres[0].boxes:cnself.model.names[int(box.cls[0])]cls_d[cn]cls_d.get(cn,0)1confs.append(f{float(box.conf[0]):.2f})logf图片检测完成\n总数{total}\n类别{cls_d}\n置信度{confs}self.append_log(log)os.makedirs(self.save_dir,exist_okTrue)cv2.imwrite(f{self.save_dir}/img_result.jpg,draw_img)defdetect_video(self):path,_QFileDialog.getOpenFileName(self,选择视频,,Video(*.mp4 *.avi))ifpath:self.start_stream(path)defdetect_camera(self):self.start_stream(0)defstop_detect(self):ifself.work_threadandself.work_thread.isRunning():self.work_thread.stop_task()self.work_thread.quit()self.work_thread.wait()defcloseEvent(self,event):self.stop_detect()event.accept()if__name____main__:appQApplication(sys.argv)winThyroidDetectUI()win.show()sys.exit(app.exec_())