建立人物去背 api

目標

  1. 去除人物背景
  2. 使用 Docker
  3. 使用 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"'

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *