YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: 🚀】

针对大尺度图像(如遥感影像、大尺度工业检测图像等),由于设备的限制,无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练,再将训练结果进行还原拼接是解决该问题的普遍思路。YOLT项目([1805.09512] You Only Look Twice: Rapid Multi-Scale Object Detection In Satellite Imagery (arxiv.org))是该思路具体实现,其以改进的YOLOV2作为检测框架,通过重叠裁剪预测处理以及对目标检测框拼接还原结果进行NMS过滤实现大尺度遥感影像的小型目标检测。但在具体方案操作时,本项目作者发现该方法存在以下几点问题:

  1. 无法较好地同时性地解决拼接结果中不同类别物体重叠检测框的精确过滤,尤其是位于图像边缘的不完整物体的检测框,会牺牲一定的检测精度。

  2. 由于裁剪造成图像中的大型物体被分割于数块图像中,存在无法在单张影像中完整捕获物体的缺陷

  3. 所使用的YOLOV2检测框架已经较为落后,已无法满足现在任务场景对检测精度的需求。

因此,本项目以最新的YOLOV8为检测框架,增设多尺度,多信息的预处理模块,捕获大尺度图像的多尺度上下文信息,能够有效识别出大尺度图像的大小型识别物体以及密集型检测目标。另外,此次我们还对对原始NMS算法进行改进,以满足不同类型物体以及重叠框(尤其是位于边缘的检测框)的过滤,实现大尺度影像的精确检测。

项目实战展示

  • 煤渣传送带异常物体检测

在这里插入图片描述

  • 基于InSAR影像的地表沉陷变化监测

在这里插入图片描述

Install

window

1、CPU推理环境配置:

1.1、Pip (recommended)

pip install ultralytics

1.2、conda

conda create -n yoltv8 python=3.9
conda activate yoltv8
conda install ultralytics

2、GPU推理环境配置:

Note:默认已安装配置gpu环境下的pytorch深度学习环境,如未配置,请先进行配置

2.1、Pip(recommended)

pip install ultralytics

2.2、conda

conda create -n yoltv8 python=3.9
conda activate yoltv8
conda install ultralytics

Usage

本项目支持命令行参数,可通过设置命令行参数进行模型推理,请在yoltv8\predict.py下运行,相关命令行参数如下:

[--images_dir IMAGES_DIR] # 所存放照片的文件夹路径, 默认为:yoltv8\dataset\predict\init_images\项目名称
[--outdir_slice_ims OUTDIR_SLICE_IMS] # 图像分割结果路径,无需设置,会自动生成,默认为:yoltv8\dataset\predict\slice_images\项目名称
[--project_name PROJECT_NAME]
# 一次推理任务的项目名称,推理结果的ID,不同任务请不用重复,否则会覆盖结果。
# yolov8原始模型预测结果路径:yoltv8\results\yolov8_detect\项目名称, 自动生成,无需修改
[--im_ext IM_EXT] # 推理文件的后缀名称,如.jpg
[--sliceHeight SLICEHEIGHT] # 图像裁剪高度, 默认1088, 根据具体情况更改
[--sliceWidth SLICEWIDTH] # 图像裁剪宽度. 默认1088
[--overlap OVERLAP] # 图像裁剪重复率,默认0.5,太小会出现无法捕获大型目标的完整检测框
[--slice_sep SLICE_SEP] # 分割结果名称的分隔符号,默认'_'
[--overwrite OVERWRITE]  # 图像裁剪结果已存在时是否重写, 默认Flase
[--out_ext OUT_EXT] # 裁剪结果的后缀名称,默认.png
[--model MODEL] # 模型训练结果文件
[--conf CONF] # 检测对象置信度阈值
[--iou IOU] # NMS的交集联合(IoU)阈值
[--half HALF] # 是否使用半精度(FP16)
[--device DEVICE] # 要运行的设备,即cuda设备=0/1/2/3或设备=cpu
[--show SHOW] # 如果可能,显示结果
[--save SAVE] # 保存带有结果的图像
[--save_txt SAVE_TXT] # 将结果保存为. txt文件
[--save_conf SAVE_CONF] # 使用置信度分数保存结果
[--save_crop SAVE_CROP] # 保存带有结果的裁剪图像
[--hide_labels HIDE_LABELS] # 是否隐藏标签
[--hide_conf HIDE_CONF] # 是否隐藏置信度
[--max_det MAX_DET] # 每张图像的最大检测次数
[--vid_stride VID_STRIDE] # 视频帧率步幅
[--line_width LINE_WIDTH] # 边界框的线宽。如果无,则按图像大小缩放。
[--visualize VISUALIZE] # 可视化模型特征
[--augment AUGMENT] # 将图像增强应用于预测源
[--agnostic_nms AGNOSTIC_NMS] # 与类无关的NMS
[--retina_masks RETINA_MASKS] # 使用高分辨率分割掩码
[--classes CLASSES [CLASSES ...]] # 按类过滤结果,即class=0,或class=[0,2,3]
[--boxes BOXES] # 在分割预测中显示框
[--output_file_dir OUTPUT_FILE_DIR] #  模型预测最后txt结果文件的路径,无需修改,默认为:yoltv8\results\completed_txt\项目名称, txt结果会自动成在此路径下
[--iou_threshold IOU_THRESHOLD] # 回归大图时进行perclassnms的iou阈值,默认为0.01,即,默认同类物体其检测框不应该出现重叠,符合当前任务需求,可根据实际情况修改
[--confidence_threshold CONFIDENCE_THRESHOLD] # 回归大图时进行perclassnms的置信度阈值,默认为0.5
[--area_weight AREA_WEIGHT] # 回归大图时进行perclassnms的置信度与面积的比例权重,默认为5
[--class_labels CLASS_LABELS [CLASS_LABELS ...]] # 类别的标签结果,默认[0, 1, 2, 3, 4, 5]
[--class_names CLASS_NAMES [CLASS_NAMES ...]] # 类别标签对应的名称,默认怕["head", "boxholder", "greendevice", "baseholer", "circledevice", "alldrop"]
[--completed_output_path COMPLETED_OUTPUT_PATH] # 模型预测最后txt结果文件的路径,无需修改,默认为:yoltv8\results\completed_predict\项目名称, 图像结果会自动成在此路径下

