当前位置: 首页 > news >正文

基于yolo的小球位置实时检测

基于yolo的小球位置实时检测

  1. Yolo安装

操作系统:ubuntu

安装cuda和opencv

git clone https://github.com/pjreddie/darknet.git

cd darknet

修改Makefile文件,使GPU=1,OPENCV=1

make

2. 数据集处理

2.1 制作数据集

将小球放在摄像头前面,截取500张不同位置的图片,如图2-1所示。尽可能的保证图像的清晰度,不要有幻影。

图2-1 制作数据集

2.2 图片名顺序编号

截取500张图片之后,需要将图片从000-499顺序编号,如图2-2所示。

图2-2 图片顺序标号

可以通过如下python程序实现:

#coding:utf-8

import os

path = "./b/"

dirs = os.listdir(path)

print type(dirs)

for i in range(0,500):

    oldname = path + dirs[i]

    newname = path + "%03d"%i +".jpg"

    os.rename(oldname,newname)

图2-3 train.txt文件

2.3 生成train.txt文件

新建文件夹VOCdevkit,在VOCdevkit文件夹下新建三个文件夹Annotation、ImageSets和JPEGImages,并把准备好的自己的原始图像放在JPEGImages文件夹下。在ImageSets文件夹中,新建空文件夹Main,然后把写了训练或测试的图像的名字的文本拷到Main文件夹下,即train.txt文件,如图2-3所示。

可以通过如下python程序实现:

file = open('train.txt','w')

for i in range(0,500):

    file.write(str("%03d"%i)+'\n')

file.close()

2.4 生成xml文件

通过标注工具labelimg来图片进行标注,生成xml文件。Github地址为:https://github.com/tzutalin/labelImg

生成的xml文件保存到Annotation文件夹下,格式如下:

<?xml version="1.0"?>

<annotation>

<folder>JPEGImages</folder>

<filename>000.jpg</filename>

<path>/home/byl/dl/yolo/darknet/scripts/VOCdevkit/BALL2007/JPEGImages/000.jpg</path>

<source>

<database>Unknown</database>

</source>

<size>

<width>800</width>

<height>600</height>

<depth>3</depth>

</size>

<segmented>0</segmented>

<object>

<name>ball</name>

<pose>Unspecified</pose>

<truncated>0</truncated>

<difficult>0</difficult>

<bndbox>

<xmin>330</xmin>

<ymin>38</ymin>

<xmax>357</xmax>

<ymax>65</ymax>

</bndbox>

</object>

</annotation>

2.5 生成txt文件

将VOCdevkit放到scripts目录下,运行voc_label.py文件,会在VOCdevkit文件下生成labels文件夹,000.txt-499.txt会生成在labels文件夹下。格式为:0 0.428125 0.0841666666667 0.03375 0.045。同时,会在scripts文件夹下生成2007_train.txt文件,如图2-4所示。

图2-4 2007_train.txt文件

修改voc_label.py代码如下:

import xml.etree.ElementTree as ET
import pickle
import os
from os import listdir, getcwd
from os.path import join

#sets=[('2012', 'train'), ('2012', 'val'), ('2007', 'train'), ('2007', 'val'), ('2007', 'test')]

#classes = ["aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow", "diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]

