Yolov1原理详细解读及实战(二)实战篇

news2024/11/23 21:40:53

在Yolov1原理详细解读及实战(一)理论篇 中,我们对Yolov1网络结构、算法流程、训练及推理原理进行了详细剖析,本章进入实战环节,话不多说,马上开始!

环境

vscode+WSL:Ubuntu 18.04+python 3.9.7

Darknet安装

YOLOv1是Darknet深度学习框架进行训练和推理,首先安装Darknet。

步骤1:安装Darknet

git clone https://github.com/pjreddie/darknet
cd darknet
make -j8

在这里插入图片描述
步骤2:下载Yolov1预训练模型

wget http://pjreddie.com/media/files/yolov1.weights

步骤3:验证是否安装成功

./darknet yolo test cfg/yolov1.cfg yolov1.weights data/kite.jpg

在这里插入图片描述

运行结束后,在darknet目录下打开predictions.jpg即可查看结果。

在这里插入图片描述

模型训练

数据集准备

步骤1:下载VOC数据集。

wget https://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar

解压后的文件结构如下:

└── VOCdevkit     #根目录
    └── VOC2007   #不同年份的数据集,这里只下载了2007
        ├── Annotations        #存放xml文件,与JPEGImages中的图片一一对应,解释图片的内容等等
        ├── ImageSets          #该目录下存放的都是txt文件,txt文件中每一行包含一个图片的名称,末尾会加上±1表示正负样本
        │   ├── Action
        │   ├── Layout
        │   ├── Main           #存放的是分类和检测的数据集分割文件
        │   │   ├── train.txt  #用于训练的图片名称
        │   │   ├── val.txt    #用于验证的图片名称
        │   │   ├── test.txt       #用于测试的图片名称
        │   │   ├── trainval.txt   #train与val的合集
        │   └── Segmentation
        ├── JPEGImages         #存放源图片
        ├── SegmentationClass  #存放的是图片,语义(class)分割相关
        └── SegmentationObject #存放的是图片,实例(object)分割相关

步骤2:将VOC2007格式数据转换为Yolo训练的格式。

Darknet需要的label不是xml格式,而是一张图片对应一个txt的形式,即每个标注框占一行。因此需要将xml格式转为txt格式。代码如下:

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')]

classes = ["bicycle", "boat", "dog", "cat","person"]


