无人机图像航拍灾后洪水房屋检测数据集
训练集6462张,验证集318张,测试集325张~
train: …/train/images
val: …/valid/images
test: …/test/images
nc: 3
names: [‘Flooded’, ‘Not-Flooded’, ‘Partially-Flooded’]
无人机航拍灾后洪水房屋检测数据集
📊 数据集总体概览
| 项目 | 内容 |
|---|---|
| 总图像数量 | 7,105 张 |
| 图像来源 | 无人机航拍(灾后场景,含城市/乡村区域) |
| 图像分辨率 | 多尺寸(典型为 1920×1080 或 1080×1920,取决于飞行姿态) |
| 类别数量 | 3 类 |
| 标注格式 | YOLO 格式(每张图像对应一个.txt标注文件,含归一化边界框与类别 ID) |
| 任务类型 | 目标检测(每栋房屋作为一个检测目标,标注其洪水状态) |
🗂️ 数据划分详情
| 数据集 | 图像数量 | 占比 | 路径 |
|---|---|---|---|
| 训练集 | 6,462 | ~91.0% | ../train/images |
| 验证集 | 318 | ~4.5% | ../valid/images |
| 测试集 | 325 | ~4.6% | ../test/images |
| 总计 | 7,105 | 100% | — |
✅ 对应的标签路径通常为:
../train/labels../valid/labels../test/labels
🏠 类别定义与语义说明
| 类别 ID | 类别名称(英文) | 类别名称(中文) | 语义说明 |
|---|---|---|---|
| 0 | Flooded | 完全淹没 | 房屋主体被洪水完全覆盖或水位高于门窗,无法正常居住 |
| 1 | Not-Flooded | 未被淹没 | 房屋周围无积水或仅有轻微地面积水,结构完好 |
| 2 | Partially-Flooded | 部分淹没 | 房屋部分区域(如底层、庭院)被淹,但上层仍可见 |
📄 YOLO 配置文件(dataset.yaml示例)
# dataset.yamltrain:../train/imagesval:../valid/imagestest:../test/imagesnc:3names:['Flooded','Not-Flooded','Partially-Flooded']✅ 典型应用场景
- 灾情快速评估:通过无人机自动识别受灾房屋比例
- 应急资源调度:优先救援“完全淹没”区域居民
- 保险理赔支持:提供客观房屋损毁状态证据
- 重建规划辅助:统计不同淹没程度房屋分布
基于 YOLOv8 的无人机航拍灾后洪水房屋检测智能灾害响应系统的完整代码方案,涵盖:
✅ 数据配置
✅ 模型训练(含类别不平衡优化)
✅ 图像/视频/实时流推理
✅ 可视化与灾情统计
✅ 部署建议
📁 一、项目结构
flood_house_detection/ ├── data/ │ ├── train/ │ │ ├── images/# 6462 张│ │ └── labels/# YOLO .txt│ ├── valid/ │ │ ├── images/ │ │ └── labels/ │ ├── test/ │ │ ├── images/ │ │ └── labels/ │ └── dataset.yaml ├── models/# 训练输出├── outputs/# 推理结果├── weights/# 预训练模型(可选)├── train.py# 训练脚本├── detect.py# 推理核心├── report.py# 灾情统计报告├── utils/ │ └── visualize.py# 标注可视化└── requirements.txt📦 二、环境依赖(requirements.txt)
ultralytics==8.2.0 opencv-python==4.8.0 numpy==1.24.3 matplotlib pandas tqdm scikit-learn安装:
pipinstall-r requirements.txt📄 三、数据配置文件dataset.yaml
# data/dataset.yamltrain:../train/imagesval:../valid/imagestest:../test/imagesnc:3names:['Flooded','Not-Flooded','Partially-Flooded']✅ 确保
labels/文件夹与images/同级,且.txt文件名一致。
🚀 四、模型训练(train.py)— 针对类别不平衡优化
# train.pyfromultralyticsimportYOLOdeftrain_flood_detector():# 使用 yolov8s(平衡精度与速度)model=YOLO("yolov8s.pt")results=model.train(data="data/dataset.yaml",imgsz=640,epochs=100,batch=32,device=0,# GPU ID;无 GPU 改为 "cpu"name="flood_house_yolov8s",project="models",patience=30,save=True,augment=True,# 增强策略:提升小目标 & 鲁棒性hsv_h=0.015,hsv_s=0.7,hsv_v=0.4,degrees=10.0,translate=0.1,scale=0.5,fliplr=0.5,mosaic=1.0,mixup=0.1,# 关键:启用类别平衡(Ultralytics 内部自动处理样本权重)# 注:YOLOv8 默认在损失函数中使用 class weights(基于标签频率))print(f"✅ 训练完成!最佳模型路径:{results.save_dir}/weights/best.pt")if__name__=="__main__":train_flood_detector()💡说明:YOLOv8 在训练时会自动根据各类标注数量计算类别权重(class weights),缓解“Flooded”样本少的问题。
🔍 五、推理检测(detect.py)
# detect.pyimportcv2importosfromultralyticsimportYOLOimportnumpyasnpclassFloodHouseDetector:def__init__(self,model_path="models/flood_house_yolov8s/weights/best.pt"):self.model=YOLO(model_path)self.class_names=["Flooded","Not-Flooded","Partially-Flooded"]self.colors=[(0,0,255),(0,255,0),(255,165,0)]# BGR: Red, Green, Orangedefdetect_image(self,image_path,conf=0.3,save_dir="outputs"):image=cv2.imread(image_path)results=self.model(image,conf=conf)annotated=results[0].plot()# 自动使用内置颜色os.makedirs(save_dir,exist_ok=True)out_path=os.path.join(save_dir,os.path.basename(image_path))cv2.imwrite(out_path,annotated)# 统计结果boxes=results[0].boxes counts={name:0fornameinself.class_names}forclsinboxes.cls:counts[self.class_names[int(cls)]]+=1print(f"📊 检测结果:{counts}")returnannotated,countsdefdetect_video(self,video_path,conf=0.3):cap=cv2.VideoCapture(video_path)fps=int(cap.get(cv2.CAP_PROP_FPS))w=int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))h=int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))out_path="outputs/detected_"+os.path.basename(video_path)out=cv2.VideoWriter(out_path,cv2.VideoWriter_fourcc(*'mp4v'),fps,(w,h))total_counts={name:0fornameinself.class_names}frame_id=0whilecap.isOpened():ret,frame=cap.read()ifnotret:breakresults=self.model(frame,conf=conf)[0]out.write(results.plot())# 累计每帧检测数(可选:仅关键帧统计)ifframe_id%30==0:# 每秒统计一次(假设30fps)forclsinresults.boxes.cls:total_counts[self.class_names[int(cls)]]+=1frame_id+=1cap.release()out.release()print(f"✅ 视频检测完成 →{out_path}")print(f"📈 累计检测:{total_counts}")returntotal_counts📊 六、灾情统计报告(report.py)
# report.pyimportosfromdetectimportFloodHouseDetectorimportpandasaspddefgenerate_disaster_report(test_dir="data/test/images",output_csv="outputs/disaster_report.csv"):detector=FloodHouseDetector()report_data=[]forimg_nameinos.listdir(test_dir):ifimg_name.lower().endswith(('.jpg','.png','.jpeg')):img_path=os.path.join(test_dir,img_name)_,counts=detector.detect_image(img_path,conf=0.3,save_dir="outputs/test_results")row={"image":img_name,**counts}report_data.append(row)df=pd.DataFrame(report_data)df.to_csv(output_csv,index=False)print(f"✅ 灾情报告已保存至:{output_csv}")# 打印汇总total=df.sum(numeric_only=True)print("\n🌍 灾情总览:")forcls,numintotal.items():print(f" -{cls}:{int(num)}栋")if__name__=="__main__":generate_disaster_report()▶️ 七、使用示例
1. 训练模型
python train.py2. 检测单张图像
fromdetectimportFloodHouseDetector detector=FloodHouseDetector()img,stats=detector.detect_image("test_images/flood_area.jpg")3. 生成灾情报告
python report.py4. 检测视频(用于无人机回传视频流)
detector=FloodHouseDetector()detector.detect_video("drone_footage.mp4")🛠️ 八、部署与工程化建议
| 场景 | 方案 |
|---|---|
| 应急指挥中心 | 部署 Web 系统:前端上传图像 → 后端 YOLOv8 推理 → 返回热力图+统计 |
| 无人机端侧 | 导出 TensorRT 引擎:yolo export model=best.pt format=engine |
| 批量灾评 | 使用report.py对整个测试集生成 CSV,导入 GIS 系统 |
| 低资源设备 | 使用yolov8n+imgsz=480加速推理 |
防汛抗旱指挥部、应急管理局、保险公司、测绘单位等场景,实现“空天地一体化”智能灾评。