【Python】计算VOC格式XML文件中目标面积和长宽比并生成直方图

博客围绕目标检测精度问题展开,指出可对anchor进行参数优化,RPN网络生成的anchor影响检测精度,需统计数据中目标区域面积和长宽比。介绍了代码思路,包括遍历xml文件、定位坐标值、计算面积长宽比等,运行代码后在生成图片标题加入相关数据并配有进度条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

1.Introduction

最近目标检测的精度上不去,看看别人的文章,发现可以针对anchor进行参数优化,RPN网络生成的anchor数量与种类很大程度上影响着检测精度,anchor与检测目标越接近,检测精度越高。所以我们就需要统计下自己数据中目标区域的面积和长宽比。
在这里插入图片描述

2.Materials and methods

代码思路主要有:

(1)遍历文件夹中的xml文件
(2)定位xmin,xmax,ymin,ymax四个坐标值
(3)计算面积和长宽比,生成列表
(4)统计列表直方图

emm,没啥说的,上代码吧。

# -*- coding: utf-8 -*-
"""
Created on Sun Jan 10 21:48:48 2021

@author: YaoYee
"""
 
import os
import xml.etree.cElementTree as et
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm

 
path="C:/Users/YaoYee/Desktop/Annotations"
files=os.listdir(path)


area_list = []
ratio_list = []


def file_extension(path): 
    return os.path.splitext(path)[1] 
 

for xmlFile in tqdm(files, desc='Processing'): 
    if not os.path.isdir(xmlFile): 
        if file_extension(xmlFile) == '.xml':
            tree=et.parse(os.path.join(path,xmlFile))
            root=tree.getroot()
            filename=root.find('filename').text
            # print("--Filename is", xmlFile)
            
            for Object in root.findall('object'):
                bndbox=Object.find('bndbox')
                xmin=bndbox.find('xmin').text
                ymin=bndbox.find('ymin').text
                xmax=bndbox.find('xmax').text
                ymax=bndbox.find('ymax').text
                
                area = ( int(ymax)-int(ymin)) * (int(xmax)-int(xmin) )
                area_list.append(area)
                # print("Area is", area)
                
                ratio = ( int(ymax)-int(ymin)) / (int(xmax)-int(xmin) )
                ratio_list.append(ratio)
                # print("Ratio is", round(ratio,2))


square_array = np.array(area_list)
square_max = np.max(square_array)
square_min = np.min(square_array)
square_mean = np.mean(square_array)
square_var = np.var(square_array)
plt.figure(1)
plt.hist(square_array,20)
plt.xlabel('Area in pixel')
plt.ylabel('Frequency of area')
plt.title('Area\n' \
          +'max='+str(square_max)+', min='+str(square_min)+'\n' \
          +'mean='+str(int(square_mean))+', var='+str(int(square_var))
          )


ratio_array = np.array(ratio_list)
ratio_max = np.max(ratio_array)
ratio_min = np.min(ratio_array)
ratio_mean = np.mean(ratio_array)
ratio_var = np.var(ratio_array)
plt.figure(2)
plt.hist(ratio_array,20)
plt.xlabel('Ratio of length / width')
plt.ylabel('Frequency of ratio')
plt.title('Ratio\n' \
          +'max='+str(round(ratio_max,2))+', min='+str(round(ratio_min,2))+'\n' \
          +'mean='+str(round(ratio_mean,2))+', var='+str(round(ratio_var,2))
          )

3. Results and discussion

运行下看看效果~
在这里插入图片描述
最后在生成的图片标题中加入了最值,均值和方差,同时还贴心的配有进度条~
在这里插入图片描述

4. Conclusion

好像有点入门Python了~

猜你喜欢:👇🏻
【Python】如何在文件夹里批量分割图片?
【Python】如何在文件夹里批量替换文本中的内容?
【Python】如何在文件夹里批量修改文件名?(0001-1000)

在这里插入图片描述

