Python实用记录(七):通过retinaface对CASIA-WebFace人脸数据集进行清洗,并把错误图路径放入txt文档

简介: 使用RetinaFace模型对CASIA-WebFace人脸数据集进行清洗,并将无法检测到人脸的图片路径记录到txt文档中。

由于这些数据集是通过爬虫直接在网上下载的,有很多错误的图,需要把它们找出来进行删除。
1:使用RetinaFace对给定的图片做人脸检测,对于提取不到landmark/boundingbox的图片逐个做分析。
2:将图像缩小送进网络训练发现很多都可以检测出来了,其实retinaface对尺度比较小的图片效果会好很多

https://download.csdn.net/download/m0_51004308/19513502?spm=1001.2014.3001.5501这是基于python版本的整个完整的数据集清洗(包括retainface模型文件,运行操作也非常简单,只需要把你的数据集路径加入其中就行。有详细注释,需要可以了解)

import numpy as np
import torch
import cv2
from retinaface.detector import RetinafaceDetector, RetinafaceDetector_dnn
from align_faces import align_process

class retinaface():
    def __init__(self, device = 'cuda', align=False):
        self.retinaface = RetinafaceDetector(device=device)
        self.align = align
    def detect(self, srcimg):
        bounding_boxes, landmarks = self.retinaface.detect_faces(srcimg)
        drawimg, face_rois = srcimg.copy(), []
        for i in range(bounding_boxes.shape[0]):
            # score = bounding_boxes[i,4]
            x1, y1, x2, y2 = (bounding_boxes[i, :4]).astype(np.int32)
            cv2.rectangle(drawimg, (x1, y1), (x2, y2), (0, 0, 255), thickness=2)
            face_roi = srcimg[y1:y2, x1:x2]
            landmark = landmarks[i, :].reshape((2, 5)).T
            if self.align:
                face_roi = align_process(srcimg, bounding_boxes[i, :4], landmark, (224, 224))
            landmark = landmark.astype(np.int32)
            for j in range(5):
                cv2.circle(drawimg, (landmark[j, 0], landmark[j, 1]), 2, (0, 255, 0), thickness=-1)
                # cv2.putText(drawimg, str(j), (landmark[j, 0], landmark[j, 1] + 12), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255))
            face_rois.append(face_roi)
        return drawimg, face_rois
    def get_face(self, srcimg):
        bounding_boxes, landmarks = self.retinaface.detect_faces(srcimg)
        boxs, face_rois = [], []
        for i in range(bounding_boxes.shape[0]):
            # score = bounding_boxes[i,4]
            box = (bounding_boxes[i, :4]).astype(np.int32).tolist()
            face_roi = srcimg[box[1]:box[3], box[0]:box[2]]
            landmark = landmarks[i, :].reshape((2, 5)).T
            if self.align:
                face_roi = align_process(srcimg, bounding_boxes[i, :4], landmark, (224, 224))
            box.extend(landmark.astype(np.int32).ravel().tolist())
            boxs.append(tuple(box))
            face_rois.append(face_roi)
        return boxs, face_rois

class retinaface_dnn():
    def __init__(self, align=False):
        self.net = RetinafaceDetector_dnn()
        self.align = align

    def detect(self, srcimg):
        bounding_boxes, landmarks = self.net.detect_faces(srcimg)
        drawimg, face_rois = srcimg.copy(), []
        for i in range(bounding_boxes.shape[0]):
            # score = bounding_boxes[i,4]
            x1, y1, x2, y2 = (bounding_boxes[i, :4]).astype(np.int32)
            cv2.rectangle(drawimg, (x1, y1), (x2, y2), (0, 0, 255), thickness=2)
            face_roi = srcimg[y1:y2, x1:x2]
            landmark = landmarks[i, :].reshape((2, 5)).T
            if self.align:
                face_roi = align_process(srcimg, bounding_boxes[i, :4], landmark, (224, 224))
            landmark = landmark.astype(np.int32)
            for j in range(5):
                cv2.circle(drawimg, (landmark[j, 0], landmark[j, 1]), 2, (0, 255, 0), thickness=-1)
                # cv2.putText(drawimg, str(j), (landmark[j, 0], landmark[j, 1] + 12), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255))
            face_rois.append(face_roi)
        return drawimg, face_rois

    def get_face(self, srcimg):
        bounding_boxes, landmarks = self.net.detect_faces(srcimg)
        boxs, face_rois = [], []
        for i in range(bounding_boxes.shape[0]):
            # score = bounding_boxes[i,4]
            box = (bounding_boxes[i, :4]).astype(np.int32).tolist()
            face_roi = srcimg[box[1]:box[3], box[0]:box[2]]
            landmark = landmarks[i, :].reshape((2, 5)).T
            if self.align:
                face_roi = align_process(srcimg, bounding_boxes[i, :4], landmark, (224, 224))
            box.extend(landmark.astype(np.int32).ravel().tolist())
            boxs.append(tuple(box))
            face_rois.append(face_roi)
        return boxs, face_rois

