经典目标检测YOLOV1模型的训练及验证

news2024/9/19 18:31:23

1、前期准备

准备好目录结构、数据集和关于YOLOv1的基础认知

1.1  创建目录结构

        自己创建项目目录结构,结构目录如下:

network                    CNN Backbone 存放位置
weights                    权重存放的位置
test_images             测试用的图片
utils                          辅助功能的代码存放位置 

models                    保存模型位置

data                         训练的数据集

1.2  数据集介绍与下载

1.2.1 数据集介绍

       首先了解数据集,对数据集了解后方便对数据进行相应处理。数据集详细介绍直通车:https://blog.csdn.net/qq_41946216/article/details/137683750?spm=1001.2014.3001.5501

1.2.1 数据集下载

       本次采用数据集: VOC2012数据集。

       数据集下载方式一:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar

       数据集下载方式二:

     下载并构建VOC2012数据集,从:https://gitee.com/ppov-nuc/pascal-vocdataset_-for_-yolo.git, 下载get_data文件generate_csv.py文件到本地,放到创建的目录结构中,修改get_data中下载的内容和相应路径,然后运行批处理文件get_data,在get_dat中会自动执行generate_csv.py,如下图所示。


2. 数据集处理

       在utils目录下创建工具类 generate_txt_file.py,主要用于数据集的划分和解析 Annotations/xxxxx.xml 文件中的类别bbox信息,并将信息存入voctrain.txt和voctest.txt文件,如下图所示:

具体代码:

# author: baiCai
# 1. 导包
from xml.etree import ElementTree as ET
import os
import random

# 2. 定义一些基本的参数
# 定义所有的类名
VOC_CLASSES = (
    'aeroplane', 'bicycle', 'bird', 'boat',
    'bottle', 'bus', 'car', 'cat', 'chair',
    'cow', 'diningtable', 'dog', 'horse',
    'motorbike', 'person', 'pottedplant',
    'sheep', 'sofa', 'train', 'tvmonitor')

'''
读取所有 xml 文件,存入列表
'''
# 要读取的xml文件路径,记得自己修改路径
Annotations = '../data/VOC2012/Annotations/'
# 列出所有的xml文件
xml_files = os.listdir(Annotations)
# 打乱数据集
random.shuffle(xml_files)
'''
定义训练集和测试比例
划分Annotations中的训练集和测试集文件列表
'''
# 训练集数量
train_num = int(len(xml_files) * 0.7)
# 训练列表
train_file_list = xml_files[:train_num]
# 测测试列表
test_file_list = xml_files[train_num:]

'''
定义 xml 解析后的信息存储路径和写对象
'''
# 训练集和测试集文件名字
train_set_path = './voctrain.txt'
test_set_path = './voctest.txt'

# 3. 定义解析xml文件的函数
'''
主要解析 xml 获取 类别名字和bbox,如 
{'name': 'person','bbox': [174, 101, 349, 351]}
'''
def parse_rec(filename):
    # 参数:输入xml文件名
    # 创建xml对象
    tree = ET.parse(filename)
    objects = []
    # 迭代读取xml文件中的object节点,即物体信息
    for obj in tree.findall('object'):
        obj_struct = {}
        # difficult属性,即这里不需要那些难判断的对象
        difficult = int(obj.find('difficult').text)
        if difficult == 1:  # 若为1则跳过本次循环
            continue
        # 开始收集信息
        obj_struct['name'] = obj.find('name').text
        bbox = obj.find('bndbox')
        obj_struct['bbox'] =\
            [int(float(bbox.find('xmin').text)),
            int(float(bbox.find('ymin').text)),
            int(float(bbox.find('xmax').text)),
            int(float(bbox.find('ymax').text))]
        objects.append(obj_struct)

    return objects

