Day14 - CV项目实战:SAR飞机检测识别

论文原文:

​​​​​​SAR-AIRcraft-1.0:高分辨率SAR飞机检测识别数据集 - 中国知网

第一排的7张图片,普通人肉眼很难看出对应的是第二排的飞机。

还有上图里标注的飞机,外行根本看不明白,为什么这些是,其他的不是。作为一个外行,问题似乎很严峻,从图里根本识别不出来哪里是飞机,也没法标注。其实,在面对各行业问题的时候,经常会遇到这种问题,感觉可能搞不定。但是没关系,很多东西是反直觉的,这个任务真正做起来不难。

首先,目标检测的标注是非常重要的。

如何标注数据?

很多专业数据我们看不懂,标不了,没关系,这个其实是给行业专家来标注的。

新建项目文件夹 CVProject / label_demo /images --->用来放所有的图片

新建项目文件 CVProject / label_demo / classes.txt --->用来放所有的类别

论文里一共有七个类别的数据,我们将其写入到classes.txt文件中。


 

目标检测有三种经典数据格式

1. VOC:
  • .xml
  •  xmin, ymin, xmax, ymax
  • 左上角,右下角
  • 绝对坐标(像素值)
from xml.etree import ElementTree# 解析XML文件
tree = ElementTree.parse(source="0000001.xml")
# 获取XML文件的根元素
root = tree.getroot()# 获取图像路径
img_path = root.find(path="path").text
print(img_path)  # 输出图像路径# 获取图像的宽度和高度
img_width = int(root.find(path="size").find(path="width").text)
img_height = int(root.find(path="size").find(path="height").text)
print(img_height, img_width)  # 输出图像的高度和宽度# 遍历所有目标对象
for obj in root.findall(path="object"):# 获取目标名称print(obj.find("name").text)# 获取边界框的坐标xmin = int(obj.find("bndbox").find("xmin").text)ymin = int(obj.find("bndbox").find("ymin").text)xmax = int(obj.find("bndbox").find("xmax").text)ymax = int(obj.find("bndbox").find("ymax").text)print(xmin, ymin, xmax, ymax)  # 输出边界框的坐标print("-" * 80)  # 分割线# 定义标签到索引的映射
label2idx = {"A330": 0, "A320/321": 1, "A220": 2, "ARJ21": 3, "Boeing737": 4, "Boeing787": 5, "other": 6
}# 定义索引到标签的映射
idx2label = {idx: label for label, idx in label2idx.items()}
print(idx2label)  # 输出索引到标签的映射
2. YOLO
  • .txt
  • cls_id, x_center, y_center, w, h
  • 类别id,框中心点x坐标,框中心点y坐标,框宽度,框高度
  • 类别id:跟标注的顺序一致即可,从0开始
  • 相对坐标,百分比(跟x有关的都除以图像的宽度,跟y有关的都除以图像的高度)

     YOLO官网:https://docs.ultralytics.com

     用产品的心态去做技术 ,基本上你能想到的,都帮你实现了。

# 定义函数,将VOC格式转换为YOLO格式
def transfer_yolo(file_name="./0000001.xml"):# 解析XML文件tree = ElementTree.parse(source=file_name)# 获取XML文件的根元素root = tree.getroot()# 获取图像的宽度和高度img_width = int(root.find(path="size").find(path="width").text)img_height = int(root.find(path="size").find(path="height").text)# 打开输出文件,准备写入YOLO格式的数据with open(file=file_name.replace(".xml", ".txt"), mode="w", encoding="utf8") as f:# 遍历每个目标对象for obj in root.findall(path="object"):# 获取目标名称name = obj.find("name").text# 获取目标类别的索引cls_id = label2idx.get(name)# 获取边界框的坐标xmin = int(obj.find("bndbox").find("xmin").text)ymin = int(obj.find("bndbox").find("ymin").text)xmax = int(obj.find("bndbox").find("xmax").text)ymax = int(obj.find("bndbox").find("ymax").text)# 计算边界框的中心点坐标x_center = round(number=(xmin + xmax) / 2 / img_width, ndigits=6)y_center = round(number=(ymin + ymax) / 2 / img_height, ndigits=6)# 计算边界框的宽度和高度box_width = round(number=(xmax - xmin) / img_width, ndigits=6)box_height = round(number=(ymax - ymin) / img_height, ndigits=6)# 将YOLO格式的数据写入文件print(cls_id, x_center, y_center, box_width, box_height, sep=" ", end="\n", file=f)# 调用函数进行转换
transfer_yolo()
3. COCO
  • .json
  • x, y, width, height
  • x:中心点的 x 坐标
  • y:中心点的 y 坐标
  • width:框的宽度
  • height:框的高度
  • 原始坐标(像素值)
