该项目基于PaddleRS,利用分辨率的DFCHouston数据集进行超高分辨率影像处理,裁剪出图块并标注汽车。通过例划分训练集和验证集,采用PPYOLOv型进行训练,并借助VDL查看效果。最终,该模型实现了高精度的预测和可视化展示。
PaddleRS:无人机汽车识别
在分辨率的无人机图像上,我们希望通过目标检测来识别出道路上的汽车。这个项目将会在PaddleRS的基础上进行开发和实现。
1 数据准备
DFCHouston是IEEE GRSS Data Fusion比赛所使用的数据集,由来自德克萨斯大学休斯顿分校的Saurabh Prasad实验室公开发布。该数据集涵盖波段的高光谱图像(分辨率),段的LiDAR数据(精度)以及超高分辨率影像(),包含了不同类型的地物。
使用了极高的分辨率,将影像缩放为尺寸分别为图块,并手动标记出每个图块内的汽车矩形框,然后将其分为训练集与测试集。在此基础上,进行深度学习模型的训练。
# 解压数据集! mkdir -p dataset ! unzip -oq data/data56250/carDetection_RGB.zip -d dataset登录后复制 In [2]
# 划分数据集import osimport os.path as ospimport randomdef get_data_list(data_dir): random.seed(666) mode = ["train_list", "val_list"] dir_path = osp.join(data_dir, "JPEGImages") files = [f.split(".")[0] for f in os.listdir(dir_path)] random.shuffle(files) # 打乱顺序 with open(osp.join(data_dir, f"{mode[0]}.txt"), "w") as f_tr: with open(osp.join(data_dir, f"{mode[1]}.txt"), "w") as f_va: for i, name in enumerate(files): if (i % 10) == 0: # 训练集与测试集为9:1 f_va.write(f"JPEGImages/{name}.jpg Annotations/{name}.xml\n") else: f_tr.write(f"JPEGImages/{name}.jpg Annotations/{name}.xml\n") labels = ["car"] txt_str = "\n".join(labels) with open((data_dir + "/" + f"label_list.txt"), "w") as f: f.write(txt_str) print("Finished!") get_data_list("dataset")登录后复制
Finished!登录后复制
2 PaddleRS准备
PaddleRS 是基于飞桨打造的专业遥感处理工具,适用于多种遥感任务如分类、检测和分割。它简化了从模型训练到部署的流程,助力开发者高效开发与实现遥感深度学习项目。
github:https://github.com/PaddlePaddle/PaddleRS
接下来可以通过git clone得到PaddleRS。 In [7]
! git clone https://github.com/PaddlePaddle/PaddleRS.git %cd PaddleRS ! git checkout release/1.0! pip install --upgrade pip ! pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple ! python setup.py install %cd ..登录后复制
3 模型训练
PaddleRS基于PaddleSeg的设计模式进行开发,简化了数据和模型的定义过程,使得模型的训练与迭代变得更加迅速和便捷。
3.1 数据定义
在[中详细介绍了如何使用`datasets`和`transforms`来实现各种任务的处理,包括数据加载与增强,使你的模型训练过程更加高效、有效。
import osimport os.path as ospfrom paddlers.datasets import VOCDetDataset from paddlers import transforms as T# 定义数据增强train_transforms = T.Compose([ T.DecodeImg(), T.RandomDistort(), T.RandomCrop(), T.RandomHorizontalFlip(), T.BatchRandomResize( target_sizes=[512, 544, 576, 608, 640, 672, 704], interp='RANDOM'), T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), T.ArrangeDetector('train') ]) eval_transforms = T.Compose([ T.DecodeImg(), T.Resize(target_size=608, interp='CUBIC'), T.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), T.ArrangeDetector('eval') ])# 定义数据集data_dir = "dataset"train_file_list = osp.join(data_dir, 'train_list.txt') val_file_list = osp.join(data_dir, 'val_list.txt') label_file_list = osp.join(data_dir, 'label_list.txt') train_dataset = VOCDetDataset( data_dir=data_dir, file_list=train_file_list, label_list=label_file_list, transforms=train_transforms, shuffle=True) eval_dataset = VOCDetDataset( data_dir=data_dir, file_list=train_file_list, label_list=label_file_list, transforms=eval_transforms, shuffle=False)登录后复制
- 03-08 18:57:32 [INFO] Starting to read file list from dataset... 2023-03-08 18:57:39 [INFO] 944 samples in file dataset/train_list.txt, including 944 positive samples and 0 negative samples. creating index... index created! 2023-03-08 18:57:39 [INFO] Starting to read file list from dataset... 2023-03-08 18:57:47 [INFO] 944 samples in file dataset/train_list.txt, including 944 positive samples and 0 negative samples. creating index... index created!登录后复制 In [5]
# 检查及可视化数据import numpy as npimport cv2import matplotlib.pyplot as plt %matplotlib inline# 反归一化def in_normal(img): mean = np.array([0.485, 0.456, 0.406]) std = np.array([0.229, 0.224, 0.225]) img = (255 * (img * std + mean)).astype("uint8") return img# 绘制矩形框def visual(img, bboxs): for bbox in bboxs: x1, y1, x2, y2 = bbox cv2.rectangle(img, (x1, y1), (x2, y2), (255, 0, 0), 2) return imgfor data in train_dataset: img = in_normal(data["image"]) vis = visual(img, data["gt_bbox"]) plt.figure(figsize=(10, 10)) plt.imshow(img) plt.show() break登录后复制
<Figure size 1000x1000 with 1 Axes>登录后复制登录后复制
3.2 模型准备
PaddleRS将模型分区到models和custom_models中,涵盖了Paddle四大组件及其与遥感和变化检测相关的模块结构。通过tasks实现了模型封装,并集成了Loss、Optimizer、Metrics等功能模块。以PPYOLOv例,展示了一个详细的例子。In [
from paddlers.tasks.object_detector import PPYOLOv2 num_classes = len(train_dataset.labels) model = PPYOLOv2(num_classes=num_classes)登录后复制 In []
model.train( num_epochs=30, train_dataset=train_dataset, train_batch_size=16, eval_dataset=eval_dataset, pretrain_weights="COCO", learning_rate=3e-5, warmup_steps=10, warmup_start_lr=0.0, save_interval_epochs=5, lr_decay_epochs=[10, 20], save_dir="output", use_vdl=True)登录后复制
训练的效果可以通过VDL进行查看。
In [9]
from paddlers.tasks import load_model new_model = load_model("output/best_model")登录后复制
- 03-08 19:28:24 [INFO] Model[PPYOLOv2] loaded.登录后复制
4 模型评估
只需要调用evaluate即可完成预测。可以看到map还是挺高的。 In [10]
new_model.evaluate(eval_dataset)登录后复制
- 03-08 19:28:32 [INFO] Start to evaluate(total_samples=944, total_steps=944)... 2023-03-08 19:29:17 [INFO] Accumulating evaluatation results...登录后复制
OrderedDict([('bbox_map', 90.35561807270788)])登录后复制
5 模型预测
PaddleRS的目标检测任务能够提供精确的坐标、类别的信息以及分数,非常适合自定义后处理,并且可以直接使用`visualize_detection`函数实现直观展示。现将以下测试图像的结果进行预测和可视化操作。
from paddlers.tasks.utils.visualize import visualize_detectionimport matplotlib.pyplot as plt %matplotlib inline test_transforms = T.Compose([ T.DecodeImg(), T.Resize(target_size=608, interp='CUBIC'), T.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), T.ArrangeDetector('test') ]) img_path = "dataset/JPEGImages/UH_NAD83_272056_3289689_58.jpg"pred = new_model.predict(img_path, test_transforms) vis_img = visualize_detection(img_path, pred, save_dir=None) plt.figure(figsize=(10, 10)) plt.imshow(vis_img) plt.show()登录后复制
<Figure size 1000x1000 with 1 Axes>登录后复制登录后复制
以上就是PaddleRS:无人机汽车识别的详细内容,更多请关注其它相关文章!