本次任务一般仅需要修改以下参数(其他参数可保持默认,请根据实际情况进行设置):

  1. images_dir参数,指定你所存放照片的文件夹路径(注意照片路径,而是存在照片的上级文件夹路径,路径及照片名称中不可出现中文汉字),

    如:–image_dir E:\yoltv8\dataset\predict\init_images, 可将推理照片存放在默认dataset\predict\init_images路径下。

  2. im_ext参数,你所需要进行推理的照片格式,如.jpg、.png等(无需区分大小写,但要注意不要遗忘了 . )。推理时,只会对images_dir下的以im_ext为后缀名的文件进行推理。

  3. model参数,指定模型结果文件的路径,如 --model E:\yoltv8\checkpoint\best.pt,除pt文件外,也支持onnx文件、engine文件等yolov8等官方支持的模型结果文件格式。

命令行启动示例:

   python predict.py --images_dir E:\yoltv8\dataset\predict\init_images --im_ext .jpg --model E:\yoltv8\checkpoint\best.pt

本项目还可直接修改predict.py文件中的命令函参数设置部分,这样就无需再命令行中进行修改,,修改参数信息后直接启动predict.py即可。各参数信息和前文一样。

parser = argparse.ArgumentParser()
parser.add_argument("--images_dir", type=str, default=os.path.join(PROJECT_ROOT, 'dataset', 'predict', 'init_images'))
parser.add_argument("--outdir_slice_ims", type=str, default=os.path.join(PROJECT_ROOT, 'dataset', 'predict', 'slice_images'))
parser.add_argument("--project_name", type=str, default="sensor_detect")
parser.add_argument("--im_ext", type=str, default=".jpg")
parser.add_argument("--sliceHeight", type=int, default=1088)
parser.add_argument("--sliceWidth", type=int, default=1088)
parser.add_argument("--overlap", type=float, default=0.5)
parser.add_argument("--slice_sep", type=str, default="_")
parser.add_argument("--overwrite", type=bool, default=False)
parser.add_argument("--out_ext", type=str, default=".png")
parser.add_argument("--model", type=str, default=r"E:\yoltv8\checkpoint\best.pt")
parser.add_argument("--conf", type=float, default=0.25)  # object confidence threshold for detection
parser.add_argument("--iou", type=float, default=0.7)  # intersection over union (IoU) threshold for NMS
parser.add_argument("--half", type=bool, default=False)  # use FP16 half-precision inference
parser.add_argument("--device", type=str, default=None)  # cuda device, i.e. 0 or 0,1,2,3 or
parser.add_argument("--show", type=bool, default=False)  # show results
parser.add_argument("--save", type=bool, default=True)  # save images with results
parser.add_argument("--save_txt", type=bool, default=True)  # save results"
parser.add_argument("--save_conf", type=bool, default=True)
parser.add_argument("--save_crop", type=bool, default=False)  # save cropped prediction boxes
parser.add_argument("--hide_labels", type=bool, default=False)  # hide labels
parser.add_argument("--hide_conf", type=bool, default=False)
parser.add_argument("--max_det", type=int, default=300)  # maximum detections per image
parser.add_argument("--vid_stride", type=bool, default=False)  # video frame-rate stride
parser.add_argument("--line_width", type=float, default=None)
parser.add_argument("--visualize", type=bool, default=False)
parser.add_argument("--augment", type=bool, default=False)
parser.add_argument("--agnostic_nms", type=bool, default=False)
parser.add_argument("--retina_masks", type=bool, default=False)
parser.add_argument("--classes", type=int, nargs="+", default=None)
parser.add_argument("--boxes", type=bool, default=True)
parser.add_argument("--output_file_dir", type=str, default=os.path.join(PROJECT_ROOT, 'results', 'completed_txt'))
parser.add_argument("--iou_threshold", type=float, default=0.01)
parser.add_argument("--confidence_threshold", type=float, default=0.5)
parser.add_argument("--area_weight", type=float, default=5)
parser.add_argument("--class_labels", type=int, nargs="+", default=[0, 1, 2, 3, 4, 5])
parser.add_argument("--class_names", type=str, nargs="+", default=["head","boxholder","greendevice","baseholer","circledevice","alldrop",])
parser.add_argument("--completed_output_path", type=str, default=os.path.join(PROJECT_ROOT, 'results', 'completed_predict')))

