Bonjour,

Cedric,41 ans, je debute en php, et en python ausi ...
En général j'arrive a trouver des solutions en recherchant sur le web, mais la je ne comprend pas ce qui se passe.

Je suis sous Current PHP version: 5.6.30-0+deb8u1, raspberry pi 3

J'ai un script python, qui fonctionne très bien quand je le lance en console avec un python train.py
le script python :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#! /usr/bin/env python
import fnmatch
import os
import MySQLdb as mdb
import cv2
import numpy as np
 
import config
import face
 
 
MEAN_FILE = 'mean.png'
POSITIVE_EIGENFACE_FILE = 'positive_eigenface.png'
NEGATIVE_EIGENFACE_FILE = 'negative_eigenface.png'
 
 
def walk_files(directory, match='*'):
	"""Generator function to iterate through all files in a directory recursively
	which match the given filename match parameter.
	"""
	for root, dirs, files in os.walk(directory):
		for filename in fnmatch.filter(files, match):
			yield os.path.join(root, filename)
 
def prepare_image(filename):
	"""Read an image as grayscale and resize it to the appropriate size for
	training the face recognition model.
	"""
	return face.resize(cv2.imread(filename, cv2.IMREAD_GRAYSCALE))
 
def normalize(X, low, high, dtype=None):
	"""Normalizes a given array in X to a value between low and high.
	Adapted from python OpenCV face recognition example at:
	  https://github.com/Itseez/opencv/blob/2.4/samples/python2/facerec_demo.py
	"""
	X = np.asarray(X)
	minX, maxX = np.min(X), np.max(X)
	# normalize to [0...1].
	X = X - float(minX)
	X = X / float((maxX - minX))
	# scale to [low...high].
	X = X * (high-low)
	X = X + low
	if dtype is None:
		return np.asarray(X)
	return np.asarray(X, dtype=dtype)
 
if __name__ == '__main__':
	#print "Reading training images..."
	conn = mdb.connect('localhost','xxxx','xxxxxx','data')
	cur = conn.cursor()
	query = ((" UPDATE rpi3portail SET resultattrain = 'Reading training images...' WHERE id= 2  "))
	cur.execute(query)
	conn.commit()
	cur.close()
	conn.close()
	faces = []
	labels = []
	pos_count = 0
	neg_count = 0
	# Read all positive images
	for filename in walk_files(config.POSITIVE_DIR, '*.pgm'):
		faces.append(prepare_image(filename))
		labels.append(config.POSITIVE_LABEL)
		pos_count += 1
	# Read all negative images
	for filename in walk_files(config.NEGATIVE_DIR, '*.pgm'):
		faces.append(prepare_image(filename))
		labels.append(config.NEGATIVE_LABEL)
		neg_count += 1
	#print 'Read', pos_count, 'positive images and', neg_count, 'negative images.'
	# Train model
	#print 'Training model...'
	conn = mdb.connect('localhost','xxxxx','xxxxxx','data')
	cur = conn.cursor()
	query = (" UPDATE rpi3portail SET resultattrain = 'Training model...' WHERE id= 2  ")
	cur.execute(query)
	conn.commit()
	cur.close()
	conn.close()
	model = cv2.createEigenFaceRecognizer()
	model.train(np.asarray(faces), np.asarray(labels))
	# Save model results
	model.save(config.TRAINING_FILE)
	#print 'Training data saved to', config.TRAINING_FILE
	conn = mdb.connect('localhost','root','uargea2h','data')
	cur = conn.cursor()
	query = ((" UPDATE rpi3portail SET resultattrain = 'Termine' WHERE id= 2  "))
	cur.execute(query)
	conn.commit()
	cur.close()
	conn.close()
	# Save mean and eignface images which summarize the face recognition model.
	mean = model.getMat("mean").reshape(faces[0].shape)
	cv2.imwrite(MEAN_FILE, normalize(mean, 0, 255, dtype=np.uint8))
	eigenvectors = model.getMat("eigenvectors")
	pos_eigenvector = eigenvectors[:,0].reshape(faces[0].shape)
	cv2.imwrite(POSITIVE_EIGENFACE_FILE, normalize(pos_eigenvector, 0, 255, dtype=np.uint8))
	neg_eigenvector = eigenvectors[:,1].reshape(faces[0].shape)
	cv2.imwrite(NEGATIVE_EIGENFACE_FILE, normalize(neg_eigenvector, 0, 255, dtype=np.uint8))
A différent endroit, je fais des UPDATE dans ma base sql,pour suivre l’évolution.
Ce script fonctionne parfaitement en console, et ce jusqu'a la fin.

Quand je lance ce script via php avec le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
$output=exec('python /home/pi/face/train.py ');
le script demarre, puis bloque quelque part après
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
#print 'Training model...'
	conn = mdb.connect('localhost','xxxxx','xxxxxx','data')
	cur = conn.cursor()
	query = (" UPDATE rpi3portail SET resultattrain = 'Training model...' WHERE id= 2  ")
	cur.execute(query)
	conn.commit()
	cur.close()
	conn.close()
Je le vois dans ma base sql, "resultattrain" prend la valeur "Training model..." puis reste bloqué la dessus..

Avez vous une piste? une méthode pour voir ce qui bloque ?