安全帽佩戴检测算法模型训练详细流程

2023-10-31

一、任务描述

实际施工现场需要对每个进出的人员进行安全帽监测,对未佩戴安全帽的人员平台进行风险告警,通知工作人员并记录下来。

主要包括三类目标物体:头盔(helmet),人(person)和人头(head)

二、实现流程

1、数据集:直接用的网络数据集,下载地址:

https://aistudio.baidu.com/aistudio/datasetdetail/50329

2、算法:用的算法框架是百度的PaddleDetection,代码下载地址:

https://github.com/PaddlePaddle/PaddleDetection

3、将数据集解压保存在helmet_data文件夹下

4、将数据集拆分成训练集、测试集和验证集,用txt文件记录保存下来。代码如下:

import logging
import random
import os
import os.path as osp
import xml.etree.ElementTree as ET


def list_files(dirname):
    """ 列出目录下所有文件(包括所属的一级子目录下文件)
    Args:
        dirname: 目录路径
    """
    def filter_file(f):
        if f.startswith('.'):
            return True
        return False

    all_files = list()
    dirs = list()
    for f in os.listdir(dirname):
        if filter_file(f):
            continue
        if osp.isdir(osp.join(dirname, f)):
            dirs.append(f)
        else:
            all_files.append(f)
    for d in dirs:
        for f in os.listdir(osp.join(dirname, d)):
            if filter_file(f):
                continue
            if osp.isdir(osp.join(dirname, d, f)):
                continue
            all_files.append(osp.join(d, f))
    return all_files


def is_pic(filename):
    """ 判断文件是否为图片格式
    Args:
        filename: 文件路径
    """
    suffixes = {'JPEG', 'jpeg', 'JPG', 'jpg', 'BMP', 'bmp', 'PNG', 'png'}
    suffix = filename.strip().split('.')[-1]
    if suffix not in suffixes:
        return False
    return True


def replace_ext(filename, new_ext):
    """ 替换文件后缀
    Args:
        filename: 文件路径
        new_ext: 需要替换的新的后缀
    """
    items = filename.split(".")
    items[-1] = new_ext
    new_filename = ".".join(items)
    return new_filename


def split_voc_dataset(dataset_dir, save_dir, val_percent=0.15, test_percent=0.15):
    # 注意图片目录和标注目录名已全部修改
    if not osp.exists(osp.join(dataset_dir, "JPEGImages")):
        logging.error("\'JPEGImages\' is not found in {}!".format(dataset_dir))
    if not osp.exists(osp.join(dataset_dir, "Annotations")):
        logging.error("\'Annotations\' is not found in {}!".format(
            dataset_dir))
    all_image_files = list_files(osp.join(dataset_dir, "JPEGImages"))

    image_anno_list = list()
    label_list = list()
    for image_file in all_image_files:
        if not is_pic(image_file):  # 判断是否为图片格式
            continue
        anno_name = replace_ext(image_file, "xml")
        if osp.exists(osp.join(dataset_dir, "Annotations", anno_name)):
            image_anno_list.append([image_file, anno_name])
            try:
                tree = ET.parse(osp.join(dataset_dir, "Annotations", anno_name))
            except:
                raise Exception("文件{}不是一个良构的xml文件,请检查标注文件".format(
                    osp.join(dataset_dir, "Annotations", anno_name)))
            objs = tree.findall("object")
            for i, obj in enumerate(objs):
                cname = obj.find('name').text
                if not cname in label_list:
                    label_list.append(cname)
        else:
            logging.error("The annotation file {} doesn't exist!".format(anno_name))

    random.shuffle(image_anno_list)  # 随机打乱
    image_num = len(image_anno_list)  # 总图片数量
    val_num = int(image_num * val_percent)  # 验证集数量
    test_num = int(image_num * test_percent)  # 测试集数量
    train_num = image_num - val_num - test_num  # 训练集数量

    train_image_anno_list = image_anno_list[:train_num]  # 训练集样本
    val_image_anno_list = image_anno_list[train_num:train_num + val_num]  # 验证集样本
    test_image_anno_list = image_anno_list[train_num + val_num:]  # 测试集样本

    with open(osp.join(save_dir, 'train_list.txt'), mode='w', encoding='utf-8') as f:
        for x in train_image_anno_list:
            file = osp.join("JPEGImages", x[0])
            label = osp.join("Annotations", x[1])
            f.write('{} {}\n'.format(file, label))
    with open(osp.join(save_dir, 'val_list.txt'), mode='w', encoding='utf-8') as f:
        for x in val_image_anno_list:
            file = osp.join("JPEGImages", x[0])
            label = osp.join("Annotations", x[1])
            f.write('{} {}\n'.format(file, label))
    if len(test_image_anno_list):
        with open(osp.join(save_dir, 'test_list.txt'), mode='w', encoding='utf-8') as f:
            for x in test_image_anno_list:
                file = osp.join("JPEGImages", x[0])
                label = osp.join("Annotations", x[1])
                f.write('{} {}\n'.format(file, label))
    with open(osp.join(save_dir, 'labels.txt'), mode='w', encoding='utf-8') as f:
        for l in sorted(label_list):
            f.write('{}\n'.format(l))
    return image_anno_list, label_list


