เวอร์ชันใหม่กว่า (เปลี่ยนชื่อ):
รุ่นเก่ากว่า:
ติดดาวเราบน GitHub — มันสร้างแรงบันดาลใจให้เรามาก!
Samei เป็นเฟรมเวิร์ก Rust ที่มีการผูก Python ที่ช่วยสร้างระบบติดตามที่ซับซ้อน ด้วย Sameli เราสามารถพัฒนา SORT, DeepSORT แบบขนานที่มีประสิทธิภาพสูง และเครื่องมือติดตามผู้สังเกตการณ์เดี่ยวที่ซับซ้อนอื่นๆ (เช่น Cam) หรือเครื่องมือติดตามหลายเซิร์ฟเวอร์
วัตถุประสงค์หลักของ Samei คือการจัดหาวิธีการสร้างกลไกติดตามวัตถุหลายรายการในหน่วยความจำที่ซับซ้อน
เฟรมเวิร์กนี้ช่วยสร้างเครื่องมือค้นหาการติดตามและความคล้ายคลึงหลายประเภท ซึ่งเป็นเครื่องมือที่ง่ายที่สุดที่มีคุณสมบัติเวกเตอร์ และช่วยให้สามารถเปรียบเทียบเวกเตอร์ใหม่กับเวกเตอร์ที่เก็บไว้ในฐานข้อมูลได้ เครื่องยนต์ที่มีความซับซ้อนมากขึ้นทำงานบนรางรถไฟ - ชุดข้อสังเกตสำหรับคุณลักษณะเดียวกันที่รวบรวมไว้ตลอดวงจรชีวิต ระบบดังกล่าวมักใช้ในการประมวลผลวิดีโอหรือระบบอื่นๆ ที่ผู้สังเกตการณ์ได้รับผลการสังเกตที่ไม่ชัดเจนหรือเปลี่ยนแปลงไป
Samei เป็นเฟรมเวิร์กสำหรับสร้างตัวติดตามที่กำหนดเอง อย่างไรก็ตาม มันมีอัลกอริธึมบางอย่างเป็นฟังก์ชันการทำงานของผู้ใช้:
ตัวกรอง Bounding Box Kalman ซึ่งคาดการณ์กล่องขอบเขตสี่เหลี่ยมที่จัดแนวแกนกับฉาก รองรับกล่องขอบเขตเชิง (หมุน) เช่นกัน
ตัวกรองคาลมานพอยต์ 2D ที่ทำนายการเคลื่อนที่ของจุด 2D
ตัวกรองคาลมานเวกเตอร์พอยต์ 2D ที่ทำนายเวกเตอร์ของการเคลื่อนที่ของจุด 2D อิสระ (ใช้ใน Keypoint Tracker)
การตัดขอบกล่อง ซึ่งช่วยให้คำนวณพื้นที่ทางแยกสำหรับกล่องขอบที่จัดแนวแกนและทิศทาง (หมุน)
Non-Maximum Suppression (NMS) - กรองกล่องขอบเขตสี่เหลี่ยมแบบโคแอกเซียลไปยังฉาก และรองรับกล่องขอบเขตที่กำหนด
อัลกอริธึม การติดตาม SORT (รองรับกล่องจัดแนวแกนและวางแนว) - รองรับระยะทาง IoU และ Mahalanobis
อัลกอริธึม การติดตาม Batch SORT (รองรับกล่องจัดแนวแกนและวางแนว) - รองรับระยะทาง IoU และ Mahalanobis ตัวติดตามแบบแบตช์อนุญาตให้ส่งหลายฉากไปยังตัวติดตามในชุดเดียวและนำพวกมันกลับมา หากแพลตฟอร์มรองรับการแบทช์ (เช่น Nvidia DeepStream หรือ Intel DL Streamer) ตัวติดตามแบทช์จะมีประโยชน์มากกว่าในการใช้งาน
การติดตาม VisualSORT - อัลกอริธึมที่คล้าย DeepSORT (รองรับการจัดแนวแกนและกล่องวางแนว) - รองรับระยะทาง IoU และ Mahalanobis สำหรับการติดตามตำแหน่ง ระยะทางแบบยุคลิดและโคไซน์ใช้สำหรับการติดตามด้วยภาพบนเวกเตอร์คุณลักษณะ
Batch VisualSORT - รสชาติ VisualSORT แบบแบตช์;
แม้ว่า Samei จะอนุญาตให้สร้างกลไกการติดตามและความคล้ายคลึงกันต่างๆ ได้ แต่ก็มีเครื่องมือการแข่งขันที่บางครั้งอาจเหมาะสมกว่า หัวข้อนี้จะอธิบายว่าข้อนี้ใช้ได้ที่ไหนและมีทางเลือกอื่นใดบ้าง
คล้ายคลึงกันเหมาะที่สุดสำหรับงานติดตามที่วัตถุถูกอธิบายโดยการสังเกตหลายครั้งสำหรับคลาสฟีเจอร์บางอย่าง ไม่ใช่เวกเตอร์ฟีเจอร์เดียว นอกจากนี้ พฤติกรรมของพวกมันยังเป็นแบบไดนามิก - คุณลบพวกมันออกจากดัชนีหรือแก้ไขพวกมันบ่อยพอ ๆ กับการเพิ่มอันใหม่ นี่เป็นจุดที่สำคัญมาก - มีประสิทธิภาพน้อยกว่าเครื่องมือที่ทำงานกับพื้นที่อ็อบเจ็กต์ที่เพิ่มขึ้นหรือคงที่
พอดี : ติดตามบุคคลทั่วทั้งห้อง: คุณสมบัติ ReID บุคคล อายุ/เพศ และใบหน้าจะถูกรวบรวมหลายครั้งในระหว่างการติดตาม และใช้เพื่อรวมแทร็กหรือให้ผลลัพธ์รวมที่ส่วนท้ายของแทร็ก
ไม่พอดี : ฐานข้อมูลการลอกเลียนแบบ เมื่อเอกสารเดียวอธิบายด้วยเวกเตอร์ ReID คงที่จำนวน (หรือเพียงหนึ่ง) เอกสารจะถูกเพิ่มแต่ไม่ได้ถูกลบออก ภารกิจคือค้นหาเอกสาร X ที่คล้ายกันมากที่สุดในการตรวจสอบ
หากงานของคุณดูเหมือน Not fit สามารถใช้ Samei ได้ แต่คุณอาจกำลังมองหาการใช้งาน HNSW
หรือ NMS
:
HNSW สนิม - ลิงก์
HNSW C/Python - ลิงก์
NMSLib - ลิงก์
วัตถุที่คล้ายกันรองรับคุณสมบัติดังต่อไปนี้:
ติดตามวงจรชีวิต - วัตถุแสดงด้วยวงจรชีวิตของมัน (ติดตาม) - ปรากฏ พัฒนา และหายไป ในช่วงอายุการใช้งาน ออบเจ็กต์จะพัฒนาไปตามคุณสมบัติเชิงพฤติกรรม (คุณลักษณะ และการสังเกตคุณลักษณะ)
การสังเกต - Sameli ถือว่าวัตถุถูกสังเกตโดยเอนทิตีของผู้สังเกตการณ์ซึ่งรวบรวมคุณลักษณะของมัน (เวกเตอร์ที่สม่ำเสมอ) และคุณลักษณะการสังเกตที่กำหนดเอง (เช่น GPS หรือตำแหน่งกล่องหน้าจอ) หลายครั้ง คุณลักษณะเหล่านั้นแสดงโดยเวกเตอร์ของตัวเลขลอยตัวและคุณลักษณะการสังเกต เมื่อการสังเกตเกิดขึ้น แทร็กจะได้รับการอัปเดตด้วยฟีเจอร์ที่รวบรวมไว้ การสังเกตในอนาคตจะใช้เพื่อค้นหาแทร็กที่คล้ายกันในดัชนีและรวมเข้าด้วยกัน
แอตทริบิวต์แทร็ก - แอตทริบิวต์ที่กำหนดเองจะอธิบายคุณสมบัติของแทร็กเพิ่มเติมนอกเหนือจากการสังเกตคุณลักษณะ คุณลักษณะการติดตามเป็นส่วนสำคัญเมื่อคุณเปรียบเทียบวัตถุในป่า เนื่องจากอาจมีการจัดการคุณลักษณะเมื่อวัตถุเข้ากันไม่ได้ เช่น animal_type
ที่ห้ามไม่ให้คุณเปรียบเทียบ dogs
และ cats
ระหว่างกัน การใช้คุณลักษณะที่ได้รับความนิยมอีกประการหนึ่งคือลักษณะเชิงพื้นที่หรือเชิงเวลาของวัตถุ เช่น วัตถุที่ตั้งอยู่ในตำแหน่งที่ห่างไกลในเวลาเดียวกันไม่สามารถเปรียบเทียบได้ คุณลักษณะใน Samei เป็นแบบไดนามิกและพัฒนาขึ้นตามการเพิ่มการสังเกตคุณลักษณะทุกครั้งและเมื่อมีการรวมวัตถุเข้าด้วยกัน ใช้ในการคำนวณระยะทางและการคาดเดาความเข้ากันได้ (ซึ่งจะลดพื้นที่ในการคำนวณโดยการข้ามออบเจ็กต์ที่เข้ากันไม่ได้)
หากคุณวางแผนที่จะใช้ Samei เพื่อค้นหาในดัชนีขนาดใหญ่ ให้พิจารณาแอตทริบิวต์ของวัตถุเพื่อแยกพื้นที่การค้นหา หากคุณสมบัติของทั้งสองแทร็กเข้ากันไม่ได้ การคำนวณระยะทางจะถูกข้ามไป
ที่คล้ายกันนั้นรวดเร็ว โดยปกติจะเร็วกว่าตัวติดตามที่สร้างด้วย Python และ NumPy
ในการรันการคำนวณคุณสมบัติการมองเห็น เฟรมเวิร์กจะใช้รังสีอัลตราไวโอเลต - ไลบรารีสำหรับการคำนวณ SIMD ที่รวดเร็ว
การคำนวณแบบขนานถูกนำมาใช้กับการแบ่งส่วนดัชนีและการคำนวณแบบขนานโดยอิงตามกลุ่มผู้ปฏิบัติงานเธรดเฉพาะ
ประสิทธิภาพการทำงานของเวกเตอร์ขึ้นอยู่กับระดับการปรับให้เหมาะสมที่สุดที่กำหนดไว้สำหรับบิลด์เป็นอย่างมาก ที่ระดับการปรับให้เหมาะสมที่ต่ำหรือเป็นค่าเริ่มต้น Rust อาจไม่ใช้ f32 vectorization ดังนั้นเมื่อรันการวัดประสิทธิภาพจะต้องดูแลระดับการปรับให้เหมาะสมที่เหมาะสมที่กำหนดค่าไว้
ใช้ RUSTFLAGS="-C target-cpu=native"
เพื่อเปิดใช้งานคุณสมบัติ CPU ทั้งหมด เช่น AVX, AVX2 ฯลฯ ซึ่งเป็นประโยชน์ต่อรังสีอัลตราไวโอเลต
หรือคุณสามารถเพิ่มคำแนะนำในการสร้างลงใน .cargo/config
:
[build] rustflags = "-C target-cpu=native"
ลองดูเกณฑ์มาตรฐานสำหรับตัวเลข
ตัวเลขการวัดประสิทธิภาพบางส่วนแสดงอยู่ที่นี่: การวัดประสิทธิภาพ
คุณสามารถเรียกใช้การวัดประสิทธิภาพของคุณเองโดย:
rustup default nightly cargo bench
คุณอาจต้องเพิ่มบรรทัดต่อไปนี้ใน ~/.cargo/config
เพื่อสร้างโค้ดบน Apple Silicone:
[build] rustflags = "-C target-cpu=native" # Apple Silicone fix [target.aarch64-apple-darwin] rustflags = [ "-C", "link-arg=-undefined", "-C", "link-arg=dynamic_lookup", ]
อินเทอร์เฟซ Python แสดงฟังก์ชันและคลาสที่พร้อมใช้งานของคล้าย ๆ กัน ในตอนนี้อินเทอร์เฟซ Python จัดเตรียม:
ตัวกรองคาลมานสำหรับการทำนายกล่องที่จัดแนวแกนและทิศทาง (หมุน)
ตัวกรองคาลมานสำหรับการทำนายการเคลื่อนที่ของจุด 2 มิติ
ตัวกรอง 2D Point Vector Kalman ซึ่งทำนายเวกเตอร์ของการเคลื่อนที่ของจุด 2D อิสระ (ใช้ใน Keypoint Tracker)
NMS (การปราบปรามไม่สูงสุด);
การตัด Sutherland-Hodgman พื้นที่ทางแยกสำหรับกล่องเชิง (หมุน)
เรียงลำดับด้วยการวัด IoU และ Mahalanobis
BatchSORT พร้อมเมตริก IoU และ Mahalanobis
VisualSORT - ตัวติดตามที่คล้ายกับ DeepSORT พร้อมตัวชี้วัดแบบยูคลิด/โคไซน์สำหรับคุณสมบัติด้านภาพและตัวชี้วัด IoU/Mahalanobis สำหรับการติดตามตำแหน่ง (VisualSort)
BatchVisualSORT - รสชาติ VisualSORT แบบแบตช์;
สามารถสำรวจคลาสและฟังก์ชันของ Python API ได้ในเอกสารประกอบของ Python และตัวอย่างเล็กๆ น้อยๆ ที่ให้ไว้
นอกจากนี้ยังมีชุดประเมินผล MOTChallenge ซึ่งคุณสามารถใช้ประเมินประสิทธิภาพและตัวชี้วัดของตัวติดตามได้อย่างง่ายดาย
โปรดทราบว่าแพ็คเกจ PyPi ถูกสร้างขึ้นเพื่อให้สอดคล้องกับแพลตฟอร์มที่หลากหลาย ดังนั้นอาจไม่เร็วเท่ากับแพ็คเกจที่คุณสร้างในเครื่องสำหรับแพลตฟอร์มของคุณ (ดูหัวข้อต่อไปนี้)
แพลตฟอร์ม:
ลินุกซ์: X86_64, ARM64, ARMv7;
หน้าต่าง: X86_64;
MacOS: X86_64, ARM64
pip3 install similari-trackers-rs
คุณสามารถสร้างวงล้อใน Docker และหากคุณต้องการติดตั้งในระบบโฮสต์ ให้คัดลอกแพ็คเกจผลลัพธ์ไปยังระบบโฮสต์ตามตัวอย่างต่อไปนี้
หากคุณใช้ไลบรารี่สนิมอื่น ๆ คุณอาจพบว่าการสร้างด้วยคอนเทนเนอร์ Rust พื้นฐาน (และ Python 3.8) มีประโยชน์:
docker build -t similari-trackers-rs -f docker/rust_1.67/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
Python 3.8 ยังคงถูกใช้บ่อยมาก ต่อไปนี้เป็นวิธีสร้าง Samei ด้วย:
docker build -t similari-trackers-rs -f docker/python_3.8/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
หากคุณใช้สภาพแวดล้อม Python ล่าสุด คุณสามารถสร้างด้วยคอนเทนเนอร์ Python พื้นฐานได้:
docker build -t similari-trackers-rs -f docker/python_3.10/Dockerfile . # optional: copy and install to host system docker run --rm -it -v $(pwd)/distfiles:/tmp similari-trackers-rs cp -R /opt/dist /tmp pip3 install --force-reinstall distfiles/dist/*.whl
หมายเหตุ : หากคุณได้รับข้อผิดพลาด pip3
เช่น:
ERROR: similari-trackers-rs-0.26.4-cp38-cp38-manylinux_2_28_x86_64.whl is not a supported wheel on this platform.
หมายความว่าเวอร์ชัน Python ในระบบโฮสต์ไม่ตรงกับเวอร์ชันที่อยู่ในรูปภาพที่ใช้ในการสร้างวงล้อ
ติดตั้งชุดเครื่องมือ Rust ที่ทันสมัย:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env อัปเดตสนิม
ติดตั้งเครื่องมือที่จำเป็นสำหรับการสร้าง apt install build-essential -y
ติดตั้ง Python3 (>= 3.8) และไฟล์การพัฒนา ( python3-dev
)
ติดตั้งมาตูริน:
pip3 install --upgrade maturin~=0.15
ไม่ได้อยู่ใน VENV สร้างโมดูลหลาม:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin build --release --out dist pip3 install --force-reinstall dist/*.whl
ในวีเอ็นวี . สร้างโมดูลหลาม:
RUSTFLAGS=" -C target-cpu=native -C opt-level=3" maturin develop
ตัวอย่างการใช้งานอยู่ที่ python
ภาพ MOT Challenge Docker สำหรับเครื่องมือติดตามที่คล้ายกันและเครื่องมือติดตามทั่วไปอยู่ที่นี่แล้ว คุณสามารถสร้างอิมเมจ Docker แบบออลอินวันได้อย่างง่ายดายและลองใช้เครื่องมือติดตามของเรา
รวบรวมบทความเกี่ยวกับวิธีการใช้ Samei เพื่อแก้ไขปัญหาเฉพาะ
ตัวอย่างตัวติดตามอ็อบเจ็กต์ IoU
ตัวอย่างตัวติดตามวัตถุ Re-ID
ตัวอย่างตัวติดตามวัตถุ SORT;
ตัวอย่างตัวติดตามวัตถุ Python SORT;
ตัวอย่างตัวติดตามวัตถุ SORT แบบหมุนของ Python
ทำไมคุณถึงต้องการระบบติดตามประสิทธิภาพสูงสำหรับการติดตามวัตถุหลายชิ้น
ดูตัวอย่างใน repo:
simple.rs - แนวคิดการใช้งานที่เรียบง่าย
track_merging.rs - แนวคิดเกี่ยวกับการรวมแทร็กภายในกล้อง
increamental_track_build.rs - ตัวติดตามตามคุณสมบัติที่ง่ายมาก
simple_sort_iou_tracker.rs - ตัวติดตาม SORT (พร้อมตัวกรองคาลมาน, IoU)
simple_sort_iou_tracker_เน้น.rs - ตัวติดตาม SORT เชิง (หมุน) (พร้อมตัวกรองคาลมาน, IoU)
simple_sort_maha_tracker.rs - ตัวติดตาม SORT (พร้อมตัวกรอง Kalman, Mahalanobis)
simple_sort_maha_tracker_เน้น.rs - ตัวติดตาม SORT ที่มุ่งเน้น (พร้อมตัวกรอง Kalman, Mahalanobis)
middleware_sort_tracker.rs - ตัวติดตาม SORT (พร้อมตัวกรองคาลมาน การใช้งานมิดเดิลแวร์)