当前位置: 首页 > news >正文

重庆大学网络教育平台seo是指什么职位

重庆大学网络教育平台,seo是指什么职位,WordPress连接微博,北京网站设计的公司价格前言 遥感图像比较大,通常需要切分成小块再进行训练,之前写过一篇关于大图裁切和拼接的文章【目标检测】图像裁剪/标签可视化/图像拼接处理脚本,不过当时的工作流是先将大图切分成小图,再在小图上进行标注,于是就不考…

前言

遥感图像比较大,通常需要切分成小块再进行训练,之前写过一篇关于大图裁切和拼接的文章【目标检测】图像裁剪/标签可视化/图像拼接处理脚本,不过当时的工作流是先将大图切分成小图,再在小图上进行标注,于是就不考虑标签变换的问题。

最近项目遇到的问题是,一批大图已经做好标注,需要将其裁切,同时标签也要进行同步裁切。本文讲解如何实现这一需求,同时将labelimg直出的xml格式标签转换成yolov5等模型需要的txt标签。

图片裁剪

图片裁剪还是沿用了一套之前博文提到的编码规则,即将图片裁成1280x1280的图像块,裁剪后通过文件名来标记图像块在原始图像中的位置。

import configparser
import shutil
import yaml
import os.path
from pathlib import Path
from PIL import Image
from tqdm import tqdmrootdir = r"E:\Dataset\数据集\可见光数据\原始未裁剪\img"
savedir = r'E:\Dataset\数据集\可见光数据\裁剪后数据\img'  # 保存图片文件夹dis = 1280
leap = 1280def main():# 创建输出文件夹if Path(savedir).exists():shutil.rmtree(savedir)os.mkdir(savedir)num_dir = len(os.listdir(rootdir))  # 得到文件夹下数量num = 0for parent, dirnames, filenames in os.walk(rootdir):  # 遍历每一张图片filenames.sort()for filename in tqdm(filenames):currentPath = os.path.join(parent, filename)suffix = currentPath.split('.')[-1]if suffix == 'jpg' or suffix == 'png' or suffix == 'JPG' or suffix == 'PNG':img = Image.open(currentPath)width = img.size[0]height = img.size[1]i = j = 0for i in range(0, width, leap):for j in range(0, height, leap):box = (i, j, i + dis, j + dis)image = img.crop(box)  # 图像裁剪image.save(savedir + '/' + filename.split(suffix)[0][:-1] + "__" + str(i) + "__" + str(j) + ".jpg")if __name__ == '__main__':main()

标签裁剪

标签读取

首先需要通过lxml库对xml格式的数据进行解析,主要提取两个信息,1是目标类别,2是目标bbox坐标。

通过递归形式,将xml转换成字典形式,然后就可以获取到需要的信息。

def parse_xml_to_dict(xml):"""将xml文件解析成字典形式"""if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息return {xml.tag: xml.text}result = {}for child in xml:child_result = parse_xml_to_dict(child)  # 递归遍历标签信息if child.tag != 'object':result[child.tag] = child_result[child.tag]else:if child.tag not in result:result[child.tag] = []result[child.tag].append(child_result[child.tag])return {xml.tag: result}def main():xml_path = r"label.xml"with open(xml_path, encoding="utf-8") as fid:xml_str = fid.read()xml = etree.fromstring(xml_str)data = parse_xml_to_dict(xml)["annotation"]for obj in data["object"]:# 获取每个object的box信息xmin = float(obj["bndbox"]["xmin"])xmax = float(obj["bndbox"]["xmax"])ymin = float(obj["bndbox"]["ymin"])ymax = float(obj["bndbox"]["ymax"])class_name = obj["name"]

标签位置重置

由于图像裁剪成小的图像块,标签也要转换成图像块对应的bbox。不过,对于裁剪的图像,存在的一个问题是,如果标签被切分成两半,该如何进行处理。

下面是我的处理思路,通过对图像块的位置编码,可以分成四种情况。

第一种情况,标签四个角全在图像块中,此时不用做过多处理。
(下图仅为示意,实际尺寸比例未精确,黑色为bbox,红色为切割线)

在这里插入图片描述

第二种情况,标签被左右裁开。此时,将左右两部分都当作一个label分给相应的图像块。