if __name__ == "__main__":
    device = 'cuda' if torch.cuda.is_available() else 'cpu'
    # retinaface_detect = retinaface(device=device, align=True)
    retinaface_detect = retinaface_dnn(align=True)
    ###dnn版本和pytorch版本的一个区别是: pytorch版本的输入图片不做resize就进入到网络里,而dnn版本的输入图片要resize到固定尺寸的,
    ###输入不同,因此对这两个版本的输出不做比较
    import os,sys


    f = open('error.txt', 'w')
    imgroot = '/home/lqs/Documents/arcface-pytorch-master/data/CASIA-WebFace/'
    #imgroot = '/home/lqs/Documents/arcface-pytorch-master/data/902_Pic_Fea/'
    im=0
    dirlist = os.listdir(imgroot)  ### imgroot里有多个文件夹,每个文件夹存放着一个人物的多个肖像照,文件夹名称是人名
    for i, name in enumerate(dirlist):
        sys.stdout.write("\rRun person{0}-{1}, name:{2}\n".format(i,len(dirlist),name))
        sys.stdout.flush()
        imgdir = os.path.join(imgroot, name)
        imglist = os.listdir(imgdir)
        for imgname in imglist:
            imapath=os.path.join(imgdir, imgname)
            srcimg = cv2.imread(imapath)
            drawimg, face_rois = retinaface_detect.detect(srcimg)
            # cv2.imshow('face_rois',face_rois)
            # cv2.waitKey(0)
            #print(len(face_rois))
            if len(face_rois)==0:
                f.write(imapath + '\n')
                im+=1
                print('the error pic',imapath)
    print('the totle error pic  {} 个'.format(im))
    f = open("/home/lqs/Documents/arcface-pytorch-master/data/error.txt", "r")
    lines = f.readlines()  # 读取全部内容
    print('the len of txt is {}'.format(len(lines)))
目录
相关文章
|
1月前
|
Python
Python实用记录(六):如何打开txt文档并删除指定绝对路径下图片
这篇文章介绍了如何使用Python打开txt文档,删除文档中指定路径的图片,并提供了一段示例代码来展示这一过程。
27 1
|
4天前
|
机器学习/深度学习 算法 PyTorch
用Python实现简单机器学习模型:以鸢尾花数据集为例
用Python实现简单机器学习模型:以鸢尾花数据集为例
17 1
|
30天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
44 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
30天前
|
计算机视觉 Python
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
这篇文章介绍了如何使用Python的OpenCV库将多张图片合并为一张图片显示,以及如何使用matplotlib库从不同txt文档中读取数据并绘制多条折线图。
41 3
Python实用记录(九):将不同的图绘制在一起、将不同txt文档中的数据绘制多条折线图
|
30天前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
36 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
30天前
|
Python
Python实用记录(十二):文件夹下所有文件重命名以及根据图片路径保存到新路径下保存
这篇文章介绍了如何使用Python脚本对TTK100_VOC数据集中的JPEGImages文件夹下的图片文件进行批量重命名,并将它们保存到指定的新路径。
32 0
|
机器学习/深度学习 传感器 SQL
Python 数据竞赛常用 | 可视化数据集缺失情况
无论是打比赛还是在实际工程项目中,都会遇到数据缺失的情况,如果数据集较小,还能在 Excel 或者其他可视化软件大致看一下导致数据缺失的原因。但当数据集较大时,手工查看每个变量的缺失值是非常麻烦的一件事情。 数据探索和预处理也是任何数据科学或机器学习工作流中的重要步骤。缺失数据可能是处理真实数据集时最常见的问题之一,数据丢失的原因很多,包括传感器故障、数据过时、数据管理不当,甚至人为错误。丢失的数据可能以单个值、一个要素中的多个值或整个要素丢失的形式出现。
534 0
Python 数据竞赛常用 | 可视化数据集缺失情况
|
1天前
|
设计模式 算法 搜索推荐
Python编程中的设计模式:优雅解决复杂问题的钥匙####
本文将探讨Python编程中几种核心设计模式的应用实例与优势,不涉及具体代码示例,而是聚焦于每种模式背后的设计理念、适用场景及其如何促进代码的可维护性和扩展性。通过理解这些设计模式,开发者可以更加高效地构建软件系统,实现代码复用,提升项目质量。 ####
|
1天前
|
机器学习/深度学习 数据挖掘 开发者
Python编程入门:理解基础语法与编写第一个程序
【10月更文挑战第37天】本文旨在为初学者提供Python编程的初步了解,通过简明的语言和直观的例子,引导读者掌握Python的基础语法,并完成一个简单的程序。我们将从变量、数据类型到控制结构,逐步展开讲解,确保即使是编程新手也能轻松跟上。文章末尾附有完整代码示例,供读者参考和实践。
|
1天前
|
人工智能 数据挖掘 程序员
Python编程入门:从零到英雄
【10月更文挑战第37天】本文将引导你走进Python编程的世界,无论你是初学者还是有一定基础的开发者,都能从中受益。我们将从最基础的语法开始讲解,逐步深入到更复杂的主题,如数据结构、面向对象编程和网络编程等。通过本文的学习,你将能够编写出自己的Python程序,实现各种功能。让我们一起踏上Python编程之旅吧!