【矩池云】YOLOv3~YOLOv5训练红外小目标数据集

news2024/11/17 13:35:56

一、数据集准备

数据集下载地址:https://github.com/YimianDai/sirst

1. 需要将数据集转换为YOLO所需要的txt格式

参考链接:https://github.com/pprp/voc2007_for_yolo_torch

1.1 检测图片及其xml文件

import os, shutil

def checkPngXml(dir1, dir2, dir3, is_move=True):
    """
    dir1 是图片所在文件夹
    dir2 是标注文件所在文件夹
    dir3 是创建的,如果图片没有对应的xml文件,那就将图片放入dir3
    is_move 是确认是否进行移动,否则只进行打印
    """
    if not os.path.exists(dir3):
        os.mkdir(dir3)
    cnt = 0
    for file in os.listdir(dir1):
        f_name,f_ext = file.split(".")
        if not os.path.exists(os.path.join(dir2, f_name+".xml")):
            print(f_name)
            if is_move:
                cnt += 1
                shutil.move(os.path.join(dir1,file), os.path.join(dir3, file))
    if cnt > 0:
        print("有%d个文件不符合要求,已打印。"%(cnt))
    else:
        print("所有图片和对应的xml文件都是一一对应的。")

if __name__ == "__main__":
    dir1 = r"dataset/images/images"   # 修改为自己的图片路径
    dir2 = r"dataset/masks/masks"     # 修改为自己的图片路径
    dir3 = r"dataset/Allempty"        # 修改为自己的图片路径
    checkPngXml(dir1, dir2, dir3, False)

1.2 划分训练集

import os
import random
import os, fnmatch
 

trainval_percent = 0.8
train_percent = 0.8

xmlfilepath = r"dataset/masks/masks"
txtsavepath = r"dataset"
total_xml = fnmatch.filter(os.listdir(xmlfilepath), '*.xml')
print(total_xml)

num=len(total_xml)
list=range(num)
tv=int(num*trainval_percent)
tr=int(tv*train_percent)
trainval= random.sample(list,tv)
train=random.sample(trainval,tr)

ftrainval = open('dataset/trainval.txt', 'w')
ftest = open('dataset/test.txt', 'w')
ftrain = open('dataset/train.txt', 'w')
fval = open('dataset/val.txt', 'w')

for i  in list:
    name=total_xml[i][:-4]+'\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)

ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

1.3 转为txt标签

# -*- coding: utf-8 -*-
"""
需要修改的地方:
1. sets中替换为自己的数据集
2. classes中替换为自己的类别
3. 将本文件放到VOC2007目录下
4. 直接开始运行
"""

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join
sets=[('2007', 'train'), ('2007', 'val'), ('2007', 'test')]  #替换为自己的数据集
classes = ["Target"]     #修改为自己的类别

def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0
    y = (box[2] + box[3])/2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x*dw
    w = w*dw
    y = y*dh
    h = h*dh
    return (x,y,w,h)

def convert_annotation(year, image_id):
    in_file = open('dataset/masks/masks/%s.xml'%(image_id))  #将数据集放于当前目录下
    out_file = open('dataset/labels/%s.txt'%(image_id), 'w')
    tree=ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    print(w,h)
    for obj in root.iter('object'):
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult)==1:
            continue
        cls_id = classes.index(cls)
        print(cls_id)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text))
        bb = convert((w,h), b)
        print(bb)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
wd = getcwd()
for year, image_set in sets:
    if not os.path.exists('dataset/labels/'):
        os.makedirs('dataset/labels/')
    image_ids = open('dataset/%s.txt'%(image_set)).read().strip().split()
    list_file = open('%s_%s.txt'%(year, image_set), 'w')
    for image_id in image_ids:
        list_file.write('dataset/images/images/%s.png\n'%(image_id))
        convert_annotation(year, image_id)
    list_file.close()
# os.system("cat 2007_train.txt 2007_val.txt > train.txt")     #修改为自己的数据集用作训练

1.4 构造数据集

import os, shutil

"""
需要满足以下条件:
1. 在JPEGImages中准备好图片
2. 在labels中准备好labels
3. 创建好如下所示的文件目录:
    - images
        - train2014
        - val2014
    - labels(由于voc格式中有labels文件夹,所以重命名为label)
        - train2014
        - val2014
"""


