鱼C论坛

 找回密码
 立即注册
查看: 930|回复: 3

求助大佬,在这个问题怎么解决呢?

[复制链接]
发表于 2023-5-30 10:34:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
ao1.py
import cv2
import numpy as np
import dlib


def cv_show(neme, img):
    cv2.namedWindow(neme, cv2.WINDOW_NORMAL)
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


class Eigenvector(object):
    def __init__(self):
        # resnet模型
        self.face_descriptor_extractor = dlib.face_recognition_model_v1(
            './data/data_dlib/dlib_face_recognition_resnet_model_v1.dat')

        # 人脸检测模型
        self.hog_face_detector = dlib.get_frontal_face_detector()
        # 获取人脸的68个关键点
        self.shape_detector = dlib.shape_predictor('./data/data_dlib/shape_predictor_68_face_landmarks.dat')

    def fun1(self, img):
        # 检测人脸
        detections = self.hog_face_detector(img, 1)
        # 可能识别多张人脸(但只要第一个识别到的人脸)
        for face in detections:
            # # 人脸框坐标
            # l, t, r, b = face.left(), face.top(), face.right(), face.bottom()
            # 获取68个关键点
            points = self.shape_detector(img, face)

            # # 绘制关键点
            # for point in points.parts():
            #     cv2.circle(img, (point.x, point.y), 2, (0, 255, 0), 1)
            #
            # # 绘制矩形框
            # cv2.rectangle(img, (l, t), (r, b), (0, 255, 0), 2)
            # cv_show('neme', img)

            # 获取特征描述符
            # 功能:图像中的68个关键点转换为128D面部描述符,其中同一人的图片被映射到彼此附近,并且不同人的图片被远离地映射。
            # 参数:img_rd:人脸灰度图,类型:numpy.ndarray
            #    shape:68个关键点位置
            # 返回值:128D面部描述符
            face_descriptor = self.face_descriptor_extractor.compute_face_descriptor(img, points)

            # 转为numpy 格式的数组
            face_descriptor = [f for f in face_descriptor]

            face_descriptor = np.array(face_descriptor, dtype=np.float64)

            face_descriptor = np.reshape(face_descriptor, (1, -1))
            # print(face_descriptor.shape)
            return face_descriptor


if __name__ == '__main__':
    # 提取人脸区域
    path = './data/jm/1.jpg'
    img = cv2.imread(path)
    # 转为RGB  为了准确率
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    # 返回值:128D面部描述符
    p = Eigenvector().fun1(img)
    print(p.shape)

ao2.py
# 批量读取数据
import os
import cv2
import numpy as np

import ao1


def cv_show(neme, img):
    cv2.namedWindow(neme, cv2.WINDOW_NORMAL)
    cv2.imshow(neme, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def r_path_name(path):
    list_img = os.listdir(path)

    # 一个人的特征表
    person = []
    # 标签列表
    lab = []

    # 标签号
    lab_n = 0

    for i in range(len(list_img)):
        list_img_name = os.listdir(path + list_img[i])

        lab_n += 1

        # 当前类别的特征集合
        feature_list = None

        for j in list_img_name:
            path_n = path + list_img[i] + "/" + j

            # 读取图片
            img = cv2.imread(path_n)
            # 转为RGB  为了提高准确率
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

            # cv_show('neme', img)

            # 人脸特征向量
            feat = ao1.Eigenvector().fun1(img)

            # 如果识别到了人脸
            if not feat is None:
                if feature_list is None:
                    feature_list = feat
                else:
                    # 特征列表 拼接矩阵 竖向合并
                    feature_list = np.concatenate((feature_list, feat), axis=0)
        person.append(feature_list)
        lab.append(lab_n)
    return person, lab


if __name__ == '__main__':
    path = "./data/jm/"
    img, lab = r_path_name(path)

    print(len(img))
    print(len(lab))

    # 保存路径
    path_s = "./data/train"
    # 保存csv
    for i, j in zip(img, lab):

        fo1 = open(f"{path_s}{j}.txt", "w", encoding="utf-8")

        # 写入
        fo1.write(str(i.tolist()))
        # 关闭打开的文件
        fo1.close()

NotADirectoryError: [WinError 267] 目录名称无效。: './data/jm/1.jpg'

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-30 10:37:38 | 显示全部楼层
根据错误信息  NotADirectoryError: [WinError 267] 目录名称无效。: './data/jm/1.jpg' ,它表明你在尝试列出目录'./data/jm/1.jpg'中的文件,但'./data/jm/1.jpg'不是一个目录,它是一个文件。你在列出目录中的文件时需要提供一个正确的目录路径。

我注意到在  ao2.py  文件中的  r_path_name(path)  函数里,你试图读取  path  目录下的所有文件(人脸图片),并且对每一个文件执行一些操作。问题出现在以下这段代码中:
for i in range(len(list_img)):
    list_img_name = os.listdir(path + list_img)

    lab_n += 1

    # ...

    for j in list_img_name:
        path_n = path + list_img + "/" + j

在上述代码中, os.listdir(path + list_img)  这行试图获取一个路径的列表,但 list_img 是一个文件名列表,不是一个单一的文件名,所以  path + list_img  并不是一个有效的路径。你可能想要在每个迭代中获取单个文件名,然后将这个文件名添加到路径中。

你可以尝试修改为以下代码:
for i in range(len(list_img)):
    img_name = list_img[i]  # 获取单个文件名
    list_img_name = os.listdir(path + "/" + img_name)  # 添加文件名到路径中

    lab_n += 1

    # ...

    for j in list_img_name:
        path_n = path + "/" + img_name + "/" + j

在上述代码中,我获取了  list_img  列表中的单个文件名,并将其添加到路径中。然后,在路径中添加更深层的文件名。注意,我在路径组件之间添加了 "/" 字符,以确保路径格式正确。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-30 10:54:04 | 显示全部楼层
还是报错呢
D:\anaconda\envs\TF2.1\python.exe D:/ending/FaceRecognition/ao2.py
Traceback (most recent call last):
  File "D:/ending/FaceRecognition/ao2.py", line 63, in <module>
    img, lab = r_path_name(path)
  File "D:/ending/FaceRecognition/ao2.py", line 29, in r_path_name
    list_img_name = os.listdir(path + "/" + img_name)  # 添加文件名到路径中
NotADirectoryError: [WinError 267] 目录名称无效。: './data/jm//1.jpg'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-30 11:56:54 | 显示全部楼层
isdkz 发表于 2023-5-30 10:37
根据错误信息  NotADirectoryError: [WinError 267] 目录名称无效。: './data/jm/1.jpg' ,它表明你在尝试 ...

大佬,还是有点问题哎
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 23:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表