哪些网站是同字形网页,公众号怎么推广产品,手机如何申请个人邮箱,手把手教你转移wordpressnanodet训练自己的数据集、NCNN部署到Android 一、介绍二、训练自己的数据集1. 运行环境2. 数据集3. 配置文件4. 训练5. 训练可视化6. 测试 三、部署到android1. 使用官方权重文件部署1.1 下载权重文件1.2 使用Android Studio部署apk 2. 部署自己的模型【暂时存在问题】2.1 生成… nanodet训练自己的数据集、NCNN部署到Android 一、介绍二、训练自己的数据集1. 运行环境2. 数据集3. 配置文件4. 训练5. 训练可视化6. 测试 三、部署到android1. 使用官方权重文件部署1.1 下载权重文件1.2 使用Android Studio部署apk 2. 部署自己的模型【暂时存在问题】2.1 生成ncnn模型2.2 部署到android 一、介绍
看看作者自己的介绍吧
NanoDet-Plus 知乎中文介绍
NanoDet 知乎中文介绍 二、训练自己的数据集
1. 运行环境
conda create -n nanodet python3.8 -y
conda activate nanodetconda install pytorch torchvision cudatoolkit11.1 -c pytorch -c conda-forgegit clone https://github.com/RangiLyu/nanodet.git
cd nanodetpip install -r requirements.txtpython setup.py develop2. 数据集
该示例最后使用的是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_asciiFalse, indent2)json.dump(val_coco, f, ensure_asciiFalse, indent2)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.json3. 配置文件
以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.yml中resume和load_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_4166. 测试
方法一
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 Predictor为from 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.bin和nanodet-plus-m_416.param复制到F:\nanodet\demo_android_ncnn\app\src\main\assets下并重命名为nanodet.bin和nanodet.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 project和run app都没有报错但是手机运行程序时识别有问题类别并不是我自己数据集的类别暂时还没发现问题所在。