1.数据准备

标签格式是json,分成训练集(train)和验证集(val),分别存放图和对应的标签文件,利用如下代码将单个的json文件转成coco格式的json,代码如下:

# -*- coding:utf-8 -*-
import argparse
import json
import matplotlib.pyplot as plt
import skimage.io as io
from labelme import utils
import numpy as np
import glob
import PIL.Imageclass MyEncoder(json.JSONEncoder):def default(self, obj):if isinstance(obj, np.integer):return int(obj)elif isinstance(obj, np.floating):return float(obj)elif isinstance(obj, np.ndarray):return obj.tolist()else:return super(MyEncoder, self).default(obj)class labelme2coco(object):def __init__(self, labelme_json=[], save_json_path='./tran.json'):self.labelme_json = labelme_jsonself.save_json_path = save_json_pathself.images = []self.categories = []self.annotations = []# self.data_coco = {}self.label = []self.annID = 1self.height = 0self.width = 0self.save_json()def data_transfer(self):for num, json_file in enumerate(self.labelme_json):with open(json_file, 'r') as fp:data = json.load(fp)  # 加载json文件self.images.append(self.image(data, num))for shapes in data['shapes']:label = shapes['label']if label not in self.label:self.categories.append(self.categorie(label))self.label.append(label)points = shapes['points']  # 这里的point是用rectangle标注得到的,只有两个点,需要转成四个点points.append([points[0][0], points[1][1]])points.append([points[1][0], points[0][1]])self.annotations.append(self.annotation(points, label, num))self.annID += 1def image(self, data, num):image = {}# img = utils.img_b64_to_arr(data['imageData'])  # 解析原图片数据# img=io.imread(data['imagePath']) # 通过图片路径打开图片# img = cv2.imread(data['imagePath'], 0)# height, width = img.shape[:2]width = data['imageWidth']height = data['imageHeight']img = Noneimage['height'] = heightimage['width'] = widthimage['id'] = num + 1image['file_name'] = data['imagePath'].split('/')[-1]self.height = heightself.width = widthreturn imagedef categorie(self, label):categorie = {}categorie['supercategory'] = 'Cancer'categorie['id'] = len(self.label) + 1  # 0 默认为背景categorie['name'] = labelreturn categoriedef annotation(self, points, label, num):annotation = {}annotation['segmentation'] = [list(np.asarray(points).flatten())]annotation['iscrowd'] = 0annotation['image_id'] = num + 1# annotation['bbox'] = str(self.getbbox(points)) # 使用list保存json文件时报错(不知道为什么)# list(map(int,a[1:-1].split(','))) a=annotation['bbox'] 使用该方式转成listannotation['bbox'] = list(map(float, self.getbbox(points)))annotation['area'] = annotation['bbox'][2] * annotation['bbox'][3]# annotation['category_id'] = self.getcatid(label)annotation['category_id'] = self.getcatid(label)  # 注意,源代码默认为1annotation['id'] = self.annIDreturn annotationdef getcatid(self, label):for categorie in self.categories:if label == categorie['name']:return categorie['id']return 1def getbbox(self, points):# img = np.zeros([self.height,self.width],np.uint8)# cv2.polylines(img, [np.asarray(points)], True, 1, lineType=cv2.LINE_AA)  # 画边界线# cv2.fillPoly(img, [np.asarray(points)], 1)  # 画多边形 内部像素值为1polygons = pointsmask = self.polygons_to_mask([self.height, self.width], polygons)return self.mask2box(mask)def mask2box(self, mask):'''从mask反算出其边框mask:[h,w]  0、1组成的图片1对应对象,只需计算1对应的行列号(左上角行列号,右下角行列号,就可以算出其边框)'''# np.where(mask==1)index = np.argwhere(mask == 1)rows = index[:, 0]clos = index[:, 1]# 解析左上角行列号left_top_r = np.min(rows)  # yleft_top_c = np.min(clos)  # x# 解析右下角行列号right_bottom_r = np.max(rows)right_bottom_c = np.max(clos)# return [(left_top_r,left_top_c),(right_bottom_r,right_bottom_c)]# return [(left_top_c, left_top_r), (right_bottom_c, right_bottom_r)]# return [left_top_c, left_top_r, right_bottom_c, right_bottom_r]  # [x1,y1,x2,y2]return [left_top_c, left_top_r, right_bottom_c - left_top_c,right_bottom_r - left_top_r]  # [x1,y1,w,h] 对应COCO的bbox格式def polygons_to_mask(self, img_shape, polygons):mask = np.zeros(img_shape, dtype=np.uint8)mask = PIL.Image.fromarray(mask)xy = list(map(tuple, polygons))PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)mask = np.array(mask, dtype=bool)return maskdef data2coco(self):data_coco = {}data_coco['images'] = self.imagesdata_coco['categories'] = self.categoriesdata_coco['annotations'] = self.annotationsreturn data_cocodef save_json(self):self.data_transfer()self.data_coco = self.data2coco()# 保存json文件json.dump(self.data_coco, open(self.save_json_path, 'w'), indent=4, cls=MyEncoder)  # indent=4 更加美观显示labelme_json = glob.glob(r'./*.json')
# labelme_json=['./1.json']labelme2coco(labelme_json, '.\\instances_train2014.json')

