肥仔教程网

SEO 优化与 Web 开发技术学习分享平台

23.基于PP-PicoDet轻量级目标检测模型——实现目标检测项目

一、PP-PicoDet模型简介

PP-PicoDet是轻量级目标检测模型,在移动端具有卓越的性能。更好的精度和效率权衡一直是物体检测中一个具有挑战性的问题。

为提高准确性和效率,他们研究了无锚点策略在轻量级对象检测模型上的适用性,增强了骨干结构,设计了颈部的轻量化结构,提高了网络的特征提取能力。改进标签分配策略和损失功能,使训练更加稳定和高效。

该模型在准确性和延迟之间实现了更好的权衡。PicoDet-S只有0.99M参数,实现了30.6%的mAP,这是mAP的绝对4.8%改进,同时与YOLOX-Nano相比将移动CPU推理延迟降低了55%,并且与NanoDet相比,mAP绝对提高了7.1%。当输入大小为 320 时,它在移动 ARM CPU 上达到 123 FPS(使用 Paddle Lite 时为 150 FPS)。仅330万个参数的PicoDet-L达到40.9%的mAP,绝对比YOLOv5s提高3.7%,快44%。

模型特色:

  • 更高的mAP: 第一个在1M参数量之内mAP(0.5:0.95)超越30+(输入416像素时)。
  • 更快的预测速度: 网络预测在ARM CPU下可达150FPS。
  • 部署友好: 支持PaddleLite/MNN/NCNN/OpenVINO等预测库,支持转出ONNX,提供了C++/Python/Android的demo。
  • 先进的算法: 在现有SOTA算法中进行了创新, 包括:ESNet, CSP-PAN, SimOTA等等。


注:以上部分文字来源于官网



二、项目实战——bottle目标检测

1、数据准备和划分:命令行下运行

paddlex --split_dataset --format VOC --dataset_dir bottle --val_value 0.2 --test_value 0.1

2、模型训练

import paddlex as pdx
from paddlex import transforms as T

train_transforms = T.Compose([
    T.RandomCrop(), T.RandomHorizontalFlip(), T.RandomDistort(),
    T.BatchRandomResize(
        target_sizes=[576, 608, 640], interp='RANDOM'), T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

eval_transforms = T.Compose([
    T.Resize(
        target_size=640, interp='CUBIC'), T.Normalize(
            mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 定义训练和验证所用的数据集
# API说明:https://github.com/PaddlePaddle
train_dataset = pdx.datasets.VOCDetection(
    data_dir='bottle',
    file_list='bottle/train_list.txt',
    label_list='bottle/labels.txt',
    transforms=train_transforms,
    shuffle=True)

eval_dataset = pdx.datasets.VOCDetection(
    data_dir='bottle',
    file_list='bottle/val_list.txt',
    label_list='bottle/labels.txt',
    transforms=eval_transforms,
    shuffle=False)

num_classes = len(train_dataset.labels)
model = pdx.det.PicoDet(num_classes=num_classes, backbone='ESNet_l')

model.train(
    num_epochs=20,
    train_dataset=train_dataset,
    train_batch_size=14,
    eval_dataset=eval_dataset,
    pretrain_weights='COCO',
    learning_rate=.05,
    warmup_steps=24,
    warmup_start_lr=0.005,
    save_interval_epochs=1,
    lr_decay_epochs=[6, 8, 11],
    use_ema=True,
    save_dir='output/picodet_esnet_l-bottle',
    use_vdl=True)



3、导出部署模型:命令行下运行

paddlex --export_inference --model_dir best_model --save_dir inference



4、模型预测

#划分数据集7:2:1
#paddlex --split_dataset --format VOC --dataset_dir bottle --val_value 0.2 --test_value 0.1
#输出部署模型
#paddlex --export_inference --model_dir best_model --save_dir inference
import paddlex as pdx
import cv2
import os
#os.environ["CUDA_VISIBLE_DEVICES"]="0,1"
predictor=pdx.deploy.Predictor("output/picodet_esnet_l-bottle/inference_model",use_gpu=True)
imgfile="bottle/bottletest.jpg"
img=cv2.imread(imgfile)
result=predictor.predict(img)
#预测结果显示
vis_img=pdx.det.visualize(img,result,threshold=0.5,save_dir=None)
cv2.imshow("result",vis_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注:以下预测时间信息是在CPU下,没有GPU环境。

------------------ Inference Time Info ----------------------

total_time(ms): 2061.4, img_num: 1, batch_size: 1

average latency time(ms): 2061.40, QPS: 0.485107

preprocess_time_per_im(ms): 11.70, inference_time_per_batch(ms): 2049.70, postprocess_time_per_im(ms): 0.00



从该目标检测项目来看,特别是在没有GPU环境,迭代5次,训练时间约20多分钟,准确率能达85%以上,而且模型大小不足20MB,所以说PP-PicoDet总体表现还是非常优秀的。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言