nanodet训练自己的数据集、NCNN部署到Android

2023-11-08 10:28

本文主要是介绍nanodet训练自己的数据集、NCNN部署到Android,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

nanodet训练自己的数据集、NCNN部署到Android

    • 一、介绍
    • 二、训练自己的数据集
      • 1. 运行环境
      • 2. 数据集
      • 3. 配置文件
      • 4. 训练
      • 5. 训练可视化
      • 6. 测试
    • 三、部署到android
      • 1. 使用官方权重文件部署
        • 1.1 下载权重文件
        • 1.2 使用Android Studio部署apk
      • 2. 部署自己的模型【暂时存在问题】
        • 2.1 生成ncnn模型
        • 2.2 部署到android

一、介绍

看看作者自己的介绍吧

NanoDet-Plus 知乎中文介绍

NanoDet 知乎中文介绍

在这里插入图片描述

二、训练自己的数据集

1. 运行环境

conda create -n nanodet python=3.8 -y
conda activate nanodetconda install pytorch torchvision cudatoolkit=11.1 -c pytorch -c conda-forgegit clone https://github.com/RangiLyu/nanodet.git
cd nanodetpip install -r requirements.txtpython setup.py develop

2. 数据集

该示例最后使用的是coco格式的标注文件,下方提供了一个voc转coco的脚本。

import os
from tqdm import tqdm
import xml.etree.ElementTree as ET
import jsonclass_names = ["cat", "bird", "dog"]def voc2coco(data_dir, train_path, val_path):xml_dir = os.path.join(data_dir, 'Annotations')img_dir = os.path.join(data_dir, 'JPEGImages')train_xmls = []for f in os.listdir(train_path):train_xmls.append(os.path.join(train_path, f))val_xmls = []for f in os.listdir(val_path):val_xmls.append(os.path.join(val_path, f))print('got xmls')train_coco = xml2coco(train_xmls)val_coco = xml2coco(val_xmls)with open(os.path.join(data_dir, 'coco_train.json'), 'w') as f:json.dump(train_coco, f, ensure_ascii=False, indent=2)json.dump(val_coco, f, ensure_ascii=False, indent=2)print('done')def xml2coco(xmls):coco_anno = {'info': {}, 'images': [], 'licenses': [], 'annotations': [], 'categories': []}coco_anno['categories'] = [{'supercategory': j, 'id': i + 1, 'name': j} for i, j in enumerate(class_names)]img_id = 0anno_id = 0for fxml in tqdm(xmls):try:tree = ET.parse(fxml)objects = tree.findall('object')except:print('err xml file: ', fxml)continueif len(objects) < 1:print('no object in ', fxml)continueimg_id += 1size = tree.find('size')ih = float(size.find('height').text)iw = float(size.find('width').text)img_name = fxml.strip().split('/')[-1].replace('xml', 'jpg')img_name = img_name.split('\\')img_name = img_name[-1]img_info = {}img_info['id'] = img_idimg_info['file_name'] = img_nameimg_info['height'] = ihimg_info['width'] = iwcoco_anno['images'].append(img_info)for obj in objects:cls_name = obj.find('name').textif cls_name == "water":continuebbox = obj.find('bndbox')x1 = float(bbox.find('xmin').text)y1 = float(bbox.find('ymin').text)x2 = float(bbox.find('xmax').text)y2 = float(bbox.find('ymax').text)if x2 < x1 or y2 < y1:print('bbox not valid: ', fxml)continueanno_id += 1bb = [x1, y1, x2 - x1, y2 - y1]categery_id = class_names.index(cls_name) + 1area = (x2 - x1) * (y2 - y1)anno_info = {}anno_info['segmentation'] = []anno_info['area'] = areaanno_info['image_id'] = img_idanno_info['bbox'] = bbanno_info['iscrowd'] = 0anno_info['category_id'] = categery_idanno_info['id'] = anno_idcoco_anno['annotations'].append(anno_info)return coco_annoif __name__ == '__main__':save_dir = './datasets/annotations' # 保存json文件的路径train_dir = './datasets/annotations/train/' # 训练集xml文件的存放路径val_dir = './datasets/annotations/val/' # 验证集xml文件的存放路径voc2coco(save_dir, train_dir, val_dir)

最后数据集的路径如下:

-datasets
|--images
|	|--train
|	|	|--00001.jpg
|	|	|--00004.jpg
|	|	|--...
|	|--val
|	|	|--00002.jpg
|	|	|--00003.jpg
|	|	|--...
|--annatotions
|	|--coco_train.json
|	|--coco_val.json