# 4. 把信息保存入文件中
def write_txt(file_list,set_path):
    # # 生成训练集txt
    count = 0
    with  open(set_path, 'w') as wt:
        for xml_file in file_list:
            count += 1
            # 获取图片名字
            image_name = xml_file.split('.')[0] + '.jpg'  # 图片文件名
            # 对xml_file进行解析
            results = parse_rec(Annotations + xml_file)
            # 如果返回的对象为空,表示张图片难以检测,因此直接跳过
            if len(results) == 0:
                print(xml_file)
                continue
            # 否则,则写入文件中
            # 先写入图片名字
            wt.write(image_name)
            # 接着指定下面写入的格式
            for result in results:
                class_name = result['name']
                bbox = result['bbox']
                class_name = VOC_CLASSES.index(class_name)  # 名字在类别中是下标位置
                wt.write(' ' + str(bbox[0]) +
                                ' ' + str(bbox[1]) +
                                ' ' + str(bbox[2]) +
                                ' ' + str(bbox[3]) +
                                ' ' + str(class_name))
            wt.write('\n')
        wt.close()

# 5. 运行
if __name__ == '__main__':
    write_txt(train_file_list,train_set_path)
    write_txt(test_file_list,test_set_path)

3. 构建数据加载器 

      在utils目录下创建工具类 yolo_dataset.py,主要用于数据集的构建,包含初始化、图片增强及归一化等功能。

3.1定义初始化方法

       读取xxxx.xml解析后的文件
       对每行数据(每个图片信息)的所有中心点信息以【x,y,w,h】和标签分别存入box列表和label列表。
       当前图片的边界框和标签信息即box列表和label列表,转换为LongTensor格式添加到对应的boxex列表和labels列表。

3.2 定义增强图片方法

增加方法名称定义的函数
随机翻转图片和边界框random_flip(img, boxes)
随机缩放图片和边界框randomScale(img, boxes)
随机模糊图片randomBlur(img)
随机调整图片亮度RandomBrightness(img)
随机调整图片色调RandomHue(img)
随机调整图片饱和度RandomSaturation(img)
随机移动图片和边界框randomShift(img, boxes, labels)        
随机裁剪图片和边界框randomCrop(img, boxes, labels)
用于从图像中减去均值subMean(self, bgr, mean)
将BGR图像转换为RGB图像BGR2RGB(self, img)
将BGR图像转换为HSV图像BGR2HSV(self, img)
将HSV图像转换为BGR图像HSV2BGR(self, img)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1612159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程并发八股问题总结

目录 (1).Java中实现线程的方法(2).如何停止一个正在运行的线程(3).notify和notifyAll有什么区别(4).sleep()和wait()有什么区别(5).volatile是什么?可以保证有序性吗?(6).Thread类中的start()和run方法有什么区别?(7).为什么wait、notify、n…

面试经典150题——跳跃游戏 II

