Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >目标检测模型NanoDet(超轻量,速度很快)介绍和PyTorch版本实践

目标检测模型NanoDet(超轻量,速度很快)介绍和PyTorch版本实践

作者头像
润森
发布于 2022-09-22 08:13:13
发布于 2022-09-22 08:13:13
2.4K00
代码可运行
举报
文章被收录于专栏:毛利学Python
运行总次数:0
代码可运行

前言

YOLO、SSD、Fast R-CNN等模型在目标检测方面速度较快和精度较高,但是这些模型比较大,不太适合移植到移动端或嵌入式设备;轻量级模型 NanoDet-m,对单阶段检测模型三大模块(Head、Neck、Backbone)进行轻量化,目标加检测速度很快;模型文件大小仅几兆(小于4M)。

NanoDet作者开源代码地址:https://github.com/RangiLyu/nanodet (致敬)

先看一下NanoDet目标检测的效果:

同时检测多辆汽车:

查看多目标、目标之间重叠、同时存在小目标和大目标的检测效果:

NanoDet 模型介绍

NanoDet 是一种 FCOS 式的单阶段 anchor-free 目标检测模型,它使用 ATSS 进行目标采样,使用 Generalized Focal Loss 损失函数执行分类和边框回归(box regression)。

1)NanoDet 模型性能

NanoDet-m模型和YoloV3-Tiny、YoloV4-Tiny作对比:

ModelResolutionCOCO mAPLatency(ARM 4xCore)FLOPSParams|Model Size(ncnn bin) |------ NanoDet-m320*32020.610.23ms0.72B0.95M|1.8mb NanoDet-m416*41621.716.44ms1.2B0.95M|1.8mb YoloV3-Tiny416*41616.637.6ms5.62B8.86M|33.7mb YoloV4-Tiny416*41621.732.81ms6.96B6.06M|23.0mb

备注:以上性能基于 ncnn 和麒麟 980 (4xA76+4xA55) ARM CPU 获得的。使用 COCO mAP (0.5:0.95) 作为评估指标,兼顾检测和定位的精度,在 COCO val 5000 张图片上测试,并且没有使用 Testing-Time-Augmentation。

NanoDet作者将 ncnn 部署到手机(基于 ARM 架构的 CPU 麒麟 980,4 个 A76 核心和 4 个 A55 核心)上之后跑了一下 benchmark,模型前向计算时间只要 10 毫秒左右,而 yolov3 和 v4 tiny 均在 30 毫秒的量级。在安卓摄像头 demo app 上,算上图片预处理、检测框后处理以及绘制检测框的时间,NanoDet 也能轻松跑到 40+FPS。

2)NanoDet 模型架构

3)NanoDet损失函数

NanoDet 使用了李翔等人提出的 Generalized Focal Loss 损失函数。该函数能够去掉 FCOS 的 Centerness 分支,省去这一分支上的大量卷积,从而减少检测头的计算开销,非常适合移动端的轻量化部署。

详细请参考:

4)NanoDet 优势

NanoDet 是一个速度超快和轻量级的移动端 Anchor-free 目标检测模型。该模型具备以下优势:

  • 超轻量级:模型文件大小仅几兆(小于4M——nanodet_m.pth);- 速度超快:在移动 ARM CPU 上的速度达到 97fps(10.23ms);- 训练友好:GPU 内存成本比其他模型低得多。GTX1060 6G 上的 Batch-size 为 80 即可运行;- 方便部署:提供了基于 ncnn 推理框架的 C++ 实现和 Android demo。

基于PyTorch 实现NanoDet

基于NanoDet项目进行小裁剪,专门用来实现Python语言、PyTorch 版本的代码地址:

1)NanoDet目标检测效果

1)检测出一只小鸟

2)同时检测出四位少年

3)在复杂街道中,检测出行人、汽车:

通过测试发现NanoDet确实很快,但识别精度和效果比YOLOv4差不少的。

下图是使用 YOLOv4检测的效果:

文章链接:

大家可以看到大部分的行人、汽车是被检测出来了,存在小部分没有被检测出来;

