当前位置: 首页 > article >正文

国产化框架PaddleYOLO结合Swanlab进行作物检测

1. 项目介绍

粮食安全,作为人类生存与发展的基石,始终是全球关注的焦点。它不仅仅关乎粮食的充足供应,更涉及粮食的质量安全、营养健康以及可持续生产等多个维度。在全球化、气候变化和资源环境约束日益加剧的背景下,如何确保粮食安全,成为了各国政府和国际社会共同面临的重大挑战。随着科技的飞速发展,作物检测技术作为保障粮食安全的重要手段之一,正逐步走向精准化、智能化和高效化。作物检测不仅能够帮助农民及时了解作物生长状况,优化田间管理,提高作物产量和品质,还能在粮食收获、储存、加工等各个环节中,对粮食质量进行严格把关,确保粮食的安全性和营养价值。从传统的田间观察、人工测量到现代的遥感监测、无人机巡查,再到基于深度学习的作物检测技术,作物检测手段的不断创新,为粮食安全的保障提供了强有力的技术支撑。特别是基于深度学习的作物检测技术,通过精准管理和数据驱动决策,能够实现对作物生长环境的实时监测、病虫害的提前预警以及作物产量的精准预测,从而有效提升农业生产的效率和效益。因此,从粮食安全的角度出发,深入探索作物检测技术的创新与应用,对于提高粮食生产能力、保障粮食质量安全、促进农业可持续发展具有重要意义。本文将探讨作物检测技术在粮食安全领域的应用现状、发展趋势以及未来展望。

PaddleYOLO是由阿里云开发并开源的一个基于 PaddlePaddle 的目标检测模型,它专为实时和大规模应用设计,提供了高度优化的性能和易用性。国产化检测框架PaddleYOLO

SwanLab是一款开源、轻量级的AI实验跟踪工具,通过提供友好的API,结合超参数跟踪、指标记录、在线协作等功能,提高ML实验跟踪和协作体验。欢迎使用SwanLab

Swanhub是由极客工作室开发的一个开源模型协作分享社区。它为AI开发者提供了AI模型托管、训练记录、模型结果展示、API快速部署等功能。欢迎使用SwanHub

 2. 准备部分

2.1 环境安装

安装以下3个库:

paddle
swanlab
gradio

安装命令:

pip install paddle swanlab gradio

2.2 下载数据集

甜菜苗数据集:coco格式

2.3 下载PaddleYOLO框架

3. YOLOv8模型训练

3.1 修改配置

1. 首先选择合适的模型,在此选择YOLOv8模型进行实验。./configs/yolov8/yolov8n_500e_coco.yml(其中500e代表训练500个epoch)

2. 复制一份该yml文件,名字为yolov8n_beet.yml,并添加输入图像的尺寸大小,与预训练权重。

3. 预训练权重:https://github.com/PaddlePaddle/PaddleYOLO/tree/develop/configs/yolov8

4. 将下载好的权重放在PaddleYOLO项目下即可。

​​​​​​​

5. 在configs/datasets/coco_detection.yml,将其复制一份改名为beet_coco.yml。

6. 修改beet_coco.yml文件。将num_classes换为自己数据集的“类别数”。修改dataset_dir的路径为自己数据集的文件夹路径。

注意:如果类别数不对,则会报错:Error: ../paddle/phi/kernels/funcs/gather.cu.h:67 Assertion `index_value >= 0 && index_value < input_dims[j]` failed. The index is out of bounds, please check whether the dimensions of index and input meet the requirements.  It should be less than [1] and greater than or equal to 0, but received [0]

参考:https://blog.csdn.net/uuyymilkyl/article/details/128490134?fromshare=blogdetail&sharetype=blogdetail&sharerId=128490134&sharerefer=PC&sharesource=weixin_44813538&sharefrom=from_link

​​​​​​​

3.2 使用Swanlab

1. 首先在PaddleYolo中,找到ppdet/engine/callbacks.py文件,在代码的底部添加如下代码:

