import osimport numpy as npimport cv2from skimagefeature import local_binary_patternfrom sklearndecomposition import PCAimport mindsporenn as nnimport mindsporeops as opsimport mindsporedataset as dsi
根据错误提示,可以看出是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()
希望能够解决您的问题。
原文地址: https://www.cveoy.top/t/topic/bh0x 著作权归作者所有。请勿转载和采集!