自动驾驶目标检测项目实战(一)—基于深度学习框架yolov的交通标志检测

news2025/1/17 3:49:36

自动驾驶目标检测项目实战——基于深度学习框架yolov的交通标志检测

目前目标检测算法有很多,流行的就有faster-rnn和yolov,本文使用了几年前的yolov3框架进行训练,效果还是很好,当然也可以使用更高版本的Yolov进行实战。本代码使用的是keras框架,pytorch的yolov如何对数据集进行训练,可以参考我之前的文章:
工业缺陷检测项目实战(二)——基于深度学习框架yolov5的钢铁表面缺陷检测

跑工程的原理步骤都是一样的,都可以学习。

数据集准备

使用gtsrb交通标志数据集,下载链接:
https://www.kaggle.com/datasets/meowmeowmeowmeowmeow/gtsrb-german-traffic-sign
https://aistudio.baidu.com/aistudio/datasetdetail/97069
以上两个链接都可以下载,文件夹里面是这样:
在这里插入图片描述
Meta没什么用,主要是Test和Train,Test作为验证集使用。

基础代码准备

本工程基于开源代码进行修改:
https://github.com/miemie2013/Keras-DIOU-YOLOv3

环境

tensorflow==1.15.1
keras==2.3.1

其他看着来,缺什么pip install什么。

使用步骤

1.将数据集放在工程文件夹
在这里插入图片描述
2.生成train和test的txt文件
我这里写了一个csv转txt的代码:
在这里插入图片描述
代码如下:

import numpy as np
import pickle
import re
import os
from PIL import Image


# Create raw data pickle file
data_raw = {}
class_list = []
box_coords_list = []
image_file_list = []

with open('GTSRB/Test.csv', 'r') as f:
	next(f) # skip header line
	for line in f:  # 遍历每一行
		line = line[:-1]  # 去掉换行符
		fields = line.split(',')
		image_file = fields[7]
		class_list.append(int(fields[6]))
		image_file_list.append(image_file)
		# Find box coordinates for all signs in this image
		box_coords = np.array([int(x) for x in fields[2:6]])

		box_coords_list.append(box_coords)


# 写入txt内容
with open("GTSRB/val.txt", 'w+', encoding='utf-8') as f:
	for i in range(len(box_coords_list)):
		box_coord = ""
		box_coord += str(box_coords_list[i][0]) + ','
		box_coord += str(box_coords_list[i][1]) + ','
		box_coord += str(box_coords_list[i][2]) + ','
		box_coord += str(box_coords_list[i][3])
		d = image_file_list[i] + ' ' + box_coord + ',' + str(class_list[i])
		f.write(d + '\n')

路径根据自己的去修改即可。生成的txt放在annotation文件夹下。
在这里插入图片描述
txt文件格式如下:

xxx/xxx.jpg 18.19,6.32,424.13,421.83,20 323.86,2.65,640.0,421.94,20 
xxx/xxx.jpg 48,240,195,371,11 8,12,352,498,14
# image_path x_min, y_min, x_max, y_max, class_id  x_min, y_min ,..., class_id 
# make sure that x_max < width and y_max < height

3.生成标签的类别txt文件
在data文件夹下,生成txt的文件来表示类名:
在这里插入图片描述
比如这里有43个类,则我们可以先用数字字符表示,等检测完再转回对于的类名:
在这里插入图片描述
一行表示一个类名,注意此处类名不能有空格,比如以下是错误的例子:
在这里插入图片描述
每一行都存在空格,这样在计算mAP的时候会报错。

数据已准备完毕。

4.修改文件路径
主要是修改train.py文件里面的这三个路径:
在这里插入图片描述
5.训练
运行

python train.py

在这里插入图片描述

6.注意
引用github源码大佬的话:

(1)本仓库有pattern=0、pattern=1、pattern=2这3种训练模式。 0-从头训练,1-读取model_body继续训练(包括解冻,但需要先运行1_lambda2model.py脚本取得model_body),2-读取coco预训练模型训练 你只需要修改pattern的值即可指定训练模式。 然后在这3种模式的if-else分支下,你再指定批大小batch_size、学习率lr等超参数。

