采用u版的pytorchyolo3源码训练自己的数据集

2023-05-16

采用u版的pytorchyolo3源码训练自己的数据集

1.说明

      最近一直在研究目标检测这一块的内容。
      在导师的建议下学习了yolov3目标检测算法,想着既然学完了就要跑一边看看是啥样子的说干就干。
      本文采用的源码为https://github.com/ultralytics/yolov3的版本
      由于使用电脑的gpu内存有限,本文运行的为yolov3-tiny

2.环境:

Cython
matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow
PyYAML>=5.3
scipy>=1.4.1
tensorboard>=2.2
torch>=1.7.0(笔者为1.6.0也可以跑)
torchvision>=0.8.1
tqdm>=4.41.0
没有对应环境的pip安装一下就完事了

3.制作数据集

制作数据集方面可以采用labelimg标注工具对自己的图像进行标注,安装包下载地址为:github:https://github.com/tzutalin/labelImg
安装依赖库
pip install PyQt5
pip install PyQt5_tools
pip install lxml
下载完成之后在文件目录中输入cmd进入解压后的文件路径
在这里插入图片描述
执行命令
pyrcc5 -o resources.py resources.qrc
python labelImg.py
即可完成安装。
标注生成的将xml文件放置在Annotations文件夹之中,图片文件放置在images文件之中
这个问image文件夹下的文件
在这里插入图片描述
在数据方面我直接从coco数据集之中提取了一类bicycle,来作为数据集

4.相关准备

在https://github.com/ultralytics/yolov3将代码下载下来并解压。采用pycharm打开之后大致的框架如下!
在这里插入图片描述

装载数据:我们首先将Annotations和images文件夹复制到data文件夹下,同时在data文件夹下新建2个文件夹,分别命名为ImageSets和labels。
然后在工程目录之下建立一个新的python文件makeTxt.py,代码如下

import os
import random

trainval_percent = 0.2  # 可自行进行调节
train_percent = 1
xmlfilepath = 'data/annotations'
txtsavepath = 'data/images'
total_xml = os.listdir(xmlfilepath)

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('ImageSets/Main/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
# fval = open('ImageSets/Main/val.txt', 'w')

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

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

然后再建立voc_label.py

#!/usr/bin/env python 
# -*- coding:utf-8 -*-
import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

sets = ['train', 'test']

classes = ['bicycle']  # 自己训练的类别


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(image_id):
    in_file = open('data/Annotations/%s.xml' % (image_id))
    out_file = open('data/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)

    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)
        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)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