import json# 打开JSON文件,模式为只读,编码为UTF-8
with open(file="./0000001.json", mode="r", encoding="utf8") as f:# 读取文件内容并解析为Python对象(通常是字典或列表)data = json.loads(s=f.read())# 获取第一个对象(假设data是一个列表,其中包含多个对象)
objs = data[0]# 获取第一个对象的所有键
keys = objs.keys()
print(keys)  # 输出所有键# 获取图像信息
image_info = objs["image"]
print(image_info)  # 输出图像信息# 遍历标注信息
for obj in objs["annotations"]:# 获取标注的标签label = obj["label"]# 获取标注的坐标coordinates = obj["coordinates"]print(label)  # 输出标签print(coordinates)  # 输出坐标

训练相关的指标

  • Epoch:训练轮次(把所有数据都使用一遍,称为一轮)
  •  GPU_mem:GPU的显存占用情况
  • box_loss:框的误差的损失
  • cls_loss:类别损失
  • dfl_loss:框与框之间比较的损失
  • Instances:本批次有多少个目标
  • Size:训练的图像大小
  • Box:
    • P:Precision 精准率  = TP / (TP + FP)
      • 误报
      • 预测出的正框有多少是真正的正框
      • 上图示例中检测出的A330飞机里,只有83.1%是真正的A330飞机,相当于误报16.9%
      • 图像分类很强调ACC,为什么目标检测没有ACC了,因为目标检测是严重负样本很多,所有的背景都是负样本
    • R:Recall 召回
      • 漏检
      • 代表正样本挖掘的能力
      • 比如测试集里有100个A330,其中能找出88.4个是A330,相当于漏检11.6%
    • mAP
      • Mean Average Precision 全类平均准确率
      • 比如上图中all这行,mean表示7个类别的平均,AP表示平均准确率
      • mAP的核心考察的是Precision精准率,主要是防误报
      • mAP50,其中的50表示IoU,这就涉及到了什么是正样本,什么是负样本的问题
      • mAP_0.5, mAP@0.5, mAP_0.5:0.95

一个目标检测的问题,什么叫预测对了呢?

目标检测输出2个东西,一个是类别概率,另一个是外围框。

所以即要把类别预测正确,又把框套的恰到好处,这才叫预测对了,这也就是TP(True正样本)。

mAP50表示框的类别对了,且跟真实的框交并比大于等于0.5,就算预测正确。

mAP50是最低要求。

如何计算两个框的交并比呢?即正确的框和预测的框的交集除以它们的并集。结果大于等于0.5就认为框预测正确。

mAP75表示框的类别对了,且与真实的框的交并比大于等于75,才算是预测正确,否则也算假样本。

mAP50-95表示会从50到90取几个样。

mAP后的数字越大,表示正样本的要求越严格。

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

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

相关文章

Threejs 材质贴图、光照和投影详解

1. 材质和贴图 材质(Material)定义了物体表面的外观,包括颜色、光泽度、透明度等。贴图(Textures)是应用于材质的图像,它们可以增加物体表面的细节和真实感。 1.1材质类型 MeshBasicMaterial&#xff1a…

笔记整理—linux驱动开发部分(11)中断上下文

触摸屏分为两种,一种为电阻式触摸屏,另一种为电容式触摸屏。电阻式触摸屏(x、x-、y、y-、AD)有两种接口,一种为SOC自带的接口(miscinput或platform),第二种为外部IC,通过…

网络编程示例之开发板测试

编译elf1_cmd_net程序 (一)设置交叉编译环境。 (二)查看elf1_cmd_net文件夹Makefile文件。查看当前编译规则,net_demo是编译整个工程,clean是清除工程。 (三)输入命令。 &#xff0…

【GD32】(一) 开发方式简介及标准库开发入门

文章目录 0 前言1 开发方式选择2 标准库模板的创建3 遇到的问题和解决方法 0 前言 因为项目关系,需要使用GD32。之前对此早有耳闻,知道这个是一个STM32的替代品,据说甚至可以直接烧录STM32的程序(一般是同型号)&#x…

Java NIO 核心知识总结

NIO 简介 在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需…

Spring如何解决循环依赖的问题

Spring 如何解决循环依赖的问题 Spring 是通过三级缓存来解决循环依赖问题,第一级缓存里面存储完整的Bean实例,这些实例是可以直接被使用的,第二级缓存存储的是实例化后但是还没有设置属性值的Bean实例,也就是Bean里面的 依赖注入…

