根据错误提示,可以看出是mindspore.dataset.vision.py_transforms模块中没有Compose这个属性。可以尝试使用transforms模块中的Compose函数替换掉原来的代码中使用的py_transforms.Compose。修改后的代码如下:

import os
import numpy as np
import cv2
from skimage.feature import local_binary_pattern
from sklearn.decomposition import PCA
import mindspore.nn as nn
import mindspore.ops as ops
import mindspore.dataset as ds
import mindspore.dataset.vision.transforms as transforms
import mindspore.dataset.transforms as py_transforms
import mindspore.dataset.transforms.c_transforms as C
import mindspore.dataset.vision.c_transforms as vision
from mindspore import Model, context, Tensor, load_checkpoint, load_param_into_net

class FaceNet(nn.Cell):
    def __init__(self):
        super(FaceNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 5, pad_mode='valid')
        self.conv2 = nn.Conv2d(32, 64, 3, pad_mode='valid')
        self.conv3 = nn.Conv2d(64, 128, 3, pad_mode='valid')
        self.fc1 = nn.Dense(128 * 10 * 10, 1024)
        self.fc2 = nn.Dense(1024, 128)

        self.relu = nn.ReLU()
        self.maxpool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.flatten = nn.Flatten()
        self.dropout = nn.Dropout(0.5)

    def construct(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.conv2(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.conv3(x)
        x = self.relu(x)
        x = self.maxpool(x)

        x = self.flatten(x)
        x = self.fc1(x)
        x = self.relu(x)
        x = self.dropout(x)

        x = self.fc2(x)

        return x

def prepare_training_data(data_folder_path):
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
    dirs = os.listdir(data_folder_path)
    faces = []
    labels = []
    for dir_name in dirs:
        label = int(dir_name)
        subject_dir_path = data_folder_path + "/" + dir_name
        subject_images_names = os.listdir(subject_dir_path)

        for image_name in subject_images_names:
            image_path = subject_dir_path + "/" + image_name
            image = cv2.imread(image_path)
            if image is None:
                continue

            gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
            rect = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),
                                                 flags=cv2.CASCADE_SCALE_IMAGE)
            for (x, y, w, h) in rect:
                face = gray[y:y + w, x:x + h].astype(np.float32)
                face = cv2.resize(face, (100, 100))
                face_lbp = local_binary_pattern(face, 1, 8).reshape(1, -1)
                if face_lbp is not None:
                    faces.append(face_lbp)
                    labels.append(label)

    faces = np.array(faces)
    labels = np.array(labels)
    return faces, labels

if __name__ == "__main__":
    # prepare data
    faces, labels = prepare_training_data("allraw")
    pca = PCA(n_components=40, svd_solver='full')
    faces = faces.reshape(faces.shape[0], -1)
    faces = pca.fit_transform(faces)

    # prepare dataset
    data = []
    for i in range(faces.shape[0]):
        data.append((faces[i], labels[i]))
    dataset = ds.GeneratorDataset(data, ['data', 'label'])

    # prepare transforms
    transform = transforms.Compose([
        vision.Resize((100, 100)),
        transforms.ToTensor()
    ])
    dataset = dataset.map(input_columns='data', operations=py_transforms.Compose([transform]))

    # prepare model
    net = FaceNet()
    loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')
    opt = nn.Momentum(net.trainable_params(), learning_rate=0.001, momentum=0.9)
    model = Model(net, loss_fn=loss, optimizer=opt)

    # train model
    context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
    dataset = dataset.batch(32, drop_remainder=True)
    model.train(epochs=10, train_dataset=dataset)

    # save model
    param_dict = net.parameters_dict()
    save_dict = {}
    for key, value in param_dict.items():
        save_dict[key] = value.asnumpy()
    np.savez('facenet.npz', **save_dict)

    # load model
    load_dict = np.load('facenet.npz')
    for key, value in param_dict.items():
        load_param_into_net(net, {key: Tensor(load_dict[key])})

    # test model
    cap = cv2.VideoCapture(0)
    stop = False
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml')
    subjects = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33']
    while not stop:
        success, img = cap.read()
        img1 = img.copy()

        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        rect = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),
                                             flags=cv2.CASCADE_SCALE_IMAGE)
        if len(rect) == 0:
            txt = 'no face!'
            cv2.putText(img1, txt, (10, 20), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
        if not rect is None:
            for (x, y, w, h) in rect:
                face = gray[y:y + w, x:x + h].astype(np.float32)
                face = cv2.resize(face, (100, 100))
                face_lbp = local_binary_pattern(face, 1, 8).reshape(1, -1)
                face_pca = pca.transform(face_lbp)
                cv2.rectangle(img1, (x, y), (x + w, y + h), (0, 255, 0), 2)
                k = cv2.waitKey(100)
                input_data = transform(face).unsqueeze(0)
                output_data = net(input_data).asnumpy()
                c = np.argmax(output_data)
                if output_data[0, c] > 0.7:
                    cv2.putText(img1, subjects[c], (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
                else:
                    label = 'unknown'
                    cv2.putText(img1, label, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)
                cv2.imshow('img', img1)
                cv2.waitKey(1)
                if c & 0xFF == ord('q'):
                    stop = True
                    cv2.destroyAllWindows()

希望能够解决您的问题。

import osimport numpy as npimport cv2from skimagefeature import local_binary_patternfrom sklearndecomposition import PCAimport mindsporenn as nnimport mindsporeops as opsimport mindsporedataset as dsi

原文地址: https://www.cveoy.top/t/topic/bh0x 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录