Drowsiness detection using facial landmarks or CNN.
Project description
Drowsiness Validator
A Python package for detecting drowsiness using facial landmarks or a Convolutional Neural Network (CNN).
Installation
Install the package using pip:
pip install drowsiness-validator
Requirements
The package requires the following dependencies:
- opencv-python
- dlib
- numpy
- scipy
- pandas
- scikit-learn
- tensorflow
- pillow
- flask
Matplotlib is an optional dependency, only needed if you want to visualize training history when training a new CNN model.
Usage
Here's a basic example of how to use the package:
from drowsiness_validator import detect_drowsiness
# Example with image path
test_img_path = 'path/to/your/image.jpg'
result = detect_drowsiness(image_path=test_img_path, method='cnn')
print(result)
# Example output: {'prediction': 1, 'status': 'Drowsy', 'method': 'cnn'}
# Example with base64 image
import base64
with open(test_img_path, 'rb') as f:
img_b64 = base64.b64encode(f.read()).decode('utf-8')
result = detect_drowsiness(image_base64=img_b64, method='cnn')
print(result)
# Example output: {'prediction': 1, 'status': 'Drowsy', 'method': 'cnn'}
Flask API Server
The package includes a Flask API server that can be used to detect drowsiness from images. To run the server:
# From the project root directory
python app.py
API Endpoints
/validate-drowsiness (POST)
Validates if a person in an image is drowsy.
Request Body:
{
"image": "base64_encoded_image_string_here",
"method": "cnn" // Optional, defaults to "cnn"
}
OR
{
"image_path": "/path/to/image/on/server.jpg",
"method": "cnn" // Optional, defaults to "cnn"
}
Response:
{
"prediction": 1,
"status": "Drowsy",
"method": "cnn"
}
/health (GET)
A simple health check endpoint.
Response:
{
"status": "ok"
}
Example Flask Route Implementation
Here is how the Flask route is implemented in the included app.py:
from flask import Flask, request, jsonify
from drowsiness_validator import detect_drowsiness
app = Flask(__name__)
@app.route('/validate-drowsiness', methods=['POST'])
def validate_drowsiness():
"""
Endpoint to detect drowsiness from an image.
"""
try:
# Extract data from request
data = request.json
if not data:
return jsonify({'error': 'No JSON data provided'}), 400
# Determine which input method is being used
image_base64 = data.get('image')
image_path = data.get('image_path')
method = data.get('method', 'cnn') # Default to CNN if not specified
# Validate inputs
if not image_base64 and not image_path:
return jsonify({'error': 'Either "image" (base64) or "image_path" is required'}), 400
if image_base64 and image_path:
return jsonify({'error': 'Provide either "image" (base64) or "image_path", not both'}), 400
if method not in ['cnn', 'aspect_ratio']:
return jsonify({'error': 'Method must be either "cnn" or "aspect_ratio"'}), 400
# Process the request
if image_base64:
result = detect_drowsiness(image_base64=image_base64, method=method)
else:
result = detect_drowsiness(image_path=image_path, method=method)
return jsonify(result)
except Exception as e:
return jsonify({'error': f'An unexpected error occurred: {str(e)}'}), 500
@app.route('/health', methods=['GET'])
def health_check():
"""Simple health check endpoint"""
return jsonify({'status': 'ok'})
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)
Documentation
detect_drowsiness
Detects drowsiness from an image using either CNN or facial aspect ratios (via Random Forest).
Args:
image_path(str, optional): Path to the input image file. Defaults to None.image_base64(str, optional): Base64 encoded string of the input image. Defaults to None.method(str, optional): Method for detection ('cnn' or 'aspect_ratio'). Defaults to 'cnn'.force_train_cnn(bool, optional): Whether to force retraining of the CNN model. Defaults to False.train_dir(str, optional): Path to the training data directory (needed if force_train_cnn=True).test_dir(str, optional): Path to the test data directory (needed if force_train_cnn=True).
Returns:
dict: A dictionary containing the prediction result and method used.
Example Response:
{
"prediction": 1,
"status": "Drowsy",
"method": "cnn"
}
calculate_ARs
Calculates aspect ratios from an image.
Args:
image_path(str, optional): Path to the input image file. Defaults to None.image_data(numpy array, optional): Image data. Defaults to None.
Returns:
-
dict: A dictionary containing calculated aspect ratios or an error message.Example:
{ "EAR": 0.289, # Eye Aspect Ratio "MAR": 0.625, # Mouth Aspect Ratio "MOE": 2.162, # Mouth over Eye Ratio "HPR": 1.342, # Head Pose Ratio "BAR": 12.456 # Brow Aspect Ratio }
calculate_all_ARs
Calculates all aspect ratios from either an image path or image data (numpy array).
Args:
image_path(str, optional): Path to the input image file. Defaults to None.image_data(numpy array, optional): Image data. Defaults to None.
Returns:
dict: A dictionary containing calculated aspect ratios.
predict_drowsiness_with_cnn
Predicts drowsiness using the trained CNN model from image data or path.
Args:
image_data(numpy array, optional): Image data as numpy array. Defaults to None.image_path(str, optional): Path to the input image file. Defaults to None.force_train(bool, optional): Whether to force retraining of the CNN model. Defaults to False.train_dir(str, optional): Path to the training data directory (needed if force_train=True).test_dir(str, optional): Path to the test data directory (needed if force_train=True).
Returns:
tuple: (prediction, confidence) where prediction is 0 (Active) or 1 (Drowsy), and confidence is a float between 0 and 1.
Author
Sharjeel Baig
- Portfolio: https://sharjeelbaig.github.io
- GitHub: https://github.com/sharjeelbaig
License
This project is licensed under the MIT License.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drowsiness_validator-0.1.7.tar.gz.
File metadata
- Download URL: drowsiness_validator-0.1.7.tar.gz
- Upload date:
- Size: 74.4 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e24a060bb23538085de22a052d8ac313e35f3714917b6c36330be680406b99e3
|
|
| MD5 |
4d5233ef7378a83a532d34b12b164758
|
|
| BLAKE2b-256 |
b1b21b9ba1e01a044c208db9afa41b2a4a18c92dcd10729f238f3270a237582c
|
File details
Details for the file drowsiness_validator-0.1.7-py3-none-any.whl.
File metadata
- Download URL: drowsiness_validator-0.1.7-py3-none-any.whl
- Upload date:
- Size: 74.8 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.9.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
55f57cc838575cc9710e5063ba97e6d4b353d700c2a28b96477601b191a43ed5
|
|
| MD5 |
6ab2bd9f4ebb600b0fde88ff1e6a17c0
|
|
| BLAKE2b-256 |
c1de0e061c32d38f6f2af451400f683c7064f9a19bac7a3f0e390328478334d5
|