def make_for_torch_yolov3(dir_image,
                                 dir_label,
                                 dir1_train,
                                 dir1_val,
                                 dir2_train,
                                 dir2_val,
                                 main_trainval,
                                 main_test):
    if not os.path.exists(dir1_train):
        os.mkdir(dir1_train)
    if not os.path.exists(dir1_val):
        os.mkdir(dir1_val)
    if not os.path.exists(dir2_train):
        os.mkdir(dir2_train)
    if not os.path.exists(dir2_val):
        os.mkdir(dir2_val)

    with open(main_trainval, "r") as f1:
        for line in f1:
            print(line[:-1])
            # print(os.path.join(dir_image, line[:-1]+".png"), os.path.join(dir1_train, line[:-1]+".png"))
            shutil.copy(os.path.join(dir_image, line[:-1]+".png"),
                        os.path.join(dir1_train, line[:-1]+".png"))
            shutil.copy(os.path.join(dir_label, line[:-1]+".txt"),
                        os.path.join(dir2_train, line[:-1]+".txt"))


    with open(main_test, "r") as f2:
        for line in f2:
            print(line[:-1])
            shutil.copy(os.path.join(dir_image, line[:-1]+".png"),
                        os.path.join(dir1_val, line[:-1]+".png"))
            shutil.copy(os.path.join(dir_label, line[:-1]+".txt"),
                        os.path.join(dir2_val, line[:-1]+".txt"))

if __name__ == "__main__":
    '''
    https://github.com/ultralytics/yolov3
    这个pytorch版本的数据集组织
    - images
        - train2014 # dir1_train
        - val2014 # dir1_val
    - labels
        - train2014 # dir2_train
        - val2014 # dir2_val
    trainval.txt, test.txt 是由create_main.py构建的
    '''

    dir_image = r"dataset/images/images"
    dir_label = r"dataset/labels"

    dir1_train = r"dataset/image/train2014"
    dir1_val = r"dataset/image/val2014"

    dir2_train = r"dataset/label/train2014"
    dir2_val = r"dataset/label/val2014"

    main_trainval = r"dataset/trainval.txt"
    main_test = r"dataset/test.txt"

    make_for_torch_yolov3(dir_image,
                            dir_label,
                            dir1_train,
                            dir1_val,
                            dir2_train,
                            dir2_val,
                            main_trainval,
                            main_test)

最终数据集格式如下:

 2. 构造训练所需要的数据集

根据以上数据集 需要单独构建一个datasets文件夹,存放标签和图像,具体格式如下:

可以参考该链接:https://github.com/ultralytics/yolov5/issues/7389

3. 构建数据配置文档,需要注意 YOLOv5目录需要和datasets目录同级。

命名为hongwai.yaml

# YOLOv3 🚀 by Ultralytics, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here (20.1 GB)


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco # dataset root dir
train: images/train2014  # train images (relative to 'path') 118287 images
val: images/val2014  # val images (relative to 'path') 5000 images
test: images/val2014  # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794

# Classes
nc: 1
names:
  0: Target

 二、矩池云配置环境

1. 租用环境

 2、 配置环境,缺啥配啥,耐心解决问题

参考命令:

pip install -r requirements.txt

也许训练过程中还会报错找不到module,根据module名字,使用pip安装即可

三、训练

YOLOv5训练命令:

python train.py --data data/hongwai.yaml --weights '' --cfg yolov5s.yaml --img 640 --device 0

YOLOv3训练命令:

python train.py --data data/hongwai.yaml --weights '' --cfg yolov3.yaml --img 640 --device 0

训练结果部分展示:

 

 四、文件夹检测

执行命令:

python detect.py --weights runs/train/exp10/weights/best.pt --source dataset/image/val2014

结果保存位置: 

 

【创造不易,需要指导做该项目的可以联系】

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

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

相关文章

OceanBase并行执行中 DTL消息接收处理的逻辑

OceanBase 并行执行的消息处理框架是很有意思的,里面用到了不少面向对象编程思想,值得分析。 DTL 从宏观上看可以分为三大部分: DTL 消息发送DTL 消息缓存DTL 消息处理 本文介绍 DTL 消息处理。 核心组件 DTL 消息缓冲区 DTL 消息缓冲区…

不懂这10个命令,别说你会调试网络设备

我的网工朋友大家好啊 好久没跟你们聊思科设备了。 虽然目前大方向上,企业用的设备越来越偏向国产化,学习华为、华三等厂商知识的人也越来越多。 但不可否认的是,思科仍然是厂商老大哥。 交换机、路由器这两块,思科占的全球市场…

若依框架请求magic-api接口出现Uncaught (in promise) error Promise.then (async)

错误描述: 在若依前端向magic-api发请求,实际上收到了返回的数据,但是仍出现错误提示。 错误截图: 猜测的原因: 请求参数错误返回参数错误magic-api内部语法错误 排除原因 在magic-api中仅返回一个数,同…

ChatGPT浪潮席卷,维智科技以时空AI赋能数实融合的未来城市

作者 | 伍杏玲 出品 | CSDN 每个时代都有新的技术浪潮,但在短短两年时间里见证两项颠覆全球的技术发展,实在出人意料之外:2021年以来,元宇宙成为互联网产业新风口,今年ChatGPT成为IT圈“顶流”,这两者为地…

Java访问QingCloud青云QingStor对象存储(公有云、私有云)

