def api(request): log = Log() if request.method != 'POST': log.status = 'post error' log.save() raise Http404 try: formdata = request.FILES['file'] filename = formdata.name filesize = formdata.size except Exception as err: log.message = err log.status = 'formdata error' log.save() return server_error(request) log.filename = filename log.filesize = filesize log.save() if filesize > 10000000: log.status = 'filesize error' log.save() return server_error(request) try: filedata = formdata.open().read() except Exception as err: log.message = err log.status = 'filedata error' log.save() return server_error(request) ext = imghdr.what(None, h=filedata) if ext not in ['jpeg', 'png']: log.message = ext log.status = 'filetype error' log.save() return server_error(request) try: s3_key = save_image(filedata, filename) except Exception as err: log.message = err log.status = 's3 error' log.save() return server_error(request) log.s3_key = s3_key log.save() image = np.fromstring(filedata, np.uint8) image = cv2.imdecode(image, 1) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) face_cascade = cv2.CascadeClassifier( os.path.join(os.path.dirname(__file__), 'haarcascade_frontalface_default.xml')) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5) if type(faces) != np.ndarray: log.status = 'faces error' log.save() return server_error(request) face_list = [] for (x, y, w, h) in faces: face = image[y:y + h, x:x + w] face = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY) face = cv2.resize(face, (IMG_ROWS, IMG_COLS)) face = np.array(face, dtype=np.float32) / 255.0 face = np.ravel(face) face_list.append(face) try: percent_list = predict(face_list, dtype='int') except Exception as err: log.message = err log.status = 'predict error' log.save() return server_error(request) predict_list = [] for (x, y, w, h), percent in zip(faces, percent_list): max_index = np.argmax(percent) max_value = np.amax(percent) if max_index == 0: color = (177, 107, 1) elif max_index == 1: color = (15, 30, 236) else: color = (0, 0, 0) text = '{} {}%'.format(CLASSES[max_index], max_value) image = write_text(image, text, (x, y + h + 10), color, int(h / 10)) cv2.rectangle(image, (x, y), (x + w, y + h), color, thickness=2) predict_list.append(text) log.message = ','.join(predict_list) image = cv2.imencode('.jpeg', image)[1].tostring() response = 'data:image/jpeg;base64,' + base64.b64encode(image).decode( 'utf-8') log.status = 'success' log.save() return HttpResponse(response, status=200)