作者:人工智能_SYBH

基于PicoDet的无人机视角VisDrone目标检测与ncnn部署

1. 项目简介

本项目基于PicoDet实现对无人机视角的VisDrone数据集进行目标检测并实现在ncnn中的推理。

1.1 PicoDet简介

PicoDet是百度新推出的轻量级目标检测网络,对anchor-free策略在轻量型目标检测模型中的应用进行了探索,通过对backbone、neck、标签分配策略以及训练方法等诸多优化,在精度-效率上取得了更好的均衡。

PicoDet-S仅需0.99M参数即可取得30.6%mAP,比YOLOX-Nano高4.8%同时推理延迟降低55%,比NanoDet指标高7.1%;

当输入尺寸为320时,在移动端ARM CPU上可以达到123FPS处理速度,推理框架为PaddleLite时,推理速度可达150FPS。

PicoDet-M仅需2.15M参数即可取得34.3%mAP指标;

PicoDet-L仅需3.3M参数即可取得40.9%mAP,比YOLOv5s高3.7%mAP,推理速度快44%。

与其他轻量级检测网络对比如下:

论文:https://arxiv.org/abs/2111.00902

代码:https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.3/configs/picodet

1.2 VisDrone数据介绍

配备摄像机的无人机或通用无人机具有广泛的应用,包括农业,航空摄影,快速交付和监视等。

VisDrone数据集是由天津大学等团队开源的一个大型无人机视角的数据集,官方提供的数据中训练集是6471、验证集是548,一共提供了以下11个类,分别是:'pedestrian', 'people', 'bicycle', 'car', 'van','truck', 'tricycle', 'awning-tricycle', 'bus', 'motor', 'others',其中others是非有效目标区域,本项目中予以忽略;

数据集主页:http://aiskyeye.com/challenge/object-detection/

数据集标注展示:

2. PicoDet算法介绍

官方的讲解非常详细,PPT参考如下;

2.1 PicoDet的算法特色

2.2 PicoDet的backbone

2.3 PicoDet的算法结构

2.4 SimOTA的特点

2.5 其他优化策略

3. 数据准备

PaddleDetection默认的是coco格式,而VisDrone有自己的标注格式,因此需要转换;

3.1 解压数据集

In [1]

!mkdir work/data
!unzip -oq data/data115729/VisDrone2019-DET-train.zip -d work/data
!unzip -oq data/data115729/VisDrone2019-DET-val.zip -d work/data

3.2 转换数据格式为Coco格式

In [2]

import json
import os
import cv2
import numpy as np
from PIL import Image
import shutil

class Vis2COCO:
    def __init__(self, save_path, train_ratio, category_list, is_mode="train"):
        self.category_list = category_list
        self.images = []
        self.annotations = []
        self.categories = []
        self.img_id = 0
        self.ann_id = 0
        self.is_mode = is_mode
        self.train_ratio = train_ratio
        self.save_path = save_path  
        if not os.path.exists(self.save_path):
            os.makedirs(self.save_path)

    def to_coco(self, anno_dir, img_dir):
        self._init_categories()
        img_list = os.listdir(img_dir)
        for img_name in img_list:
            anno_path = os.path.join(anno_dir, img_name.replace(os.path.splitext(img_name)[-1], '.txt'))
            if not os.path.isfile(anno_path):
                print('File is not exist!', a
lock