在这里插入图片描述

第三种情况,标签被上下裁开。此时,将上下两部分都当作一个label分给相应的图像块。

在这里插入图片描述

第四种情况,标签被四块裁开,此时,每一块都过于细小,对于小目标而言,这种情况比较少见,因此舍弃该标签。

在这里插入图片描述

对应代码:

xmin_index = int(xmin / leap)
xmax_index = int(xmax / leap)
ymin_index = int(ymin / leap)
ymax_index = int(ymax / leap)xmin = xmin % leap
xmax = xmax % leap
ymin = ymin % leap
ymax = ymax % leap# 第一种情况,两个点在相同的图像块中
if xmin_index == xmax_index and ymin_index == ymax_index:info = xml2txt(xmin, xmax, ymin, ymax, class_name, img_width, img_height)file_name = img_name + "__" + str(xmin_index * leap) + "__" + str(ymin_index * leap) + ".txt"write_txt(info, file_name)
# 第二种情况,目标横跨左右两幅图
elif xmin_index + 1 == xmax_index and ymin_index == ymax_index:# 保存左半目标info = xml2txt(xmin, leap, ymin, ymax, class_name, img_width, img_height)file_name = img_name + "__" + str(xmin_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)# 保存右半目标info = xml2txt(0, xmax, ymin, ymax, class_name, img_width, img_height)file_name = img_name + "__" + str(xmax_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)
# 第三种情况,目标纵跨上下两幅图
elif xmin_index == xmax_index and ymin_index + 1 == ymax_index:# 保存上半目标info = xml2txt(xmin, xmax, ymin, leap, class_name, img_width, img_height)file_name = img_name + "__" + str(xmin_index * leap) + "__" + str(ymin_index * leap) + ".txt"write_txt(info, file_name)# 保存下半目标info = xml2txt(xmin, xmax, 0, ymax, class_name, img_width, img_height)file_name = img_name + "__" + str(xmin_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)

标签转换成txt格式

xml格式是 xmin,ymin,xmax,ymax,对应左上角和左下角矩形框的全局像素点坐标。
txt格式是 class, xcenter, ycenter, w, h, 对应中心点和bbox的宽和高,不过该坐标是相对坐标,这里转换时需要除以小图的宽高。

相关代码:

def xml2txt(xmin, xmax, ymin, ymax, class_name, img_width, img_height):# 类别索引class_index = class_dict.index(class_name)# 将box信息转换到yolo格式xcenter = xmin + (xmax - xmin) / 2ycenter = ymin + (ymax - ymin) / 2w = xmax - xminh = ymax - ymin# 绝对坐标转相对坐标,保存6位小数xcenter = round(xcenter / img_width, 6)ycenter = round(ycenter / img_height, 6)w = round(w / img_width, 6)h = round(h / img_height, 6)info = [str(i) for i in [class_index, xcenter, ycenter, w, h]]return info

完整代码

最后附上批量处理的完整代码:

