一、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.12、模型训练
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 inference4、模型预测
#划分数据集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总体表现还是非常优秀的。