• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用新版FLIR (FLIR_ADAS_v2) 训练Faster RCNN模型

武飞扬头像
Chi_XU_
帮助1

简介

  • FLIR在2022.1.19发布了新版的FLIR_ADAS_v2,相较于上一代的FLIR_1_3,新版有着更多的类别和数量更丰富的图像。但现有的博客中关于新版FLIR的使用教学少只有少,加上暑假期间曾使用FLIR_ADAS_v2来训练模型以提高其对红外热图像的识别能力,便决定记录分享一下。
  • 本文章主要介绍如何使用FLIR_ADAS_v2中的thermal image来训练基于pytorchFaster RCNN模型
  • 若有不足,也欢迎大家指正批评

FLIR_ADAS_v2数据集下载

 Faster RCNN模型下载

数据集的预处理

将json文件转换为xml文件

  • 本文章使用的是FLIR_ADAS_v2数据集中的thermal image
  • FLIR_ADAS_v2提供的annotation文件是coco.json
  • 我们需要将json文件转换为Faster RCNN所需要的xml文件
  • 网上将json文件转换为xml文件的代码很多,我在此展示我所借鉴的,仅供参考
  1.  
    # translate coco_json to xml
  2.  
    import os
  3.  
    import time
  4.  
    import json
  5.  
    import pandas as pd
  6.  
    from tqdm import tqdm
  7.  
    from pycocotools.coco import COCO
  8.  
     
  9.  
     
  10.  
    def trans_id(category_id):
  11.  
    names = []
  12.  
    namesid = []
  13.  
    for i in range(0, len(cats)):
  14.  
    names.append(cats[i]['name'])
  15.  
    namesid.append(cats[i]['id'])
  16.  
    # print('id:{1}\t {0}'.format(names[i], namesid[i]))
  17.  
    index = namesid.index(category_id)
  18.  
    return index
  19.  
     
  20.  
    root = r'' # 你下载的 COCO 数据集所在目录
  21.  
    dataType = '2019'
  22.  
    anno = r'' # annotation文件所在的位置
  23.  
    xml_dir = r'' # 生成的xml文件的储存位置
  24.  
     
  25.  
    coco = COCO(anno) # 读文件
  26.  
    cats = coco.loadCats(coco.getCatIds()) # 这里loadCats就是coco提供的接口,获取类别
  27.  
     
  28.  
    # Create anno dir
  29.  
    dttm = time.strftime("%Y%m%d%H%M%S", time.localtime())
  30.  
    # if os.path.exists(xml_dir):
  31.  
    # os.rename(xml_dir, xml_dir dttm)
  32.  
    # os.mkdir(xml_dir)
  33.  
     
  34.  
    with open(anno, 'r') as load_f:
  35.  
    f = json.load(load_f)
  36.  
     
  37.  
    imgs = f['images'] # json文件的img_id和图片对应关系 imgs列表表示多少张图
  38.  
     
  39.  
    cat = f['categories']
  40.  
    df_cate = pd.DataFrame(f['categories']) # json中的类别
  41.  
    df_cate_sort = df_cate.sort_values(["id"], ascending=True) # 按照类别id排序
  42.  
    categories = list(df_cate_sort['name']) # 获取所有类别名称
  43.  
    print('categories = ', categories)
  44.  
    df_anno = pd.DataFrame(f['annotations']) # json中的annotation
  45.  
     
  46.  
    for i in tqdm(range(len(imgs))): # 大循环是images所有图片
  47.  
    xml_content = []
  48.  
    file_name = imgs[i]['file_name'] # 通过img_id找到图片的信息
  49.  
    height = imgs[i]['height']
  50.  
    img_id = imgs[i]['id']
  51.  
    width = imgs[i]['width']
  52.  
     
  53.  
    # xml文件添加属性
  54.  
    xml_content.append("<annotation>")
  55.  
    xml_content.append(" <folder>VOC2007</folder>")
  56.  
    xml_content.append(" <filename>" file_name.split('/')[1].split('.')[0] '.jpg' "</filename>")
  57.  
    xml_content.append(" <size>")
  58.  
    xml_content.append(" <width>" str(width) "</width>")
  59.  
    xml_content.append(" <height>" str(height) "</height>")
  60.  
    xml_content.append(" </size>")
  61.  
    xml_content.append(" <segmented>0</segmented>")
  62.  
     
  63.  
    # 通过img_id找到annotations
  64.  
    annos = df_anno[df_anno["image_id"].isin([img_id])] # (2,8)表示一张图有两个框
  65.  
     
  66.  
    for index, row in annos.iterrows(): # 一张图的所有annotation信息
  67.  
    bbox = row["bbox"]
  68.  
    category_id = row["category_id"]
  69.  
    # cate_name = categories[trans_id(category_id)]
  70.  
    cate_name = cat[category_id-1]['name']
  71.  
     
  72.  
    # add new object
  73.  
    xml_content.append("<object>")
  74.  
    xml_content.append("<name>" cate_name "</name>")
  75.  
    xml_content.append("<pose>Unspecified</pose>")
  76.  
    xml_content.append("<truncated>0</truncated>")
  77.  
    xml_content.append("<difficult>0</difficult>")
  78.  
    xml_content.append("<bndbox>")
  79.  
    xml_content.append("<xmin>" str(int(bbox[0])) "</xmin>")
  80.  
    xml_content.append("<ymin>" str(int(bbox[1])) "</ymin>")
  81.  
    xml_content.append("<xmax>" str(int(bbox[0] bbox[2])) "</xmax>")
  82.  
    xml_content.append("<ymax>" str(int(bbox[1] bbox[3])) "</ymax>")
  83.  
    xml_content.append("</bndbox>")
  84.  
    xml_content.append("</object>")
  85.  
    xml_content.append("</annotation>")
  86.  
     
  87.  
    x = xml_content
  88.  
    xml_content = [x[i] for i in range(0, len(x)) if x[i] != "\n"]
  89.  
    ### list存入文件
  90.  
    xml_path = os.path.join(xml_dir, file_name.replace('.jpg', '.xml'))
  91.  
    with open(xml_path, 'w ', encoding="utf8") as f:
  92.  
    f.write('\n'.join(xml_content))
  93.  
    xml_content[:] = []
