灾害类-自然灾害检测数据集,21357张(存在数据增强),yolo和voc两种标注方式
4类,标注数量:
landslide:滑坡 7818
fallen tree:倒树 11037
stone:落石 25155
road collapse:道路塌陷 6416
image num: 21357
2.模型代码:模型训练使用yolov11n训练,30个epoch训练结果,map如描述图所示。
3.qt界面:运行界面采用pyqt编写,本项目已经训练好模型,配置好环境后可直接使用,运行效果见描述图像
自然灾害(滑坡‑落石‑道路坍塌‑倒树)检测系统完整代码
类别:landslide滑坡、stone落石、road_collapse道路坍塌、fallen_tree倒伏树木
1、数据集yaml配置 natural_disaster.yaml
nc:4names:0:landslide1:stone2:road_collapse3:fallen_treetrain:./datasets/natural_disaster/images/trainval:./datasets/natural_disaster/images/valtest:./datasets/natural_disaster/images/test2、YOLOv11训练脚本 train_natural.py
fromultralyticsimportYOLOif__name__=="__main__":# 加载yolo11n预训练权重model=YOLO("yolo11n.pt")train_result=model.train(data="natural_disaster.yaml",epochs=60,imgsz=640,batch=8,device=0,workers=2,patience=12,conf=0.25,iou=0.45,project="natural_disaster_system",name="yolo11n_exp")# 模型评估val_metric=model.val()print(f"mAP@0.5:{val_metric.box.map50}")3、PyQt5简易GUI检测系统(对应界面)qt_disaster.py
importsysimportcv2fromPyQt5.QtWidgetsimport*fromPyQt5.QtGuiimport*fromPyQt5.QtCoreimport*fromultralyticsimportYOLOclassDisasterDetectWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于YOLOv11的自然灾害检测系统")self.resize(1200,800)self.model=YOLO("./weights/best.pt")# 控件self.label_img=QLabel()self.label_img.setFixedSize(550,550)self.btn_open=QPushButton("选择图片")self.btn_open.clicked.connect(self.open_image)self.table=QTableWidget()self.table.setColumnCount(5)self.table.setHorizontalHeaderLabels(["序号","类别","置信度","xmin","ymin","xmax","ymax"][0:5])layout=QHBoxLayout()left_layout=QVBoxLayout()left_layout.addWidget(self.label_img)left_layout.addWidget(self.table)right_layout=QVBoxLayout()right_layout.addWidget(self.btn_open)layout.addLayout(left_layout)layout.addLayout(right_layout)central=QWidget()central.setLayout(layout)self.setCentralWidget(central)defopen_image(self):file,_=QFileDialog.getOpenFileName(self,"选择图片","","*.jpg *.png")ifnotfile:returnres=self.model.predict(source=file,conf=0.3,save=False)[0]img=cv2.imread(file)img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)self.table.setRowCount(0)foridx,boxinenumerate(res.boxes):cls_name=res.names[int(box.cls)]conf=float(box.conf)x1,y1,x2,y2=map(int,box.xyxy[0])#绘制框cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)cv2.putText(img,f"{cls_name}{conf:.2f}",(x1,y1-8),cv2.FONT_HERSHEY_SIMPLEX,0.6,(0,255,0),1)#表格插入row=self.table.rowCount()self.table.insertRow(row)self.table.setItem(row,0,QTableWidgetItem(str(idx+1)))self.table.setItem(row,1,QTableWidgetItem(cls_name))self.table.setItem(row,2,QTableWidgetItem(f"{conf:.2f}"))self.table.setItem(row,3,QTableWidgetItem(f"[{x1},{y1},{x2},{y2}]"))qimg=QImage(img.data,img.shape[1],img.shape[0],QImage.Format_RGB888)self.label_img.setPixmap(QPixmap.fromImage(qimg).scaled(self.label_img.size(),Qt.KeepAspectRatio))if__name__=="__main__":app=QApplication(sys.argv)win=DisasterDetectWindow()win.show()sys.exit(app.exec_())4、环境依赖
pipinstallultralytics opencv-python pyqt55、VOC转YOLO标签转换脚本
importos,xml.etree.ElementTreeasET classes=["landslide","stone","road_collapse","fallen_tree"]defxml_to_yolo(xml_file,txt_out,w_img,h_img):tree=ET.parse(xml_file)root=tree.getroot()lines=[]forobjinroot.findall("object"):cls=obj.find("name").textifclsnotinclasses:continuecid=classes.index(cls)b=obj.find("bndbox")xmin,ymin=float(b.find("xmin").text),float(b.find("ymin").text)xmax,ymax=float(b.find("xmax").text),float(b.find("ymax").text)cx=((xmin+xmax)/2)/w_img cy=((ymin+ymax)/2)/h_img bw=(xmax-xmin)/w_img bh=(ymax-ymin)/h_img lines.append(f"{cid}{cx:.6f}{cy:.6f}{bw:.6f}{bh:.6f}")withopen(txt_out,"w",encoding="utf8")asf:f.write("\n".join(lines))使用说明
- 将训练完成得到
best.pt权重放到./weights/目录 - 运行
qt_disaster.py直接启动可视化检测系统,支持图片检测,输出类别、置信度、坐标到表格。 - 训练运行
python train_natural.py。
。