[人脸数据集] 数据集处理:将MAFA人脸数据集的.mat标注格式转为.xml格式

一. 数据集分析

1.1解压从官方下载的MAFA数据集后,文件结构:

(官方链接已失效,博主分享出来链接:https://pan.baidu.com/s/1HaBc5ybGG7X429Nzz-2CUg 
提取码:j58x)

train_images/

test_images/

LabelTrainAll.mat

LabelTestAll.mat

readme-test.txt

readme-train.txt

可用看看这个txt文件,解释了标注规范,重点!这个数据集的训练集标注出了有遮挡的人类面部,而没有遮挡的面部没有标出,测试集中,将面部分成了 { 没遮挡的脸、遮挡的脸、 invalid 脸}

二. mat 2 xml

.mat的数据标注格式用起来总会不爽,改成常用的xml非常重要。

先把装xml的文件夹建好,

test_xml/, train_xml/

train 和 test的数据集标注略有不同,作者的txt文件也解释得相当清楚了,所以直接把代码拿出来看吧

import scipy.io as sio
import numpy as np
from PIL import Image


label_map = {'1':'face_mask','1.0':'face_mask','2':'face','2.0':'face','3':'invalid','3.0':'invalid'}

def testMat2xml():

	xmlflie = 'test_xml/'
	imgflie = 'test_images/'
	load_path = 'LabelTestAll.mat'
	dict_keys_data = 'LabelTest'

	load_data = sio.loadmat(load_path)
	# print(load_data.keys())
	# dict_keys(['__header__', '__version__', '__globals__', 'LabelTest'])
	# dict_keys(['__header__', '__version__', '__globals__', 'label_train'])

	for idx in range(len(load_data[dict_keys_data][0])):
		# print(len(load_data[dict_keys_data][0]))
		imgName = load_data[dict_keys_data][0][idx][0][0]   # test_00004934.jpg
		# print(imgName)

		imgPath = imgflie + imgName
		img = Image.open(imgPath)
		imgWidth, imgHeight = img.size

		xml_file = open(xmlflie + imgName.split(".")[-2] + '.xml', 'w')
		xml_file.write('<annotation>\n')
		xml_file.write('	<folder>' + 'MAFA/' + imgflie + '</folder>\n')
		xml_file.write('	<filename>' + imgName + '</filename>\n')
		xml_file.write('	<size>\n')
		xml_file.write('		<width>' + str(imgWidth) + '</width>\n')
		xml_file.write('		<height>' + str(imgHeight) + '</height>\n')
		xml_file.write('		<depth>' + str(3) + '</depth>\n')
		xml_file.write('	</size>\n')

		bboxLen = len(load_data[dict_keys_data][0][idx][2]) # 每张图标有几个bbox

		# print(bboxLen)
		for bbox in range(bboxLen):
			x,y,w,h,label = load_data[dict_keys_data][0][idx][2][bbox][0:5]
			# print(x,y,w,h,label)
			# print(str(label_map[str(label)]))

			xml_file.write('	<object>\n')
			xml_file.write('		<name>' + str(label_map[str(label)]) + '</name>\n')
			xml_file.write('		<bndbox>\n')
			xml_file.write('			<xmin>' + str(x) + '</xmin>\n')
			xml_file.write('			<ymin>' + str(y) + '</ymin>\n')
			xml_file.write('			<xmax>' + str(x + w) + '</xmax>\n')
			xml_file.write('			<ymax>' + str(y + h) + '</ymax>\n')
			xml_file.write('		</bndbox>\n')
			xml_file.write('	</object>\n')
		xml_file.write('</annotation>\n')
		xml_file.close()

def trainMat2xml():

	xmlflie = 'train_xml/'
	imgflie = 'train_images/'
	load_path = 'LabelTrainAll.mat'
	dict_keys_data = 'label_train'

	load_data = sio.loadmat(load_path)


	for idx in range(len(load_data[dict_keys_data][0])):
	# for idx in range(400):
		imgName = load_data[dict_keys_data][0][idx][1][0]   # train_0000xxxx.jpg
		# print(imgName)
		# print(load_data[dict_keys_data][0][idx][1][0])

		imgPath = imgflie + imgName
		img = Image.open(imgPath)
		imgWidth, imgHeight = img.size

		xml_file = open(xmlflie + imgName.split(".")[-2] + '.xml', 'w')
		xml_file.write('<annotation>\n')
		xml_file.write('	<folder>' + 'MAFA/' + imgflie + '</folder>\n')
		xml_file.write('	<filename>' + imgName + '</filename>\n')
		xml_file.write('	<size>\n')
		xml_file.write('		<width>' + str(imgWidth) + '</width>\n')
		xml_file.write('		<height>' + str(imgHeight) + '</height>\n')
		xml_file.write('		<depth>' + str(3) + '</depth>\n')
		xml_file.write('	</size>\n')

		bboxLen = len(load_data[dict_keys_data][0][idx][2])

		for i in range(bboxLen):
			x,y,w,h, x1,y1,x2,y2, x3,y3,w3,h3, occ_type, occ_degree, gender, race, orientation, x4,y4,w4,h4 = load_data[dict_keys_data][0][idx][2][i][0:21]
			print(x,y,w,h)
			print(x1,y1,x2,y2)
			print(x3,y3,w3,h3)
			print(occ_type, occ_degree, gender, race, orientation)
			print(x4,y4,w4,h4)

			xml_file.write('	<object>\n')
			xml_file.write('		<name>' + 'face/maskface' + '</name>\n')
			xml_file.write('		<bndbox>\n')
			xml_file.write('			<xmin>' + str(x) + '</xmin>\n')
			xml_file.write('			<ymin>' + str(y) + '</ymin>\n')
			xml_file.write('			<xmax>' + str(x + w) + '</xmax>\n')
			xml_file.write('			<ymax>' + str(y + h) + '</ymax>\n')
			xml_file.write('		</bndbox>\n')
			xml_file.write('	</object>\n')

			xml_file.write('	<object>\n')
			xml_file.write('		<name>' + '2eyes' + '</name>\n')
			xml_file.write('		<bndbox>\n')
			xml_file.write('			<xmin>' + str(x1) + '</xmin>\n')
			xml_file.write('			<ymin>' + str(y1) + '</ymin>\n')
			xml_file.write('			<xmax>' + str(x2) + '</xmax>\n')
			xml_file.write('			<ymax>' + str(y2) + '</ymax>\n')
			xml_file.write('		</bndbox>\n')
			xml_file.write('	</object>\n')
			
			xml_file.write('	<object>\n')
			xml_file.write('		<name>' + 'occluder' + '</name>\n')
			xml_file.write('		<bndbox>\n')
			xml_file.write('			<xmin>' + str(x + x3) + '</xmin>\n')
			xml_file.write('			<ymin>' + str(y + y3) + '</ymin>\n')
			xml_file.write('			<xmax>' + str(x + x3 + w3) + '</xmax>\n')
			xml_file.write('			<ymax>' + str(y + y3 + h3) + '</ymax>\n')
			xml_file.write('		</bndbox>\n')
			xml_file.write('	</object>\n')

		xml_file.write('</annotation>\n')
		xml_file.close()



if __name__ == '__main__':
    testMat2xml()
    trainMat2xml()

原创小脚本,希望对你有所帮助!

(•̀ᴗ•́)و ̑̑点赞

  • 15
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
YOLOv5是一种目标检测算法,最近它被应用于口罩识别任务中。下面是关于YOLOv5口罩识别的总结分析: 1. 算法原理 YOLOv5算法基于深度学习技术,采用了一种基于anchor boxes的目标检测方法。它将输入的图像分成多个网格,每个网格负责检测图像中的一个目标。然后,算法使用卷积神经网络从每个网格中提取特征,并预测每个网格中是否存在口罩以及口罩的位置和大小。这个过程中使用的是多层卷积神经网络结构,可以学习到更复杂的特征,从而提高检测的准确率和效率。 2. 数据集 为了训练和测试口罩检测算法,需要使用大量的图像数据。目前有一些公开数据集,例如MMASS、MaskedFace-Net和MAFA等。这些数据集包含了不同种类的图像,可以用于训练和测试口罩检测算法。此外,也可以通过在真实场景中采集图像数据来扩充数据集,以提高算法的适用性。 3. 性能评估 为了评估算法的性能,需要使用一些指标。目前常用的指标包括精确率、召回率、F1分数和平均精度均值(mAP)等。这些指标可以帮助我们了解算法在不同情况下的性能,从而进行改进和优化。 4. 应用场景 口罩识别算法可以应用于各种场景,例如公共交通、医院和商场等。在疫情期间,口罩识别技术可以帮助检查人员快速准确地识别出未佩戴口罩的人员,从而保障公共卫生和安全。 总之,YOLOv5是一种高效、准确的口罩识别算法,可以帮助我们应对疫情等重大挑战。在未来,随着技术的不断发展和应用场景的不断扩大,口罩识别技术的应用前景将更加广阔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值