if __name__ == '__main__':
    dataset_dir = "/root/bigdata/pycharm_projects/PaddleDetection/data/helmet_data/helmet_train_data"
    split_voc_dataset(dataset_dir=dataset_dir, save_dir=dataset_dir)

5、修改tools下的x2coco.py的训练集文件地址参数,然后运行x2coco.py来将xml文件转成json文件,具体修改如下(我这边为了方便,将需要修改的参数都放到一个params.py文件中):

 

注意:由于数据集标注文件已经是xml,所以不需要做其他转换。如果标注文件是yolo格式的txt文件,则需要先将其转换为voc格式的xml文件。

6、修改PaddleDetection中的/configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml'文件,

及其相关文件。

具体修改如下:

'../datasets/coco_detection.yml',

--------------------------------------------------------------------------------

ppyoloe_plus_crn_x_80e_coco.yml:

--------------------------------------------------------------------------------

'./_base_/optimizer_80e.yml',

--------------------------------------------------------------------------------

'../runtime.yml',

 这里注意,没gpu的这个数据集要跑三天左右,建议买个gpu,不然感觉有点浪费时间

--------------------------------------------------------------------------------

另外有需要调整神经网络训练参数的可以去'./_base_/ppyoloe_plus_crn.yml'里面修改;有需要调整样本参数的可以去'./_base_/ppyoloe_plus_reader.yml'里面修改。

7、执行模型训练文件train.py:

 python tools/train.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml --eval --amp

如果直接执行train.py不指定coco文件的话,就在cli.py中修改config的默认值,具体如下:

 8、推理测试集数据,先修改infer.py的参数值,修改如下:

执行语句:python tools/infer.py -c configs/ppyoloe/ppyoloe_plus_crn_x_80e_coco.yml -o weights=../output/ppyoloe_plus_crn_x_80e_coco/best_model

 如果直接执行infer.py不指定weights的话,就会直接使用ppyoloe_plus_crn_x_80e_coco.yml中的weights值。

其中weights参数是最好的训练模型的权重的绝对路径,

infer_dir是测试集图片数据的绝对路径,

output_dir是结果输出绝对路径,

最终生成推理结果的图片和测试集的推理结果bbox.json都存储在helmet_output/infer_output/路径下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