结果路径示例展示(sensor_detect为本次推理的项目名称):

在这里插入图片描述
:多尺度,多信息的预处理模块还未上传,但不影响正常使用,可先增大裁剪尺寸以及重叠率来避免超大物体(无法在单幅影像块中完整给出的物体)的识别不完整。

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

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

相关文章

Matlab隐式方程拟合【案例源码+视频教程】|隐函数拟合|非线性拟合|视频教程

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

OpenHarmony实战开发-Actor并发模型对比内存共享并发模型

内存共享并发模型指多线程同时执行复数任务,这些线程依赖同一内存并且都有权限访问,线程访问内存前需要抢占并锁定内存的使用权,没有抢占到内存的线程需要等待其他线程释放使用权再执行。 Actor并发模型每一个线程都是一个独立Actor&#xf…

synchronized底层原理

1synchronized关键字的底层原理 Monitor 举个例子: 1.线程1执行synchronized代码块,里面用到了lock(对象锁)。首先会让这个lock对象和monitor关联,判断monitor中的owner属性是否为null。如果为null直接获取对象锁。owner只能关联一个线程。 2…

机器学习和深度学习--李宏毅 (笔记与个人理解)Day 16

Day 16 deep Learning – 鱼与熊掌兼得 最近在减重, 昨天跑了个一公里,然后今天上午又打了个篮球,真是老胳膊老腿了,运动完给我困得不行 Review 见前面的笔记 这里说dl 会提供一个足够大的模型, 来使得Dall loss 足够小…

ASP.NET基于Ajax+Lucene构建搜索引擎的设计和实现

摘 要 通过搜索引擎从互联网上获取有用信息已经成为人们生活的重要组成部分,Lucene是构建搜索引擎的其中一种方式。搜索引擎系统是在.Net平台上用C#开发的,数据库是MSSQL Server 2000。主要完成的功能有:用爬虫抓取网页;获取有效…

java:特殊文件(properties,xml)和日志

特殊文件 txt(文本文件) txt文件是一种纯文本文件,用于存储文本信息 优缺点:txt文件简单易用,可以使用任何文本编辑器打开和编辑,但不支持数据类型和结构,所有信息均用纯文本形式保存 适合简单的配置信息存储 properties文件 properties文件是一种键值对文件,用于存储配置…

【Linux】账号和权限管理

目录 一、用户账号与组账号 二、添加用户账号-useradd 三、修改用户账号的属性-usermod 四、更改用户命令-passwd 五、删除用户账号-userdel 六、添加组账号-groupadd 七、添加删除组成员-gpasswd 八、删除组账号-groupdel 九、查询账号信息-groups、id、finger、w、w…

分享一款免费阅读的软件:Legado,已免费开源(文末有福利)

对于喜欢阅读的人来说,一定经历过从一本厚厚的修仙书籍到MP3、MP4的阅读时代,再到现今的手机软件。 但是现在的阅读软件经常会遇见以下问题:比如广告弹窗太多,排版乱,甚至很多的APP都进入会员时代,再加上一…

28、链表-两数相加

思路: 有几个方面需要考虑 双指针遍历,如果出现和大于10那么向前进1如果长度不一样那么长的部分直接落下并且考虑进1 的问题 代码如下: class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {if (l1null||l2null){…

鸿蒙端云一体化开发--开发云函数--适合小白体制

开发云函数 那什么是云函数?我们将来又怎么去使用这个云函数呢? 答:我们之前要编写一些服务端的业务逻辑代码,那现在,在这种端云一体化的开发模式下,我们是把服务端的业务逻辑代码,通过云函数来…

NVM下载和安装NodeJS教程

nvm文档手册 - nvm是一个nodejs版本管理工具 - nvm中文网 官网下载nvm,选择版本 打开nvm文件夹下的settings.txt文件,在最后添加以下代码: node_mirror: https://npm.taobao.org/mirrors/node/ npm_mirror: https://npm.taobao.org/mirrors…

973: 统计利用先序遍历创建的二叉树叶结点的个数

解法&#xff1a; #include<iostream> #include<queue> using namespace std; // 定义二叉树结点 struct TreeNode {char val;TreeNode* left;TreeNode* right;TreeNode(char x) :val(x), left(NULL), right(NULL) {}; }; // 先序递归遍历建立二叉树 TreeNode* bu…