learning - Cómo acelerar caffe classifer en python
install caffe pip (2)
Estoy usando python para usar clasificador caffe. Obtuve la imagen de mi cámara y realicé la imagen de predicción del conjunto de entrenamiento. Funciona bien, pero el problema es la velocidad muy lenta. Pienso solo 4 cuadros / segundo. ¿Podría sugerirme alguna forma de mejorar el tiempo de cálculo en mi código? El problema se puede explicar de la siguiente manera. Tengo que volver a cargar un modelo de red age_net.caffemodel
que su tamaño es de aproximadamente age_net.caffemodel
siguiendo el código
age_net_pretrained=''./age_net.caffemodel''
age_net_model_file=''./deploy_age.prototxt''
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
mean=mean,
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(256, 256))
Y para cada imagen de entrada ( caffe_input
), llamo a la función de predicción
prediction = age_net.predict([caffe_input])
Creo que debido al tamaño de la red es muy grande. Luego, predecir la función lleva mucho tiempo para predecir la imagen. Creo que el tiempo lento es de eso.
Este es mi código de referencia completo. Cambió por mí.
from conv_net import *
import matplotlib.pyplot as plt
import numpy as np
import cv2
import glob
import os
caffe_root = ''./caffe''
import sys
sys.path.insert(0, caffe_root + ''python'')
import caffe
DATA_PATH = ''./face/''
cnn_params = ''./params/gender_5x5_5_5x5_10.param''
face_params = ''./params/haarcascade_frontalface_alt.xml''
def format_frame(frame):
img = frame.astype(np.float32)/255.
img = img[...,::-1]
return img
if __name__ == ''__main__'':
files = glob.glob(os.path.join(DATA_PATH, ''*.*''))
# This is the configuration of the full convolutional part of the CNN
# `d` is a list of dicts, where each dict represents a convolution-maxpooling
# layer.
# Eg c1 - first layer, convolution window size
# p1 - first layer pooling window size
# f_in1 - first layer no. of input feature arrays
# f_out1 - first layer no. of output feature arrays
d = [{''c1'':(5,5),
''p1'':(2,2),
''f_in1'':1, ''f_out1'':5},
{''c2'':(5,5),
''p2'':(2,2),
''f_in2'':5, ''f_out2'':10}]
# This is the configuration of the mlp part of the CNN
# first tuple has the fan_in and fan_out of the input layer
# of the mlp and so on.
nnet = [(800,256),(256,2)]
c = ConvNet(d,nnet, (45,45))
c.load_params(cnn_params)
face_cascade = cv2.CascadeClassifier(face_params)
cap = cv2.VideoCapture(0)
cv2.namedWindow("Image", cv2.WINDOW_NORMAL)
plt.rcParams[''figure.figsize''] = (10, 10)
plt.rcParams[''image.interpolation''] = ''nearest''
plt.rcParams[''image.cmap''] = ''gray''
mean_filename=''./mean.binaryproto''
proto_data = open(mean_filename, "rb").read()
a = caffe.io.caffe_pb2.BlobProto.FromString(proto_data)
mean = caffe.io.blobproto_to_array(a)[0]
age_net_pretrained=''./age_net.caffemodel''
age_net_model_file=''./deploy_age.prototxt''
age_net = caffe.Classifier(age_net_model_file, age_net_pretrained,
mean=mean,
channel_swap=(2,1,0),
raw_scale=255,
image_dims=(256, 256))
age_list=[''(0, 2)'',''(4, 6)'',''(8, 12)'',''(15, 20)'',''(25, 32)'',''(38, 43)'',''(48, 53)'',''(60, 100)'']
while(True):
val, image = cap.read()
if image is None:
break
image = cv2.resize(image, (320,240))
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5, minSize=(30,30))
for f in faces:
x,y,w,h = f
cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,255))
face_image_rgb = image[y:y+h, x:x+w]
caffe_input = cv2.resize(face_image_rgb, (256, 256)).astype(np.float32)
prediction = age_net.predict([caffe_input])
print ''predicted age:'', age_list[prediction[0].argmax()]
cv2.imshow(''Image'', image)
ch = 0xFF & cv2.waitKey(1)
if ch == 27:
break
#break
Intenta llamar a age_net.predict([caffe_input])
con oversmaple=False
:
prediction = age_net.predict([caffe_input], oversample=False)
El comportamiento predeterminado de predict
es crear 10 cultivos ligeramente diferentes de la imagen de entrada y alimentarlos a la red para clasificar, al deshabilitar esta opción, debe obtener una aceleración x10.
También puede intentar eliminar su red de canales . Es un algoritmo que poda canales de manera efectiva en cada capa, lo que podría acelerar la red de 2 a 5 veces. La dirección de github es: https://github.com/yihui-he/channel-puning