智能农业检测无人机视角水稻稻穗检测数据集智慧农业水稻稻穗检测、无人机农田巡检、稻穗计数、农作物目标检测、智慧农业YOLOv11n稻穗检测、无人机航拍农业数据、密集小目标检测、PyQt5农业检测界面
智能农业检测无人机视角水稻稻穗检测数据集6049张yolo和voc两种标注方式1类标注数量Rice-Panicle: 117848image num: 6049模型代码采用 YOLOv11n 网络训练训练轮次80 个 epoch提供全部训练 测试源代码训练精度 mAP 效果如图所示PyQt5 界面功能界面使用 PyQt5 开发提供全部源码.ui、.qrc、.py 及图标文件支持图片检测、视频检测、摄像头实时检测界面实时显示目标位置、目标总数、置信度等信息支持检测结果保存导出操作简单直观无需命令行一、数据集信息表格1.1 基础信息汇总项目详情数据集名称无人机视角水稻稻穗检测数据集总图像数量6049 张标注格式YOLO、VOC 双格式类别总数1 类总标注框数量117848训练模型YOLOv11n训练轮次80 epoch1.2 类别明细序号英文类别中文类别标注总数0Rice-Panicle水稻稻穗1178481.3 YOLO 类别列表names[Rice-Panicle]二、应用场景农田无人机巡检航拍影像自动统计稻穗数量估测水稻产量。智慧农业监测田间长势分析、稻穗分布统计辅助农事管理。农作物视觉算法研发小目标、密集目标检测模型训练、学术研究与竞赛。智能农机配套结合视觉设备实现田间实时稻穗识别、长势筛查。离线数据分析搭配PyQt界面批量处理航拍图片保存检测结果用于农情研判。三、环境依赖与完整代码3.1 环境安装命令pipinstallultralytics torch opencv-python PyQt5 numpy3.2 数据集配置文件rice.yamlpath:./rice_datasettrain:images/trainval:images/valtest:images/testnc:1names:0:Rice-Panicle3.3 数据集目录结构rice_dataset/ ├── images/ │ ├── train/ │ ├── val/ │ └── test/ ├── labels/ # YOLO txt 标注 │ ├── train/ │ ├── val/ │ └── test/ ├── voc_labels/ # VOC xml 标注 └── rice.yaml3.4 训练代码train_rice.pyfromultralyticsimportYOLOdeftrain_rice_panicle():# 加载轻量化 YOLOv11nmodelYOLO(yolov11n.yaml)model.train(datarice.yaml,epochs80,imgsz640,batch12,devicecpu,# 有GPU改为 device0workers4,patience15,ampTrue,mosaic1.0,projectruns/train,namerice_panicle_det,exist_okTrue)print(训练完成权重路径runs/train/rice_panicle_det/weights)if__name____main__:train_rice_panicle()3.5 测试推理代码test_rice.pyfromultralyticsimportYOLO# 加载训练好的最优权重modelYOLO(runs/train/rice_panicle_det/weights/best.pt)if__name____main__:# 单张图片检测resmodel(test.jpg,saveTrue,conf0.25)# 批量图片检测# res model(./test_images/, saveTrue, conf0.25)# 视频检测# res model(test.mp4, saveTrue, conf0.25)# 摄像头实时检测# res model(0, saveTrue, conf0.25)print(推理测试完成)四、PyQt5 可视化界面完整源码rice_ui.pyimportsysimportcv2importosfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QPushButton,QLabel,QFileDialog,QTextEdit,QVBoxLayout,QWidget,QHBoxLayout)fromPyQt5.QtGuiimportQImage,QPixmapfromPyQt5.QtCoreimportQt,QThread,pyqtSignalfromultralyticsimportYOLO# 子线程推理防止界面卡顿classDetectThread(QThread):frame_signalpyqtSignal(object)log_signalpyqtSignal(str)def__init__(self,model,source,save_path):super().__init__()self.modelmodel self.sourcesource self.save_pathsave_path self.is_runningTruedefrun(self):os.makedirs(self.save_path,exist_okTrue)capcv2.VideoCapture(self.source)idx0whileself.is_running:ret,framecap.read()ifnotret:breakresultsself.model(frame,conf0.25)draw_frameresults[0].plot()total_numlen(results[0].boxes)conf_list[f{float(box.conf[0]):.2f}forboxinresults[0].boxes]log_textf稻穗总数{total_num}\n置信度列表{conf_list}self.frame_signal.emit(draw_frame)self.log_signal.emit(log_text)cv2.imwrite(f{self.save_path}/res_{idx}.jpg,draw_frame)idx1cap.release()defstop_thread(self):self.is_runningFalse# 主界面classRiceDetectUI(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(水稻稻穗检测系统)self.resize(1280,800)# 加载模型self.modelYOLO(runs/train/rice_panicle_det/weights/best.pt)self.detect_threadNoneself.result_dir./detect_result# 整体布局main_widgetQWidget()self.setCentralWidget(main_widget)main_layoutQHBoxLayout(main_widget)# 图像显示区域self.display_labelQLabel()self.display_label.setStyleSheet(background-color: #222222;)self.display_label.setAlignment(Qt.AlignCenter)main_layout.addWidget(self.display_label,3)# 右侧控制面板ctrl_widgetQWidget()ctrl_layoutQVBoxLayout(ctrl_widget)self.btn_imgQPushButton(图片检测)self.btn_videoQPushButton(视频检测)self.btn_cameraQPushButton(摄像头检测)self.btn_stopQPushButton(停止检测)self.log_textQTextEdit()self.log_text.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_text)main_layout.addWidget(ctrl_widget,1)defshow_frame(self,frame):rgb_imgcv2.cvtColor(frame,cv2.COLOR_BGR2RGB)h,w,chrgb_img.shape bytes_linech*w q_imgQImage(rgb_img.data,w,h,bytes_line,QImage.Format_RGB888)self.display_label.setPixmap(QPixmap.fromImage(q_img).scaled(self.display_label.size(),Qt.KeepAspectRatio))defadd_log(self,text):self.log_text.append(text)defstart_detect(self,source):self.stop_detect()self.detect_threadDetectThread(self.model,source,self.result_dir)self.detect_thread.frame_signal.connect(self.show_frame)self.detect_thread.log_signal.connect(self.add_log)self.detect_thread.start()defdetect_image(self):file_path,_QFileDialog.getOpenFileName(self,选择图片,,图片文件 (*.jpg *.png *.jpeg))ifnotfile_path:returnimgcv2.imread(file_path)resself.model(img,conf0.25)draw_imgres[0].plot()self.show_frame(draw_img)totallen(res[0].boxes)confs[f{float(b.conf[0]):.2f}forbinres[0].boxes]logf图片检测完成\n稻穗总数{total}\n置信度{confs}self.add_log(log)os.makedirs(self.result_dir,exist_okTrue)cv2.imwrite(f{self.result_dir}/img_result.jpg,draw_img)defdetect_video(self):file_path,_QFileDialog.getOpenFileName(self,选择视频,,视频文件 (*.mp4 *.avi))iffile_path:self.start_detect(file_path)defdetect_camera(self):self.start_detect(0)defstop_detect(self):ifself.detect_threadandself.detect_thread.isRunning():self.detect_thread.stop_thread()self.detect_thread.quit()self.detect_thread.wait()defcloseEvent(self,event):self.stop_detect()event.accept()if__name____main__:appQApplication(sys.argv)uiRiceDetectUI()ui.show()sys.exit(app.exec_())