NanoDet:這是個小於4M超輕量目標檢測模型
摘要:NanoDet 是一個速度超快和輕量級的移動端 Anchor-free 目標檢測模型。
前言
YOLO、SSD、Fast R-CNN等模型在目標檢測方面速度較快和精度較高,但是這些模型比較大,不太適合移植到移動端或嵌入式裝置;輕量級模型 NanoDet-m,對單階段檢測模型三大模組(Head、Neck、Backbone)進行輕量化,目標加檢測速度很快;模型檔案大小僅幾兆(小於4M)。
NanoDet作者開原始碼地址: (致敬)
基於NanoDet專案進行小裁剪,專門用來實現Python語言、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目標檢測效果
同時檢測出四位少年
在複雜街道中,檢測出行人、汽車:
透過測試發現NanoDet確實很快,但識別精度和效果比YOLOv4差不少的。
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請參考 https://blog.csdn.net/qq_41204464/article/details/108807165
安裝PyTorch請參考 https://blog.csdn.net/u014723479/article/details/103001861
安裝pycocotools請參考 https://blog.csdn.net/weixin_41166529/article/details/109997105
3)體驗NanoDet目標檢測
下載程式碼,開啟工程
先到githug下載程式碼,然後解壓工程,然後使用PyCharm工具開啟工程;
githug程式碼下載地址:
說明:該程式碼是基於NanoDet專案進行小裁剪,專門用來實現Python語言、PyTorch 版本的程式碼
NanoDet作者開原始碼地址: (致敬)
使用PyCharm工具開啟工程
選擇開發環境】
檔案(file)——>設定(setting)——>專案(Project)——>Project Interpreters 選擇搭建的開發環境;
然後先點選Apply,等待載入完成,再點選OK;
進行目標檢測
具體命令請參考:
'''目標檢測-圖片''' 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 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()
本文分享自華為雲社群《目標檢測模型NanoDet(超輕量,速度很快)介紹和PyTorch版本實踐》,原文作者:一顆小樹x。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4662/viewspace-2796240/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 訓練一個目標檢測模型模型
- 52 個深度學習目標檢測模型深度學習模型
- R2CNN模型——用於文字目標檢測的模型CNN模型
- 目標檢測---教你利用yolov5訓練自己的目標檢測模型YOLO模型
- 增加檢測類別?這是一份目標檢測的基礎指南
- 0-目標檢測模型的基礎模型
- Yolov5——訓練目標檢測模型YOLO模型
- 目標檢測
- 基於混合高斯模型的運動目標檢測演算法模型演算法
- 目標檢測 YOLO v3 訓練 人臉檢測模型YOLO模型
- 目標檢測模型的評價標準-AP與mAP模型
- 最新Anchor-Free目標檢測模型—FoveaBox模型
- 做目標檢測,這一篇就夠了!2019最全目標檢測指南
- 九、目標檢測
- 使用關鍵點進行小目標檢測
- 目標檢測 YOLO v3 驗證 COCO 模型YOLO模型
- 目標檢測面面觀
- 目標檢測之SSD
- 目標檢測綜述
- 28-目標檢測
- 大話目標檢測經典模型:Mark R-CNN模型CNN
- 目標檢測模型——SPP (空間金字塔池化)模型
- 目標檢測:二維碼檢測方案
- 電子書開放下載!這應該是最全的一份目標檢測演算法&模型盤點演算法模型
- 這才是目標檢測YOLOv3的真實面目YOLO
- TF專案實戰(基於SSD目標檢測)——人臉檢測1
- 3D目標檢測技術有哪些好用的模型?3D模型
- 在安卓上執行yolov8目標檢測模型(ncnn)安卓YOLO模型CNN
- SSD 目標檢測 Keras 版Keras
- 目標檢測發展方向
- 目標檢測之YOLO系列YOLO
- 【目標檢測】R-CNNCNN
- 52 個深度學習目標檢測模型彙總,論文、原始碼一應俱全!深度學習模型原始碼
- 51 個深度學習目標檢測模型彙總,論文、原始碼一應俱全!深度學習模型原始碼
- 深度學習之目標檢測與目標識別深度學習
- 比當前SOTA小4倍、計算量少9倍,谷歌最新目標檢測器EfficientDet谷歌
- 一文讀懂目標檢測模型(附論文資源)模型
- 目標檢測相關論文