sets = [('2007','train')]
classes = ["ball"]

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/BALL%s/Annotations/%s.xml'%(year, image_id))
    out_file = open('VOCdevkit/BALL%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()

for year, image_set in sets:
    if not os.path.exists('VOCdevkit/BALL%s/labels/'%(year)):
        os.makedirs('VOCdevkit/BALL%s/labels/'%(year))
    image_ids = open('VOCdevkit/BALL%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/BALL%s/JPEGImages/%s.jpg\n'
%(wd, year, image_id))
        convert_annotation(year, image_id)
    list_file.close()

3.训练神经网络

3.1 修改tiny-yolo-voc.cfg

修改cfg/tiny-yolo-voc.cfg如下:

[convolutional]  

size=1  

stride=1  

pad=1  

filters=30  //修改最后一层卷积层核参数个数,计算公式是依旧自己数据的类别数filter=num×(classes + coords + 1)=5×(1+4+1)=30  

activation=linear  

  

[region]  

anchors = 1.08,1.19,  3.42,4.41,  6.63,11.38,  9.42,5.11,  16.62,10.52  

bias_match=1  

classes=1  //类别数,本例为1类  

coords=4  

num=5  

softmax=1  

jitter=.2  

rescore=1  

  

object_scale=5  

noobject_scale=1  

class_scale=1  

coord_scale=1  

  

absolute=1  

thresh = .6  

random=1  

3.2 修改voc.names文件

现在检测的类只有一个ball,删除data/voc.names中的内容,写入ball。

3.3 修改voc.data文件

    修改voc.data文件内容如下:

    classes= 1

train  = /home/byl/dl/yolo/darknet/scripts/2007_train.txt

//valid  = /home/byl/dl/yolo/darknet/2007_test.txt

names = data/voc.names

backup = backup

图3-1 训练网络

3.4 训练网络

在darknet目录下,输入./darknet detector train cfg/voc.data cfg/tiny-yolo-voc.cfg,即可开始训练。如图3-1所示。

4.最终结果

4.1 终极模型

对目标进行检测,需要模型文件。模型的好坏直接影响最终的检测见过。对训练log进行分析,来判断模型是否训练到了最佳,如表4-1所示。AVG IOU的值越大,测试结果会越好。表中的0.0,0.1…分别代表AVG IOU 0.0,AVG IOU 0.1…。

训练次数

0.0

0.1

0.2

0.3

0.7

0.8

0.9

47万-53万

1

6

150

1311

185100

127817

1874

53万-55万

1

2

35

362

61803

46824

880

55万-61万

0

7

85

825

178128

147453

3405

61万-63万

0

2

21

185

51183

45038

1149

63万-69万

1

7

82

657

193275

183137

5572

69万-71万

0

0

18

187

63576

64266

2234

118万-121万

0

0

6

84

70550

100660

7199

121万-126万

0

1

18

188

145083

209911

15962

126万-128万

0

0

7

54

42951

59009

4284

128万-133万

0

1

17

181

137936

207057

16287

133万-135万

0

0

6

74

47243

69910

5404

表4-1 训练log分析

通过表可知,大约训练到120万次时,训练结果趋于稳定,不会再有太大的变化。由于数据量太大,训练log和最终训练的模型将会放在TITAN X电脑Ubuntu系统家目录下的项目/01-小球位置实时检测目录下。

4.2 检测结果

用历时三周训练了135万次的模型检测的结果如图4-1所示。还有录制的检测结果的视频、训练数据文件,数据标定文件等均在上节所述文件夹。

 

图4-1 检测结果

 

相关文章:

基于yolo的小球位置实时检测

基于yolo的小球位置实时检测 Yolo安装 操作系统&#xff1a;ubuntu 安装cuda和opencv git clone https://github.com/pjreddie/darknet.git cd darknet 修改Makefile文件&#xff0c;使GPU1&#xff0c;OPENCV1 make 2. 数据集处理 2.1 制作数据集 将小球放在摄像头前…...

【微服务】Elasticsearch数据聚合自动补全数据同步(四)

&#x1f697;Es学习第四站~ &#x1f6a9;Es学习起始站&#xff1a;【微服务】Elasticsearch概述&环境搭建(一) &#x1f6a9;本文已收录至专栏&#xff1a;微服务探索之旅 &#x1f44d;希望您能有所收获 在第二站的学习中&#xff0c;我们已经导入了大量数据到es中&…...

java面试题(十七)spring

2.1 请你说说Spring的核心是什么 参考答案 Spring框架包含众多模块&#xff0c;如Core、Testing、Data Access、Web Servlet等&#xff0c;其中Core是整个Spring框架的核心模块。Core模块提供了IoC容器、AOP功能、数据绑定、类型转换等一系列的基础功能&#xff0c;而这些功能…...

你知道 BI 是什么吗?关于 BI 系统的概述

BI 作为信息化建设中的关键一环&#xff0c;在企业中通常起到承上启下的作用&#xff0c;下能连接打通企业业务系统数据库&#xff0c;将各部门数据分类分级统一储存到数据仓库&#xff0c;简化存储取数流程&#xff0c;减少人力、时间成本&#xff1b;上能提供数据可视化报表…...

git:详解git rebase命令

背景 今天无意中打开 git 官网&#xff0c;发现 git 命令还是很多的&#xff0c;然而我们常用的就那几个&#xff0c;今天来学习一个也不怎么常用的命令 rebase 官网链接 都说学一个东西最好的方式就是读他的 官方文档&#xff0c;这里我读了一遍&#xff0c;把一些核心的地…...

第四章——随机变量的数字特征

文章目录1、数字特征的定义2、数学期望&#xff08;均值&#xff09;2.1、数学期望的定义及性质2.1.1、定义2.1.2、性质2.2、数学期望相关例题2.3、Yg(X)的数学期望2.4、Zg(X,Y)的数学期望2.5、随机变量函数的数学期望例题3、方差3.1、方差的定义与性质3.2、相关例题3.3、切比雪…...

vue2源码阅读理解-响应式数据原理

首先明确&#xff0c;vue2是如何实现响应式的&#xff1f; 通过object.defineProperty观察者模式实现&#xff0c;在创建vue实例的过程中&#xff0c;也就是介于beforecomputed~computed的过程中&#xff0c;会执行如下函数initState export function initState (vm: Componen…...

服务调用分布式session

目录一、nginx动静分离二、服务调用1、创建配置zmall-cart购物车模块2、创建配置zmall-order订单模块3、服务调用三、spring session实战1、什么是Spring Session2、为什么要使用Spring Session3、错误案例展示4、配置spring-session四、二级域名问题五、用户登录一、nginx动静…...

Maven知识点-插件-maven-surefire-plugin简介

Maven本身并不是一个单元测试框架&#xff0c;Java 世界中主流的单元测试框架为JUnit 和TestNG。 Maven 所做的只是在构建执行到特定生命周期阶段的时候&#xff0c;通过插件来执行JUnit或者TestNG的测试用例。 这一插件就是maven-surefire-plugin&#xff0c;可以称之为测试…...

如何借力Alluxio推动大数据产品性能提升与成本优化?

内容简介 随着数字化不断发展&#xff0c;各行各业数据呈现海量增长的趋势。存算分离将存储系统和计算框架拆分为独立的模块&#xff0c;Alluxio作为如今主流云数据编排软件之一&#xff0c;为计算型应用&#xff08;如 Apache Spark、Presto&#xff09;和存储系统&#xff0…...

linux shell脚本被包含是什么意思?.命令和source命令(在脚本中运行脚本,脚本中调用脚本)(脚本包含,父子脚本)

在 shell 编程中&#xff0c;当一个 shell 脚本被另一个 shell 脚本包含&#xff0c;即用 . 或 source 命令包含&#xff0c;则被包含的脚本在当前 shell 进程内执行&#xff0c;并且可以访问当前 shell 进程的环境变量和函数。 此时&#xff0c;$0 代表的是主脚本的名称&#…...

MySQL进阶篇之锁(lock)

05、锁 5.1、概述 1、介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据…...

TMDSEVM6657LS评估板恢复出厂默认状态

TMDSEVM6657LS评估板恢复出厂默认状态 前言 TMDSEVM6657LS评估板特别适用于DSP开发的初学者&#xff0c;但有时候拿到手的开发板几经流转&#xff0c;被别人修改过&#xff0c;也可能自己烧录过程出错&#xff0c;导致开发板的状态未知等原因&#xff0c;需要恢复到出厂默认状…...

聊一聊,我对DDD的关键理解

作者&#xff1a;闵大为 阿里业务平台解决方案团队 当我们在学习DDD的过程中&#xff0c;感觉学而不得的时候&#xff0c;可能会问&#xff1a;我们还要学么&#xff1f;这的确引人深思。本文基于工作经验&#xff0c;尝试谈谈对DDD的一些理解。 一、序 《阿甘正传》中&#xf…...

算法笔记(一)—— 认识复杂度和简单排序算法

时间复杂度是在一个算法流程中&#xff0c;常数操作的数量级指标。&#xff08;最差情况下的算法表现&#xff09; 比较两个算法的优劣&#xff0c;在足够的空间下&#xff0c;看时间复杂度指标&#xff0c;若相同&#xff0c;需要在大数据运行下来判断两个算法的“常数项指标…...

MQ消息中间件常见题及解决办法

目录儿常见MQRocketMQ2、RocketMQ测试可用MQ常见问题1、幂等性问题2、如何保证消息不丢失3、消息积压问题4、事务消息设计分析常见MQ RocketMQ RocketMQ又四部分组成 NameServer 同步Broker服务信息&#xff0c;给消费者和生产者提供可用Broker的服务信息。Broker 消息存储业…...

网关服务限流熔断降级分布式事务

目录一、网关服务限流熔断降级二、Seata--分布式事务1、分布式事务基础①事务②本地事物③分布式事务④分布式事务的场景2、分布式事务解决方案①全局事务②最大努力通知③TCC事务3、Seata介绍4、Seata实现分布式事务控制①案例基本代码&#xff08;异常模拟&#xff09;②启动…...

JVM——7JVM调优实战及常量池详解

Arthas工具的使用 阿里巴巴开源的java诊断工具 下载插件 上传至linux环境 在linux跑起来的java项目&#xff0c;可以用Arthas进行查看 项目上线前的时候没问题&#xff0c;上线了就出问题 &#xff0c;用来查看线上代码 jad 项目名 &#xff1a;反编译线上正在运行的代码 用…...

子串分值【第十一届】【省赛】【A组】

问题描述 对于一个字符串 s&#xff0c;我们定义 s 的分值 f(s) 为 s 中恰好出现一次的字符个数。例如 f("aba")1&#xff0c;f("abc")3, f("aaa")0。 现在给定一个字符串 s[0..n−1]&#xff08;长度为 n&#xff09;&#xff0c;请你计算对于…...

SpringCloud 中 Config、Bus、Stream、Sleuth

文章目录&#x1f68f; 第十三章 分布式配置中心&#x1f6ac; 一、Config 概述&#x1f6ac; 二、Config 快速入门&#x1f6ad; config-server&#xff1a;&#x1f6f9; 1、使用gitee创建远程仓库&#xff0c;上传配置文件&#x1f6f9; 2、导入 config-server 依赖&#x1…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...