当前位置:   article > 正文

(12-3)AI人脸识别系统:数据集_人脸识别数据集

人脸识别数据集

12.3  数据集

在进行人脸识别之前,需要先准备好数据集。该项目训练数据使用emore数据集,一共有85742个人,共5822653张图片,使用lfw-align-128数据集作为测试数据。

12.3.1  准备数据集

在本项目的素材文件中提供了标注文件,被存放在工程的“dataset”目录下,解压后即可使用。另外还需要下载下面这两个数据集,下载完成后也需要解压到“dataset”目录下。

  1. emore数据集
  2. lfw-align-128数据集

12.3.2  提取人脸

编写文件create_dataset.py,功能是将提取到人脸图片到“dataset/images”目录,并把整个数据集打包为二进制文件。之所以打包为二进制文件,因为这样可以大幅度的提高训练时读取数据的速度。文件create_dataset.py的主要实现代码如下所示。

  1. # 从train.rec提前图片到images目录
  2. def load_mx_rec(dataset_path, rec_path):
  3. save_path = dataset_path / 'images'
  4. if not save_path.exists():
  5. save_path.mkdir()
  6. imgrec = mx.recordio.MXIndexedRecordIO(str(rec_path / 'train.idx'), str(rec_path / 'train.rec'), 'r')
  7. img_info = imgrec.read_idx(0)
  8. header, _ = mx.recordio.unpack(img_info)
  9. max_idx = int(header.label[0])
  10. for idx in tqdm(range(1, max_idx)):
  11. img_info = imgrec.read_idx(idx)
  12. header, img = mx.recordio.unpack_img(img_info)
  13. label = int(header.label)
  14. label_path = save_path / str(label)
  15. if not label_path.exists():
  16. label_path.mkdir()
  17. path = str(label_path / '{}.jpg'.format(idx))
  18. cv2.imwrite(path, img)
  19. class DataSetWriter(object):
  20. def __init__(self, prefix):
  21. # 创建对应的数据文件
  22. self.data_file = open(prefix + '.data', 'wb')
  23. self.header_file = open(prefix + '.header', 'wb')
  24. self.label_file = open(prefix + '.label', 'wb')
  25. self.offset = 0
  26. self.header = ''
  27. def add_img(self, key, img):
  28. # 写入图像数据
  29. self.data_file.write(struct.pack('I', len(key)))
  30. self.data_file.write(key.encode('ascii'))
  31. self.data_file.write(struct.pack('I', len(img)))
  32. self.data_file.write(img)
  33. self.offset += 4 + len(key) + 4
  34. self.header = key + '\t' + str(self.offset) + '\t' + str(len(img)) + '\n'
  35. self.header_file.write(self.header.encode('ascii'))
  36. self.offset += len(img)
  37. def add_label(self, label):
  38. # 写入标签数据
  39. self.label_file.write(label.encode('ascii') + '\n'.encode('ascii'))
  40. # 人脸识别训练数据的格式转换
  41. def convert_data(root_path, output_prefix):
  42. # 读取全部的数据类别获取数据
  43. person_id = 0
  44. data = []
  45. persons_dir = os.listdir(root_path)
  46. for person_dir in persons_dir:
  47. images = os.listdir(os.path.join(root_path, person_dir))
  48. for image in images:
  49. image_path = os.path.join(root_path, person_dir, image)
  50. data.append([image_path, person_id])
  51. person_id += 1
  52. print("训练数据大小:%d,总类别为:%d" % (len(data), person_id))
  53. # 开始写入数据
  54. writer = DataSetWriter(output_prefix)
  55. for image_path, person_id in tqdm(data):
  56. try:
  57. key = str(uuid.uuid1())
  58. img = cv2.imread(image_path)
  59. _, img = cv2.imencode('.bmp', img)
  60. # 写入对应的数据
  61. writer.add_img(key, img.tostring())
  62. label_str = str(person_id)
  63. writer.add_label('\t'.join([key, label_str]))
  64. except:
  65. continue
  66. if __name__ == '__main__':
  67. load_mx_rec(Path('dataset'), Path('dataset/faces_emore'))
  68. convert_data('dataset/images', 'dataset/train_data')

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/373372
推荐阅读
相关标签
  

闽ICP备14008679号