1. Preparación del proyecto
1. Referencia de comprensión del proyecto: https://blog.csdn.net/hanjiangxue_wei/article/details/86566435
2. Dirección del proyecto: https://github.com/deepinsight/insightface
3. Clona el proyecto anterior en el servidor local.
En el modo de línea de comandos en xshell:
- Conéctese al servidor: nombre de dominio del servidor ssh, introduzca el nombre de usuario y la contraseña;
- Cambie el directorio de trabajo a la ubicación especificada: cd dir;
- Clone el proyecto en este directorio: git clone https://github.com/deepinsight/insightface
2. Descarga de datos originales: tome los datos lfw como ejemplo, descargue los datos de la imagen original lfw.
3. Proceso de producción de datos
1. Alineación de datos
- Cree la carpeta lfwdata: ruta insightface / datasets / lfwdata /, propósito de almacenar datos brutos lfw y datos de alineación lfw_align;
- Cree la carpeta lfw_align: path insightface / datasets / lfwdata / lfw_align, con el propósito de almacenar los datos de corte y cara alineada;
- En la línea de comando xshell, active el entorno, cambie al directorio donde se encuentra insightface / src / align / align_lfw.py y ejecute la siguiente declaración: python3 align_lfw.py --input-dir './ insightface / datasets / lfwdata / lfw '--output -dir' ./ insightface / datasets / lfwdata / lfw_align '
2. Generar lista: almacenar en insightface / datasets / lfwdata / lfw
- Cree un nuevo archivo generatelst.py en insightface / src / data / e ingrese el siguiente contenido:
import os
import random
import argparse
class PairGenerator:
def __init__(self, data_dir, pairs_filepath, img_ext):
"""
Parameter data_dir, is your data directory.
Parameter pairs_filepath, where is the pairs.txt that belongs to.
Parameter img_ext, is the image data extension for all of your image data.
"""
self.data_dir = data_dir
self.pairs_filepath = pairs_filepath
self.img_ext = img_ext
# splitting the database content into 10 random sets
def split_to_10(self):
folders = []
cnt = 0
for name in os.listdir(self.data_dir):
folders.append(name)
folders = sorted(folders) # sorting names in abc order
a = []
# names of folders - e.g. Talgat Bigeldinov, Kairat Nurtas, etc.
for name in folders:
# f = open(self.pairs_filepath, 'a+')
# looping through image files in one folder
for file in os.listdir(self.data_dir + '/' + name):
# a.append(data_dir + name + '/' + file)
a.append(name)
cnt = cnt + 1
cnt = cnt + 1
random.shuffle(a)
# splitting the database content into 10 random sets
def write_similar(self, lst):
f = open(self.pairs_filepath, 'a+')
for i in range(20):
left = random.choice(lst)
right = random.choice(lst)
f.write(left + '\t' + right + '\t' + '1\n')
# writing 1 IMAGE_PATH LABEL like insightface lst file needs
def write_item_label(self):
cnt = 0
for name in os.listdir(self.data_dir):
if name == ".DS_Store":
continue
# print(name)
a = []
f = open(self.pairs_filepath, 'a+')
for file in os.listdir(self.data_dir + '/' + name):
if file == ".DS_Store":
continue
a.append(data_dir + '/' + name + '/' + file)
f.write(str(1) + '\t' + data_dir + '/' + name + '/' + file + '\t' + str(cnt) + '\n')
cnt = cnt + 1
# writing 1 IMAGE_PATH LABEL like insightface lst file needs in alphabetic order
def write_item_label_abc(self):
cnt = 0
names = []
for name in os.listdir(self.data_dir):
names.append(name)
names = sorted(names)
for name in names:
print(name)
a = []
f = open(self.pairs_filepath, 'a+')
for file in os.listdir(self.data_dir + '/' + name):
if file == ".DS_Store":
continue
a.append(data_dir + '/' + name + '/' + file)
f.write(str(1) + '\t' + data_dir + '/' + name + '/' + file + '\t' + str(cnt) + '\n')
cnt = cnt + 1
def write_different(self, lst1, lst2):
f = open(self.pairs_filepath, 'a+')
for i in range(500):
left = random.choice(lst1)
right = random.choice(lst2)
f.write(left + '\t' + right + '\t' + '0\n')
f.close()
def generate_pairs(self):
for name in os.listdir(self.data_dir):
if name == ".DS_Store":
continue
a = []
for file in os.listdir(self.data_dir + '/' + name):
if file == ".DS_Store":
continue
a.append(name + '/' + file)
generatePairs.write_similar(a)
def generate_non_pairs(self):
folder_list = []
for folder in os.listdir(self.data_dir):
folder_list.append(folder)
folder_list.sort(reverse=True)
# print(folder_list)
i = 0
a = []
for dir in os.listdir(self.data_dir):
if dir == ".DS_Store":
continue
for file in os.listdir(self.data_dir + dir):
if file == ".DS_Store":
continue
a.append(dir + '/' + file)
# print(a)
b = []
for dir in os.listdir(self.data_dir):
if dir == ".DS_Store":
continue
for file in os.listdir(self.data_dir + folder_list[i]):
if file == ".DS_Store":
continue
b.append(folder_list[i] + '/' + file)
# print(b)
i = i + 1
generatePairs.write_different(a, b)
if __name__ == '__main__':
# data_dir = "/home/ti/Downloads/DATASETS/out_data_crop/"
# pairs_filepath = "/home/ti/Downloads/insightface/src/data/pairs.txt"
# alternative_lst = "/home/ti/Downloads/insightface/src/data/crop.lst"
# test_txt = "/home/ti/Downloads/DATASETS/out_data_crop/test.txt"
# img_ext = ".png"
# arguments to pass in command line
parser = argparse.ArgumentParser(description='Rename images in the folder according to LFW format: Name_Surname_0001.jpg, Name_Surname_0002.jpg, etc.')
parser.add_argument('--dataset-dir', default='', help='Full path to the directory with peeople and their names, folder should denote the Name_Surname of the person')
parser.add_argument('--list-file', default='', help='Full path to the directory with peeople and their names, folder should denote the Name_Surname of the person')
parser.add_argument('--img-ext', default='', help='Full path to the directory with peeople and their names, folder should denote the Name_Surname of the person')
# reading the passed arguments
args = parser.parse_args()
data_dir = args.dataset_dir
lst = args.list_file
img_ext = args.img_ext
# generatePairs = PairGenerator(data_dir, pairs_filepath, img_ext)
# generatePairs.write_item_label()
# generatePairs = PairGenerator(data_dir, pairs_filepath, img_ext)
generatePairs = PairGenerator(data_dir, lst, img_ext)
generatePairs.write_item_label_abc() # looping through our dataset and creating 1 ITEM_PATH LABEL lst file
# generatePairs.generate_pairs() # to use, please uncomment this line
# generatePairs.generate_non_pairs() # to use, please uncomment this line
# generatePairs = PairGenerator(dataset_dir, test_txt, img_ext)
# generatePairs.split_to_10()
- Cambie al directorio donde se encuentra src / data / generatelst.py y ejecute la siguiente instrucción:
- python3 generatelst.py --dataset-dir ./insightface/datasets/lfwdata/lfw_align --list-file ./insightface/datasets/lfwdata/lfw/train.lst --img-ext '.jpg'
- --dataset-dir seguido del directorio de imágenes alineadas, ruta absoluta (en la carpeta lfw_align)
- --list-file-dir seguido del directorio de salida de train.lst, ruta absoluta (debajo de la carpeta lfw)
- python3 generatelst.py --dataset-dir ./insightface/datasets/lfwdata/lfw_align --list-file ./insightface/datasets/lfwdata/lfw/train.lst --img-ext '.jpg'
3. Genere archivos rec e idx: almacénelos en / insightface / datasets / lfwdata / lfw
- Cree un archivo de propiedades en / insightface / datasets / lfwdata / lfw sin sufijo;
- Abra la propiedad a través del comando vi, ingrese el número de ID (cuántas personas), el tamaño de la imagen, el tamaño de la imagen, es decir, 5749, 112, 112;
- Ejecute el comando en xshell: python face2rec2.py ./insightface/datasets/lfwdata/lfw/
4. Genere archivos bin y par (datos del conjunto de validación): almacénelos en / insightface / datasets / lfwdata / lfw
(1) Generar archivo de pares
- Ejecute los siguientes comandos en xshell: python3 generate_image_pairs.py --data-dir ./insightface/datasets/lfwdata/lfw_align --outputtxt ./insightface/datasets/lfwdata/lfw/train.txt --num-samepairs 1000
- --data-dir seguido de la cara alineada
- --outputtxt se usa para guardar el archivo train.txt
- --num-samepairs cuántos pares generar
- Después de ejecutarse correctamente, se generará un archivo train.txt en datasets / train
(2) Generar archivo bin
- Ejecute los siguientes comandos en xshell: python3 lfw2pack.py --data-dir ./insightface/datasets/lfwdata/lfw --output ./insightface/datasets/lfwdata/lfw/lfw.bin --num-samepairs 1000