class SwanLabCallback(Callback):
    def __init__(self, model):
        super(SwanLabCallback, self).__init__(model)

        try:
            import swanlab
            self.swanlab = swanlab
        except Exception as e:
            logger.error('swanlab not found, please install swanlab. '
                         'Use: `pip install swanlab`.')
            raise e

        # self.swanlab_params = {k.lstrip("swanlab_"): v for k, v in model.cfg.items() if k.startswith("swanlab_")}
        self.swanlab_params = {k[8:]: v for k, v in model.cfg.items() if k.startswith("swanlab_")}

        self._run = None
        if dist.get_world_size() < 2 or dist.get_rank() == 0:
            _ = self.run
            self.run.config.update(self.model.cfg)

        self.best_ap = -1000.
        self.fps = []

    @property
    def run(self):
        if self._run is None:
            self._run = self.swanlab.get_run() or self.swanlab.init(**self.swanlab_params)
        return self._run

    def on_step_end(self, status):
        if dist.get_world_size() < 2 or dist.get_rank() == 0 and status['mode'] == 'train':
            training_status = status['training_staus'].get()
            batch_time = status['batch_time']
            data_time = status['data_time']
            batch_size = self.model.cfg['{}Reader'.format(status['mode'].capitalize())]['batch_size']

            ips = float(batch_size) / float(batch_time.avg)
            metrics = {
                "train/" + k: float(v) for k, v in training_status.items()
            }
            metrics.update({
                "train/ips": ips,
                "train/data_cost": float(data_time.avg),
                "train/batch_cost": float(batch_time.avg)
            })

            self.fps.append(ips)
            self.run.log(metrics)

    def on_epoch_end(self, status):
        if dist.get_world_size() < 2 or dist.get_rank() == 0:
            mode = status['mode']
            epoch_id = status['epoch_id']
            
            if mode == 'train':
                fps = sum(self.fps) / len(self.fps)
                self.fps = []

                end_epoch = self.model.cfg.epoch
                if (epoch_id + 1) % self.model.cfg.snapshot_epoch == 0 or epoch_id == end_epoch - 1:
                    save_name = str(epoch_id) if epoch_id != end_epoch - 1 else "model_final"
                    tags = ["latest", f"epoch_{epoch_id}"]
            
            elif mode == 'eval':
                fps = status['sample_num'] / status['cost_time']

                merged_dict = {
                    f"eval/{key}-mAP": map_value[0]
                    for metric in self.model._metrics
                    for key, map_value in metric.get_results().items()
                }
                merged_dict.update({
                    "epoch": status["epoch_id"],
                    "eval/fps": fps
                })

                self.run.log(merged_dict)

                if status.get('save_best_model'):
                    for metric in self.model._metrics:
                        map_res = metric.get_results()
                        key = next((k for k in ['bbox', 'keypoint', 'mask'] if k in map_res), None)
                        
                        if not key:
                            logger.warning("Evaluation results empty, this may be due to "
                                           "training iterations being too few or not "
                                           "loading the correct weights.")
                            return
                        
                        if map_res[key][0] >= self.best_ap:
                            self.best_ap = map_res[key][0]
                            save_name = 'best_model'
                            tags = ["best", f"epoch_{epoch_id}"]

    def on_train_end(self, status):
        self.run.finish()

2. 在ppdet/engine/trainer.py文件中,在from .callbacks import那一行添加:

from .callbacks import Callback, ComposeCallback, LogPrinter, Checkpointer, VisualDLWriter, WandbCallback, SwanLabCallback

3. 找到Trainer类的__init_callbacks方法,在if self.mode == 'train':下添加如下代码:

if self.cfg.get('use_swanlab', False) or 'swanlab' in self.cfg:
    self._callbacks.append(SwanLabCallback(self))

至此,你已经完成了SwanLab与PaddleYolo的集成!接下来,只需要在训练的配置文件中添加use_swanlab: True,即可开始可视化跟踪训练。

4. 以yolov8n_beet.yml为例。

configs/yolov8/yolov8n_beet.yml文件中,在下面添加如下代码:

use_swanlab: true
swanlab_project: PaddleYOLO # 可选
swanlab_experiment_name: yolov3_mobilenet_v1_roadsign # 可选
swanlab_description: 对PaddleYOLO的一次训练测试 # 可选
# swanlab_workspace: swanhub # 组织名,可选

3.3 模型训练

python tools/train.py -c configs/yolov8/yolov8n_beet.yml

3.4 模型测试

本实验在训练后,会将训练的全部结果直接放在output中。

python -u tools/eval.py -c configs/yolov8/yolov8n_beet.yml -o weights=output/yolov8n_beet/model_final

3.5 模型推理

在预测过程中,如果预测的不是一张图片,那么需要使用--infer_dir放入的是图片文件夹路径,--infer_img放入的是图片路径。

python tools/infer.py -c configs/yolov8/yolov8n_beet.yml --infer_dir=data/dataset --output_dir=output/yolov8_result

http://www.kler.cn/news/330352.html

相关文章:

  • 数据库管理-第245期 主流国产数据库RAC架构概览(20240929)
  • 《深度学习》OpenCV 角点检测、特征提取SIFT 原理及案例解析
  • Linux中的进程间通信之共享内存
  • Python知识点:如何使用Kafka与Python进行流数据处理
  • 如何配置flutter(超详细的哦)
  • 第18周 第2章JSON入门
  • Ubuntu24.04桌面版下的网络管理
  • V3D——从单一图像生成 3D 物体
  • github 远程仓库删除 本地重新上传
  • WeChat_DevTools 断点调试方法总结
  • 基于docker-compose部署openvas
  • Pycharm 本地搭建 stable-diffusion-webui
  • Redis-预热雪崩击穿穿透
  • 重生之我们在ES顶端相遇第 18 章 - Script 使用(进阶)
  • 【系统架构设计师】专题:测试基础知识
  • 力扣题解1870
  • [Linux#57][HTTP] URL结构 | 原理 | 请求与响应 | postman | fiddler
  • 活动公司都是怎么去寻找客户的
  • MySQL--数据库约束(详解)
  • Eclipse 快捷键:提高开发效率的利器