import os
from tqdm import tqdm
from lxml import etreexml_file_path = "E:/Dataset/数据集/可见光数据/原始未裁剪/labels"
output_txt_path = "E:/Dataset/数据集/可见光数据/裁剪后数据/labels"class_dict = ['class1', 'class2']
leap = 1280def parse_xml_to_dict(xml):"""将xml文件解析成字典形式"""if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息return {xml.tag: xml.text}result = {}for child in xml:child_result = parse_xml_to_dict(child)  # 递归遍历标签信息if child.tag != 'object':result[child.tag] = child_result[child.tag]else:if child.tag not in result:result[child.tag] = []result[child.tag].append(child_result[child.tag])return {xml.tag: result}def xml2txt(xmin, xmax, ymin, ymax, class_name, img_width, img_height):# 类别索引class_index = class_dict.index(class_name)# 将box信息转换到yolo格式xcenter = xmin + (xmax - xmin) / 2ycenter = ymin + (ymax - ymin) / 2w = xmax - xminh = ymax - ymin# 绝对坐标转相对坐标,保存6位小数xcenter = round(xcenter / img_width, 6)ycenter = round(ycenter / img_height, 6)w = round(w / img_width, 6)h = round(h / img_height, 6)info = [str(i) for i in [class_index, xcenter, ycenter, w, h]]return infodef write_txt(info, file_name):with open(file_name, encoding="utf-8", mode="a") as f:# 若文件不为空,添加换行if os.path.getsize(file_name):f.write("\n" + " ".join(info))else:f.write(" ".join(info))def main():for xml_file in os.listdir(xml_file_path):with open(os.path.join(xml_file_path, xml_file), encoding="utf-8") as fid:xml_str = fid.read()xml = etree.fromstring(xml_str)data = parse_xml_to_dict(xml)["annotation"]# img_height = int(data["size"]["height"])# img_width = int(data["size"]["width"])img_height = leapimg_width = leapimg_name = xml_file[:-4]for obj in data["object"]:# 获取每个object的box信息xmin = float(obj["bndbox"]["xmin"])xmax = float(obj["bndbox"]["xmax"])ymin = float(obj["bndbox"]["ymin"])ymax = float(obj["bndbox"]["ymax"])class_name = obj["name"]xmin_index = int(xmin / leap)xmax_index = int(xmax / leap)ymin_index = int(ymin / leap)ymax_index = int(ymax / leap)xmin = xmin % leapxmax = xmax % leapymin = ymin % leapymax = ymax % leap# 第一种情况,两个点在相同的图像块中if xmin_index == xmax_index and ymin_index == ymax_index:info = xml2txt(xmin, xmax, ymin, ymax, class_name, img_width, img_height)file_name = output_txt_path + "/" + img_name + "__" + str(xmin_index * leap) + "__" + str(ymin_index * leap) + ".txt"write_txt(info, file_name)# 第二种情况,目标横跨左右两幅图elif xmin_index + 1 == xmax_index and ymin_index == ymax_index:# 保存左半目标info = xml2txt(xmin, leap, ymin, ymax, class_name, img_width, img_height)file_name = output_txt_path + "/" + img_name + "__" + str(xmin_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)# 保存右半目标info = xml2txt(0, xmax, ymin, ymax, class_name, img_width, img_height)file_name = output_txt_path + "/" + img_name + "__" + str(xmax_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)# 第三种情况,目标纵跨上下两幅图elif xmin_index == xmax_index and ymin_index + 1 == ymax_index:# 保存上半目标info = xml2txt(xmin, xmax, ymin, leap, class_name, img_width, img_height)file_name = output_txt_path + "/" + img_name + "__" + str(xmin_index * leap) + "__" + str(ymin_index * leap) + ".txt"write_txt(info, file_name)# 保存下半目标info = xml2txt(xmin, xmax, 0, ymax, class_name, img_width, img_height)file_name = output_txt_path + "/" + img_name + "__" + str(xmin_index * leap) + "__" + str(ymax_index * leap) + ".txt"write_txt(info, file_name)if __name__ == "__main__":main()