3. 配置文件

nanodet-m-416.yml为例,对照自己的数据集主要修改以下部分

model:head:num_classes: 3 # 数据集类别数data:train:img_path: F:/datasets/images/train # 训练集图片路径ann_path: F:/datasets/annotations/coco_train.json # 训练集json文件路径val:img_path: F:/datasets/images/val # 验证集图片路径ann_path: F:/datasets/annotations/coco_val.json # 验证集json文件路径device:gpu_ids: [0] # GPUworkers_per_gpu: 8 # 线程数batchsize_per_gpu: 60 # batch sizeschedule:total_epochs: 280 # 总epoch数val_intervals: 10 # 每10个epoch进行输出一次对验证集的识别结果class_names: ["cat", "bird", "dog"] # 数据集类别

4. 训练

python tools/train.py config/legacy_v0.x_configs/nanodet-m-416.yml

如果训练中途断了,需要接着训练。首先修改nanodet-m-416.ymlresumeload_model这两行注释去掉,并将model_last.ckpt的路径补上(注意去掉注释后检查下这两行缩进是否正确),然后再python tools/train.py config/legacy_v0.x_configs/nanodet-m-416.yml

schedule:resume:load_model: F:/nanodet/workspace/nanodet_m_416/model_last.ckptoptimizer:name: SGDlr: 0.14momentum: 0.9weight_decay: 0.0001

报错:

OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading "F:\Anaconda3\envs\
nanodet\lib\site-packages\torch\lib\shm.dll" or one of its dependencies.

方案:减小配置文件中线程数workers_per_gpu,或者直接设为0不使用并行。

5. 训练可视化

TensorBoard日志保存在./nanodet/workspace/nanodet_m_416路径下,可视化命令如下:

tensorboard --logdir=./nanodet/workspace/nanodet_m_416

在这里插入图片描述

6. 测试

方法一:

python demo/demo.py image --config config/legacy_v0.x_configs/nanodet-m-416.yml --model nanodet_m_416.ckpt --path test.jpg

方法二:

运行demo\demo-inference-with-pytorch.ipynb脚本(修改代码中from demo.demo import Predictorfrom demo import Predictor

在这里插入图片描述

三、部署到android

1. 使用官方权重文件部署

1.1 下载权重文件

1)在F:\nanodet\demo_android_ncnn\app\src\main路径下新建一个文件夹assets

2)将F:\nanodet\demo_android_ncnn\app\src\main\cpp\ncnn-20211208-android-vulkan路径下的nanodet-plus-m_416.binnanodet-plus-m_416.param复制到F:\nanodet\demo_android_ncnn\app\src\main\assets下,并重命名为nanodet.binnanodet.param

3)(可选)下载Yolov4和v5的ncnn模型到F:\nanodet\demo_android_ncnn\app\src\main\assets路径下;

在这里插入图片描述

1.2 使用Android Studio部署apk

使用Android Studio打开F:\nanodet\demo_android_ncnn文件夹,按照自己的安卓版本选择相应的Platforms,值得注意的是,NDK需要安装21.0.6113669版本的,否则会报错类似“No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.6528147”。【详细操作可以查看我之前的文章中的1.2节:【终端目标检测01】基于NCNN将YOLOX部署到Android】

在这里插入图片描述

部署结果:
在这里插入图片描述

2. 部署自己的模型【暂时存在问题】

2.1 生成ncnn模型
  • 先转换为onnx文件:
python tools/export_onnx.py --cfg_path config\legacy_v0.x_configs\nanodet-m-416.yml --model_path nanodet_m_416.ckpt
  • 再转换为ncnn模型:

使用在线转换https://convertmodel.com/

在这里插入图片描述

将转换后的bin和param文件放置到assets文件夹下,可以重命名为nanodet.bin和nanodet.param,也可以修改jni_interface.cpp文件中NanoDet::detector = new NanoDet(mgr, "nanodet_self-sim-opt.param", "nanodet_self-sim-opt.bin", useGPU);

2.2 部署到android

我使用的是nanodet-m-416.yml训练了自己的模型,按照官方的文档修改nanodet.h中超参数,make projectrun app都没有报错,但是手机运行程序时识别有问题(类别并不是我自己数据集的类别),暂时还没发现问题所在。

在这里插入图片描述

这篇关于nanodet训练自己的数据集、NCNN部署到Android的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369209

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock