File size: 4,556 Bytes
8505bef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env bash
# SPDX-License-Identifier: MIT
# Copyright (C) Intel Corporation
#
# Download the person detection and person re-identification models from the
# Open Model Zoo for the person-reidentification use case, download the sample
# surveillance video, and capture a reference person crop (person_a.jpg) that
# represents the identity to re-identify across camera views.
# 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
echo ""

echo "--- Downloading person-detection-retail-0013 (FP16) ---"
download_omz_model person-detection-retail-0013 FP16
echo "Ready: person-detection-retail-0013"

echo "--- Downloading person-reidentification-retail-0287 (FP16) ---"
download_omz_model person-reidentification-retail-0287 FP16
echo "Ready: person-reidentification-retail-0287"

echo "--- Downloading sample surveillance video ---"
if [[ ! -f test_video.mp4 ]]; then
    wget -q -O test_video.mp4 \
        "https://github.com/open-edge-platform/edge-ai-resources/raw/main/videos/VIRAT_S_000101.mp4"
    echo "Downloaded: test_video.mp4"
else
    echo "Already present: test_video.mp4"
fi

echo "--- Capturing the reference person from the Camera A enrollment window ---"
if [[ ! -f person_a.jpg ]]; then
    python3 - <<'PY'
import cv2
import numpy as np
import openvino as ov

DET = "intel/person-detection-retail-0013/FP16/person-detection-retail-0013.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 detect_persons(frame, thr=0.6):
    """Return [(x1, y1, x2, y2), ...] for every person detected in the frame."""
    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 = []
    for d in out:
        if float(d[2]) < thr:
            continue
        x1 = max(0, int(d[3] * w))
        y1 = max(0, int(d[4] * h))
        x2 = min(w, int(d[5] * w))
        y2 = min(h, int(d[6] * h))
        if x2 > x1 and y2 > y1:
            boxes.append((x1, y1, x2, y2))
    return boxes


# Scan the enrollment window (Camera A, the opening seconds) and capture the
# most prominent person. This person becomes the reference identity that the
# samples re-identify in the later Camera B query window.
cap = cv2.VideoCapture("test_video.mp4")
best = {"crop": None, "area": 0}
for frame_idx in range(0, 300, 15):
    cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx)
    ok, frame = cap.read()
    if not ok:
        break
    for x1, y1, x2, y2 in detect_persons(frame):
        area = (x2 - x1) * (y2 - y1)
        if area > best["area"]:
            best["area"] = area
            best["crop"] = frame[y1:y2, x1:x2].copy()
cap.release()

if best["crop"] is None or best["crop"].size == 0:
    raise SystemExit("Could not capture a reference person from the enrollment window")
cv2.imwrite("person_a.jpg", best["crop"])
print("Captured person_a.jpg (reference identity from the Camera A enrollment window)")
PY
else
    echo "Already present: person_a.jpg"
fi

echo "--- Done ---"
echo "Detector  : intel/person-detection-retail-0013/FP16/person-detection-retail-0013.xml"
echo "ReID      : intel/person-reidentification-retail-0287/FP16/person-reidentification-retail-0287.xml"
echo "Reference : person_a.jpg (identity captured from the Camera A enrollment window)"
echo "Scene     : test_video.mp4 (wide-area surveillance clip split into two virtual cameras)"