运行成功会在当前文件夹下生成一个很大的json文件,包含所有的标签信息,训练时就是读取这个文件。

2.修改配置文件

打开源码下的config文件夹,我这边选择的是nanodet-plus-m-1.5x_416.yml这个规格的网络,需要修改的部分如下:

# nanodet-plus-m-1.5x_416
# COCO mAP(0.5:0.95) = 0.341
#             AP_50  = 0.506
#             AP_75  = 0.357
#           AP_small = 0.143
#               AP_m = 0.363
#               AP_l = 0.539
save_dir: workspace/nanodet-plus-m-1.5x_416
model:weight_averager:name: ExpMovingAveragerdecay: 0.9998arch:name: NanoDetPlusdetach_epoch: 10backbone:name: ShuffleNetV2model_size: 1.5xout_stages: [2,3,4]activation: LeakyReLUfpn:name: GhostPANin_channels: [176, 352, 704]out_channels: 128kernel_size: 5num_extra_level: 1use_depthwise: Trueactivation: LeakyReLUhead:name: NanoDetPlusHeadnum_classes: 80#自己的类别数input_channel: 128feat_channels: 128stacked_convs: 2kernel_size: 5strides: [8, 16, 32, 64]activation: LeakyReLUreg_max: 7norm_cfg:type: BNloss:loss_qfl:name: QualityFocalLossuse_sigmoid: Truebeta: 2.0loss_weight: 1.0loss_dfl:name: DistributionFocalLossloss_weight: 0.25loss_bbox:name: GIoULossloss_weight: 2.0# Auxiliary head, only use in training time.aux_head:name: SimpleConvHeadnum_classes: 80input_channel: 256feat_channels: 256stacked_convs: 4strides: [8, 16, 32, 64]activation: LeakyReLUreg_max: 7
data:train:name: CocoDatasetimg_path: coco/train2017 #这里需要修改成训练图片的文件夹路径ann_path: coco/annotations/instances_train2017.json#这里修改对应的标签文件input_size: [416,416] #[w,h]keep_ratio: Falsepipeline:perspective: 0.0scale: [0.6, 1.4]stretch: [[0.8, 1.2], [0.8, 1.2]]rotation: 0shear: 0translate: 0.2flip: 0.5brightness: 0.2contrast: [0.6, 1.4]saturation: [0.5, 1.2]normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]val:name: CocoDatasetimg_path: coco/val2017#这里修改成验证集的文件夹路径ann_path: coco/annotations/instances_val2017.json#这里是对应的文件夹路径input_size: [416,416] #[w,h]keep_ratio: Falsepipeline:normalize: [[103.53, 116.28, 123.675], [57.375, 57.12, 58.395]]
device:gpu_ids: [0]workers_per_gpu: 10batchsize_per_gpu: 96
schedule:
#  resume:
#  load_model:optimizer:name: AdamWlr: 0.001weight_decay: 0.05warmup:name: linearsteps: 500ratio: 0.0001total_epochs: 300#总的迭代次数lr_schedule:name: CosineAnnealingLRT_max: 300eta_min: 0.00005val_intervals: 10
grad_clip: 35
evaluator:name: CocoDetectionEvaluatorsave_key: mAP
log:interval: 50
#修改成自己的类别名
class_names: ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus','train', 'truck', 'boat', 'traffic_light', 'fire_hydrant','stop_sign', 'parking_meter', 'bench', 'bird', 'cat', 'dog','horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe','backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports_ball', 'kite', 'baseball_bat','baseball_glove', 'skateboard', 'surfboard', 'tennis_racket','bottle', 'wine_glass', 'cup', 'fork', 'knife', 'spoon', 'bowl','banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot','hot_dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted_plant', 'bed', 'dining_table', 'toilet', 'tv', 'laptop','mouse', 'remote', 'keyboard', 'cell_phone', 'microwave','oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock','vase', 'scissors', 'teddy_bear', 'hair_drier', 'toothbrush']

3.训练

输入如下命令即可开始训练

python tools/train.py CONFIG_FILE_PATH