<think>好的,用户想识别焊缝缺陷图片中的具体缺陷类型,询问如何通过图像处理或AI模型实现。首先,我需要结合他们提供的引用内容来构建回答。 首先,用户提到了引用[2]中传统方法的不足,所以可能需要对比传统图像处理深度学习的优劣。传统方法可能包括边缘检测、阈值分割等,但效果有限。而基于深度学习的方法,如YOLOv5,在引用[1][3]中被提到,尤其是引用[3]中详细说明了使用YOLOv5进行钢管焊缝缺陷检测的应用,且提到了数据集的构建模型优化策略。 接下来,我需要整理步骤。通常,基于深度学习的流程包括数据采集与标注、模型选择与训练、模型优化、部署应用。数据方面,引用[1]强调了数据集的多样性增强方法,比如旋转、翻转等。数据标注工具如LabelImg也是关键点。模型选择方面,YOLOv5是主流,引用[3]提到了改进策略,比如注意力机制或特征融合。此外,引用[3]还提到在数据集有限的情况下,可以结合传统方法或专家系统,这可能需要融合多方法。 另外,用户可能关心传统图像处理的方法,比如预处理步骤中的滤波、形态学操作,或者特征提取方法如HOG、SIFT。但根据引用[2],传统方法效率低,可能作为辅助手段,特别是在数据不足时,如引用[3]中的建议。 然后,需要考虑模型评估优化,比如准确率、召回率指标,以及模型轻量化以便部署。引用[3]提到实时检测的需求,因此模型速度也很重要。 最后,生成相关问题时要围绕数据准备、模型选择、优化方法、传统与AI结合以及评估指标等方面提问,确保覆盖用户可能进一步想了解的内容。 需要确保回答结构清晰,分步骤说明,引用对应的文献标注,同时提供代码示例可能的话。比如在传统方法部分,可以给出OpenCV的代码片段,而在深度学习部分,可以展示YOLOv5的训练代码。这样用户能更直观地理解流程。 总结:回答应分为传统图像处理AI模型方法,强调数据准备的重要性,模型选择改进,以及实际应用中的优化部署。同时,引用提供的文献来支持每个步骤,确保信息的可靠性。</think>### 焊缝缺陷类型识别方法 #### 一、传统图像处理方案(适用于简单场景) 1. **预处理**:使用高斯滤波去除噪声,通过直方图均衡化增强对比度 2. **缺陷分割**: - 采用Canny边缘检测结合形态学操作提取缺陷区域 - 应用Otsu阈值分割算法实现缺陷与背景分离 ```python import cv2 img = cv2.imread('weld.jpg', 0) blur = cv2.GaussianBlur(img, (5,5), 0) edges = cv2.Canny(blur, 100, 200) kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3)) dilated = cv2.dilate(edges, kernel) ``` 3. **特征提取**: - 计算形状特征(周长、面积、圆形度) - 提取纹理特征(灰度共生矩阵) - 使用HOG描述子进行方向梯度直方图分析 #### 二、基于深度学习的AI方案(推荐方案) 1. **数据准备**: - 按引用[1]建议构建包含裂纹、气孔、未焊透等缺陷的标注数据集 - 使用LabelImg标注工具生成PASCAL VOC格式XML文件 - 应用数据增强策略提升泛化能力: $$ \text{增强后的图像} = T_{\theta}(I_{\text{original}}) \quad \text{其中} \theta \in \{\text{旋转, 平移, 翻转}\} $$ 2. **模型选择与训练**: - 采用YOLOv5s作为基础模型(引用[3]验证其有效性) - 添加SE注意力模块增强特征表达能力 - 修改特征金字塔结构优化小目标检测 ```python # YOLOv5模型定义示例 model = Model( backbone=BackboneWithSE(), # 带注意力机制的骨干网络 neck=FPN_PAN(), # 特征金字塔结构 head=Detect() # 检测头 ) ``` 3. **模型优化策略**: - 使用迁移学习初始化模型参数 - 采用CIoU损失函数提升定位精度: $$ \mathcal{L}_{CIoU} = 1 - IoU + \frac{\rho^2(b_{pred}, b_{gt})}{c^2} + \alpha v $$ - 引入标签平滑技术防止过拟合 #### 三、混合方案(引用[3]建议) 1. **专家系统设计**: - 对常见缺陷类型建立规则库(如长宽比>5判定为裂纹) - 当模型置信度低于阈值时触发传统算法验证 2. **增量学习机制**: - 构建在线学习系统,允许添加新缺陷样本 - 采用Few-shot Learning技术解决数据稀缺问题 #### 四、评估与部署 1. 评估指标: - 使用$mAP@0.5$作为主要评价标准 - 计算各类别的精确率$P$召回率$R$: $$ P = \frac{TP}{TP+FP}, \quad R = \frac{TP}{TP+FN} $$ 2. 部署优化: - 使用TensorRT加速推理速度 - 开发Web界面实现可视化检测(引用[1]中的UI实现方案)
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值