โครงการนี้มุ่งเน้นไปที่การสร้างบริการที่แสดงภาพลำดับที่คล้ายกัน
UI มีให้บริการที่ https://ordsimilarity.com/ API (รายละเอียดด้านล่าง) มีอยู่ที่ https://api.ordsimilarity.com
รูปภาพถูกจัดประเภทโดยใช้อัลกอริทึม average hash ซึ่งแปลงเป็นลำดับบิตของ 0 และ 1s พวกเขาจะถูกเปรียบเทียบโดยใช้ Hamming distance ซึ่งวัดจำนวนบิตที่พบได้ทั่วไประหว่างสองภาพ คำอธิบายโดยละเอียดสามารถพบได้ที่ลิงค์นี้
แฮชเฉลี่ยของระเบียบทั้งหมดจะถูกเก็บไว้ในไฟล์ JSON ข้อมูลตัวอย่างสามารถเห็นได้ใน average_hash_example.json
หมายเหตุ: เราใช้ไฟล์ JSON แทน "DB ปกติ" เพราะเราจำเป็นต้องวนซ้ำข้อมูลทั้งหมดภายในเสมอและปรากฎว่ามันเร็วกว่ามากในการโหลดข้อมูลทั้งหมดจากไฟล์ JSON มากกว่าจาก DB บางอย่างเช่น SQLITE3
ฟังก์ชั่นการประมวลผลหลักคือ get_matches_from_data ใน get_matches.py ฟังก์ชั่นนี้วนซ้ำผ่านแฮชเฉลี่ยที่กำหนดทั้งหมดและเปรียบเทียบความคล้ายคลึงกันกับแฮชเฉลี่ยที่คำนวณจากข้อมูลที่ให้ไว้ - ไม่ว่าจะเป็นรหัสลำดับหรือเนื้อหารูปภาพที่กำหนดเอง มันส่งคืนรายการของระเบียบที่คล้ายกันมากที่สุดเรียงตามความคล้ายคลึงกันของพวกเขา
get_matches.py ยังให้การเข้าถึง CLI ไปยังฟังก์ชั่น ดู python get_matches.py --help สำหรับรายละเอียดเพิ่มเติม
API ถูกนำไปใช้ใน python โดยใช้ FastAPI Framework ในการเริ่มต้นจะโหลดแฮชเฉลี่ยจากไฟล์ JSON ลงในหน่วยความจำ จากนั้นสำหรับแต่ละคำขอจะให้ข้อมูลนี้กับฟังก์ชัน get_matches_from_data ที่กล่าวถึงข้างต้นและรวบรวมผลลัพธ์ ก่อนที่จะส่งคืนผลลัพธ์ JSON ไปยังลูกค้าจะเพิ่มข้อมูลตามลำดับที่คล้ายกันด้วยคุณสมบัติหรือลิงก์ที่เป็นประโยชน์เพิ่มเติม
หมายเหตุ: API เรียก Rust API ซึ่งให้ประสิทธิภาพที่ดีขึ้นมาก ดูส่วนรายละเอียดเพิ่มเติม Rust server
API มีจุดสิ้นสุดหลายจุดสำหรับการค้นหาที่คล้ายคลึงกันซึ่งกำหนดไว้ใน api.py :
GET /ord_id/{ord_id}?top_n=Ntop_n คือ 20 และเป็นตัวเลือก หากไม่ได้ระบุจะเริ่มต้นเป็น 20POST /file?top_n=Ncurl -X POST -H "Content-Type: multipart/form-data" -F "file=@images/1.jpg" http://localhost:8001/file?top_n=10top_n ไม่ จำกัด ในกรณีนี้และเป็นทางเลือก หากไม่ได้ระบุจะเริ่มต้นเป็น 20 สำหรับประสิทธิภาพที่ดีขึ้นฟังก์ชั่น get_matches ได้ถูกนำไปใช้ใน Rust เพื่อเพิ่มความเร็วในการค้นหาความคล้ายคลึงกัน
similar_pictures มีไบนารี Rust และห้องสมุดเพื่อจุดประสงค์นี้
การเชื่อมต่อกับ Rust จาก python ถูกสร้างขึ้นใน get_matches_rust.py ซึ่งจะเปิดเผยอินเทอร์เฟซ CLI เดียวกับ get_matches.py การเชื่อมต่อนี้เกิดขึ้นได้โดยไลบรารีที่ใช้ร่วมกัน Rust ซึ่งอาศัยอยู่ภายใต้ similar_pictures/target/release/libsimilar_pictures.so
นอกจากนี้การสร้างไบนารี Rust แบบสแตนด์อโลนที่ทำหน้าที่เป็น CLI ถูกสร้างขึ้นภายใต้ที่ similar_pictures/target/release/similar_pictures _pictures CLI Help สามารถมองเห็นได้โดยการทำงาน ./similar_pictures/target/release/similar_pictures --help การใช้งานของมันคล้ายกับรุ่น python
ทั้งไลบรารี Rust และไบนารีใช้ฟังก์ชัน get_matches ทั่วไปจาก similar_pictures/src/get_matches.rs ซึ่งทำหน้าที่เดียวกันกับรุ่น python ในการสร้างไบนารีสนิมและห้องสมุดสำหรับระบบปฏิบัติการของคุณให้ cargo build --release เปิดตัว
วิธีการที่โหลดแฮชเฉลี่ยลงในหน่วยความจำในการเริ่มต้นเซิร์ฟเวอร์เพื่อให้บริการคำขอเร็วขึ้นมากก็ถูกจำลองแบบใน Rust - ใน rust_http_server
มันมีเซิร์ฟเวอร์ (nonpublic) ที่มีจุดสิ้นสุดที่คล้ายกันกับ python API - ความแตกต่างเพียงอย่างเดียวคือมันไม่ยอมรับวัตถุไฟล์มันจะต้องได้รับ file_hash โดยตรง
ไม่ควรใช้โดยตรง แต่เป็นแบ็กเอนด์สำหรับ python API การเชื่อมต่อกำลังถูกสร้างขึ้นใน rust_server.py