| #!/usr/bin/env bash |
| |
| |
| |
| |
| |
| |
|
|
| set -euo pipefail |
|
|
| |
| OMZ_BASE="https://storage.openvinotoolkit.org/repositories/open_model_zoo/2023.0/models_bin/1" |
|
|
| echo "--- Installing dependencies ---" |
| pip install -qU openvino opencv-python numpy |
|
|
| |
| |
| download_omz_model() { |
| local model="$1" |
| local precision="$2" |
| local dest="intel/${model}/${precision}" |
| mkdir -p "${dest}" |
| local ext |
| for ext in xml bin; do |
| if [[ ! -f "${dest}/${model}.${ext}" ]]; then |
| wget -q -O "${dest}/${model}.${ext}" \ |
| "${OMZ_BASE}/${model}/${precision}/${model}.${ext}" |
| fi |
| done |
| } |
|
|
| |
| echo "" |
| echo "This script will download:" |
| echo " - Model weights and/or sample files" |
| echo "" |
| read -p "Continue with downloads? (yes/no): " APPROVAL |
| if [[ "${APPROVAL}" != "yes" ]]; then |
| echo "Download cancelled by user." |
| exit 0 |
| fi |
| echo "" |
|
|
| echo "--- Downloading face-detection-adas-0001 (FP16) ---" |
| download_omz_model face-detection-adas-0001 FP16 |
| echo "Ready: face-detection-adas-0001" |
|
|
| echo "--- Downloading face-reidentification-retail-0095 (FP16) ---" |
| download_omz_model face-reidentification-retail-0095 FP16 |
| echo "Ready: face-reidentification-retail-0095" |
|
|
| echo "--- Downloading sample test video ---" |
| if [[ ! -f test_video.mp4 ]]; then |
| wget -q -O test_video.mp4 \ |
| "https://github.com/intel-iot-devkit/sample-videos/raw/master/face-demographics-walking-and-pause.mp4" |
| echo "Downloaded: test_video.mp4" |
| else |
| echo "Already present: test_video.mp4" |
| fi |
|
|
| echo "--- Capturing the reference face of the left subject from the video ---" |
| if [[ ! -f face_a.jpg ]]; then |
| python3 - <<'PY' |
| import cv2 |
| import numpy as np |
| import openvino as ov |
|
|
| DET = "intel/face-detection-adas-0001/FP16/face-detection-adas-0001.xml" |
| core = ov.Core() |
| det = core.compile_model(core.read_model(DET), "CPU") |
| inp = det.input(0) |
| det_h, det_w = inp.shape[2], inp.shape[3] |
|
|
|
|
| def left_face_portrait(frame, thr=0.6): |
| """Return a head-and-shoulders crop of the left-most detected face.""" |
| h, w = frame.shape[:2] |
| blob = cv2.resize(frame, (det_w, det_h)) |
| blob = blob.transpose(2, 0, 1)[np.newaxis, ...].astype(np.float32) |
| out = det([blob])[det.output(0)][0][0] |
| boxes = [(int(d[3] * w), int(d[4] * h), int(d[5] * w), int(d[6] * h)) |
| for d in out if float(d[2]) >= thr] |
| if not boxes: |
| return None |
| x1, y1, x2, y2 = min(boxes, key=lambda b: (b[0] + b[2]) / 2) |
| bw, bh = x2 - x1, y2 - y1 |
| cx1, cx2 = max(0, int(x1 - 0.6 * bw)), min(w, int(x2 + 0.6 * bw)) |
| cy1, cy2 = max(0, int(y1 - 0.7 * bh)), min(h, int(y2 + 1.6 * bh)) |
| return frame[cy1:cy2, cx1:cx2] |
|
|
|
|
| |
| |
| cap = cv2.VideoCapture("test_video.mp4") |
| cap.set(cv2.CAP_PROP_POS_FRAMES, 468) |
| ok, frame = cap.read() |
| crop = left_face_portrait(frame) if ok else None |
| if crop is None or crop.size == 0: |
| raise SystemExit("Could not capture a reference face at frame 468") |
| cv2.imwrite("face_a.jpg", crop) |
| print("Captured face_a.jpg from frame 468") |
| cap.release() |
| PY |
| else |
| echo "Already present: face_a.jpg" |
| fi |
|
|
| echo "--- Done ---" |
| echo "Detector : intel/face-detection-adas-0001/FP16/face-detection-adas-0001.xml" |
| echo "ReID : intel/face-reidentification-retail-0095/FP16/face-reidentification-retail-0095.xml" |
| echo "Reference : face_a.jpg (left subject captured from the sample video)" |
| echo "Scene : test_video.mp4 (contains the reference subject plus others)" |
|
|