安全帽佩戴检测算法模型训练详细流程 的相关文章

  • 谷歌 基站定位

    首先要清楚一点的是 每一个基站都能够通过请求http www google com loc json获取到一个经纬度 如果用户能够在短时间内获取到较多的基站信息 比如4个或5个 可以通过这几个基站的经纬度计算出比较准确的用户位置 举个例子
  • Linux内存buffer和cache的区别(转)

    内存使用说明 Free 命令相对于top 提供了更简洁的查看系统内存使用情况 root rac1 free total used free shared buffers cached Mem 1035108100898426124 0 12
  • ERP系统介绍

    ERP简介 企业资源计划或称企业资源规划简称ERP Enterprise Resource Planning 由美国著名管理咨询公司Gartner Group Inc 于1990年提出来的 最初被定义为应用软件 但迅速为全世界商业企业所接受
  • 你说,PC做!实在智能推出行业首个基于大模型的TARS-RPA-Agent产品

    2023年初 火遍全球的ChatGPT揭开AIGC元年大幕 国内外各家科技公司纷纷发布大模型 一时间 百模大战 风起云涌 6月下旬 AI行业准独角兽实在智能 Intelligence Indeed 开启自研垂直大语言模型 塔斯 TARS 内
  • Arduino加速度计射频自动化系统

    该项目旨在设计基于加速度计的实验室自动化系统 该系统分为两部分 1 发送器部分和 2 接收器部分 对于该实验 考虑使用两个负载灯泡和风扇 图1给出了系统框图 物料清单 发送端 接收端 接线 发送端 接收端 原理图 代码 发送端代码 接收端代
  • Halcon 12.0下载

    Halcon 12 0 链接 https pan baidu com s 15JpLWsfzIIhQEU4jE 3AsQ 密码 l0wt