看左上角的统计信息,能看到汽车检测到5辆,行人检测到14位,自行车检测到1辆,交通灯设备3台,太阳伞3把,手提包1个。

2)环境参数

测试环境参数

系统Windows ** 编程语言**:Python 3.8 整合开发环境:Anaconda深度学习框架:PyTorch1.7.0+cu101 (torch>=1.3 即可) 开发代码IDE:PyCharm

开发具体环境要求如下:

  • Cython- termcolor- numpy- torch>=1.3- torchvision- tensorboard- pycocotools- matplotlib- pyaml- opencv-python- tqdm

通常测试感觉GPU加速(显卡驱动、cudatoolkit 、cudnn)、PyTorch、pycocotools相对难装一点

Windows开发环境安装可以参考:

安装cudatoolkit 10.1、cudnn7.6请参考

安装PyTorch请参考

安装pycocotools请参考

3)体验NanoDet目标检测

下载代码,打开工程

先到githug下载代码,然后解压工程,然后使用PyCharm工具打开工程;

githug代码下载地址:

说明:该代码是基于NanoDet项目进行小裁剪,专门用来实现Python语言、PyTorch 版本的代码NanoDet作者开源代码地址(致敬)

使用PyCharm工具打开工程

打开后的页面是这样的:

【选择开发环境】

文件(file)——>设置(setting)——>项目(Project)——>Project Interpreters 选择搭建的开发环境;

然后先点击Apply,等待加载完成,再点击OK;

进行目标检测

具体命令请参考:

代码语言:javascript
代码运行次数:0
复制
'''目标检测-图片'''
python detect_main.py image --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  street.png

'''目标检测-视频文件'''
python detect_main.py video --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  test.mp4

'''目标检测-摄像头'''
python detect_main.py webcam --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  0

【目标检测-图片】

【目标检测-视频文件】

检测的是1080*1920的图片,很流畅毫不卡顿,就是目前识别精度不太高

4)调用模型的核心代码

detect_main.py 代码:

代码语言:javascript
代码运行次数:0
复制
import cv2
import os
import time
import torch
import argparse
from nanodet.util import cfg, load_config, Logger
from nanodet.model.arch import build_model
from nanodet.util import load_model_weight
from nanodet.data.transform import Pipeline

image_ext = ['.jpg', '.jpeg', '.webp', '.bmp', '.png']
video_ext = ['mp4', 'mov', 'avi', 'mkv']

'''目标检测-图片'''
# python detect_main.py image --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  street.png

'''目标检测-视频文件'''
# python detect_main.py video --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  test.mp4

'''目标检测-摄像头'''
# python detect_main.py webcam --config ./config/nanodet-m.yml --model model/nanodet_m.pth --path  0

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('demo', default='image', help='demo type, eg. image, video and webcam')
    parser.add_argument('--config', help='model config file path')
    parser.add_argument('--model', help='model file path')
    parser.add_argument('--path', default='./demo', help='path to images or video')
    parser.add_argument('--camid', type=int, default=0, help='webcam demo camera id')
    args = parser.parse_args()
    return args


class Predictor(object):
    def __init__(self, cfg, model_path, logger, device='cuda:0'):
        self.cfg = cfg
        self.device = device
        model = build_model(cfg.model)
        ckpt = torch.load(model_path, map_location=lambda storage, loc: storage)
        load_model_weight(model, ckpt, logger)
        self.model = model.to(device).eval()
        self.pipeline = Pipeline(cfg.data.val.pipeline, cfg.data.val.keep_ratio)

    def inference(self, img):
        img_info = {}
        if isinstance(img, str):
            img_info['file_name'] = os.path.basename(img)
            img = cv2.imread(img)
        else:
            img_info['file_name'] = None

        height, width = img.shape[:2]
        img_info['height'] = height
        img_info['width'] = width
        meta = dict(img_info=img_info,
                    raw_img=img,
                    img=img)
        meta = self.pipeline(meta, self.cfg.data.val.input_size)
        meta['img'] = torch.from_numpy(meta['img'].transpose(2, 0, 1)).unsqueeze(0).to(self.device)
        with torch.no_grad():
            results = self.model.inference(meta)
        return meta, results

    def visualize(self, dets, meta, class_names, score_thres, wait=0):
        time1 = time.time()
        self.model.head.show_result(meta['raw_img'], dets, class_names, score_thres=score_thres, show=True)
        print('viz time: {:.3f}s'.format(time.time()-time1))


