Download export_and_quantize.sh from phnx35/face-matching: direct link, hf CLI and curl.
- Browser
- Download file 4.57 kB
-
https://huggingface.co/phnx35/face-matching/resolve/main/export_and_quantize.sh
- Command line
-
hf download hf://phnx35/face-matching/export_and_quantize.sh
-
curl -L -o export_and_quantize.sh https://huggingface.co/phnx35/face-matching/resolve/main/export_and_quantize.sh
4.57 kB
| # SPDX-License-Identifier: MIT | |
| # Copyright (C) Intel Corporation | |
| # | |
| # Download face detection and re-identification models from Open Model Zoo | |
| # for the face-matching use case. | |
| # Usage: ./export_and_quantize.sh | |
| set -euo pipefail | |
| # Official Open Model Zoo public model storage (versioned, immutable). | |
| 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 both the IR topology (.xml) and weights (.bin) for an OMZ model | |
| # from the official storage into intel/<model>/<precision>/. | |
| 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 | |
| } | |
| # Ask for approval before downloading models and sample files | |
| 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 | |
| # Ping the HuggingFace repo to register a tracked download of config.json. | |
| # This is best-effort: a failure (offline, or before the repo is published) | |
| # must not stop the export. | |
| echo "--- Registering HuggingFace download (tracking ping) ---" | |
| HF_REPO_ID="Intel/face-matching" | |
| HF_CONFIG_URL="https://huggingface.co/${HF_REPO_ID}/resolve/main/config.json" | |
| if curl -fsSL -o /dev/null "${HF_CONFIG_URL}"; then | |
| echo "Registered HuggingFace download for ${HF_REPO_ID}" | |
| else | |
| echo "WARNING: HuggingFace tracking ping failed (offline?); continuing." >&2 | |
| 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) # left-most | |
| 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] | |
| # During the 37-42s segment a woman pauses on the left of the frame; capture | |
| # a head-and-shoulders portrait of her as the reference face to search for. | |
| 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)" | |