【python】小目标检测中对一幅高分辨率图分块且改变目标bounding box的坐标

2023-11-04

很多时候,在小目标检测中,对于一副高分辨率图像,我们很难直接输入一整幅大图来进行目标检测,特别是对于one-stage的方法,如SSD的输入尺寸是300和512, YOLO的输入尺寸是416,而高分辨率图像通常有几千×几千像素。所以我在此分享将一副高分辨率图像分块同时写入对应目标的boundingbox改变后的坐标到xml文件中。

import torch
import pickle
import sys
import os
import cv2
import numpy as np
import os.path
import torch.utils.data as data
import torchvision.transforms as transforms
from PIL import Image
from xml.dom.minidom import Document
from tqdm import tqdm
if sys.version_info[0] ==2:
    import xml.etree.cElementTree as ET
else:
    import xml.etree.ElementTree as ET
origin_dir = '原图像存放地址'
target_dir1 = '分块图像存放地址'
annota_dir = '原boundingbox的xml文件存放地址'
target_dir2 = '分块boundingbox的xml文件存放地址'
def clip_img(No, oriname):
    from_name = os.path.join(origin_dir, oriname+'.jpg')
    img = cv2.imread(from_name)
    h_ori,w_ori, _ =img.shape#保存原图的大小
    img = cv2.resize(img, (2048, 2048))#可以resize也可以不resize,看情况而定
    h, w, _ = img.shape
    xml_name = os.path.join(annota_dir, oriname+'.xml')#读取每个原图像的xml文件
    xml_ori = ET.parse(xml_name).getroot()
    res = np.empty((0,5))#存放坐标的四个值和类别
    for obj in xml_ori.iter('object'):
        difficult = int(obj.find('difficult').text) == 1
        if difficult:
            continue
        name = obj.find('name').text.lower().strip()
        bbox = obj.find('bndbox')
        pts = ['xmin', 'ymin', 'xmax', 'ymax']
        bndbox = []
        for i, pt in enumerate(pts):
            cur_pt = int(bbox.find(pt).text) - 1
            cur_pt = int(cur_pt*h/h_ori) if i%2==1 else int(cur_pt * w / w_ori)
            bndbox.append(cur_pt)
        #label_idx = self.class_to_ind[name]
        bndbox.append(name)
        res = np.vstack((res, bndbox))
    i = 0
    win_size = 256#分块的大小
    stride = 128#重叠的大小,设置这个可以使分块有重叠
    for r in range(0, h - win_size, stride):
        for c in range(0, w - win_size, stride):
            flag = np.zeros([1,10])
            youwu = False
            xiefou = True
            tmp = img[r: r+win_size, c: c+win_size]
            for re in range(res.shape[0]):
                xmin,ymin,xmax,ymax,label = res[re]
                if int(xmin)>=c and int(xmax) <=c+win_size and int(ymin)>=r and int(ymax)<=r+win_size:
                    flag[0][re] = 1
                    youwu = True
                elif int(xmin)<c or int(xmax) >c+win_size or int(ymin) < r or int(ymax) > r+win_size:
                    pass
                else:
                    xiefou = False
                    break;
            if xiefou:#如果物体被分割了,则忽略不写入
                if youwu:#有物体则写入xml文件
                    doc = Document()
                    annotation = doc.createElement('annotation')
                    doc.appendChild(annotation)
                    for re in range(res.shape[0]):
                        xmin,ymin,xmax,ymax,label = res[re]
                        xmin=int(xmin)
                        ymin=int(ymin)
                        xmax=int(xmax)
                        ymax=int(ymax)
                        if flag[0][re] == 1:
                            xmin=str(xmin-c)
                            ymin=str(ymin-r)
                            xmax=str(xmax-c)
                            ymax=str(ymax-r)
                            object_charu = doc.createElement('object')
                            annotation.appendChild(object_charu)
                            name_charu = doc.createElement('name')
                            name_charu_text = doc.createTextNode(label)
                            name_charu.appendChild(name_charu_text)
                            object_charu.appendChild(name_charu)
                            dif = doc.createElement('difficult')
                            dif_text = doc.createTextNode('0')
                            dif.appendChild(dif_text)
                            object_charu.appendChild(dif)
                            bndbox = doc.createElement('bndbox')
                            object_charu.appendChild(bndbox)
                            xmin1 = doc.createElement('xmin')
                            xmin_text = doc.createTextNode(xmin)
                            xmin1.appendChild(xmin_text)
                            bndbox.appendChild(xmin1)
                            ymin1 = doc.createElement('ymin')
                            ymin_text = doc.createTextNode(ymin)
                            ymin1.appendChild(ymin_text)
                            bndbox.appendChild(ymin1)
                            xmax1 = doc.createElement('xmax')
                            xmax_text = doc.createTextNode(xmax)
                            xmax1.appendChild(xmax_text)
                            bndbox.appendChild(xmax1)
                            ymax1 = doc.createElement('ymax')
                            ymax_text = doc.createTextNode(ymax)
                            ymax1.appendChild(ymax_text)
                            bndbox.appendChild(ymax1)
                        else:
                            continue
                    xml_name = oriname+'_%3d.xml' % (i)
                    to_xml_name = os.path.join(target_dir2, xml_name)
                    with open(to_xml_name, 'wb+') as f:
                        f.write(doc.toprettyxml(indent="\t", encoding='utf-8'))
                    #name = '%02d_%02d_%02d_.bmp' % (No, int(r/win_size), int(c/win_size))
                    img_name = oriname+'_%3d.jpg' %(i)
                    to_name = os.path.join(target_dir1, img_name)
                    i = i+1
                    cv2.imwrite(to_name, tmp)