def get_image_list(path):
    image_names = []
    for maindir, subdir, file_name_list in os.walk(path):
        for filename in file_name_list:
            apath = os.path.join(maindir, filename)
            ext = os.path.splitext(apath)[1]
            if ext in image_ext:
                image_names.append(apath)
    return image_names


def main():
    args = parse_args()
    torch.backends.cudnn.enabled = True
    torch.backends.cudnn.benchmark = True

    load_config(cfg, args.config)
    logger = Logger(-1, use_tensorboard=False)
    predictor = Predictor(cfg, args.model, logger, device='cuda:0')
    logger.log('Press "Esc", "q" or "Q" to exit.')
    if args.demo == 'image':
        if os.path.isdir(args.path):
            files = get_image_list(args.path)
        else:
            files = [args.path]
        files.sort()
        for image_name in files:
            meta, res = predictor.inference(image_name)
            predictor.visualize(res, meta, cfg.class_names, 0.35)
            ch = cv2.waitKey(0)
            if ch == 27 or ch == ord('q') or ch == ord('Q'):
                break
    elif args.demo == 'video' or args.demo == 'webcam':
        cap = cv2.VideoCapture(args.path if args.demo == 'video' else args.camid)
        while True:
            ret_val, frame = cap.read()
            meta, res = predictor.inference(frame)
            predictor.visualize(res, meta, cfg.class_names, 0.35)
            ch = cv2.waitKey(1)
            if ch == 27 or ch == ord('q') or ch == ord('Q'):
                break


