目標
- 去除人物背景
- 使用 Docker
- 使用 Flask 呼叫
開始
使用 raidavid/docker_detectron2 啟動在 3090 主機
docker run --gpus all -d \
-it \
-p 9991:5000 \
--name raibgremoveapi \
--restart=always \
raidavid/docker_detectron2:v9
關閉&刪除
docker stop raibgremoveapi && docker rm raibgremoveapi
進入 docker 中的 /app/detectron2_repo/
註解 顯示相關程式 進行測試
#app.py
# out_win = "output_style_full_screen"
# cv2.namedWindow(out_win, cv2.WINDOW_NORMAL)
# cv2.setWindowProperty(out_win, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
# cv2.imshow(out_win, tmp)
# key = cv2.waitKey(1)
執行
cd /app/detectron2_repo ; python3 demo/app.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --webcam --confidence-threshold 0.5 --opts MODEL.WEIGHTS models/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
打開瀏覽器,看到去背相關串流
http://192.168.50.100:9991/
上傳一張透明的 bg.png 並建立新的 flask api 頁面
cd demo && \
touch flaskapi.py
flaskapi.py
from flask import Response, Flask, render_template, request, make_response
import threading
import argparse
import cv2
import datetime
import time
import json
from PIL import Image
import numpy as np
from bgremove import Bgremove
app = Flask(__name__)
mBgremove = Bgremove()
mBgremove.loadModel()
bg = cv2.imread("bg.png")
@app.route("/setPhoto", methods=['POST'])
def setPhoto():
global bg
filestr = request.files['file'].read()
npimg = np.fromstring(filestr, np.uint8)
img = cv2.imdecode(npimg, cv2.IMREAD_COLOR)
frame = img.astype("float32")
showFrameTmp, b = mBgremove.run_persion(frame, bg.copy())
if b == False:
return "", 201
(flag, encodedImage) = cv2.imencode(".jpg", showFrameTmp)
image_data = bytearray(encodedImage)
response = make_response(image_data)
response.headers['Content-Type'] = 'image/png'
return response
# check to see if this is the main thread of execution
if __name__ == '__main__':
# start the flask app
app.run(host="0.0.0.0", port=5000, debug=True,
threaded=True, use_reloader=False)
# release the video stream pointer
cv2.destroyAllWindows()
執行
cd /app/detectron2_repo ; python demo/flaskapi.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --webcam --confidence-threshold 0.5 --opts MODEL.WEIGHTS models/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl
製作成新的 docker image
docker commit f40c3df0852b raidavid/docker_detectron2:flaskapi && \
docker push raidavid/docker_detectron2:flaskapi
製作成 docker-compose.yml
cd /var/docker-www && \
mkdir bgremoveflaskapi && \
cd bgremoveflaskapi && \
sudo nano docker-compose.yml
docker-compose.yml
version: '3.7'
services:
docker_detectron2flaskapi:
image: raidavid/docker_detectron2:flaskapi
ports:
- "8000:5000"
restart: always
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]
command: "python demo/flaskapi.py --config-file configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml --webcam --confidence-threshold 0.5 --opts MODEL.WEIGHTS models/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl"
networks:
default:
external:
name: wp-proxy
直接執行成果
docker-compose up -d
測試
curl --location --request POST 'http://192.168.50.100:8000/setPhoto' \
--form 'file=@"/Users/davidyang/Downloads/0521_ofGT9t_ZA6NE5A.jpeg"'