学新通
  • 也可以直接使用笔者转换好的xml文件

链接: https://pan.百度.com/s/1Um8bXlrri0B-9RF4LNeZSQ?pwd=8wk7 提取码: 8wk7

 对数据集进行分组

  • model_data文件夹下新建flir.txt文件,将所需识别的class键入
    • 因为笔者的项目需求,所以键入了FLIR_ADAS_v2的category中提到的80个类。如有需要,可直接下载笔者所用的txt文件
      • 链接: https://pan.百度.com/s/1TU5OBbMX_5wvSOLscrLTdA?pwd=6yae 提取码: 6yae 复制这段内容后打开百度网盘手机App,操作更方便哦
      • 学新通
  •  将生成的xml文件放入VOCdevkit -> Annotations文件夹下

    学新通

  • 将对应的图片放入VOCdevkit -> JPEGImages文件夹下

    学新通

  •  生成模型所需的训练文件
    • 检查VOCdevkit -> ImageSets->Main文件夹下及VOCdevkit文件夹下是否有txt文件,若有请删去

学新通

  • 点击 voc_annotation.py 文件,将 class_path 更改为类文件路径,即 model_data/flir.txt
    • 根据自己的项目需求对trainval_percenttrain_percent进行更改,若无特殊需求,可保持默认

学新通

  • 运行 voc_annotation.py 即可生成刚才所删除的txt文件,并会生成每个类所包含的数量 学新通

开始训练

  •  点击 train.py 文件,将 classes_path 设置为类文件所在路径,即 model_data/flir.txt学新通
  •  根据自己的需求和设备性能对Epochbatch_size等参数进行修改学新通
  •  运行 train.py 文件即可开始训练啦!学新通

训练结果分析

  • logs 文件夹下会生成权重文件 pth 和 报告文件

    学新通

打开tfevents文件

  • 将以下代码中的event-dir换为tfevents所属文件夹的绝对路径(不是tfevents的相对路径!!!),并在命令行输入(如果环境为anaconda则在对应环境下输入)

    • 若失败请先导入tensorboard库
tensorboard --logdir=event-dir
  •  示例

学新通

 学新通 

使用训练权重进行图像识别

导入需要进行识别的图像并新建图像输出路径

  • 新建 img 文件夹,并导入需要进行识别的图像

    学新通 

  • 新建 img_out 文件夹用于储存输出图片

修改 frcnn.py 文件

  • 修改权重文件和类文件  学新通  

修改 predict.py 文件

  • 将模式修改为批量识别  学新通 
  • 修改图像的输入路径和输出路径  学新通  

运行 predict.py 文件

  • 控制台 学新通 
  •  输出图片

学新通

学新通

学新通

学新通

参考:

  • 本文章参考了CSDN博主 Fighting_1997 大佬的原创文章
  • 祝大佬身体健康,万事如意! 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggjkkh
系列文章
更多 icon
同类精品
更多 icon
继续加载