一、参考API 官网SDK文档参考:Java SDK - 公有云文档中心 (qingcloud.com) 二、环境说明 公有云跟私有云区别: 使用公有云QingStor,直接按照官网sdk直接可对接,私有云QingStor的话,需要设置具体的私有云请求地址及z…

chatgpt赋能python:Python中构造函数的名称

Python中构造函数的名称 作为一名有10年Python编程经验的工程师,我深知Python语言中构造函数的重要性。在本文中,我将着重介绍Python中构造函数的名称,并阐述其在Python编程中的作用。 什么是构造函数? 构造函数是一种特殊类型…

【C#学习记录】添加控件后工具箱不显示是什么原因

大家好,我是雷工! 今天在一个Winform程序中用到将WindowsMediaPlayer控件添加到工具箱,但添加了好几次,工具箱内均无法显示,经翻找资料和验证确认是跟创建项目时选择的模板有关,为了遇到同样问题的小伙伴能…

荣获用友年度十佳产业融合生态伙伴称号 | 图扑软件

2023 年 4 月 20 日,由中华全国工商业联合会联合工业和信息化部、国务院国资委组织开展的 2023 年度“百场万企”大中小企业融通对接活动——智能制造 MES 产业融通对接会暨 2023 用友 BIP 技术大会 MES 生态创新专题论坛在用友产业园顺利召开。 用友年度生态合作伙…

C语言学习分享(第九次)------数据的存储

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C语言学习分享⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多C语言知识   🔝🔝 数据的存储 1. 前言🚩2…

符合国情的supabase私有化部署(0)

符合国情的supabase私有化部署(0) 符合国情的supabase私有化部署(0) 前言开源 BaaS 解决方案快速开始 获取部署文件服务明细 容器启动后创建一个前端app注册邮箱SMTP协议jwt token和kong网关配置并应用更改数据库密码k8s 部署参考尾言常见问题 name resolution failedInvalid …

Python:Python编程:从入门到实践__超清版:Python标准库

Python标准库 1. OrderedDict2. threading三级目录 Python标准库是一组模块,按照的Python都包含了它,我们只需要在程序开头包含一条简单的 import 语句,就可以使用标准库中的任何函数和类。 下面我介绍几个重点 标准库 os : 提供一些与操作系…

Word控件Aspose.Words教程:使用 Java 处理 SXC 和 FODS 文件

Aspose.Words是一种高级Word文档处理API,用于执行各种文档管理和操作任务。API支持生成,修改,转换,呈现和打印文档,而无需在跨平台应用程序中直接使用Microsoft Word。 Aspose API支持流行文件格式处理,并…

NUC980编译错误,multiple target patterns(多个目标匹配)

1:问题: 昨天环境编译的还是没问题的,今天就出错了 : Makefile:133: *** multiple target patterns. Stop 此时:make make clean make disclean 都不可以使用了,报一样的错误。 2:解决办法&…

二叉搜索树的操作、模拟实现、应用以及性能的介绍

一、二叉搜索树 1. 性质 (1)如果左子树不是空,那么左子树上的所有节点的值都小于根节点的值 (2)如果右子树不是空,那么右子树上的所有节点的值都大于根节点的值 (3)左右子树也分别为…

Redis的网络模型

计算机硬件包括CPU,内存,网卡 为了避免用户应用和操作系统内核产生冲突乃至内核崩溃,用户应用和内核是隔离开的 1)进程的寻址空间会被划分成两部分,内核空间和用户空间,内核和用户应用都无法直接访问物理内存&#xff…

【Linux】在Ubuntu上部署web项目(Ubuntu版本为16.04.7,jdk1.8、mysql5.7、tomcat9.0.48)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

河道水位监测:河道水位监测用什么设备

中国地形复杂,气候多样,导致水资源分布不均,洪涝和干旱等问题时有发生。同时,人类活动也对水资源造成了很大压力,工业和农业用水增加,河道水位下降,生态环境受到威胁。因此,对河道水…

【面向对象三大特性之继承】

目录 1.什么是继承2.父类成员访问2.1 子类访问父类的成员变量2.1.1 子类和父类不存在同名成员变量2.1.2 子类和父类存在同名成员变量 2.2子类中访问父类的成员方法2.2.1. 成员方法名字不同2.2.22. 成员方法名字相同 3.super关键字4.子类构造方法5.super和this的异同点6.代码块的…

可视化探索开源项目的 contributor 关系

引语:作为国内外最大的代码托管平台,根据最新的 GitHub 数据,它拥有超 372,000,000 个仓库,其中有 28,000,000 是公开仓。分布式图数据库 NebulaGraph 便是其中之一,同其他开源项目一样,NebulaGrpah 也有自…

用arcgis for javascript 开发一个三维地图(入门案例)

效果如图: 详细的步骤就不啰嗦介绍了,大家可以参考上一篇文章二维地图入门案例,这里只是改了一点引用和属性而已。 核心代码: SceneView 用于创建三维地图 require([“esri/Map”, “esri/views/SceneView”] 这里提一句有两种…