IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> yolov5检测小目标 -> 正文阅读

[人工智能]yolov5检测小目标

yolov5小目标检测(图像切割法)

前言

yolov5大家都熟悉,通用性很强,但针对一些小目标检测的效果很差。
YOLOv5算法在训练模型的过程中,默认设置的图片大小为640x640像素(img-size),为了检测小目标时,如果只是简单地将img-size改为4000*4000大小,那么所需要的内存会变得非常之大,几乎没有可行性。
以下是对6k * 4k的图片,进行小目标检测训练结果,八张图一个字:烂
在这里插入图片描述
数据集(路面标志):
在这里插入图片描述

图像切割

最简单的方法就是把这个大图片切割成小图片,参考开源框架SAHI[1]
几个问题:

1、简单切割,要保证切割后每张图片大小一致;
2、切割过程难免会切掉目标,需要设置“融合”区域;
3、切割后的数据集是小图片的数据集,那么同样,目标检测的时候也只能检测小图片。那就要对检测之后的小图片做合并处理。(麻烦)

1、图像切割

大体结构图:
其中蓝绿色是切割后的4*4=16张子图,红蓝框的部分是融合图,混合比例0.2
在这里插入图片描述

这个简单,参考博客python切割图片,用opencv切割就行,注意同时要切割好融合部分的图片。

# 融合部分图片
def img_mix(img, row_height, col_width, save_path, file):
    mix_num = 3
    # 每行的高度和每列的宽度

    # 分割成4*4就是有
    # 4*3个行融合区域
    # 3*4个列融合区域
    # 一行的融合
    row = 0
    for i in range(mix_num + 1):
        mix_height_start = i * row_height
        mix_height_end = (i + 1) * row_height
        for j in range(mix_num):
            mix_row_path = save_path + '/' + file + '_mix_row_' + str(row) + '.jpg'
            mix_row_start = int(j * col_width + col_width * (1 - mix_percent))
            mix_row_end = int(mix_row_start + col_width * mix_percent * 2)
            # print(mix_height_start, mix_height_end, mix_row_start, mix_row_end)
            mix_row_img = img[mix_height_start:mix_height_end, mix_row_start:mix_row_end]
            cv2.imwrite(mix_row_path, mix_row_img)
            row += 1

    col = 0
    # 一列的融合
    for i in range(mix_num):
        mix_col_start = int(i * row_height + row_height * (1 - mix_percent))
        mix_col_end = int(mix_col_start + row_height * mix_percent * 2)
        for j in range(mix_num + 1):
            mix_col_path = save_path + '/' + file + '_mix_col_' + str(col) + '.jpg'
            mix_width_start = j * col_width
            mix_width_end = (j + 1) * col_width
            # print(mix_col_start, mix_col_end, mix_width_start, mix_width_end)
            mix_col_img = img[mix_col_start:mix_col_end, mix_width_start:mix_width_end]
            cv2.imwrite(mix_col_path, mix_col_img)
            col += 1

2、目标检测

没啥好说的这个,图片切割后把yolov5的图片训练路径、检测路径改成切割后的图片就好。
注意一点
训练的时候有 融合图 , 检测的时候没有(因为我没做融合图的检测,容易和子图之间产生重复,比较是机器检测的结果)
更改路径:直接在 def run()下面更改路径,如detect.py:
在这里插入图片描述
检测结果:
在这里插入图片描述
在这里插入图片描述

3、融合

这个说难不难,说简单也不简单
主要是要思路清晰

1、需要定位每一张图片所在的位置(比如切割成4*4,总共有16个位置)
2、根据每一个位置,对每一张图片的检测结果(txt文件)内容进行相应处理,处理成在大图中对应的位置,比如位置是 右上角(0, 3), 那么该图片中检测到的结果的x值都应该加上 (3 * 大图宽度/4),再重新转换成yolov5的标注格式

差不多就这样子?
融合结果
在这里插入图片描述

4、结果观察

前面说到,这里的训练和检测都是基于小图片进行,那么就不好直接观察结果如何(检测图片上的框)
那么可以针对融合的txt文件结果,在原图上直接用 ImageDraw 画一个框
结果还不错
在这里插入图片描述

训练结果

看看训练结果
在这里插入图片描述

其他

也可以参考一些类似的项目
yolov5-tph: https://github.com/Gumpest/YOLOv5-Multibackbone-Compression
yolov-z
还有什么增加小目标检测层(感觉不通用,试了下除了增加训练时间之外,效果也一般般)

相关文件:

配置文件: config.py
裁剪图片: cut_image.py
融合图片: joint_image.py
原图画框: draw_box.py
主函数: main.py

有需要再说吧

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-06-01 15:13:42  更:2022-06-01 15:16:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:44:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码