(2)如果你决定从头训练一个模型(即pattern=0),而且你的显卡显存比较小,比如说只有6G。 又或者说你想训练一个小模型,因为你的数据集比较小。 那么你可以设置initial_filters为一个比较小的值,比如说8。 initial_filters会影响到后面的卷积层的卷积核个数(除了最后面3个卷积层的卷积核个数不受影响)。 yolov3的initial_filters默认是32,你调小initial_filters会使得模型变小,运算量减少,适合在小数据集上训练。

7.训练完之后,可以得到以下h5文件:
在这里插入图片描述
运行

python 1_lambda2model.py

将训练模型中yolov3的所有部分提取出来。我这里得到aaaa_bgr.h5
在这里插入图片描述
8.mAP评估
运行evaluate_kr.py对keras模型(1_lambda2model.py提取出来的模型)评估,跑完这个脚本后需要再跑mAP/main.py进行mAP的计算。计算完之后会保持结果图:
在这里插入图片描述
在这里插入图片描述

9.测试
在images/test里面放置要检测的图片:
在这里插入图片描述
运行

python demo_kr.py

比如识别:
在这里插入图片描述
识别结果:
在这里插入图片描述
在这里插入图片描述

另外,我添加了绘制acc和loss的曲线图,也对过滤了识别分数地的框。

需要整体代码的可私信我

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

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

相关文章

分布式事务之TCC与SAGA

分布式事务之TCC与SAGA 在《关于分布式事务的理解》&#xff0c;介绍了可靠消息队列的实现原理&#xff0c;虽然它也能保证最终的结果是相对可靠的&#xff0c;过程也足够简单&#xff08;相对于 TCC 来说&#xff09;&#xff0c;但现在你已经知道&#xff0c;可靠消息队列的…

从零起步认识XAML

新建WPF项目 在Visual Studio 2022中&#xff0c;选择"创建新项目" 选择“WPF Application” 点击下一步 点击创建。 执行DebugStart Debugging菜单命令&#xff0c;或者快捷键为F5&#xff0c;或者工具栏上的图标。 在Solution Explorer窗口&#xff08;ViewSoluti…

smardaten应用商超 | 邀您沉浸式体验企业级无代码开发

宝子们&#xff0c;还在发愁登录smardaten后缺少模板和数据吗&#xff1f;从0到1构建完整应用费时费力&#xff1f;别急&#xff0c;一大波模板资源已经装上车&#xff0c;这就给你安排上&#xff01;【smardaten应用商超】基于数睿数据长期服务软件企业、大型客户的经验&#…

Redis实现服务注册与服务发现源码阅读(Go语言)

Redis实现服务注册与服务发现源码阅读 背景 近期在看开源项目CloudWeGo中看到目前GoLang微服务框架Hertz中支持通过Redis实现服务注册与服务发现功能。便想着阅读下源码 源码阅读 gut clone了hertz-contrib后看到在一级目录下有目前各种主流的服务注册与发现的实现方案。为…

【数据结构初阶】二叉树顺序结构:堆的实现

前言 前边077带着大家学习了树与二叉树的相关概念&#xff0c;这篇文章我们来实现一个二叉树的顺序结构。 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的&#xff0c;因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉…

SQL注入基础入门篇 注入思路及常见的SQL注入类型总结

SQL注入基础入门篇1. SQL注入的概念1.1 什么是SQL注入&#xff1f;1.2 注入过程1.3 SQL注入的分类2. 注入思路3. 第一次注入3.1 寻找注入点3.2 构造攻击语句3.2.1 数据出在哪里&#xff1f;3.2.2 怎么有序的获取核心数据&#xff1f;3.2.2.1 基础信息查询3.2.2.2 表名&#xff…

TCP三次握手与四次挥手(一次明白)

TCP基本信息 默认端口号:80 LINUX中TIME_WAIT的默认时间是30s TCP三次握手 三次握手过程:每行代表发起握手到另一方刚刚收到数据包时的状态 客户端服务端客户端状态服务端状态握手前CLOSELISTEN客户端发送带有SYN标志的数据包到服务端一次握手SYN_SENDLISTEN二次握手服务端发送…

