-
Notifications
You must be signed in to change notification settings - Fork 137
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
OpenFace FeatureExtraction Docker Image #166
Comments
@SanBingYouYong this docker image works fine, will it be possible for you to share the dockerfile? |
I currently have network difficulties testing dockerfiles (basically chances that they fail half way during building due to network errors) but here's the python file (and a shell script) that I put in the image, so basically you need to modify the OpenFace docker image to support running a flask application: The Python file from flask import Flask, request, send_file
import subprocess
import os
'''
copied into openface_auto as openface_extract.py
'''
app = Flask(__name__)
ROOT_DIR = os.path.dirname(os.path.abspath(__file__))
@app.route('/process_video', methods=['POST'])
def process_video():
# 检查是否有文件在请求中
if 'video' not in request.files:
return "No video part", 400
if 'video_name' not in request.form:
return "No video name", 400
video = request.files['video']
video_name = request.form['video_name']
# 如果用户没有选择文件,浏览器也会发送一个空的文件名
if video.filename == '':
return "No selected video", 400
if video:
# 保存文件到此目录
file_path = os.path.join(ROOT_DIR, f"{video_name}.mp4")
video.save(file_path)
# command = ['build/bin/FeatureExtraction', '-f', file_path] # not easy to know when does it finish
command = ["./run_extraction.sh", file_path] # remember to chmod +x
# 执行命令
try:
# execute shell script
subprocess.Popen(command, cwd=ROOT_DIR).wait()
# check for output in ./processed/video_name.csv
output_file_path = os.path.join(ROOT_DIR, 'processed', f"{video_name}.csv")
if not os.path.exists(output_file_path):
return f"Error processing video: output file not found", 500
except subprocess.CalledProcessError as e:
return f"Error processing video: {e}", 500
response = send_file(output_file_path, as_attachment=True)
# 删除原始文件
os.remove(file_path)
# delete processed file
# basically video.avi video.csv video.hog video_aligned video_of_details.txt
the_file_list = [
f"{video_name}.avi",
f"{video_name}.csv",
f"{video_name}.hog",
f"{video_name}_of_details.txt"
]
the_dir = f"{video_name}_aligned" # this is a directory!
for file in os.listdir(os.path.join(ROOT_DIR, 'processed')):
if file in the_file_list:
os.remove(os.path.join(ROOT_DIR, 'processed', file))
if file == the_dir:
os.system(f"rm -rf {os.path.join(ROOT_DIR, 'processed', file)}")
# 返回处理后的文件
return response
return "No video to process", 400
if __name__ == '__main__':
if not os.environ.get("OPENBLAS_NUM_THREADS"):
os.environ["OPENBLAS_NUM_THREADS"] = "10" # credit: github issue
app.run(host='0.0.0.0', port=8601) The shell script that it executes (so to track task status): #! /bin/bash
if [ $# -eq 0 ]; then
echo "Usage: $0 <video_file>"
exit 1
fi
VIDEO_FILE=$1
build/bin/FeatureExtraction -f $VIDEO_FILE
|
@SanBingYouYong Thanks for the quick response. Can you suggest the way to add python3.10 in this image, I was only able to add python3.5 not above that. |
IIRC I went with miniconda3 and installed flask and python=3.10 right in the base environment. Try with the following commands to get conda working in docker containers:
There might have been some other dependency issues but I'm not sure. |
Thanks a lot for your work on extending the openface image. It works now. |
Sharing my docker file here, so that others facing issue extending or using openface with latest versions of linux can use. |
OpenFace provided a docker image to use and I extended based on it with conda and flask to provide an api access to get au.csv from videos.
The image is available on aliyun registry:
docker pull registry.cn-hangzhou.aliyuncs.com/sanbingyouyong/openface_extract_flask:latest
docker run -d --name openface_auto -p 8601:8601 openface_extract_flask:latest
The request can be sent using the following Python codes:
And the response is sent with
send_file(output_file_path, as_attachment=True)
and you can save the csv file like this:If people are interested I can also post the Dockerfile (I need to make one then since I commit the image from my working container) and also the flask .py file that runs the service. Or as a PR, idk.
References:
OpenFace docker image from its wiki
Why we need to set OPENBLAS_NUM_THREADS
The text was updated successfully, but these errors were encountered: