改进的yolo交通标志tt100k数据集目标检测(代码+原理+毕设可用)

YOLO TT100K: 基于YOLO训练的交通标志检测模型

在这里插入图片描述

在原始代码基础上:
  1. 修改数据加载类,支持CoCo格式(使用cocoapi);
  2. 修改数据增强;
  3. validation增加mAP计算;
  4. 修改anchor;

注: 实验开启weight_decay或是 不对conv层和FC层的bias参数,以及BN层的参数进行权重衰减,mAP下降很大,mAP@[.5:.95]=0.244

训练集

[Tsinghua-Tencent 100K]

下载的训练集主要包含train和test两部分,分别为6107和3073张图片。统计标注文件,共221类。详细统计每类标志个数,发现很多类的数量为0,所以清楚了部分数量为0的label,剩下类别为151,其中仍存在很多类数量<5.

TT100k转为CoCo格式:

  • 交通标志类别:
    数据集中包含数百种不同类型的交通标志实例,例如停止标志、限速标志、方向指示标志等。截至某个时间点,数据集有超过232种不同的交通标志类别,这意味着每种类别都有一定数量的样本图片用于训练和测试模型。
  • i2r类别: 这个类别涉及图像到文本的匹配任务,提供一张图像及五个候选文字描述,目标是确定哪一描述最准确地匹配该图像的内容。
  • i2 类别: 这个类别代表图像到图像的匹配,给定两张图像,判断这两张图像是否描述的是同一场景或物体,适用于图像检索和匹配任务。
  • Other 类别: 可能包括不属于上述特定任务的其他类型的数据,或者是为了填充和扩充数据集而添加的样本 参考 [yolo-v3脚本]

python scripts/tt100k2coco.py

测试

pretrained model
密码: lcou

下载到model_data,运行:python predict.py

结果

在这里插入图片描述

mAP of yolo

对比yolov3:

在这里插入图片描述

如上,mAP不高,分析原因,可能如下:

  1. 数据集分辨率2048x2048,yolov4输入为608,且交通标志中存在很多小物体,原图resize到608,很多目标太小难以检测;
  2. 某些类别数量过少;

可优化:

  1. 借鉴YOLT方法检测小物体;
  2. 数据集扩充/增强;
  3. 使用更优秀的检测方法;
  4. 改进loss,解决类别不均衡可参考

主要代码

# ----------------------------------------------------#
#   对视频中的predict.py进行了修改,
#   将单张图片预测、摄像头检测和FPS测试功能
#   整合到了一个py文件中,通过指定mode进行模式的修改。
# ----------------------------------------------------#
import timeimport cv2
import numpy as np
from PIL import Imagefrom yolo import YOLOif __name__ == "__main__":yolo = YOLO()# -------------------------------------------------------------------------##   mode用于指定测试的模式:#   'predict'表示单张图片预测#   'video'表示视频检测#   'fps'表示测试fps# -------------------------------------------------------------------------#mode = "predict"# -------------------------------------------------------------------------##   video_path用于指定视频的路径,当video_path=0时表示检测摄像头#   video_save_path表示视频保存的路径,当video_save_path=""时表示不保存#   video_fps用于保存的视频的fps#   video_path、video_save_path和video_fps仅在mode='video'时有效#   保存视频时需要ctrl+c退出才会完成完整的保存步骤,不可直接结束程序。# -------------------------------------------------------------------------#video_path = 0video_save_path = ""video_fps = 25.0if mode == "predict":'''1、该代码无法直接进行批量预测,如果想要批量预测,可以利用os.listdir()遍历文件夹,利用Image.open打开图片文件进行预测。具体流程可以参考get_dr_txt.py,在get_dr_txt.py即实现了遍历还实现了目标信息的保存。2、如果想要进行检测完的图片的保存,利用r_image.save("img.jpg")即可保存,直接在predict.py里进行修改即可。 3、如果想要获得预测框的坐标,可以进入yolo.detect_image函数,在绘图部分读取top,left,bottom,right这四个值。4、如果想要利用预测框截取下目标,可以进入yolo.detect_image函数,在绘图部分利用获取到的top,left,bottom,right这四个值在原图上利用矩阵的方式进行截取。5、如果想要在预测图上写额外的字,比如检测到的特定目标的数量,可以进入yolo.detect_image函数,在绘图部分对predicted_class进行判断,比如判断if predicted_class == 'car': 即可判断当前目标是否为车,然后记录数量即可。利用draw.text即可写字。'''while True:img = input('Input image filename:')try:image = Image.open(img)except:print('Open Error! Try again!')continueelse:r_image = yolo.detect_image(image)r_image.save(img.split("/")[-1])r_image.show()elif mode == "video":capture = cv2.VideoCapture(video_path)if video_save_path != "":fourcc = cv2.VideoWriter_fourcc(*'XVID')size = (int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)))out = cv2.VideoWriter(video_save_path, fourcc, video_fps, size)fps = 0.0while (True):t1 = time.time()# 读取某一帧ref, frame = capture.read()# 格式转变,BGRtoRGBframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 转变成Imageframe = Image.fromarray(np.uint8(frame))# 进行检测frame = np.array(yolo.detect_image(frame))# RGBtoBGR满足opencv显示格式frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)fps = (fps + (1. / (time.time() - t1))) / 2print("fps= %.2f" % (fps))frame = cv2.putText(frame, "fps= %.2f" % (fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)cv2.imshow("video", frame)c = cv2.waitKey(1) & 0xffif video_save_path != "":out.write(frame)if c == 27:capture.release()breakcapture.release()out.release()cv2.destroyAllWindows()elif mode == "fps":test_interval = 100img = Image.open('img/street.jpg')tact_time = yolo.get_FPS(img, test_interval)print(str(tact_time) + ' seconds, ' + str(1 / tact_time) + 'FPS, @batch_size 1')else:raise AssertionError("Please specify the correct mode: 'predict', 'video' or 'fps'.")

最后,计算机视觉、图像处理、毕业辅导、作业帮助、代码获取,私聊会回复!↓↓↓↓↓↓

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

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

相关文章

YOLOv9 最简训练教学!

一、代码及论文链接&#xff1a; 代码链接&#xff1a;GitHub - WongKinYiu/yolov9: Implementation of paper - YOLOv9: Learning What You Want to Learn Using Programmable Gradient Information 论文链接&#xff1a;https://arxiv.org/abs/2402.13616 二、使用步骤 1…

淘宝商品数据爬取商品信息采集数据分析API接口详细步骤展示(含测试链接)

01 数据采集 数据采集是数据可视化分析的第一步&#xff0c;也是最基础的一步&#xff0c;数据采集的数量和质量越高&#xff0c;后面分析的准确的也就越高&#xff0c;我们来看一下淘宝网的数据该如何爬取。点此获取淘宝API测试key&密钥 淘宝网站是一个动态加载的网站&a…

前端css、js、bootstrap、vue2.x、ajax查漏补缺(1)

学到的总是忘&#xff0c;遇到了就随手过来补一下 1.【JS】innerHTML innerHTML属性允许更改HTML元素的内容可以解析HTML标签 2.【CSS】display: none 设置元素不可见&#xff0c;不占空间&#xff0c;约等于将元素删除一样&#xff0c;只是源代码还存在 3.【CSS】行内样式 4.【…

工作微信统一管理(还带监管功能)

1.会话页面(可统一管理多个微信号、聚合聊天、手动搜索添加好友、通过验证请求、查看好友的朋友圈等) 2.聊天历史(可查看 所有聊天记录&#xff0c;包括手机.上撤回、删除的消息) 3.群发助手(可以一 -次群发多个好友和群&#xff0c;还可以选择定时发送&#xff0c;目前还在内测…

PlantUML简介

PlantUML简介 plantUML是一款开源的UML图绘制工具&#xff0c;支持通过文本来生成图形&#xff0c;使用起来非常高效。可以支持时序图、类图、对象图、活动图、思维导图等图形的绘制。你可以在IDEA中安装插件来使用PlantUML, 或者在Visual Studio Code中安装插件。 也可以在dra…

数据库|三地五中心,TiDB POC最佳实践探索!

目录 一、POC测试背景 //测试环境信息 二、流量单元化控制 //需求 //解决方案 三、跨城获取TSO的影响与探索 //问题描述与初步分析 //优化方案 四、灾难恢复与流量切流 //需求 //pd leader 切换 //region leader t切换 五、写在最后 一、POC测试背景 在某地震多发省…

sylar高性能服务器-日志(P43-P48)内容记录

文章目录 P43&#xff1a;Hook01一、HOOK定义接口函数指针获取接口原始地址 二、测试 P44-P48&#xff1a;Hook02-06一、hook实现基础二、class FdCtx成员变量构造函数initsetTimeoutgetTimeout 三、class FdManager成员变量构造函数get&#xff08;获取/创建文件句柄类&#x…

mongoDB 优化(1)索引

1、创建复合索引&#xff08;多字段&#xff09; db.collection_test1.createIndex({deletedVersion: 1,param: 1,qrYearMonth: 1},{name: "deletedVersion_1_param_1_qrYearMonth_1",background: true} ); 2、新增索引前&#xff1a; 执行查询&#xff1a; mb.r…

火灾安全护航:火灾监测报警摄像机助力建筑安全

火灾是建筑安全中最常见也最具破坏力的灾难之一&#xff0c;为了及时发现火灾、减少火灾造成的损失&#xff0c;火灾监测报警摄像机应运而生&#xff0c;成为建筑防火安全的重要技术装备。 火灾监测报警摄像机采用高清晰度摄像头和智能识别系统&#xff0c;能够全天候监测建筑内…

TDengine 研发分享:利用 Windbg 解决内存泄漏问题的实践和经验

内存泄漏是一种常见的问题&#xff0c;它会导致程序的内存占用逐渐增加&#xff0c;最终导致系统资源耗尽或程序崩溃。AddressSanitizer (ASan) 和 Valgrind 是很好的内存检测工具&#xff0c;TDengine 的 CI 过程就使用了 ASan 。不过这次内存泄漏问题发生在 Windows 下&#…

JVM的深入理解

1、JVM&#xff08;Java虚拟机&#xff09;&#xff1a;我们java编译时候&#xff0c;下通过把avac把.java文件转换成.class文件&#xff08;字节码文件&#xff09;&#xff0c;之后我们通过jvm把字节码文件转换成对应的cpu能识别的机器指令&#xff08;翻译官角色&#xff09…

【小沐学QT】QT学习之信号槽使用

文章目录 1、简介2、代码实现2.1 界面菜单“转到槽”方法2.2 界面信号槽编辑器方法2.3 QT4.0的绑定方法2.4 QT5.0之后的绑定方法2.5 C11的方法2.6 lamda表达式方法 结语 1、简介 在GUI编程中&#xff0c;当我们更改一个小部件时&#xff0c;我们通常希望通知另一个小程序。更普…

JavaScript的书写方式

JavaScript的书写方式 目前较为流行的是第二种和第三种&#xff0c;第一种很少见。在第二种和第三种推荐使用第三种&#xff0c;因为在日常开发/工作中&#xff0c;第三种是最为常见的 1.行内式 把JS代码嵌入到html元素内部 示例代码 运行效果 由于JS中字符串常量可以使用单引…

搜维尔科技:CATIA为建筑、基础设施和城市规划提供虚拟孪生力量

超越传统项目交付方法限制的协作 复杂建筑和基础设施项目开发的设计和工程流程需要多个利益相关者和所有项目阶段的密切合作。此外&#xff0c;日益复杂的施工项目要求所有团队都依赖 CATIA 和3D EXPERIENCE 虚拟孪生技术作为“通用语言”&#xff0c;以促进协作并减少阶段之间…

K8S(kubernetes) 部署运用方式汇总

k8s 部署运用这边汇总两类&#xff0c;第一种是命令版本。第二种是文本版本&#xff0c;通过创建yaml文件方式。 此次目标&#xff1a;通过k8s创建nginx,端口80并且可以被外网访问。 kubectl get namespaces 一、创建命名空间 首先创建一个命名空间&#xff0c;有了命名空间后…

paimon表读优化-Read-optimized Table

目录 概述实践文档测试 结束 概述 paimon 版本 : 0.7 测试目标: 类似 hudi ro 表 实践 文档 Read-optimized Table 测试 0: jdbc:hive2://10.32.36.142:10009/> select * from trace_log_refdes_hive_ro$ro limit 10;24/02/28 14:24:33 INFO ExecuteStatement: Execu…

获取tensorflow lite模型指定中间层的输出

以mobilenet v2为例子&#xff0c;我已经训练好了模型&#xff0c;有tflite格式和onnx格式两种模型的权重文件&#xff0c;我想获取tflite模型在推理阶段neck部分的输出。 查看onnx模型得到neck最后一层位置 使用netron查看onnx模型结构 从name中能知道Reshape是neck的最后一…

微信小程序固定头部-CSS实现

效果图 代码逻辑&#xff1a;设置头部的高度&#xff0c;浮动固定后&#xff0c;再加个这个高度的大小的外边距 .weui-navigation-bar {position: fixed;top: 0px;left: 0px;right: 0px;height:90px; } .weui-navigation-bar_bottom{height:90px; }

SpringCloud 基本概念

开篇 学习springcloud的前提我已经认为你已经具备&#xff1a; 微服务的基本概念具备springboot的基本用法 eurake server:注册中心,对标zookeeper eurake client:服务,对标dubbo ribbon:负载均衡,对标nginx feign:与ribbon类似,目前项目没有使用,暂时就不写 hystrix:断路…

双指令集成一体控制比例放大器

双指令独立输入比例放大器是一种能够接收两个独立指令输入来控制两个比例电磁铁的比例阀放大器。 该类放大器可以同时控制两个单电磁铁比例阀&#xff0c;每一组都可以根据不同的指令输入进行独立操作。 它通常兼容多种类型的指令输入&#xff0c;如0-10V、0-5V以及4-20mA等&…