def convert(size, box):
    dw = 1./(size[0])
    dh = 1./(size[1])
    x = (box[0] + box[1])/2.0 - 1
    y = (box[2] + box[3])/2.0 - 1
    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('VOCdevkit/VOC%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/VOC%s/labels/%s.txt'%(year, 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()
print(wd)

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

os.system("cat 2007_train.txt 2007_val.txt> train.txt")

运行结束之后,可以看到,生成了labels文件夹和2007_train.txt、2007_val.txt、train.txt。

在这里插入图片描述

labels文件夹中存放了每张图片的标注文件。例如:8 0.585 0.7306666666666667 0.122 0.3413333333333333 。含义如下:

<object-class> <x> <y> <width> <height>

其中,x,y,width和height是指标注框的左上角点坐标及宽高信息。

2007_train.txt、2007_val.txt表示训练集和验证集中图片的路径。代码最后执行 type 2007_train.txt 2007_val.txt > train.txt 将训练集和验证集放在了同一个txt中。

修改源代码并重新编译Darknet

步骤1:修改darknet/src/yolo.c

//改为自己的数据集类别
char *voc_names[] = {"bicycle", "boat", "dog", "cat","person"};
// train_images保存的是上述生成的train.txt
char *train_images = "VOCdevkit/VOC2007/train.txt";
//backup_directory是训练过程中生成的weights权重文件保存的路径
char *backup_directory = "darknet/backup/";

//修改数据集类别数为5(我的是5类)
draw_detections(im, l.side*l.side*l.n, thresh, boxes, probs, voc_names, alphabet, 5);
else if(0==strcmp(argv[2], "demo")) demo(cfg, weights, thresh, cam_index, filename, voc_names, 5, frame_skip, prefix);

步骤2:修改darknet/src/yolo_kernels.cu

# 修改数据集类别数为5(我的是5类)
draw_detections(det, l.side*l.side*l.n, demo_thresh, boxes, probs, voc_names, voc_labels, 5);

步骤3:修改darknet/cfg/yolov1/yolo.cfg

output= 735  //最后一层的全连接层,output=(5×2+classnum(=5))×7×7)
activation=linear

[detection]
classes= 5  //数据集类别

步骤4:重新编译Darknet。

cd darknet
make -j8

在这里插入图片描述

训练模型

步骤1:下载darknet.conv.weights。darknet.conv.weights是卷积网络在分类网络上预训练的权重,在此基础上训练。

wget http://pjreddie.com/media/files/darknet.conv.weights

步骤2:训练。

./darknet yolo train cfg/yolov1/yolo.cfg darknet.conv.weights

一切正常的话,就开始训练了。如图所示。

在这里插入图片描述

测试

./darknet yolo test cfg/yolov1/yolo.cfg backup/yolo_final.weights

然后输入一张图片,测试结果如下:

在这里插入图片描述

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

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

相关文章

wireshark过滤器的使用

目录 wiresharkwireshark的基本使用wireshark过滤器的区别 抓包案例 wireshark wireshark的基本使用 抓包采用 wireshark&#xff0c;提取特征时&#xff0c;要对 session 进行过滤&#xff0c;找到关键的stream&#xff0c;这里总结了 wireshark 过滤的基本语法&#xff0c;…

外卖订餐系统源码:数字化时代餐饮服务的创新之道

在如今快节奏的生活中&#xff0c;外卖订餐系统源码正成为餐饮业界的一股创新浪潮。它为餐厅和创业者提供了一个数字化的平台&#xff0c;使订餐与配送更加便捷、高效。本文将为您展示如何使用外卖订餐系统源码创建一个简单但功能强大的订餐平台。 # 导入必要的模块 import d…

离线竞价功能说明及设置

为了更加方便广大用户不再熬夜竞价&#xff0c;西部数码推出了离线竞价功能&#xff0c;现已正式上线&#xff0c;欢迎大家使用反馈。 1、离线竟价功能说明 当您拥有域名的出价权限时&#xff0c;您可在 【我参与的竞价】或【我出价的域名】列表选中域名开启离线竟价。 设置…

固定资产管理系统都需要考虑哪些问题?

企业管理中固定资产的追踪和管理是非常重要的一环。固定资产不仅包括房屋、土地、机器设备等大量的资产&#xff0c;也包括低值易耗品。因为这些资产往往是企业生产或者管理过程中不可或缺的。在使用和管理过程中&#xff0c;往往涉及到转移、借调、维护等方面。如何进行有效的…

健康安全的新定义,照明舒适达到巅峰,SUKER书客护眼台灯L1震撼发售

深耕照明领域多年的SUKER书客&#xff0c;这一次给大家带来一份大惊喜。在最近正式发布新品——SUKER书客护眼台灯L1&#xff0c;这款护眼台灯承载着在照明领域的前沿技术&#xff0c;能保证照明安全健康和舒适度并带来非常优秀的护眼效果。作为书客在护眼台灯领域的颠覆式新品…

【FaceChain风格DIY手把手教程】无限场景风格LoRA与固定人物LoRA的融合(4Kstar!)

先看效果 以上风格LoRA分别为&#xff1a;户外花园婚纱、冬季雪景汉服、火焰女神、仙侠风 环境准备 在魔搭平台ModelScope 魔搭社区中选择PAI-DSW-GPU环境 进入后打开terminal环境&#xff0c;先检查显存需要20G左右&#xff08;nvidia-smi&#xff09;&#xff0c;然后下载核…

面试题-React(七):React组件通信

在React开发中&#xff0c;组件通信是一个核心概念&#xff0c;它使得不同组件能够协同工作&#xff0c;实现更复杂的交互和数据传递。常见的组件通信方式&#xff1a;父传子和子传父 一、父传子通信方式 父组件向子组件传递数据是React中最常见的一种通信方式。这种方式适用…

什么是可观测性

可观测性是指使用从其组件收集的累积信息来了解系统或应用程序的当前状态&#xff0c;可观测性通常侧重于监视整个系统或应用程序&#xff0c;而不是单独管理元素&#xff0c;完全可观察的环境将深入了解网络堆栈&#xff0c;并始终保持网络基础设施处于最佳工作状态。 什么是…

整数拆分乘积最大

将一个整数拆分为若干个自然数的和&#xff0c;如果要使这些数的乘积最大&#xff0c;应该尽可能的拆分出3。 任意一个数字可以由多个3的n次方的和&#xff08;差&#xff09;表示。 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class M…

k8s的学习篇1

一 k8s的概念 1.1 k8s k8s是一个轻量级的&#xff0c;用于管理容器化应用和服务的平台。通过k8s能够进行应用的自动化部署和扩容缩容。 1.2 k8s核心部分 1.prod: 最小的部署单元&#xff1b;一组容器的集合&#xff1b;共享网络&#xff1b;生命周期是短暂的&#xff1b; …

<C++> 继承

1.继承的概念和定义 继承是面向对象其中的一个核心概念之一&#xff0c;继承允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类或基类&#xff09;继承属性和行为&#xff0c;以便在子类中重用已有的代码并添加新的功能。通过继承&#xff0…

yo!这里是Linux基础开发工具介绍

目录 前言 基础开发工具 yum vim 1.基本介绍 2.基本操作 3.正常模式常用命令 4.底行模式常用命令 gcc/g gdb 1.基本介绍 2.常用操作 make/Makefile 1.背景 2.介绍 3.使用 git 1.介绍 2.操作 进度条程序简单实现 后记 前言 在学完初步的基础指令及权限控…

Spring Boot进阶(60):5种判断线程池任务是否全部完成的方案 | 实用技巧分享!

1. 前言&#x1f525; 多线程编程在现代软件开发中非常常见且重要&#xff0c;而线程池是多线程编程的常用技术。在使用线程池时&#xff0c;通常需要判断线程池中的任务是否全部完成&#xff0c;以便决定程序继续执行的下一步操作。本文将介绍5种判断线程池任务是否全部完成的…

MySQL项目迁移华为GaussDB PG模式指南

文章目录 0. 前言1. 数据库模式选择&#xff08;B/PG&#xff09;2.驱动选择2.1. 使用postgresql驱动2.1. 使用opengaussjdbc驱动 3. 其他考虑因素4. PG模式4.1 MySQL和OpenGauss不兼容的语法处理建议4.2 语法差异 6. 高斯数据库 PG模式JDBC 使用示例验证6. 参考资料 本章节主要…

Java的正则

正则表达式 一个正则表达式&#xff0c;就是用某种模式去匹配字符串的一个公式 正则表达式不是只有java才有&#xff0c;实际上很多编程语言都支持正则表达式进行字符串操作 正则表达式语法 限定选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 元字符(Metacharact…

建议收藏:进销存系统和erp的区别是什么

阅读本文&#xff0c;您可以了解&#xff1a;1、进销存系统是什么&#xff1b;2、erp是什么&#xff1b;3、进销存系统和erp的区别 一、进销存系统是什么 进销存系统&#xff08;Inventory Management System&#xff09;是一种用于跟踪、管理和优化企业库存流动的软件工具或系…

springboot服务端接口外网远程调试,并实现HTTP服务监听

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

汽车电子 -- 笛卡尔坐标系和极坐标系

1.笛卡尔直角坐标系 相较于原点的两条数轴&#xff0c;构成了平面放射坐标系。如两条数轴上的度量单位相等&#xff0c;则称为放射坐标系为笛卡尔坐标系。两条数轴互相垂直的笛卡尔坐标系&#xff0c;称为笛卡尔直角坐标系。 2.极坐标 极坐标是指在平面内由极点、极轴和极径…

重大变动!亚马逊改变佣金规则

1.亚马逊将调整佣金规则 近日&#xff0c;亚马逊在发给卖家的一则邮件中&#xff0c;表示将调整佣金计算方式。根据收到邮件的卖家爆料&#xff0c;该邮件显示&#xff1a;自2023年10月24日起&#xff0c;亚马逊将按照卖家提供的报价计算推荐费&#xff0c;而不是按照消费者支…

数据库访问性能优化

在基于数据库进行业务功能的开发时&#xff0c;如何保证数据库访问的性能是区分普通程序员和高级程序员的分水岭。这里系统的梳理下如何在程序员视角下实现数据库访问性能优化。 本文是面向程序员的数据库访问性能优化法则一文的精简版&#xff0c;有兴趣的同学可以参考下原文。…