Java项目(一些注解、依赖

文章目录常用的几个注解DataAllArgsConstructorNoArgsConstructorSetterGetterEqualsAndHashCodeLog4j/Slf4jMYBatis-Plus常用注解TableNameTableIdTableFieldTableLogicMapperMapperMapperScanpom.xml中加入依赖创建项目常用的几个注解 Data 注在类上&#xff0c;提供类的ge…

cv2.addWeighted 操作 np.array 踩坑记录

cv2.addWeighted函数是把两张图片img1, img2达到融合的效果&#xff0c; 看官网的解释&#xff0c;下图中f0和f1代表两张图片&#xff0c; 用法是这样的 import cv2alpha 0.6 beta (1.0 - alpha)src1 cv2.imread("img1.jpg") src2 cv2.imread("img2.jpg&q…

MQ-2烟雾传感器模块功能实现(STM32)

认识MQ-2模块与其工作原理 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半导体。当处于200~300摄氏度时&#xff0c;二氧化锡吸附空气中的氧&#xff0c;形成氧的负离子吸附&#xff0c;使半导体中的电子密度减少&#xff0c;从而使其电阻值增加。…

【C语言复习】C语言中的数组与指针

数组与指针复习写在前面数组和指针指针基础概念进阶知识指针的分类指针和数组笔试题写在前面 数组和指针小节&#xff0c;主要分为以下关键点&#xff1a; 常见指针分类&#xff0c;如指针数组、数组指针、函数指针等。什么是数组/ 指针有关数组和指针的题目数组传参 我们也…

写字楼/园区/购物中心空置率太高?快用快鲸智慧楼宇系统

客户租不租你的写字楼&#xff0c;事关区位、交通、环境、价格、面积、装修等诸多因素&#xff0c;但很多招商部对这些影响客户决策的数据并不重视&#xff0c;在客户初次上门看房时仅简单记录姓名、联系方式、需求面积&#xff0c;对其他核心数据熟视无睹&#xff0c;也为日后…

第十三届蓝桥杯

这里写目录标题一、刷题统计&#xff08;ceil函数返回的是等值于某最小整数的浮点值&#xff0c;不强制转换回int就wa&#xff0c;没错就连和int整数相加都wa二、修剪灌木&#xff08;主要应看清楚会调转方向三、统计子矩阵&#xff08;前缀和滑动窗口⭐&#xff09;四、[积木画…

【算法】笔记:LeetCode 206. 反转链表

文章目录前言思考问题&#xff1a;把分开的节点连在一起结合原题&#xff1a;使用[迭代]解决卡点引入新指针边界条件代码反转的逻辑代码&#xff08;完整答案&#xff09;结合原题&#xff1a;使用[递归]解决卡点完整代码问题的子问题当前层要干什么递归出口前言 这道题可以拆…

冰箱压缩机 方案

压缩机是制冷系统的心脏&#xff0c;它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为制冷循环提供动力&#xff0c;从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…

C#开发的OpenRA的游戏主界面怎么样创建

通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存, 但是这些数据怎么显示出来,又是没有定义的。比如前面定义了多个界面的布局, 又是怎么样知道需要显示哪一个界面? 现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的, 所以我们需要从yaml…

水果FLStudio21.0.0中文版全能数字音乐工作站DAW

FL Studio 21.0.0官方中文版重磅发布纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01;Mac版新增对苹果M2/1家族芯片原生支持。编曲、剪辑、录音、混音&#xff0c;20余年的技术积淀和实力研发&#xff0c;FL Studio 已经从电音…

【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

文章目录前言移除链表元素相交链表写在最后前言 本章的OJ练习也是相对简单的&#xff0c;只要能够理解解题的思路&#xff0c;并且依照这个思路能够快速的写出代码&#xff0c;我相信&#xff0c;你的链表水平已经足够了。 对于OJ练习&#xff08;2&#xff09; : ->传送门…

不平凡的一天——

作者&#xff1a;指针不指南吗 专栏&#xff1a;个人日常记录 &#x1f43e;或许会很慢&#xff0c;但是不可以停下来&#x1f43e; 文章目录1.自我介绍2.上学期3.不凡的一天4.新学期写个博客&#xff0c;简单记录一下&#xff0c;新学期加油&#xff01;&#xff01;&#xff…

day7 同步互斥

作业 1.将一个文件中的数据打印到终端上类似cat一个文件&#xff0c;要求如下 &#xff08;1&#xff09;a线程读取文件中的数据 &#xff08;2&#xff09;B线程将A线程读取到的数据打印到终端上 &#xff08;3&#xff09;文件打印完毕后&#xff0c;结束进程 方法1&#…