if __name__ == '__main__':
    main()

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于yolov4的目标检测_yolov5预训练模型
YOLOv5的代码是开源的,因此我们可以从github上克隆其源码。不得不说GitHub的确是全球最大的男性交友网站,里面的人个个都是人才,yolov5发布才一年左右的时间,YOLOv5就已经更新了5个分支了,分别是yolov5.1-yolov5.5分支。该项目就是利用的yolov5.5分支来作为讲解。
全栈程序员站长
2022/09/27
8010
基于yolov4的目标检测_yolov5预训练模型
Pytorch:YOLO-v5目标检测(上)
YOLO全称为You Only Look Once(你只需看一次)。卷积神经网络处理图像时,需要将用卷积核对图像进行逐行扫描,而YOLO则是将一张图片分成无数个方格,通过机器来判断每个方格出现目标的可能性。具体的理论比较复杂,想要了解原理,我推荐看下面两个视频。 第一个是吴恩达讲解的Yolo算法(传送门) 第二个是B站讲解最清楚的Yolo-v3算法(传送门) Yolo中的v即version,代表版本,yolo的创始人总共从v1更新到v3,而v4,v5则是另外一位作者编写,虽未得到官方认可,但在某测试集上的表现已经超越之前的v3版本。
zstar
2022/06/14
1.3K0
Pytorch:YOLO-v5目标检测(上)
【目标检测/实例分割】Mask R-CNN简介与Swin Transformer实践测试
之前在看Swin Transformer的时候,发现该算法在目标检测、实例分割等各种视觉任务上屠榜,于是想来实践测试一下。
zstar
2022/10/04
3.2K0
【目标检测/实例分割】Mask R-CNN简介与Swin Transformer实践测试
深度学习实战之布匹缺陷检测
缺陷检测是工业上非常重要的一个应用,由于缺陷多种多样,传统的机器视觉算法很难做到对缺陷特征完整的建模和迁移,复用性不大,要求区分工况,这会浪费大量的人力成本。深度学习在特征提取和定位上取得了非常好的效果,越来越多的学者和工程人员开始将深度学习算法引入到缺陷检测领域中。
用户1621951
2021/07/15
3.5K1
深度学习实战之布匹缺陷检测
利用Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解
Torchvision更新到0.3.0后支持了更多的功能,其中新增模块detection中实现了整个faster-rcnn的功能。本博客主要讲述如何通过torchvision和pytorch使用faster-rcnn,并提供一个demo和对应代码及解析注释。
全栈程序员站长
2022/09/07
1.7K0
利用Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解
使用YOLOv5模型进行目标检测!
目标检测是计算机视觉领域的一大任务,大致分为一阶段目标检测与两阶段目标检测。其中一阶段目标检测模型以YOLO系列为代表。最新的YOLOv5在各个数据集上体现出收敛速度快、模型可定制性强的特点,值得关注。本文主要讲解如何从零训练自己的YOLOv5模型与一些重要参数的含义。
Datawhale
2021/07/12
11K0
使用YOLOv5模型进行目标检测!
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
2020年6月10日,Ultralytics在github上正式发布了YOLOv5。YOLO系列可以说是单机目标检测框架中的潮流前线了,YOLOv5并不是一个单独的模型,而是一个模型家族,包括了YOLOv5s(最小)、YOLOv5m、YOLOv5l、YOLOv5x(最大)。目前v6.0版本又新增一层YOLOv5n模型,代替YOLOv5s成为最小模型,在所有模型中速度更快但精度也更低。
全栈程序员站长
2022/07/01
4.8K0
YOLOv5 实现目标检测(训练自己的数据集实现猫猫识别)
【pytorch-ssd目标检测】训练自己创建的数据集
制作类似pascal voc格式的目标检测数据集:https://www.cnblogs.com/xiximayou/p/12546061.html
西西嘛呦
2020/08/26
1.3K0
【pytorch-ssd目标检测】训练自己创建的数据集
YOLOv5桌面应用开发,手把手教学实操(中)——附源代码
关注并星标 从此不迷路 计算机视觉研究院 公众号ID|ComputerVisionGzq 学习群|扫码在主页获取加入方式 今天分享的内容来自CSDN——成都_小吴,该同学撰写的一篇关于Yolov5桌面应用的开发工作,有兴趣的同学可以关注CSDN!具体文章链接:https://blog.csdn.net/qq_52859223/article/details/122982212 计算机视觉研究院专栏 作者:Edison_G 上周“计算机视觉研究院”给大家分享了一期yolov5训练干货,今天我们继续,开
计算机视觉研究院
2022/03/04
4030
用opencv的dnn模块做yolov5目标检测[通俗易懂]
最近在微信公众号里看到多篇讲解yolov5在openvino部署做目标检测文章,但是没看到过用opencv的dnn模块做yolov5目标检测的。于是,我就想着编写一套用opencv的dnn模块做yolov5目标检测的程序。在编写这套程序时,遇到的bug和解决办法,在这篇文章里讲述一下。
全栈程序员站长
2022/11/04
2.3K1
用opencv的dnn模块做yolov5目标检测[通俗易懂]
【目标检测】YOLOv5遇上知识蒸馏
知识蒸馏(Knowledge Distillation)由深度学习三巨头Hinton在2015年提出。
zstar
2022/11/12
2.3K0
【目标检测】YOLOv5遇上知识蒸馏
实用教程详解:模型部署,用DNN模块部署YOLOv5目标检测(附源代码)
在典型的机器学习和深度学习项目中,我们通常从定义问题陈述开始,然后是数据收集和准备(数据预处理)和模型构建(模型训练),对吧?但是,最后,我们希望我们的模型能够提供给最终用户,以便他们能够利用它。模型部署是任何机器学习项目的最后阶段之一,可能有点棘手。如何将机器学习模型传递给客户/利益相关者?模型的部署大致分为以下三个步骤:
计算机视觉研究院
2021/12/08
3.4K0
实用教程详解:模型部署,用DNN模块部署YOLOv5目标检测(附源代码)
深度好文 | YOLOv5+DeepSORT多目标跟踪深入解读与测试(含源码)
本文主要介绍如何使用Yolo-V5 + DeepSORT实现多目标检测与跟踪。(公众号:OpenCV与AI深度学习)
Color Space
2022/09/26
11.9K0
教程 | 从零开始PyTorch项目:YOLO v3目标检测实现(下)
选自Medium 作者:Ayoosh Kathuria 机器之心编译 参与:Panda 前几日,机器之心编译介绍了《从零开始 PyTorch 项目:YOLO v3 目标检测实现》的前 3 部分,介绍了 YOLO 的工作原理、创建 YOLO 网络层级和实现网络的前向传播的方法。本文包含了该教程的后面两个部分,将介绍「置信度阈值设置和非极大值抑制」以及「设计输入和输出流程」的方法。总体而言,本教程的目的是使用 PyTorch 实现基于 YOLO v3 的目标检测器,后者是一种快速的目标检测算法。 本教程使用的代
机器之心
2018/05/08
5.7K0
教程 | 从零开始PyTorch项目:YOLO v3目标检测实现(下)
利用yolov5实现口罩佩戴检测算法
首先申明,这篇博客是用于记录我第一次完全从头到尾跑通一个算法,我会在此博客详细写出我的具体过程,以供大家参考,可能会和炮哥博客有些重合,没办法毕竟我就是用他的博客来训练模型的。但这篇博客我会结合炮哥的博客和我自己训练过程中的一些问题和心得来写,所以还是会有所不的!!!博主其实也是个深度学习的小菜鸟hhh。在此感谢。
润森
2022/09/22
7920
利用yolov5实现口罩佩戴检测算法
Google Colab上的YOLOv3 PyTorch
对于计算机视觉爱好者来说,YOLO(一次只看一次)是一种非常流行的实时对象检测概念,因为它的速度非常快并且性能出色。
代码医生工作室
2020/04/14
2.6K0
Google Colab上的YOLOv3 PyTorch
NanoDet:轻量级(1.8MB)、超快速(移动端97fps)目标检测项目
前几日YOLO-tiny (上达最高精度,下到最快速度,Scaled-YOLOv4:模型缩放显神威)的出现给移动端开发的朋友一个新选择,昨天Github又新上一不得不关注的项目NanoDet,目标检测模型文件仅 1.8 MB,在手机上实时检测速度可达 97fps!
用户3578099
2020/11/30
1.1K0
NanoDet:轻量级(1.8MB)、超快速(移动端97fps)目标检测项目
【pytorch-ssd目标检测】测试自己创建的数据集
制作类似pascal voc格式的目标检测数据集:https://www.cnblogs.com/xiximayou/p/12546061.html
西西嘛呦
2020/08/26
6000
【pytorch-ssd目标检测】测试自己创建的数据集
【目标检测】YOLOv5跑通VOC2007数据集
如果经常阅读我博客的读者,想必对YOLOv5并不陌生。在Pytorch:YOLO-v5目标检测(上)一文中,我使用了coco128数据集,非常轻松的跑通了。然而在使用VOC2007数据集时,却遇到重重阻碍。主要问题在数据标签转化这个阶段,VOC数据集标注形式是xml,需要将其转换为txt。很多博文并未把文件的放置位置交代清楚,导致走了不少弯路,本篇博文就记录如何不走弯路地跑通VOC数据集。
zstar
2022/09/07
2K1
【目标检测】YOLOv5跑通VOC2007数据集
旋转目标检测模型-TensorRT 部署(C++)
这次工程部署主要选择了比较熟悉的旋转选择框架-GGHL。如果没有特殊算子的检测框架,依然可以使用下面的这个Pipeline, 旋转目标检测主要分成五参数和八参数的表征方法,分别对应的 x,y,w,h.以及对应的八参数的转化求法 x_1,y_1,x_2,y_2,x_3,y_3,x_4,y_4 。这两种方式在后处理的时候可以互相转换,我们这里选择后者。
墨明棋妙27
2022/09/27
1.6K0
旋转目标检测模型-TensorRT 部署(C++)
推荐阅读
相关推荐
基于yolov4的目标检测_yolov5预训练模型
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 大模型知识引擎×DeepSeek实践征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验