面试经典150题 day10 题目来源我的题解方法一 动态规划方法二 贪心 题目来源 力扣每日一题;题序:45 我的题解 方法一 动态规划 动态规划,当j位置可达i位置时:dp[i]Math.min(dp[i],dp[j]1); 时间复杂度:O( n 2 n^2 n…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 4月21日,星期日

每天一分钟,知晓天下事! 2024年4月21日 星期日 农历三月十三 1、 商务部等10部门联合发文:进一步支持境外机构投资境内科技型企业。 2、 第二艘国产大型邮轮下坞搭载建造,预计2026年底前交付,中国邮轮开启批量化建造…

Python-VBA函数之旅-hash函数

目录 一、hash函数的定义: 二、hash函数的工作方式: ​三、hash函数的优缺点: 四、hash函数的常见应用场景: 1、hash函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页&…

Efficient Subclass Segmentation in Medical Images论文速读

Efficient Subclass Segmentation in Medical Images 摘要 随着医学图像分析的研究兴趣越来越细化,大量注释的成本也在上升。降低成本的一种可行方法是使用粗粒度超类标签进行注释,同时使用有限的细粒度注释作为补充。通过这种方式,细粒度的…

BAPI_BATCH_CHANGE:修改批次的特征值

文章目录 BAPI_BATCH_CHANGE:修改批次的特征值实现步骤定义变量获取对象/类等 获取已维护特性值新特性值更新 注意事项最终效果字段介绍 BAPI_BATCH_CHANGE:修改批次的特征值 现在有一个需求是要修改批次里面的某一个特征值,所以需要使用到B…

带头循环双向链表专题

1. 双向链表的结构 带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨 的” “哨兵位”存在的意义: 遍历循环链表避免死循环。 2. 双向链表的实现 2.1双向链表结构 typedef int DataTyp…

适合各大资源网投稿html源码

源码介绍 适合各大资源网投稿html源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 效果预览 源码下载 适合各大资源…

mac电脑mysql下载与安装

mysql下载地址 历史下载地址 MySQL :: Download MySQL Community Server (Archived Versions) mac 版下载 mac版本分为 Intel 处理器 和 M系列处理器。 从 8.0.26开始, mysql 支持M系列处理器。 以前的都只有Intel 处理器的。 Intel 处理器选择 x86_64 M 系列处理…

冯喜运:4.21黄金市场失去正常反应?下周黄金原油解析

【黄金消息面解析 】:周五(4月19日),伊朗媒体似乎淡化了以色列袭击的影响,表明地缘政治风险降低,导致避险资产需求放缓,金价回吐涨幅。本周现货黄金价格上涨超2%。美国黄金期货收盘上涨0.7%,至2413.8美元。…

深入理解Java IO流:字节流

深入理解Java IO流:字节流 引言 在Java中,IO(输入/输出)操作是程序与外部世界交互的重要方式。 其中,File类是进行文件操作的基础,而字节流和字符流则是数据传输的两种主要方式。 本文将深入探讨这些概念及…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中,会经常发布一些链接图标,该图标基本上以模板背景为主,并填充项目文字内容。解决方式一般会让美工进行制作…

数字化校园在职校教育中的价值和前景

在当今信息化浪潮中,职校教育正以前所未有的速度迈入智慧校园时代。数字化校园以其强大的功能和广泛的适用性,正在深刻地改变职校的教学模式、管理模式以及学生的学习方式,助力职校教育实现高质量、高效率、个性化的转型,如何利用…

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办

微信小程序小游戏开发,微信开发者工具提示该目录下的项目(wxapp2)已在工具中创建,怎么办 情况描述, 导入一个项目的时候,导入成了小游戏项目了 想换成小游戏项目,变不了了,提示 “…

Fanuc机器人 Karel 编程学习(五)---简单的Socket通信

Fanuc Karel编写Socket程序和上位机进行通信。 一:环境配置(ROBOGUIDE) 1.1机器人系统变量设置 MENU-------> SYSTEM------> Variables------->$KERAL_ENB 设置为1 1.2 IP地址设定 MENU---->SETUP---->Host Comm 选择 F3【DETAIL】进入IP设置…

【图论 单源最短路】100276. 最短路径中的边

本文时间知识点 单源最短路 图论知识汇总 LeetCode100276. 最短路径中的边 给你一个 n 个节点的无向带权图,节点编号为 0 到 n - 1 。图中总共有 m 条边,用二维数组 edges 表示,其中 edges[i] [ai, bi, wi] 表示节点 ai 和 bi 之间有一条…

Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具

Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具 Maximize Image Quality with AI 请访问原文链接:Topaz Photo AI 3.0.0 (macOS Universal) - AI 图片修复工具,查看最新版。原创作品,转载请保留出处。 作者主页:sy…

FK中的一些方法

1. 隔离法与整体法 目标:对一个拉新邀请任务,识别出其中的作弊用户。 欺诈类的数据,黑样本不足,需要自己去找,可按IP、昵称、手机号相似性等。虽然有 会员等级、注册时长、注册地址、成交订单等特征,但分类…

STM32 HAL库F103系列之ADC实验(一)

ADC工作原理: 1、输入通道: 2、转换序列: A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组) 规则组最多可以有16个转换,注入组最多有4个转换 规则组和注入…

视频素材库哪里最好?8个视频素材免费商用

在视频创作的世界里,寻找那些能够完美匹配你的想法并加以实现的视频素材是一项既令人兴奋又充满挑战的任务。无论你的目标是提升视频质量、增强视觉效果,还是简单地想要让你的作品更加出色,这里有一系列全球精选的视频素材网站,它…