无标签背景图(负样本)的拼图代码

news2025/1/20 19:21:57

训练目标检测模型有个很令人头疼的问题,就是有些特征与要训练的特征较为相似的背景区域也被误检出来(作为本应不该检测出来的负样本却被误检出为正样本的FP)。
根据这一问题的解决办法,除了可以对正样本特征较为模糊或者有歧义的样本进行清洗,还有一个策略就是收集这些误检的背景图作为负样本(不标标签)参与训练。

所以本片就针对这类无标签的图片的拼图代码进行编写。

思路

  1. 首先背景图或大或小(一般根据实际摄像头误检框出的区域稍微外括少部分比例),而训练输入的size是固定的,为了不让小图的resize比例过大导致的太模糊特征遭到破坏,我们这里依据图片的大小范围进行1×1、2×2等宫格拼图(这里的图片大小都是特定大小,更复杂的放在下一篇)。
  2. 将范围相同的图片放在同一容器中,每次取n(1×1、2×2……)个样本,依次粘贴到一张大图上,大图的大小就是训练输入的大小。
  3. 拼图的图片会依次升序命令,而被拼的小图也会依次记录其图片名。这里的作用主要是用在模型测试上,将这些拼图输入模型测试,若是哪张拼图上有检测框,则证明哪张图片有误检,可以根据图片名以及在图片当中的哪一个位置来判断原图(被拼的小图)是哪张,可以快速找到领出来再次作为负样本进行训练。

代码

import PIL.Image as Image
import os
import cv2

img_size = 416

# 定义图像拼接函数
def image_compose(idx, ori_tmp, num):
    to_image = Image.new('RGB', (img_size, img_size)) #创建一个新图
    a = 0
    for y in range(idx):
        for x in range(idx):
            to_image.paste(Image.open(os.path.join(images_path, ori_tmp[a])), (
                int(x * (img_size / idx)), int(y * (img_size / idx))))
            print(f"ori_tmp[{a}] :", ori_tmp[a])
            a += 1
    new_name = os.path.join(save_path, "bg_" + str(idx) + "_" + str(num) + ".jpg")
    to_image.save(new_name) # 保存新图
    # print(new_name)
 
images_path = '/data/cch/000test/img'  # 图片集地址
save_path = '/data/cch/000test/save'  # 图片转换后的地址
 
ori_1 = []    
ori_2 = [] 
ori_3 = []
ori_4 = []
ori_5 = []   # 存放将要5×5拼图的原图
ori = [ori_1, ori_2, ori_3, ori_4, ori_5]

image_names = os.listdir(images_path)
for i in image_names:
    imgPath = os.path.join(images_path, i)
    img = cv2.imread(imgPath)
    [img_h, img_w, _] = img.shape
    img_h = max(img_h, img_w)
    # print(img_h,img_w)
    if img_h == img_size:
        ori_1.append(i)
    elif img_h == int(208/2):
        ori_2.append(i)
    elif img_h == int(208/3):
        ori_3.append(i)
    elif img_h == int(208/4):
        ori_4.append(i)
    elif img_h == int(208/5):
        ori_5.append(i)
# print(ori_5)
idx = 1
for ori_n in ori:
    ori_path = os.path.join(save_path, "path_txt", "ori_" + str(idx) + ".txt")
    if os.path.exists(ori_path):
        os.remove(ori_path)
    for i in ori_n:
        with open(ori_path, 'a') as file:
            file.write(i)
            file.write("\n")

    num = 0
    ori_tmp = []
    for i in ori_n:
        if len(ori_tmp) < (idx*idx):
            ori_tmp.append(i)
        else:
            image_compose(idx, ori_tmp,num) #调用函数
            # print(ori_tmp)
            ori_tmp.clear()
            num += 1
            ori_tmp.append(i)

    idx += 1

测试

