文章目录

  • 前言
  • NanoDet 模型介绍
    • 1)NanoDet 模型性能
    • 2)NanoDet 模型架构
    • 3)NanoDet损失函数
    • 4)NanoDet 优势
  • 基于PyTorch 实现NanoDet
    • 1)NanoDet目标检测效果
    • 2)环境参数
    • 3)体验NanoDet目标检测
      • 下载代码,打开工程
    • 4)调用模型的核心代码

前言

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

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

基于NanoDet项目进行小裁剪,专门用来实现Python语言、PyTorch 版本的代码地址:https://github.com/guo-pu/NanoDet-PyTorch

下载直接能使用,支持图片、视频文件、摄像头实时目标检测

先看一下NanoDet目标检测的效果:
同时检测多辆汽车:

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

NanoDet 模型介绍

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

1)NanoDet 模型性能

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


备注:以上性能基于 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 分支,省去这一分支上的大量卷积,从而减少检测头的计算开销,非常适合移动端的轻量化部署。

详细请参考:Generalized Focal Loss: Learning Qualified and Distributed Bounding Boxes for Dense Object Detection

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检测的效果:

文章链接:https://guo-pu.blog.csdn.net/article/details/109912838
大家可以看到大部分的行人、汽车是被检测出来了,存在小部分没有被检测出来;

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

2)环境参数

测试环境参数

开发具体环境要求如下:


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

  • 安装cudatoolkit 10.1、cudnn7 .6
    请参考https://blog.csdn.net/qq.41204464/article/details/108807165
  • 安装PyTorch
    请参考https://blog.csdn.net/u014723479/article/details/103001861
  • 安装pycocotools
    请参考https://blog .csdn. netweixin_41166529/article/details/109997105

3)体验NanoDet目标检测

下载代码,打开工程

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

githug代码下载地址: https://github.com/guo-pu/NanoDet-PyTorch

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

使用PyCharm工具打开工程


打开后的页面是这样的: .

[选择开发环境]

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

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

进行目标检测
具体命令请参考:

'''目标检测-图片'''
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 代码:

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 Pipelineimage_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  0def 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 argsclass Predictor(object):def __init__(self, cfg, model_path, logger, device='cuda:0'):self.cfg = cfgself.device = devicemodel = 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'] = Noneheight, width = img.shape[:2]img_info['height'] = heightimg_info['width'] = widthmeta = 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, resultsdef 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_namesdef main():args = parse_args()torch.backends.cudnn.enabled = Truetorch.backends.cudnn.benchmark = Trueload_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'):breakelif 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'):breakif __name__ == '__main__':main()

参考:https://guo-pu.blog.csdn.net/article/details/110410940?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1.pc_relevant_paycolumn_v3&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7EPayColumn-1.pc_relevant_paycolumn_v3&utm_relevant_index=1