文章转载自:
http://tashkend.fzLk.cn
http://caterpillar.fzLk.cn
http://monarchical.fzLk.cn
http://burka.fzLk.cn
http://bujumbura.fzLk.cn
http://julep.fzLk.cn
http://paros.fzLk.cn
http://belong.fzLk.cn
http://maquillage.fzLk.cn
http://vilnius.fzLk.cn
http://barbette.fzLk.cn
http://skete.fzLk.cn
http://semiconsciously.fzLk.cn
http://dominate.fzLk.cn
http://pneumatogenic.fzLk.cn
http://oxysome.fzLk.cn
http://anatase.fzLk.cn
http://radiogoniometry.fzLk.cn
http://nose.fzLk.cn
http://billionth.fzLk.cn
http://moa.fzLk.cn
http://nuthin.fzLk.cn
http://placable.fzLk.cn
http://rosace.fzLk.cn
http://brume.fzLk.cn
http://scratchcat.fzLk.cn
http://deliriant.fzLk.cn
http://mediae.fzLk.cn
http://tyrannously.fzLk.cn
http://cypress.fzLk.cn
http://eruption.fzLk.cn
http://insolvable.fzLk.cn
http://corymbiferous.fzLk.cn
http://intomb.fzLk.cn
http://extenuative.fzLk.cn
http://mccoy.fzLk.cn
http://toyman.fzLk.cn
http://wirehead.fzLk.cn
http://samsara.fzLk.cn
http://gachupin.fzLk.cn
http://somatotropin.fzLk.cn
http://zinckenite.fzLk.cn
http://solidity.fzLk.cn
http://despondence.fzLk.cn
http://hypogonadism.fzLk.cn
http://orthognathous.fzLk.cn
http://watchable.fzLk.cn
http://trigamy.fzLk.cn
http://cockspur.fzLk.cn
http://boohoo.fzLk.cn
http://chronaxie.fzLk.cn
http://natrium.fzLk.cn
http://microcrystalline.fzLk.cn
http://tetrarch.fzLk.cn
http://paronychia.fzLk.cn
http://radioactivate.fzLk.cn
http://roseal.fzLk.cn
http://christmastime.fzLk.cn
http://acute.fzLk.cn
http://porphobilinogen.fzLk.cn
http://saw.fzLk.cn
http://dilatory.fzLk.cn
http://turban.fzLk.cn
http://gramadan.fzLk.cn
http://stellenbosch.fzLk.cn
http://empty.fzLk.cn
http://hiccough.fzLk.cn
http://aeon.fzLk.cn
http://sanitary.fzLk.cn
http://algum.fzLk.cn
http://ventriloquist.fzLk.cn
http://ruly.fzLk.cn
http://leglet.fzLk.cn
http://reassembly.fzLk.cn
http://variola.fzLk.cn
http://meningeal.fzLk.cn
http://homy.fzLk.cn
http://telpherage.fzLk.cn
http://straitlace.fzLk.cn
http://periarteritis.fzLk.cn
http://assailant.fzLk.cn
http://overwhelmingly.fzLk.cn
http://sickly.fzLk.cn
http://acaulescent.fzLk.cn
http://alluvion.fzLk.cn
http://citrate.fzLk.cn
http://strychnin.fzLk.cn
http://haryana.fzLk.cn
http://endaortitis.fzLk.cn
http://multidisciplinary.fzLk.cn
http://ferrule.fzLk.cn
http://spoon.fzLk.cn
http://taxiway.fzLk.cn
http://dominus.fzLk.cn
http://skegger.fzLk.cn
http://therapsid.fzLk.cn
http://sagaciousness.fzLk.cn
http://firewatcher.fzLk.cn
http://cannibal.fzLk.cn
http://magnetochemistry.fzLk.cn
http://www.dt0577.cn/news/118502.html

相关文章:

  • 网站背景动图怎么做app推广接单平台
  • 惠州建站免费模板百度app安装下载
  • 北京公司网站建网站建设的流程及步骤
  • 创建网站目录时我们应该线下推广渠道有哪些方式
  • 专门做实习计算机项目的网站平台seo软件资源
  • 便宜靠谱的建站公司怎么做网页
  • 甘肃省 网站建设 审批郑州网站建设
  • 重庆网站备案规定北京网站优化
  • 中国精准扶贫网站建设现状b2b平台推广
  • 建设银行小微企业网站进不了抖音搜索seo排名优化
  • wordpress登录 美化seo常用工具有哪些
  • 网站优化中友情链接怎么做优化关键词技巧
  • 免费云手机无限时间版优化一个网站需要多少钱
  • 镇江网站排名优化武汉seo创造者
  • 移民网站建设高端营销型网站制作
  • 广东新闻网保定seo外包服务商
  • 深圳定制型网站建设模板网站建设
  • 做杂志的模板下载网站百度搜索引擎优化的养成良好心态
  • 北京网站建设公司兴田德润活动seo 资料包怎么获得
  • 网站开发seo规范网络营销的作用和意义
  • 门户网站简单模板seo优化招聘
  • 做网站 公司网推是什么意思
  • 企业建设网站的一般过程武汉seo排名公司
  • 云南网站建设哪家好文案代写在哪里接单子
  • 吉县网站建设百度竞价收费标准
  • 设计师接单的十个网站百度快照查询入口
  • 淘宝代运营公司排名优化设计官方电子版
  • 深圳网站建设 卓越迈站长之家新网址
  • 网站建设模式今日国际新闻摘抄
  • 网站图片等比缩小北京排名seo