我们拿一组图片进行测试,输出的目录如下:
在这里插入图片描述
txt文本文件则是保存的拼图顺序。
1×1即单张图片(以bg_1开头):
在这里插入图片描述
2×2即单张图片(以bg_2开头):
在这里插入图片描述
3×3即单张图片(以bg_3开头):
在这里插入图片描述
4×4即单张图片(以bg_4开头):
在这里插入图片描述
5×5即单张图片(以bg_5开头):
在这里插入图片描述
我觉得5×5的小图已经足够小的,在小的基本上也不可能被误检出来,即使真的误检出来也没必要加进去训练了。

最后

本篇是拼图篇最简单的案例,即没有标签、小图的大小也要固定死是那五个值才能拼、拼图方式为宫格的,都被限定死了,接下来的将会针对有标签的、图片大小不固定的、非宫格拼图方式等复杂方式进行拼图。

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

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

相关文章

Intel SGX学习笔记(2):用数组向Enclave传递5个数实现自增操作

写在前面 1、实现一个简单的Intel SGX的应用&#xff1a;非安全区定义初始化一个数组&#xff0c;数组里面存储5个数&#xff0c;然后向安全区&#xff08;enclave&#xff09;传入&#xff0c;在安全区中进行加减乘除&#xff0c;然后返回。 2、Intel SGX开发初学整体思路&a…

代码随想录算法训练营day39 | 62.不同路径,63. 不同路径 II

代码随想录算法训练营day39 | 62.不同路径&#xff0c;63. 不同路径 II 62.不同路径解法一&#xff1a;动态规划解法二&#xff1a;深度搜索&#xff08;明天补充&#xff09;解法三&#xff1a;数论&#xff08;明天补充&#xff09; 63. 不同路径 II解法一&#xff1a;动态规…

RuoYi-Vue下载与运行

一、源码下载 若依官网&#xff1a;RuoYi 若依官方网站 鼠标放到"源码地址"上&#xff0c;点击"RuoYi-Vue 前端分离版"。 跳转至Gitee页面&#xff0c;点击"克隆/下载"&#xff0c;复制HTTPS链接即可。 源码地址为&#xff1a;https://gitee.…

左值引用、右值引用,std::move() 的汇编解释

1&#xff1a;左值引用 引用其实还是指针&#xff0c;但回避了指针这个名字。由编译器完成从地址中取值。以vs2019反汇编&#xff1a; 如图&#xff0c;指针和引用的汇编代码完全一样。但引用在高级语言层面更友好&#xff0c;对人脑。比如可以少写一个 * 号和 -> 。 &…

F280049C实现Simulink调制,以及多个PWM实例之间的同步

文章目录 前言基本概念调制发波载波同步问题 前言 最近作实验碰到了载波不同步的问题&#xff0c;以前也有碰到过这个问题&#xff0c;现在终于解决了&#xff0c;做个记录。 为了以示区分&#xff0c;实例指ePWMx&#xff0c;x1,2,3,4,5,6,7,8&#xff1b;通道指ePWMxA/B&am…

如何使用jmeter进行压测

目录 1.概述 2.测试计划、线程组、取样器 3.调试运行 4.请求默认值 5.流量录制 6.模拟时间间隔 7.压力测试 8.报表 1.概述 一款工具&#xff0c;功能往往是很多的&#xff0c;细枝末节的地方也很多&#xff0c;实际的测试工作中&#xff0c;绝大多数场景会用到的也就是…

看大老如何用Postman+Jmeter实现接口实例

一、接口基础 为什么要单独测试接口&#xff1f; 1. 程序是分开开发的&#xff0c;前端还没有开发&#xff0c;后端已经开发完了&#xff0c;可以提前进入测试 2. 接口直接返回的数据------越底层发现bug&#xff0c;修复成本是越低的 3. 接口测试能模拟功能测试不能测到的异常…

数十位高级测工联合讲解Selenium自动化测试框架工作原理

一、Selenium是什么&#xff1f;   用官网的一句话来讲&#xff1a;Selenium automates browsers. Thats it&#xff01;简单来讲&#xff0c;Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作浏览器一样。支持…

uvm寄存器模型