for No, name in tqdm(enumerate(os.listdir(origin_dir))):
    clip_img(No, name.rstrip('.jpg'))

这样就将一个大图分块且保存了坐标xml文件。
注意xml文件的key视情况而定,不是通用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【python】小目标检测中对一幅高分辨率图分块且改变目标bounding box的坐标 的相关文章

随机推荐

  • DocArray 0.20.0 发布!新增 Milvus 后端支持,更好地嵌套数据搜索,新增 RGB-D 格式的 3D 模型表示

    DocArray 是一个用于处理 传输和存储多模态数据的 Python 工具包 DocArray 提供便捷的多模态数据处理功能 具备基于 Protobuf 提供高性能的网络传输性能 同时也为多种向量存储方案提供统一的 API 接口 GitH
  • CTFShow-Web入门

    目录 爆破 web21 web22 web23 web24 web25 web26 web27 web28 爆破 web21 解题思路 考察burp的intruder模块 访问发现是前端验证 随便输入账号密码抓包发现是Basic认证 Bas
  • 【splishsplash】splishsplash入门使用

    本文的目地为总结splishsplash的入门使用方法 splishsplash是一个C 开源流体引擎 主要用于产生流体动画 它的核心算法是SPH法 资源汇总 github https github com InteractiveCompu
  • 数据挖掘之关联规则挖掘的一些定义

    一 算法定义 关联规则挖掘用于发现隐藏在大型数据集中的令人感兴趣的联系 所发现的模式通常用关联规则或频繁项集的形式表示 关联规则反映了一个事物与其他事物之间的相互依存性和关联性 如果两个或多个事物之间存在一定的关联关系 那么 其中一个事物发
  • c++ STL map简介

    首先头文件 include
  • 深入JS内存模型

    前言 什么是JS的内存模型 看过了很多资料 都是千篇一律的栈内存 堆内存 基本数据类型存储在栈内存 引用数据类型存储在堆内存等等之类的 看过这些之后 对于我们去理解整个JS内存之中复杂的关系 本文会从JavaScript语法之中的各个语言特
  • DHCP攻击与防范实践

    1 DHCP工作原理 DHCP客户端从服务端申请到IP地址等网络配置信息需要经过四个步骤 每个步骤需要发送相应类型的数据报文 如下图所示 首先由客户端以广播方式发出 DHCP Discover 报文来寻找网络中的DHCP服务端 当服务端接收
  • go localhost 的简单使用

    首先在文件夹增加文件web go package main import net http func main http Handle http FileServer http Dir http ListenAndServe 8080 ni
  • DirectShow资源共享

    前段时间为了公司内部培训 写了两个DirectShow的PPT 共享如下 https skydrive live com cid 0E1C9F572B6A2D19 id E1C9F572B6A2D19 211790 另外 我的几本书的源代码
  • VS2022 LNK1104无法打开文件“libboost_filesystem-vc143-mt-gd-x64-1_78.lib”

    VS发布了最新版2022 刚好最近我要用到VS我就下载了最新版 配置了一个PCL环境 尝试运行一段代码 结果报错 找了半天问题才找到 记录一下 错误 LNK1104 无法打开文件 libboost filesystem vc143 mt g
  • qt5开发及实例_Qt 5.14版本正式发布(带下载链接)

    摘录并翻译自Qt官网内容 快来看看新版本更新了些什么东西吧 我们今天 2019 12 12 发布了Qt 5 14 该版本以及明年的Qt 5 15 LTS开始为通向Qt 6铺平道路 尽管我们正在努力通过标记不推荐使用的功能使将来尽可能平稳地移
  • git bash 不支持中文处理

    1 打开git bash后 对窗口右键 gt Options gt Text gt Locale改为zh CN Character set改为UTF 8 关闭git bash 再打开 可以显示中文了 2 如果前一种方法不行 则在git ba
  • 解决org.springframework.amqp.AmqpException: No method found for class [B

    spring boot在集成rabbitmq时 如果使用 amqp client 发送消息 RabbitListener会一直循环报错 org springframework amqp rabbit listener exception L
  • 为何学linux及用处

    目前企业使用的操作系统无非就是国产类的 windows和linux类 我们要提升自己的技能 需要学习这两款 我记得在大学时期 学习过windows以及linux 但当时觉得又不常用 就学的模棱两可 毕业之后 你会发现 其实这两种操作系统是很
  • nginx热部署的原理:nginx -s reload

    我们执行这条命令的原因是希望 nginx 不停止服务始终在处理新的请求的同时把 nginx 的配置文件平滑的把旧的 nginx conf 配置更新为新的 nginx conf 配置 这样一个功能对于 nginx 非常有必要 但是有时候我们会
  • 几本适合嵌入式软件工程师阅读的电子入门书

    导读 周末了 下面这些书 是我作为一个 计算机科学与技术出身的嵌入式软件工程师 出于自身的兴趣爱好且为了更好和硬件工程师们协作 从自身的角度出发而搜集到的信息 仅供参考 不构成专业建议 同时 也希望有经验的嵌入式 硬件工程师 能给我和其他对
  • mysql的replace字符串的替换

    PLACE str from str to str 例 REPLACE 4 568 23 把逗号改为空结果为 4568 23
  • mysql查看执行计划EXPLAIN

    一 EXPLAIN语法 语法 EXPLAIN SELECT 1 EXPLAIN EXTENDED SELECT 将执行计划 反编译 成SELECT语句 运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2 EXPLA
  • 运用自回归滑动平均模型、灰色预测模型、BP神经网络三种模型分别预测全球平均气温,并进行预测精度对比(附代码、数据)

    大家好 我是带我去滑雪 每天教你一个小技巧 全球变暖是近十年来 人们关注度最高的话题 2022年夏天 蔓延全球40 以上的极端天气不断刷新人们对于高温的认知 人们再也不会像从前那样认为全球变暖离我们遥不可及 在此背景下 基于1880年 20
  • 【python】小目标检测中对一幅高分辨率图分块且改变目标bounding box的坐标

    很多时候 在小目标检测中 对于一副高分辨率图像 我们很难直接输入一整幅大图来进行目标检测 特别是对于one stage的方法 如SSD的输入尺寸是300和512 YOLO的输入尺寸是416 而高分辨率图像通常有几千 几千像素 所以我在此分享