【目标检测】使用Retinanet训练自己的数据集——Keras版本

本文介绍了如何使用Keras实现的Retinanet目标检测网络训练自己的数据集。主要内容包括数据集准备、环境搭建、CSV文件生成、模型训练、模型转换和测试。Retinanet适用于类别分布不平衡的数据集,通过Focal Loss提高检测精度。
摘要由CSDN通过智能技术生成


Retinanet 较之 SSD, YOLO系one stage目标检测网络,在保证检测速度的基础上,很大的提高了在样本类别分布不平衡情况下的检测精度,这得益于He Kaiming等人所提出的Focal Loss
Paper可见

Focal Loss for Dense Object Detection

由于在工作或一些特定场景中,我们的数据很大可能不会像COCO, Pascal VOC这样的实验数据集有很多分布相对均匀的类,而基本是集中在某几种类别上。这时使用Retinanet 就比较合适了。
本文主要介绍如何使用Keras版本的Retinanet训练自己的数据集,代码及参考来自:

fizyr/keras-retinanet


我的开发环境 Ubuntu 16.04 + python 3.6
Windows下亦可运行,但需要Microsoft Visual C++ 14.0支持
下载:Microsoft Visual C++ Build Tools


1 准备自己的数据集

根据自己系统下载labelImg工具,对自己的图片数据打上标签。数据集可自行爬取相关类目,或这里推荐一位同事自己制作数据集的博客,有非常详细的目标检测数据准备步骤及数据下载

目标检测第2步-数据准备(简书作者:潇洒坤)

2 搭建Retinanet环境

代码库下载地址https://github.com/fizyr/keras-retinanet,或git命令:

git clone https://github.com/fizyr/keras-retinanet.git
  1. 获得代码库后进入keras-retinanet文件夹
  2. 确认有未安装numpy
pip install numpy --user
  1. 在这个文件夹内运行下面代码来安装keras-retinanet库,确认你已经根据自己的系统需求安装了tensorflow
pip install . --user 

或者你可以选择不安装库,仅在这个文件内运行相关训练测试代码,但是要先运行下述命令来编译Cython代码*(尽量不选择这种方式,仅能在此文件夹内运行相关代码,非常麻烦)*

python setup.py build_ext --inplace

3 生成CSV文件定义自己的数据集

训练自己的数据集需要至少两个CSV文件,一个文件包含标注数据,另一个则包含各个类别名及其对应的ID序号映射。

  • 数据标注文件格式

    路径,xmin,ymin,xmax,ymax,类别名
    path/to/image.jpg,x1,y1,x2,y2,class_name
    

    注:数据标注的CSV文件需一行仅包含一条标注信息,这和yolo标注数据集形成的.txt有所不同,即若一幅图片包含了多个标注的bounding boxes ,一行也仅显示一条标注,共分几行来进行标识,若没有则路径后仅有‘,’,示例如下:

    /data/imgs/img_001.jpg,837,346,981,456,cow
    /data/imgs/img_002.jpg,215,312,279,391,cat
    /data/imgs/img_002.jpg,22,5,89,84,bird
    /data/imgs/img_003.jpg,,,,,
    
  • 类别映射文件格式

    类别,序号(从0开始)
    class_name,id
    例:
    cow,0
    cat,1
    bird,2
    

写了个代码根据xml生成csv文件,下载:xml2csv.py

"""
运行方式:命令行 python xml2csv.py -i indir(图片及标注的母目录)
      注:必须参数: -i 指定包含有图片及标注的母文件夹,图片及标注可不在同一子目录里,但名称必须一一对应
                     (图片格式默认.jpg,若为其他格式可见代码中注释自行修改)
          可选参数: -p 交叉验证集拆分比,默认0.05
                   -t 生成训练集CSV文件名称,默认train.csv
                   -v 生成交叉验证集CSV文件名称,默认val.csv
                   -c 生成类别映射CSV文件名称,默认class.csv
"""

import os
import xml.etree.ElementTree as ET
import random
import math
import argparse


def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--indir', type=str)
    parser.add_argument('-p', '--percent', type=float, default=0.05)
    parser.add_argument('-t', '--train', type=str, default='train.csv')
    parser.add_argument('-v', '--val', type=str, default='val.csv')
    parser.add_argument('-c', '--classes', type=str, default='class.csv')
    args = parser.parse_args()
    return args

#获取特定后缀名的文件列表
def get_file_index(indir, postfix):
    file_list = []
    for root, dirs, files in os.walk(indir):
        for name in files:
            if postfix in name:
                file_list.append(os.path.join(root, name))
    return file_list

#写入标注信息
def convert_annotation(csv, address_list):
    cls_list = []
    with open(csv, 'w') as f:
        for i, address in enumerate(address_list):
            in_file = open(address, encoding='utf8')
            strXml =in_file.read(
  • 9
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于训练自己的数据集,你可以使用RetinaNet来进行目标检测任务的训练。下面是一般的步骤: 1. 数据准备:收集并标注自己的数据集。确保每个图像中的目标都被正确框定并标记类别。 2. 安装依赖:安装RetinaNet的依赖库,如Tensorflow、Keras等。 3. 下载预训练模型:下载RetinaNet的预训练模型,这些模型通常在COCO数据集上进行了训练,并且具有良好的通用性能。 4. 配置文件:创建一个配置文件,其中包括训练数据集的路径、类别数、预训练模型的路径等信息。 5. 数据预处理:对数据集进行预处理,如调整图像大小、归一化等。 6. 训练模型:使用预处理后的数据集和配置文件,通过训练脚本来训练RetinaNet模型。在训练过程中,模型会对图像进行特征提取,并进行目标检测的学习。 7. 模型评估:在训练过程中,可以定期评估模型在验证集上的性能。可以使用mAP(mean Average Precision)等指标来评估模型的准确性。 8. 模型调优:根据评估结果,可以调整一些超参数,如学习率、批次大小等,来提升模型性能。 9. 模型保存:在训练完成后,保存训练好的模型以备后续使用。 10. 模型推理:使用训练好的RetinaNet模型对新的图像进行目标检测。 以上是一个大致的步骤,具体实现的细节会涉及到具体的编程语言和框架。你可以参考RetinaNet的相关文档和教程,以及相关的开源代码库来进行更详细的了解和实践。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值