wd = getcwd()
for image_set in sets:
    if not os.path.exists('data/labels/'):
        os.makedirs('data/labels/')
    image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
    list_file = open('data/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write('data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

分别运行makeTxt.py和voc_label.py
运行makeTxt.py后会在ImagesSets文件下生成2个文件,如下图
在这里插入图片描述
运行voc_label.py后labels后,会在labels文件夹之中生成图片的标签文件
在这里插入图片描述其中0就是对应的标签,后面的4个数字就是标签的位置。

接下来你还要配置2个文件,在data文件下新建bicycle.data文件配置内容如下

classes=1
train=data/train.txt
valid=data/test.txt
names=data/bicycle.names
backup=backup/
eval=coco

再在data文件下新建bicycle.names文件,配置内容如下:

bicycle

修改cfg文件
其实在u版本的cfg文件夹之中有对应的yolov3-tiny3-1cls.cfg有的话就不用管了没有的话就直接复制下面的代码

[net]
# Testing
batch=1
subdivisions=1
# Training
# batch=64
# subdivisions=2
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1

[convolutional]
batch_normalize=1
filters=16
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=32
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=64
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=128
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=2

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[maxpool]
size=2
stride=1

[convolutional]
batch_normalize=1
filters=1024
size=3
stride=1
pad=1
activation=leaky

###########

[convolutional]
batch_normalize=1
filters=256
size=1
stride=1
pad=1
activation=leaky

[convolutional]
batch_normalize=1
filters=512
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear



[yolo]
mask = 3,4,5
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=1
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

[route]
layers = -4

[convolutional]
batch_normalize=1
filters=128
size=1
stride=1
pad=1
activation=leaky

[upsample]
stride=2

[route]
layers = -1, 8

[convolutional]
batch_normalize=1
filters=256
size=3
stride=1
pad=1
activation=leaky

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=1
num=6
jitter=.3
ignore_thresh = .7
truth_thresh = 1
random=1

这个是针对单个类别目标检测的,如果是多个类别还需修改其中的filters参数(改为3*(类别数+4+1))将classes改为对应的类别数。最后需要下载yolov3-tiny.weights文件,并且将对应的文件放置在weights文件夹下。

5 训练

在pycharm的Terminal(终端)运行

python train.py --data data/bicycle.data --cfg cfg/yolov3-tiny-1cls.cfg --epochs 10 
#后面的epochs自行更改

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

采用u版的pytorchyolo3源码训练自己的数据集 的相关文章

  • ModuleNotFoundError: No module named ‘...’:报错解决方案

    1 module包没安装 这个 就是包的名字 xff0c 看问题定位 xff0c import源文件 xff0c 然后去site packages里找那个模块 xff0c 如果是空的没安装 xff0c 这时候可以在对应的环境里使用pip i
  • C语言----结构体,枚举,共用体

    1 xff09 结构体 span class token comment 例 xff1a 一个描述学生的结构体 span span class token keyword struct span span class token class
  • Nvidia jetson agx xavier can通讯失败,修改时钟源pllaon

    一 问题详情 在调试Xavier can的过程中 xff0c can通信始终有问题 xff0c 收发都会报错 后来发现时钟源导致波特率不匹配 xff0c 所以不能通信 二 修改时钟源 在虚拟机使用官方sdkmanager xff0c 下载安
  • linux下实现https访问

    http转https 适用于linux服务器 linux下nginx 43 ssl实现https访问 xff08 一 xff09 环境准备 xff08 二 xff09 下载nginx源码 xff0c 编译nginx并添加ssl模块 xff0
  • Nvidia Jetson nano 安装Archiconda、gpu版torch、踩坑记录

    Nvidia Jetson nano 安装Archiconda gpu版torch 踩坑记录 jetson nano 属于aarch64架构 xff0c 不同于一般的x86 64的linux系统架构 xff0c 而torch官网上面 htt
  • linux下的yum,vim,gcc,gdb

    我们在windows系统下我们能够很简单进行粘贴复制下载安装 xff0c 也能通过vs进行我们缩写代码的编译运行 xff0c 但是我们在linux下我们应该怎样去操作我们的这些命令呢 xff0c 这章我们就讲解一下我们linux下常用的一些
  • 【Keil】Keil5添加源程序和头文件

    xxx c就是源程序 xxx h就是头文件 源程序添加方法 双击文件夹 xff0c 例如图片上的Source xff0c 跳出弹窗 xff0c 选择需要添加的源程序即可 添加头文件的方法 1 首先点击图片红框处 xff0c 或是在文件夹te
  • C 标准库 string常用函数 笔记

    文章目录 64 TOC 文章目录 前言字符串长度strlen sizeof 字符串拼接strcat strncat 字符串拷贝strcpy strncpy memcpy 内存填充memset 字符串比较strcmp strncmp 字符串查
  • node.js中的http.request方法使用说明_node.js

    方法说明 xff1a 函数的功能室作为客户端向HTTP服务器发起请求 语法 xff1a 复制代码 代码如下 http get options callback 由于该方法属于http模块 xff0c 使用前需要引入http模块 xff08
  • ARM中SP、LR、PC三个寄存器介绍

    寄存器定义和用途 定义 寄存器是中央处理器内的组成部份 寄存器是有限存贮容量的高速存贮部件 xff0c 它们可用来暂存指令 数据和位址 用途 可将寄存器内的数据执行算术及逻辑运算 xff1b 存于寄存器内的地址可用来指向内存的某个位置 xf
  • Linux buffer/cache介绍

    free 命令 与 buffer cache 在 Linux 系统中 xff0c 我们经常用 free m命令来查看系统内存的使用状态 xff1a m 显示单位为MB free m 各个参数的说明 total 内存总数 used 已经使用的
  • 数字签名算法RSA

    RSA RSA数字签名算法源于RSA公钥密码算法的思想 xff0c 将RSA公钥密码算法按照数字签名的方式运用 RSA数字签名算法是迄今为止应用最为广泛的数字签名算法 RSA数字签名算法的实现如RSA加密算法一致 RSA数字签名算法主要可分
  • AXI接口协议详解-AXI总线、接口、协议

    转自 xff1a https cloud tencent com developer article 1695010 AXI接口协议详解 AXI总线 接口 协议 AXI 总线 上面介绍了AMBA总线中的两种 xff0c 下面看下我们的主角
  • USB主机是如何检测到设备的插入的呢?

    转自 xff1a https www cnblogs com wangh0802PositiveANDupward archive 2013 05 06 3061241 html USB设备的插入检测机制 首先 xff0c 在USB集线器的
  • 电路图中的那些类似于箭头的是什么意思?

    这个双箭头在画图软件中称为 off connect xff0c 作用是连接一个工程中的两张原理图里网络标号相同的网络 即 xff1a 这张原理图中网络标号为 PCIE20 2 REFCLKP 网络 xff0c 与其他原理图中的网络标号为 P
  • linux的socket CAN驱动介绍

    https blog csdn net linyangspring article details 27186911 在linux中 xff0c CAN总线的驱动有两种实现方式 xff1a 字符设备以及socket can驱动 Socket
  • 一文讲透Linux网络设备驱动框架及编写步骤

    https blog 51cto com u 14592069 5785977 本文阐述了网络架构模型 xff0c 特别是Linux系统中网络子设备框架4层结构 xff0c 反别阐述了各层的作用 重点讲解了sk buff及net devic
  • linux下的项目管理工具make和git的使用

    在linux下我们不能向在windows下这样去快速的进行编译 xff0c 在以前我们都是使用一个命令一个命令地去将 c文件生成程序 xff0c 在这里我们介绍项目自动化辅助构建工具make以及项目版本管理工具git make make说白
  • list_for_each_entry()函数分析

    在Linux内核源码中 xff0c 经常要对链表进行操作 xff0c 其中一个很重要的宏是list for each entry xff1a span class token comment list for each entry iter

随机推荐

  • 电力系统谐波分析

    加粗样式 电力系统谐波分析 一 实验目的 1 了解电力系统谐波信号的特点及分析方法 xff1b 2 综合利用数字信号处理技术实现对电力系统谐波信号的分析 xff1b 3 使学生进一步巩固数字滤波器的基本概念 理论 分析方法和实现方法 xff
  • 电力系统谐波分析代码

    程序清单 xff08 1 xff09 模拟谐波的信号的波形及频谱 fs 61 3000 采样频率 N1 61 256 采样点数 N2 61 1024 n1 61 0 N1 1 t 61 n1 fs x1 61 sin 2 pi t 50 4
  • range() 函数用法

    range 函数可创建一个整数列表 xff0c 一般用在 for 循环中 函数语法 xff1a range start stop step 参数说明 xff1a start 计数从 start 开始 默认是从 0 开始 例如range xf
  • set()函数用法

    python内置函数 文章目录 python内置函数描述set 语法返回值 实例 描述 set xff08 xff09 是集合的一种 set 函数创建一个无序不重复元素集 xff0c 可进行关系测试 xff0c 删除重复数据 xff0c 还
  • pop()函数的用法

    pop 函数用于移除列表中的一个元素 xff08 默认最后一个元素 xff09 xff0c 并且返回该元素的值 语法 xff1a list pop obj 61 list 1 默认为 index 61 1 xff0c 删除最后一个列表值 o
  • python assert()函数

    1 断言函数作用 断言函数是对表达式布尔值的判断 xff0c 要求表达式计算值必须为真 可用于自动调试 如果表达式为假 xff0c 触发异常 xff1b 如果表达式为真 xff0c 不会报错 2 使用assert判断数组是否相等 np ar
  • torch.nn 实现上采样——nn.Upsample

    CLASS torch nn Upsample span class token punctuation span size span class token operator 61 span None span class token a
  • ubuntu用命令行清空回收站的方法

    1 打开Trash span class token builtin class name cd span local share Trash 2 查看Trash里的文件 span class token function ls span
  • ubuntu命令行重启

    重启命令 xff1a 法一 xff1a span class token function reboot span 法二 xff1a span class token function shutdown span r now span cl
  • Linux下的重要目录/proc, /sys, /SElinux, /bin, /usr/lib, /usr/local, /var, /tmp

    今天我们简单的介绍一些linux下面的一些重要文件夹的重用 proc 是个虚拟文件系统 也就是 重新引导后修改会被重新初始化 提供了进程信息 内存资源 硬件设备 内核内存等信息 比如 xff1a 网卡 xff1a proc sys vm i
  • JVM中的堆和栈到底存储了什么?

    以下文章来自 xff1a https www jianshu com p 8a89fb6d839c xff0c 这篇文章涉及多方面知识 xff0c 所以我在有些地方插入了一些更加深入的文章 xff08 方法和函数区别 指针变量 修改引用的值
  • Qt中基于鼠标事件获取界面上坐标—鼠标点击,移动,释放

    Qt中基于鼠标事件获取界面上坐标 鼠标点击 移动 释放 以左上角为坐标原点显示全局像素坐标 以label控件左下角为坐标原点显示鼠标在控件上坐标 加入了像素与经纬度坐标同时显示 程序说明 以左上角为坐标原点显示全局像素坐标 Qt中默认左上角
  • ubuntu下研华工控机CAN卡驱动的安装与测试

    ubuntu下研华工控机CAN卡驱动的安装 0 关于ubuntu系统与内核版本是否需要匹配的问题 1 CAN卡驱动安装 PCI 1680 advSocketCAN V1 0 0 0 2 CAN卡通讯测试 2 1 引脚介绍 2 2 测试程序
  • PCL点云库必备知识点2.1——点云旋转变化pcl::transformPointCloud的使用

    matrix transform02 cpp span class token macro property span class token directive hash span span class token directive k
  • ros必备知识点8:ros之use_sim_time的使用

    这个参数当回放bag数据集是设置为true xff0c 此时说明系统使用的是仿真时间 xff0c 如果设置为false xff0c 则系统使用walltime 此参数可以通过launch文件中设置 xff0c 或者通过节点设置 launch
  • Apollo第二讲—apollo自动驾驶调试及仿真实践

    1 自动驾驶开发流程 1 1 数据分析 使用DreamView调试工具 云实验操作指南 xff08 1 xff09 云实验1 xff1a 使用Dreamview播放离线数据包 Apollo调试工具 1 xff09 内容概述 2 xff09
  • Apollo第五讲——Apollo定位模块

    1 定位的作用 1 xff08 xff09 定位和地图是一对孪生兄弟 获取当前地理位置信息 xff0c 通常在地图中进行记录和表示 提供车辆当前运动状态 xff1a 航向 速度 加速度 角速度等状态信息 xff08 2 xff09 地位的地
  • Apollo专项课——第一讲:交通灯检测

    1 问题引入与本节课重点学习打卡内容 2 Apollo决策功能的设计与实现 交规决策 xff1a 根据路径与红绿灯状态来决定是否生成虚拟墙 路径决策 路径边界 速度决策 planning模块运行流程 场景分类的例子 xff1a 车道跟随 x
  • Apollo最新升级后的感知框架介绍

    Apollo感知框架 1 Apollo视觉感知算法模块流程2 感知框架升级的内容 1 Apollo视觉感知算法模块流程 预处理 神经网络模型的训练 后处理 2 感知框架升级的内容 主要包括三方面 xff0c 如下所示 xff1a xff08
  • 采用u版的pytorchyolo3源码训练自己的数据集

    采用u版的pytorchyolo3源码训练自己的数据集 1 说明 最近一直在研究目标检测这一块的内容 在导师的建议下学习了yolov3目标检测算法 xff0c 想着既然学完了就要跑一边看看是啥样子的说干就干 本文采用的源码为https gi