深度图变换器的新突破:DeepGraph

人工智能咨询培训老师叶梓 转载标明出处 在图变换器领域,尽管其全局注意力机制在图结构数据处理上显示出了巨大潜力,但现有的图变换器模型却普遍较浅,通常不超过12层。这一现象引发了学者们对于“增加层数是否能进一步提升图变换器性能”的深…

单体架构 IM 系统之 Server 节点状态化分析

基于 http 短轮询模式的单体架构的 IM 系统见下图,即客户端通过 http 周期性地轮询访问 server 实现消息的即时通讯,也就是我们前面提到的 “信箱模型”。“信箱模型” 虽然实现非常容易,但是消息的实时性不高。 我们在上一篇文章&#xff08…

阿里云通义大模型团队开源Qwen2.5-Coder:AI编程新纪元

🚀 11月12日,阿里云通义大模型团队宣布开源通义千问代码模型全系列,共6款Qwen2.5-Coder模型。这些模型在同等尺寸下均取得了业界最佳效果,其中32B尺寸的旗舰代码模型在十余项基准评测中均取得开源最佳成绩,成为全球最强…

计算机网络(8)数据链路层之子层

上一篇已经讲到数据链路层可以分为两个子层,这次将重点讲解子层的作用和ppp协议 数据链路层的子层 数据链路层通常被分为两个子层: 逻辑链路控制子层(LLC,Logical Link Control): LLC子层负责在数据链路…

【操作系统】输入/输出(I/O)管理

王道笔记 一、I/O管理描述 1.1 I/O设备的概念和分类 1.1.1 什么是I/O设备 “I/O”就是“输入/输出”(Input/Output) I/O设备机会可以将数据输入到计算机,或者可以接收计算机输出数据的外部设备,属于计算机中的硬件部件。下图就…

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV买卖股票的最佳时机III309.买卖股票的最佳时机含冷冻期

Day44 | 动态规划 :状态机DP 买卖股票的最佳时机IV&&买卖股票的最佳时机III&&309.买卖股票的最佳时机含冷冻期 动态规划应该如何学习?-CSDN博客 本次题解参考自灵神的做法,大家也多多支持灵神的题解 买卖股票的最佳时机【…

Koa进阶:掌握中间件和参数校验的艺术

目录 一、首先下载依赖 二、在index.js中引入koa-parameter,一般挂载这个中间件时会放在注册请求体的后面 三、使用实例 四、如果跟我们所需求的参数不同,返回结果直接会返回422 koa-parameter一般是用来校验请求传过来的参数是否是自己所需要的的 G…

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用:读取图像文件并将其加载到 Mat 对象中。参数: 第一个参数是文件路径,可以是相对路径或绝对路径。第二个参数是读取标志,比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…

git config是做什么的?

git config是做什么的? git config作用配置级别三种配置级别的介绍及使用,配置文件说明 使用说明git confi查看参数 默认/不使用这个参数 情况下 Git 使用哪个配置等级? 一些常见的行为查看配置信息设置配置信息删除配置信息 一些常用的配置信…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

【二叉搜素树】——LeetCode二叉树问题集锦:6个实用题目和解题思路

文章目录 计算布尔二叉树的值求根节点到叶节点的数字之和二叉树剪枝验证二叉搜索树二叉搜索树中第K小的元素二叉树的所有路径 计算布尔二叉树的值 解题思路: 这是一个二叉树的布尔评估问题。树的每个节点包含一个值,其中叶子节点值为 0 或 1&#xff0…

2023年MathorCup数学建模A题量子计算机在信用评分卡组合优化中的应用解题全过程文档加程序

2023年第十三届MathorCup高校数学建模挑战赛 A题 量子计算机在信用评分卡组合优化中的应用 原题再现: 在银行信用卡或相关的贷款等业务中,对客户授信之前,需要先通过各种审核规则对客户的信用等级进行评定,通过评定后的客户才能…

嵌入式开发套件(golang版本)

1. watchdog(软件看门狗:守护升级) 2. gate(主程序) 3. web(api版本 升级包) OTA 升级流程 watchdog启动后检查守护进程gate是否正在运行,如果没有,api对比版本号&am…

解压专家 2.4.12| 多功能解压缩工具,支持密码共享、音乐播放和歌词匹配。

解压专家是一款功能强大的解压缩软件,提供了类似于WIFI万能钥匙的密码分享功能,帮助用户快速获取共享的解压密码。作为专业的解压缩工具,它支持多种常见和不常见的压缩包格式,如ZIP、RAR、7z、TAR.GZ和ISO等,并且还支持…