一、基础知识 前门访问与后门访问是两种寄存器的访问方式。 所谓前门访问, 指的是通过模拟cpu在总线上发出读指令, 进行读写操作。 在这个过程中, 仿真时间( $time函数得到的时间) 是一直往前走的。而后门访问是与前门访问相对的概念。 它并不通过总线进行读写操作, 而是…

2023/5/14周报

目录 摘要 论文阅读 1、标题和现存问题 2、准备知识 3、模型结构 4、实验准备 5、实验结果 深度学习 1、大气数据和水质数据 2、数据清洗 3、项目框架设定 总结 摘要 本周在论文阅读上&#xff0c;阅读了一篇时空图卷积网络:交通预测的深度学习框架的论文。文章的时…

oracle使用with as创建临时表

一、业务需求 在oracle项目的开发过程中&#xff0c;使用sql编写好对应的分析报表内容后&#xff0c;由于sql分析报表涉及到的一些线别丢失&#xff0c;导致呈现的报表分类统计时固定用醒目颜色标识的统计行数据显示错位&#xff1b;因此需要修复分析报表填充完整的线别。 二、…

LeetCode 62 不同路径

题目&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。问总共有多少条不同的路径&#…

云上高校导航 小程序 开发教程

Gitee仓库&#xff1a;云上高校导航 GitHub仓库&#xff1a;云上高校导航 “云上高校导航”是一套基于小程序云开发的校园导航类系统开发方案&#xff0c;该开发方案可供开发者进行二次开发&#xff0c;用于解决师生和访客的校园出行需求。 项目优势及创新&#xff1a; 使…

Flink 常用API(2)——转换算子+聚合算子

转换算子&#xff08;Transformation&#xff09; 映射&#xff08;map&#xff09; 用于将数据流中的数据进行转换&#xff0c;形成新的数据流 “一一映射”&#xff0c;消费一个元素就产出一个元素 参数&#xff1a;接口 MapFunction 的实现 方法&#xff1a;map 返回值…

C#串口通信从入门到精通(13)——多个串口发送数据

文章目录 前言1、多串口数据的发送2、源码前言 我们在开发串口通信程序时,有时候会需要连接不止一个串口,这时候该怎么写程序呢?本文就来介绍多个串口数据的发送 1、多串口数据的发送 我们在之前的专栏中介绍了串口数据的发送,当时有提到过,我们是通过创建一个SerialPo…

支付系统设计三:渠道网关设计06-业务处理

文章目录 前言一、业务服务工厂二、业务处理服务1. 业务处理服务2. 业务处理抽象服务3. 流量控制4. 报文提交4.1 获取交易的服务端通讯列表4.2 循环请求支付渠道4.2.1 报文组装4.2.2 报文发送4.2.2.1 协议处理器获取4.2.2.2 构建通讯客户端4.2.2.3 发送请求4.2.2.4 响应报文读取…

【rust】| 06——语言特性 | 所有权

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础 | 变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 【rust】| 06——语言特…

论文/文章/课设 不会写 后端的实现方式?来试试这个吧!

起因 有朋友用了云开发&#xff0c;但是不太会写&#xff0c;老师也不太理解&#xff0c;就来询问我该怎么写&#xff08;不要苛责老师古板&#xff0c;他们确实不一定能够立刻接受新东西&#xff09; 用的不是云开发的也适用以下思路 思路 我们把后端开发类比成拧螺丝&…

非煤矿山电子封条 yolov7

非煤矿山电子封条通过yolov7python网络模型技术&#xff0c;非煤矿山电子封条可以对矿山主副井口、风井口、车辆出入口和调度室等全天候不间断实时分析预警&#xff0c;发现人员违规行为及异常设备状态立即告警。YOLOv7 的发展方向与当前主流的实时目标检测器不同&#xff0c;研…

GitSVN区别及选型

1、结论先行 git更适用于纯代码仓库&#xff0c;优势在于分支管理svn则擅长于文件管理&#xff0c;优势在于目录级权限控制 2、版本管理发展历程 3、Git&SVN为何而生 Git出生于2005年&#xff0c;是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版…