随机推荐

  • 华为OD C++机试面试题 02 字符串反转

    华为OD C 机试面试题 02 字符串反转 题目描述 接受一个只包含小写字母的字符串 然后输出该字符串反转后的字符串 字符串长度不超过1000 输入描述 输入一行 为一个只包含小写字母的字符串 输出描述 输出该字符串反转后的字符串 示例1
  • 整流桥-桥式整流工作原理

    整流桥 有多种方法可以用整流二极管将交流电转换为直流电 包括半波整流 全波整流以及桥式整流等 整流桥 就是将桥式整流的四个二极管封装在一起 只引出四个引脚 四个引脚中 两个直流输出端标有 或 两个交流输入端有 标记 应用整流桥到电路中 主要
  • PyQt(Python+Qt)学习随笔:什么是信号绑定(Unbound and Bound Signals)?

    老猿Python博文目录 专栏 使用PyQt开发图形界面Python应用 老猿Python博客地址 1 概述 信号的绑定是由在类的实例变量中第一次通过类实例的方式 即 self 信号 或 实例名 信号 引用时触发 PyQt5会自动将该实例绑
  • python3-元组常用操作和函数

    元组与列表类似 不同点为 格式不同 元组数据使用 小括号 列表数据使用 方括号 元组中的元素不允许修改 删除等操作 即 改变元组中元素的操作都不被允许 元组只存在一个元素时 需要使用 逗号结尾 否则结果默认为对应元素的类型而不是元组 但是列
  • Protrator自动化测试(针对Angular 应用的自动化测试)

    环境准备工作 1 Protrator 是在NodeJs 环境下运行的 所以第一步是安装NodeJS 2 测试本机是否安装了NodeJs 可以命令行下输入 node v 将会输出NodeJS 的版本号 在Window下没有什么好的命令行工具
  • Weblogic-SSRF漏洞复现

    SSRF漏洞存在于http your ip 7001 uddiexplorer SearchPublicRegistries jsp 我们在brupsuite下测试该漏洞 访问一个可以访问的IP PORT 如http 127 0 0 1 7
  • python接口自动化参数传递_2、Python接口自动化系列之unittest结合ddt的使用

    前面一篇我们已经把unittest的常用用法都已经讲过了 可能很多小伙伴有个疑问 unittest框架怎么做数据驱动呢 这节我们就来学习一下 1 unittest 没有自带数据驱动功能 所以如果使用unittest 同时又想使用数据驱动 那
  • vue 后端数据成功返回 页面不渲染_vue能获取到数据数据却渲染不到页面上,为什么?...

    问题描述 从后台可以拿到数据 并打印在控制台但是就是渲染不到页面 我也不知道是为什么 感觉都正常 问题出现的环境背景及自己尝试过哪些方法 尝试用let this this来代替this但是还是没用并且报出success是undefined的
  • 121-----JS基础-----滚轮事件(鼠标)

    一 代码 很简单
  • angularjs--------选择下拉框

    div class id div
  • The NVIDIA driver on your system is too old (found version 10000)

    问题 原因是因为CUDA版本与pytorch版本不匹配 解决办法 查看自己的CUDA版本 我的是CUDA 10 0 https pytorch org 把这行复制到Anaconda Prompt窗口就行了
  • CPU虚拟化

    CPU虚拟化 中央处理器 CPU 是计算机的主要设备之一 是计算机中的核心配件 在计算机体系结构中 CPU是对计算机的所有硬件资源 如存储器 输入输出单元 进行控制调配 执行通用运算的核心硬件单元 计算机系统中所有软件层的操作 最终都将通过
  • @ControllerAdvice 的介绍及三种用法

    学习下 ControllerAdvice 首先 ControllerAdvice本质上是一个 Component 因此也会被当成组建扫描 加了 ControllerAdvice的类为那些声明了 ExceptionHandler InitBi
  • IP地址分类(A类 B类 C类 D类 E类)

    IP地址由四段组成 每个字段是一个字节 8位 最大值是255 IP地址由两部分组成 即网络地址和主机地址 网络地址表示其属于互联网的哪一个网络 主机地址表示其属于该网络中的哪一台主机 二者是主从关系 IP地址的四大类型标识的是网络中的某台主
  • 如何完美解答面试问题——HashMap的扩容机制(JDK1.7)

    大家好 我是孤焰 今天要谈一谈在面试过程中几乎被每个面试官都会提到的一个问题 HashMap的扩容机制是什么 由于我也是刚刚学习编程的小白 所以此篇博文将参考了多篇博文 最后总结而成 此篇博文仅介绍JDK1 8版本之前的HashMap扩容机
  • Unity3D 动画操作

    导入模型 https blog csdn net shenqiankk article details 100064940 方式一 Animator animation SetBool 状态转换的参数 true false 在创建对象前 先
  • 【计算机网络】数据链路层(一):数据帧和物理寻址

    数据链路层是物理层的上层 物理层是把电脑连接起来的物理手段 它主要规定了网络的一些电气属性 其作用是负责传送0和1的电信号 数据链路层位于物理层的上层 简单的阐述它的作用就是确定0和1的分组方式 下面我们就详细的介绍数据链路层 上面是TCP
  • 阿里云DNS 新增云上线路的智能解析功能

    简介 企业在云上部署单元化架构或内部服务链路时 需要考虑让数据 单元 离用户更近 避免跨单元获取数据 以此来满足自身低延时的诉求 阿里云DNS 新增基于云上链路的调度功能 进一步优化DNS智能解析 给云上用户提供更精准的流量调度能力 传统解
  • 基于STM32串口通信的ESP8266WiFi模块使用

    掌握esp8266的使用可以实现真正的万物物联 esp8266wifi通信对于MCU而言归结到底还是串口或spi通信 因此 掌握RS232通信协议 SPI通信协议以及esp8266的配置就可以基本搞定WiFi模块的使用 参考文章 1 ESP
  • 安全帽佩戴检测算法模型训练详细流程

    一 任务描述 实际施工现场需要对每个进出的人员进行安全帽监测 对未佩戴安全帽的人员平台进行风险告警 通知工作人员并记录下来 主要包括三类目标物体 头盔 helmet 人 person 和人头 head 二 实现流程 1 数据集 直接用的网络