深度学习基于YOLOV11罂粟识别检测系统 YOLOV11框架如何训练无人机罂粟识别检测数据集 航拍罂粟数据集的训练及应用

张开发
2026/4/13 13:36:27 15 分钟阅读

分享文章

深度学习基于YOLOV11罂粟识别检测系统 YOLOV11框架如何训练无人机罂粟识别检测数据集 航拍罂粟数据集的训练及应用
深度学习基于YOLOV11罂粟识别检测系统 YOLOV11框架如何训练无人机罂粟识别检测数据集 航拍罂粟数据集的训练及应用1以下是构建该系统的详细步骤和完整代码。第一步环境准备首先你需要安装最新的 Ultralytics 库支持 YOLOv11以及处理图像和界面的库。pipinstallultralytics opencv-python pandas PySide6 lxml第二步数据集预处理 (XML 转 YOLO)3160 张 XML 格式。转换为 YOLO 训练所需的.txt格式并划分训练集和验证集。脚本convert_data.pyimportosimportxml.etree.ElementTreeasETfromsklearn.model_selectionimporttrain_test_splitimportshutil# 配置路径XML_DIRdataset/xmls# 存放xml文件的文件夹IMAGE_DIRdataset/images# 存放图片文件的文件夹OUTPUT_DIRdataset/yolo# 输出转换后txt的文件夹CLASSES[poppy]# 类别列表这里只有罂粟os.makedirs(os.path.join(OUTPUT_DIR,labels,train),exist_okTrue)os.makedirs(os.path.join(OUTPUT_DIR,labels,val),exist_okTrue)os.makedirs(os.path.join(OUTPUT_DIR,images,train),exist_okTrue)os.makedirs(os.path.join(OUTPUT_DIR,images,val),exist_okTrue)defconvert(size,box):dw1./size[0]dh1./size[1]x(box[0]box[1])/2.0-1y(box[2]box[3])/2.0-1wbox[1]-box[0]hbox[3]-box[2]x*dw w*dw y*dh h*dhreturn(x,y,w,h)defconvert_annotation(xml_id):in_fileopen(os.path.join(XML_DIR,f{xml_id}.xml),encodingutf-8)out_fileopen(os.path.join(OUTPUT_DIR,labels,temp,f{xml_id}.txt),w,encodingutf-8)treeET.parse(in_file)roottree.getroot()sizeroot.find(size)wint(size.find(width).text)hint(size.find(height).text)forobjinroot.iter(object):difficultobj.find(difficult).text clsobj.find(name).textifclsnotinCLASSESorint(difficult)1:continuecls_idCLASSES.index(cls)xmlboxobj.find(bndbox)b(float(xmlbox.find(xmin).text),float(xmlbox.find(xmax).text),float(xmlbox.find(ymin).text),float(xmlbox.find(ymax).text))bbconvert((w,h),b)out_file.write(str(cls_id) .join([str(a)forainbb])\n)# 1. 转换所有XMLos.makedirs(os.path.join(OUTPUT_DIR,labels,temp),exist_okTrue)xml_files[os.path.splitext(f)[0]forfinos.listdir(XML_DIR)iff.endswith(.xml)]print(f正在转换{len(xml_files)}个标注文件...)forxml_idinxml_files:convert_annotation(xml_id)# 2. 划分训练集和验证集 (80% 训练, 20% 验证)train_files,val_filestrain_test_split(xml_files,test_size0.2,random_state42)defmove_files(file_list,img_set):forfile_idinfile_list:# 移动图片src_imgos.path.join(IMAGE_DIR,f{file_id}.jpg)# 假设图片是jpg格式dst_imgos.path.join(OUTPUT_DIR,images,img_set,f{file_id}.jpg)ifos.path.exists(src_img):shutil.copy(src_img,dst_img)# 移动标签src_lblos.path.join(OUTPUT_DIR,labels,temp,f{file_id}.txt)dst_lblos.path.join(OUTPUT_DIR,labels,img_set,f{file_id}.txt)ifos.path.exists(src_lbl):shutil.copy(src_lbl,dst_lbl)move_files(train_files,train)move_files(val_files,val)# 3. 生成 data.yaml 供 YOLO 使用yaml_contentf path:{os.path.abspath(OUTPUT_DIR)}train: images/train val: images/val names: 0: poppy withopen(poppy_data.yaml,w)asf:f.write(yaml_content)print(数据预处理完成请检查 poppy_data.yaml)第三步训练 YOLOv11 模型数据处理完成后使用以下代码进行模型训练。脚本train.pyfromultralyticsimportYOLOdeftrain_model():# 加载 YOLOv11 预训练模型 (你可以选择 n, s, m, l, x 不同大小)# 这里使用 yolov11s.pt 作为平衡点modelYOLO(yolov11s.pt)# 开始训练resultsmodel.train(datapoppy_data.yaml,# 上一步生成的配置文件epochs100,# 训练轮数imgsz640,# 输入图像大小batch16,# 批大小根据显存调整namepoppy_v11_exp,# 实验名称device0# 使用 GPU (0号显卡)如果没有GPU则设为 cpu)if__name____main__:train_model()第四步构建可视化系统 (PySide6)这是最终用户看到的界面模仿了你提供的截图。它包含文件导入、摄像头检测、结果显示和表格列表。脚本app.pyimportsysimportcv2importtimeimporttorchimportpandasaspdfromPySide6.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QTableWidget,QTableWidgetItem,QHeaderView,QFileDialog,QMessageBox)fromPySide6.QtGuiimportQPixmap,QImage,QFontfromPySide6.QtCoreimportQt,QThread,Signal,QTimer# 加载训练好的模型 (确保路径正确)# 训练完成后权重通常在 runs/detect/poppy_v11_exp/weights/best.ptMODEL_PATHruns/detect/poppy_v11_exp/weights/best.ptmodelYOLO(MODEL_PATH)classVideoThread(QThread):change_pixmap_signalSignal(np.ndarray)update_stats_signalSignal(int,float)# 数量, 耗时def__init__(self):super().__init__()self._run_flagTrueself.source0# 默认摄像头defrun(self):capcv2.VideoCapture(self.source)whileself._run_flag:ret,cv_imgcap.read()ifret:# YOLO 推理start_timetime.time()resultsmodel(cv_img)[0]infer_timetime.time()-start_time# 绘制结果annotated_frameresults.plot()# 统计数量countlen(results.boxes)self.change_pixmap_signal.emit(annotated_frame)self.update_stats_signal.emit(count,infer_time)else:breakcap.release()defstop(self):self._run_flagFalseself.wait()class罂粟识别系统(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle(罂粟无人机识别系统)self.setGeometry(100,100,1200,800)self.init_ui()self.threadNonedefinit_ui(self):# 主布局central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# 左侧视频显示区left_layoutQVBoxLayout()self.image_labelQLabel(请点击右侧开启摄像头或导入视频)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setFixedSize(800,600)self.image_label.setStyleSheet(background-color: #222; color: white;)left_layout.addWidget(self.image_label)# 右侧控制面板right_layoutQVBoxLayout()right_layout.setAlignment(Qt.AlignTop)# 标题titleQLabel(检测控制面板)title.setFont(QFont(Microsoft YaHei,16,QFont.Bold))right_layout.addWidget(title)# 按钮组self.btn_videoQPushButton( 摄像头开启)self.btn_video.clicked.connect(self.toggle_camera)right_layout.addWidget(self.btn_video)self.btn_fileQPushButton( 导入视频文件)self.btn_file.clicked.connect(self.load_video)right_layout.addWidget(self.btn_file)# 统计信息self.lbl_countQLabel(检测数量: 0)self.lbl_timeQLabel(推理耗时: 0.00s)right_layout.addWidget(self.lbl_count)right_layout.addWidget(self.lbl_time)# 表格self.tableQTableWidget()self.table.setColumnCount(4)self.table.setHorizontalHeaderLabels([序号,类别,置信度,坐标])self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)right_layout.addWidget(self.table)main_layout.addLayout(left_layout)main_layout.addLayout(right_layout)deftoggle_camera(self):ifself.threadisNone:self.threadVideoThread()self.thread.change_pixmap_signal.connect(self.update_image)self.thread.update_stats_signal.connect(self.update_info)self.thread.start()self.btn_video.setText(⏹️ 停止检测)else:self.thread.stop()self.threadNoneself.btn_video.setText( 摄像头开启)self.image_label.clear()self.image_label.setText(已停止)defload_video(self):# 这里仅演示摄像头视频文件逻辑类似只需在 Thread 中传入文件路径QMessageBox.information(self,提示,此功能逻辑与摄像头相同请选择文件路径传入 VideoThread)defupdate_image(self,cv_img):将 OpenCV 图像转换为 Qt 图像并显示rgb_imagecv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w convert_to_Qt_formatQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pconvert_to_Qt_format.scaled(800,600,Qt.KeepAspectRatio)self.image_label.setPixmap(QPixmap.fromImage(p))defupdate_info(self,count,infer_time):self.lbl_count.setText(f检测数量:{count})self.lbl_time.setText(f推理耗时:{infer_time:.3f}s)# 简单的表格更新逻辑实际项目中建议传入详细结果列表# 这里仅做演示每次清空重填self.table.setRowCount(count)# 注意这里需要修改 Thread 将 results.boxes.data 传出来才能填充具体表格if__name____main__:appQApplication(sys.argv)window罂粟识别系统()window.show()sys.exit(app.exec())系统运行流程准备数据将你的 3160 张图片放入dataset/imagesXML 文件放入dataset/xmls。转换数据运行python convert_data.py生成 YOLO 格式数据。训练模型运行python train.py等待训练完成获得best.pt权重文件。运行系统修改app.py中的MODEL_PATH指向你的权重文件然后运行python app.py。功能需求支持实时检测、显示置信度、坐标以及统计数量。

更多文章