训练过程会出一些小问题,我这总结了有以下:
1.安装的包的版本不对应导致报错
2.gpu显存不够,修改batchsize
3.电脑本身环境的问题
具体问题具体分析,有不当之处,欢迎一起交流学习~

4.训练过程可视化

训练过程中会在workspace文件夹下生成训练日志,通过tensorbord就可将训练过程可视化。结果如下:

基于VS2017+OpenCV,C++搭建NanoDet-Plus轻量级目标检测模型并训练(二)相关推荐

  1. 基于轻量级目标检测模型实现手写汉字检测识别计数

    一般手写相关的数据集,应该是手写数字听得最多最多的,手写汉字也有,但是与手写数字或者是手写字母的知名度相比就低了很多很多,在我前面的一篇很早期入门的时候写过一篇文章,如下: <Yolov3目标检 ...

  2. 轻量级目标检测模型实战——杂草检测

    在前面我写过一篇目标检测自己做实验的记录性也是入门的一篇文章,如下: Yolov3目标检测实战[实现图像中随机出现手写数字的检测] 感兴趣的话可以去看看. 当时主要是基于YOLOv3进行的实验,因为Y ...

  3. 基于并行附加特征提取网络的SSD地面小目标检测模型

    人工智能技术与咨询 来源:<电子学报> ,作者李宝奇等 摘 要: 针对SSD原始附加特征提取网络(Original Additional Feature Extraction Networ ...

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

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

  5. 使用opencv训练目标检测模型基于cascade模型

    使用opencv训练目标检测模型基于cascade模型 基于Haar特征的cascade分类器(classifiers) 是Paul Viola和 Michael Jone在2001年,论文" ...

  6. 基于Python,OpenCV,Numpy和Albumentations实现目标检测的合成数据集

    1.总述 训练一个对象检测模型,如YOLOv5,需要一个包含感兴趣对象的图像和注释(带有对象边界框坐标的文本文件)的数据集. 例如,在下面的图片中,你可以看到可视化的边界框.每个边界框表示与特定类别相 ...

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

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

  8. 超轻量目标检测模型NanoDet(速度很快)PyTorch版本实践

    文章目录 前言 NanoDet 模型介绍 1)NanoDet 模型性能 2)NanoDet 模型架构 3)NanoDet损失函数 4)NanoDet 优势 基于PyTorch 实现NanoDet 1) ...

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

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

最新文章

  1. 预见未来丨机器学习:未来十年研究热点
  2. 解决fullgc_「OOM」Java heap space原因与解决
  3. 如何使用trace模式运行BRF+应用
  4. 智能家居设备_您的智能家居设备正在监视您吗?
  5. DataURL与File,Blob,canvas对象之间的互相转换的Javascript (未完)
  6. HMS数据库设置和优化
  7. Spring高级之Spring事务详解(用法、传播行为、隔离级别、只读事务、事务条件)
  8. SQL 查询笔记:子查询,分组查询,左连接查询。。。。。
  9. 零基础学python pdf-笔记《零基础入门学习Python(第2版)》PDF+课件+代码分析
  10. 一个简单的PopupWindow做的选项菜单点击按钮会在按钮下弹出几个下拉控件
  11. 33. secure world对smc请求的处理------invoke command操作在OP-TEE中的实现
  12. qt emit是什么意思_2020年12月12日 无赞赏QT吗哪 :如天上的星星永远发光的信仰...
  13. linux 关于回程路由相关问题
  14. Hibernate 列映射 – 解决其他类型映射命名冲突
  15. html中outline属性,css的outline属性的作用是什么
  16. 052试题 86 - crosscheck 命令及expried
  17. MYSQL JDBC图书管理系统
  18. win10+python3.6+百度AI——实现人脸识别
  19. Servlet是什么?
  20. 超详细【Uboot驱动开发】(一)uboot基础了解

热门文章

  1. Echarts3实例 map地图选中高亮显示
  2. 搜狗高速浏览器2014 v5.0.0515 官方最新版
  3. 2022年最新面试JVM面试追魂夺命17问,教科书级回答
  4. 维密超模也来学编程?你想象得到吗,这些明星也曾是程序员!
  5. 华为鸿蒙系统概念图,华为Mate40Pro概念图:超高屏占比+鸿蒙系统 这才是真正的华为...
  6. c语言定义max和命令,C语言#define定义函数
  7. 教你如何用计算机玩游戏,想要在电脑设备上玩手机游戏,教你如何使用tcgames软件进行操作...
  8. 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........
  9. 数据湖有新解!Apache Hudi 与 Apache Flink 集成
  10. 2019企业发布会最新震撼大气开场舞蹈 《全息未来已来》全息投影舞蹈 创意3D科技互动视频秀 企业舞蹈编排