-2

所以我一直在做这个面部识别项目。这是为了我的科学博览会,我正处于尝试获取数据图、绘图和可视化的阶段。我已经让它在某种程度上起作用,但它并不一致(在执行方面)。

问题是,有时代码有效,有时它会给我一个错误。在某些情况下,错误在于 Numpy append()。我有一个变量,我想将数据附加到,但是当它不起作用时,错误是AttributeError: 'numpy.ndarray' object has no attribute 'append'

#Although the results aren't as expected, this can make for a good demo in ISEF
#The whole refresh after a face is detected is cool and can be used to show how different faces cluster

# Numerical computation requirements
import numpy as np 
from numpy import linalg, load, expand_dims, asarray, savez_compressed, append
from numpy.linalg import norm
import pandas as pd

# Plotting requirements
import matplotlib
from matplotlib import pyplot as plt
import matplotlib.patheffects as PathEffects
from matplotlib.animation import FuncAnimation as ani
import seaborn as sb

# Clustering requirements
import sklearn
from sklearn.cluster import KMeans
from sklearn.manifold import TSNE
from sklearn.preprocessing import scale

# Miscellaneous requirements
import os
import cv2
from PIL import Image
from mtcnn.mtcnn import MTCNN
from keras.models import load_model
from scipy.spatial.distance import squareform, pdist

# Initialize RNG seed and required size for Facenet
seed = 12345678
size = (160,160)

# Required networks
facenet = load_model('facenet_keras.h5')
fd = MTCNN()

# Initialize Seaborn plots
sb.set_style('darkgrid')
sb.set_palette('muted')
sb.set_context('notebook', font_scale=1.5, rc={'lines.linewidth': 2.5})

# Matplotlib animation requirements?
plt.style.use('fivethirtyeight')
fig = plt.figure()

# Load embeddings
data = load('jerome only npz/jerome embeddings.npz')
Data_1 = data['arr_0']

Dataset = []

for array in Data_1:
    Dataset.append(np.expand_dims(array, axis=0))

# Create cluster
cluster = KMeans(n_clusters=2, random_state=0).fit(Data_1)

y = cluster.labels_
z = pd.DataFrame(y.tolist())

faces = list()

def scatter(x,colors):
    palette = np.array(sb.color_palette('hls', 26))

    plot = plt.figure()
    ax = plt.subplot(aspect='equal')
    # sc = ax.scatter(x[:,0],x[:,1], lw =0, s=120, c=palette[colors.astype(np.int)])
    sc = ax.scatter(x[:,0],x[:,1], lw =0, s=120)
    labels = []

    return plot , ax, sc, labels

def detembed():
    cam = cv2.VideoCapture(0)
    _,frame = cam.read()
    info = fd.detect_faces(frame)
    if info != []:
        for i in info:
            print("*****************    FACE DETECTED *************************************************")
            x,yc,w,h = i['box']
            x,y = abs(x), abs(yc)
            w,h = abs(w), abs(h)
            xx, yy = x+w, yc+h
            #cv2.rectangle(frame, (x,y), (xx,yy), (0,0,255),2)
            face = frame[yc:yy, x:xx]
            image = Image.fromarray(face)
            image = image.resize(size)
            arr = asarray(image)

            arr = arr.astype('float32')
            mean, std = arr.mean(), arr.std()
            arr = (arr - mean) / std
            samples = expand_dims(arr, axis=0)
            faces.append(samples)
        #cv2.imshow('Camera Feed', frame)

while True:
    detembed()
    embeddings = Dataset
    if not faces:
        continue
    else:
        for face in faces:
            embeds = facenet.predict(face)
            #switch these if conflicts arise
            embeddings.append(embeds)
            embeddings = asarray(embeddings)

            embeddings = embeddings[:,0,:]

    cluster = KMeans(n_clusters=2, random_state=0).fit(Data_1)
    y = cluster.labels_

    points = TSNE(random_state=seed).fit_transform(embeddings)

    # here "y" dictates the color of the plots depending on the kmeans algorithm
    scatter(points,y)
    graph = ani(fig, scatter, interval=20)
    fcount = len(embeddings)
    plt.text(0,0,'{} points'.format(fcount))
    plt.show()

    # reset embeddings var to initial dataset
    Dataset = np.delete(Dataset, fcount - 1,0)
    embeddings = Dataset

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.release()
cv2.destroyAllWindows

请注意,我不是一个有才华的程序员;这段代码是从我在网上找到的一些例子中搞砸的。在进行这个项目时,我不得不学习 Python。我确实有 C 语言背景,所以我会说我掌握了代码逻辑的基础知识。

请帮忙。我真的很绝望;科学博览会越来越近了,我是一名没有 ML 导师的高中生。我住在一个岛上(关岛),没有机器学习从业者(甚至在大学里也没有),所以我求助于 Stackoverflow。

4

1 回答 1

0

NumPy 的 append() 没有问题。在这里(第 3 条语句),您尝试在不使用 NumPy 的 np.append() 的情况下将值附加到 Numpy 数组。

Dataset.append(np.expand_dims(array, axis=0))

embeddings = Dataset

embeddings.append(embeds)

由于数据集在运行第一条语句后包含 Numpy 数组,嵌入也将是一个 NumPy 数组,因此只要执行到这里,操作就会失败。

一个简单的解决方法是使用这个:

np.append(embeddings, embeds)

或这个,

embeddings = list(Dataset)

希望有帮助。

于 2020-03-02T12:12:05.773 回答