#!/usr/bin/env python
# -*- coding: utf8 -*-
import sys
from xml.etree import ElementTree
from xml.etree.ElementTree import Element, SubElement
from lxml import etree
import numpy as np
import os
import sys
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
XML_EXT = '.xml'
ENCODE_METHOD = 'utf-8'
#pascalVocReader readers the voc xml files parse it
class PascalVocReader:
"""
this class will be used to get transfered width and height from voc xml files
"""
def __init__(self, filepath,width,height):
# shapes type:
# [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
self.shapes = []
self.filepath = filepath
self.verified = False
self.width=width
self.height=height
try:
self.parseXML()
except:
pass
def getShapes(self):
return self.shapes
def addShape(self, bndbox, width,height):
xmin = int(bndbox.find('xmin').text)
ymin = int(bndbox.find('ymin').text)
xmax = int(bndbox.find('xmax').text)
ymax = int(bndbox.find('ymax').text)
width_trans = (xmax - xmin)/width*self.width
height_trans = (ymax-ymin)/height *self.height
points = [width_trans,height_trans]
self.shapes.append((points))
def parseXML(self):
assert self.filepath.endswith(XML_EXT), "Unsupport file format"
parser = etree.XMLParser(encoding=ENCODE_METHOD)
xmltree = ElementTree.parse(self.filepath, parser=parser).getroot()
pic_size = xmltree.find('size')
size = (int(pic_size.find('width').text),int(pic_size.find('height').text))
for object_iter in xmltree.findall('object'):
bndbox = object_iter.find("bndbox")
self.addShape(bndbox, *size)
return True
class create_w_h_txt:
def __init__(self,vocxml_path,txt_path):
self.voc_path = vocxml_path
self.txt_path = txt_path
def _gether_w_h(self):
pass
def _write_to_txt(self):
pass
def process_file(self):
file_w = open(self.txt_path,'a')
# print (self.txt_path)
for file in os.listdir(self.voc_path):
file_path = os.path.join(self.voc_path, file)
xml_parse = PascalVocReader(file_path,208,208)
data = xml_parse.getShapes()
for w,h in data :
txtstr = str(w)+' '+str(h)+'\n'
#print (txtstr)
file_w.write(txtstr)
file_w.close()
class kMean_parse:
def __init__(self,path_txt):
self.path = path_txt
self.km = KMeans(n_clusters=5,init="k-means++",n_init=10,max_iter=3000000,tol=1e-3,random_state=0)
self._load_data()
def _load_data (self):
self.data = np.loadtxt(self.path)
def parse_data (self):
self.y_k = self.km.fit_predict(self.data)
print(self.km.cluster_centers_)
def plot_data (self):
plt.scatter(self.data[self.y_k == 0, 0], self.data[self.y_k == 0, 1], s=50, c="orange", marker="o", label="cluster 1")
plt.scatter(self.data[self.y_k == 1, 0], self.data[self.y_k == 1, 1], s=50, c="green", marker="s", label="cluster 2")
plt.scatter(self.data[self.y_k == 2, 0], self.data[self.y_k == 2, 1], s=50, c="blue", marker="^", label="cluster 3")
plt.scatter(self.data[self.y_k == 3, 0], self.data[self.y_k == 3, 1], s=50, c="gray", marker="*",label="cluster 4")
plt.scatter(self.data[self.y_k == 4, 0], self.data[self.y_k == 4, 1], s=50, c="yellow", marker="d",label="cluster 5")
# draw the centers
plt.scatter(self.km.cluster_centers_[:, 0], self.km.cluster_centers_[:, 1], s=250, marker="*", c="red", label="cluster center")
plt.legend()
plt.grid()
plt.show()
if __name__ == '__main__':
# whtxt = create_w_h_txt("./VOC2007/Annotations/","./data1.txt") #指定为voc标注路径,以及存放生成文件路径
# whtxt.process_file()
kmean_parse = kMean_parse("./data1.txt")#路径和生成文件相同。
kmean_parse.parse_data()
kmean_parse.plot_data() #绘图部分只支持五个簇,要增加,需要自家改代码即可
在计算机视觉领域, SSD (Single Shot MultiBox Detector) 是一种广泛应用的实时目标检测算法,它在检测速度和精度上取得了良好的平衡。Caffe 是一种高效、开源的深度学习框架,常用于实现 SSD 网络。在 SSD 的训练过程中,为了优化模型性能,通常会进行数据预处理,其中包括对目标框的宽高比聚类。本项目中的“Caffe-ssd的宽高比聚类”就是针对这一环节的具体实践。 宽高比(Aspect Ratio)是目标框的宽度与高度的比例,不同的目标可能具有不同的宽高比。在 SSD 中,预先定义一组固定比例的 anchor boxes(也称为默认框),这些 anchor boxes 应覆盖训练集中可能出现的各种目标尺寸和宽高比。通过宽高比聚类,我们可以更准确地确定这些 anchor boxes,从而提高模型对不同形状目标的检测能力。 该项目包含两个主要的程序: 1. **从 XML 文件中批量获取标注目标的宽与高**:XML 文件通常用于存储图像的物体检测标注信息,包括边界框的位置(左上角和右下角坐标)和类别标签。这个程序读取这些 XML 文件,提取每个目标物体的边界框宽和高,为后续的宽高比计算做准备。 2. **K-means 维度聚类程序(可视化绘图)**:K-means 聚类是一种常用的数据分析方法,用于将数据点分组到 k 个类别中,使得同一类内的数据点相似性最大,类间的差异性最大。在这个项目中,K-means 被用来对目标框的宽高比进行聚类,以找到最佳的 anchor box 比例。聚类结果可视化可以帮助我们理解目标宽高比的分布,并选择合适的 anchor box 数量和比例。 实施步骤如下: 1. **数据收集**:从 XML 标注文件中读取目标物体的宽和高,形成一个二维数据集,其中每一项代表一个目标框的宽高比。 2. **预处理**:对数据进行标准化或归一化,确保聚类过程不受数值范围影响。 3. **K-means 聚类**:设定聚类数量(k 值),运行 K-means 算法对宽高比进行分组。算法会迭代更新每个数据点的类别归属和聚类中心,直到满足停止条件(如达到最大迭代次数或中心点不再显著移动)。 4. **结果分析**:分析聚类结果,选择每个类别的中心值作为 anchor box 的宽高比。同时,通过可视化工具展示聚类结果,直观地查看宽高比的分布情况。 5. **应用到 SSD**:将聚类得到的 anchor box 比例应用于 SSD 模型,调整模型结构,然后继续训练过程。 K-means 聚类在 SSD 中的应用是一个迭代优化的过程,可能需要多次尝试不同的 k 值和预处理方式,以找到最优的 anchor box 设置。优化 anchor boxes 可以显著提高 SSD 模型对不同形状目标的检测效果,尤其是在处理形状差异较大的目标时。因此,"Caffe-ssd的宽高比聚类" 是 SSD 目标检测系统中非常重要的一步,对于提升模型性能至关重要。






























- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整

- 粉丝: 426
- 资源: 6
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- C#初学者的编程入门与实践基础教程
- PHP初学者的入门与实践基础教程
- JavaScript初学者的入门与实践基础教程
- AI大模型学习与使用入门基础教程
- 大学生实验报告编写基础教程:从入门到精通
- Matlab仿真入门与实践基础教程
- Cocos Creator快速上手与游戏开发基础教程
- 硬件开发入门:从原理到实践基础教程
- 蓝桥杯初学者的Python编程入门基础教程
- (源码)基于Python的IoT猫监控系统.zip
- (源码)基于Arduino的自动衣物折叠设备(StakeFolder).zip
- (源码)基于Arduino的pypilot舵机控制器.zip
- (源码)基于ESP32和蓝牙低能耗协议的GIF图像传输系统.zip
- (源码)基于Arduino的花型灯光装饰项目.zip
- (源码)基于Fiware平台的Interwatch健康监测项目.zip
- (源码)基于Node.js的Minecraft机器人ZMBot.zip