超轻量目标检测模型NanoDet(速度很快)PyTorch版本实践相关推荐

  1. 1.8M超轻量目标检测模型NanoDet,比YOLO跑得快

    机器之心报道,项目作者:RangiLyu 目标检测一直是计算机视觉领域的一大难题,其目标是找出图像中的所有感兴趣区域,并确定这些区域的位置和类别.目标检测中的深度学习方法已经发展了很多年,并出现了不同 ...

  2. windows缩放200模糊_1.8M超轻量目标检测模型NanoDet,比YOLO跑得快,上线两天Star量超200...

    机器之心报道 项目作者:RangiLyu 如何把 anchor-free 模型移植到移动端或嵌入式设备?这个项目对单阶段检测模型三大模块(Head.Neck.Backbone)进行轻量化,得到模型大小 ...

  3. 收藏 | 超轻量目标检测模型NanoDet,比YOLO跑得快,上线两天Star量超200

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:机器之心 AI博士笔记系列推荐 周志华<机器学习> ...

  4. 1.8M超轻量目标检测模型NanoDet,比YOLO跑得快,上线两天Star量超200

    点击 机器学习算法与Python学习 ,选择加星标 精彩内容不迷路 作者|RangiLyu,本文由机器之心报道 目标检测一直是计算机视觉领域的一大难题,其目标是找出图像中的所有感兴趣区域,并确定这些区 ...

  5. 超轻量目标检测模型NanoDet

    华为P30上用NCNN移植跑benchmark,每帧仅需10.23毫秒,比yolov4-tiny快3倍,参数量小6倍,COCO mAP(0.5:0.95)能够达到20.6 .而且模型权重文件只有1.8 ...

  6. NanoDet:这是个小于4M超轻量目标检测模型

    摘要:NanoDet 是一个速度超快和轻量级的移动端 Anchor-free 目标检测模型. 前言 YOLO.SSD.Fast R-CNN等模型在目标检测方面速度较快和精度较高,但是这些模型比较大,不 ...

  7. 用OpenCV实现超轻量的NanoDet目标检测模型!

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨nihate 审稿丨邓富城 编辑丨极市平台 导读 本文作者用OpenCV部署了超轻量目标检测模型 ...

  8. 【20201127期嵌入式AI周报】NanoDet 目标检测模型、移植 ncnn到 RISC-V等!

    导读:本期为 AI 简报 20201127 期,将为您带来 8 条相关新闻,希望对您有所帮助~ 一共2000+字,全篇看完需要5~7分钟 1. NanoDet:轻量级(1.8MB).超快速(移动端97 ...

  9. 精度45.9%,推理速度72.9FPS,百度飞桨推出工业级目标检测模型 PP-YOLO

    允中 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 工业视觉.自动驾驶.安防.新零售等我们身边熟知的各行各业都需要目标检测技术,由于其很好的平衡了标注成本.检测精度和速度等,成为当前智能制造产 ...

最新文章

  1. Scikit Learn: 在python中机器学习
  2. 帝国cms栏目忘记设置为终极栏目怎么办?
  3. 如何查看一个现有的keil工程之前由什么版本的keil IDE编译
  4. 大话数据结构—栈与队列
  5. Linux系统软件包的管理   3月30日课程
  6. SQL 16进制数转化10进制
  7. Date类 和 Calendar类
  8. springboot使用netty容器_Spring Boot 2 实战:使用 Undertow 来替代Tomcat
  9. 何以笙箫默,一部有剧情的创意广告集?
  10. linux下监控磁盘空间脚本
  11. 日亚海淘DHL自助清关流程攻略
  12. rs232接口_为什么越来越多人用RS232接口,却还分不清DB9、DB25的引脚定义?
  13. 基于MATLAB图像处理的自动QQ小游戏(一)自动扫雷篇
  14. 留一份名单,以供研究:2009中国企业500强全名单
  15. 用UCWEB浏览器上网 省流量小技巧
  16. 中南大学计算机学院2021复试名单,2021年中南大学研究生拟录取名单整理汇总(各学院)...
  17. 史上最好最全最牛的安全驾驶经验(不看必后悔)
  18. [Luogu4169][Violet]天使玩偶/SJY摆棋子
  19. C# 实现reportview的操作,详解。
  20. 神州数码防火墙策略基础

热门文章

  1. word撰写论文秘籍:图表自动编号、公式自动编号、自动页眉、自动参考文献
  2. mysql数据库主从复制步骤_MySQL搭建主从复制详细步骤
  3. “AI写手”火了!大学生用GPT-3写“鸡汤文”,骗过一堆人登上科技头条
  4. HP840笔记本电脑如何截屏
  5. 安卓checkbox全选/反选/取消选择
  6. tfidf 文本抽取
  7. 月入四万元 !“宅经济”催生内容付费春天?
  8. Git(仓库,分支,生成SSH公钥,IDEA集成Git)
  9. android 模拟器so调试,[求助]IDA 7.0 调试Android模拟器 so文件的问题
  10. mysql alter添加列