Numpy приложение иногда работает, иногда нет - PullRequest
0 голосов
/ 02 марта 2020

, поэтому я работаю над этим проектом по идентификации лица. Это для моей научной ярмарки, и я нахожусь в фазе, где я пытаюсь получить графики данных, графики и визуализации. У меня это работает до некоторой степени, но это не согласовано (с точки зрения исполнения).

Дело в том, что иногда код работает, иногда он выдаст мне ошибку. Для некоторого контекста ошибка с 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, поэтому я бы сказал, что получил основы логики кода c.

Пожалуйста, помогите. Я действительно отчаялся; научная ярмарка приближается, и я учусь в школе без наставника по ОД. Я живу на острове (Гуам) без практиков машинного обучения (даже в университете), поэтому я перехожу к Stackoverflow.

1 Ответ

0 голосов
/ 02 марта 2020

Нет проблем с NumPy append (). Здесь (3-й оператор) вы пытаетесь добавить значение в массив Numpy без использования NumPy np.append ().

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

embeddings = Dataset

embeddings.append(embeds)

, поскольку наборы данных содержат массив Numpy после запуска Во-первых, встраивания также будут массивом NumPy, и, следовательно, операция завершится неудачно, когда будет выполнено выполнение.

Простым решением было бы использовать это:

np.append(embeddings, embeds)

Или это,

embeddings = list(Dataset)

Надеюсь, это поможет.

...