การแนะนํา
ในบทความนี้ฉันต้องการแบ่งปันประสบการณ์ของฉันในการพัฒนาแอปพลิเคชัน iOS สําหรับจุลทรรศการหุ่นยนต์ที่มีการรับรู้เซลล์เลือดที่ใช้ AI - วิธีการสร้างมันความท้าทายที่เราต้องแก้ไขความล้มเหลวที่เราพบและวิธีการใช้ iPhone เป็นเครื่องมือในห้องปฏิบัติการ
นี่ไม่ได้เป็นอีกแอพรายการที่ต้องทําที่มีการรับรองความถูกต้องหรือแอพพลิเคชันสําหรับการใช้ตัวกรองสําหรับภาพถ่ายด้วยตนเอง - ความมุ่งเน้นที่นี่คือการสตรีมวิดีโอจากชิ้นส่วนตาของจุลทรรศการเครือข่ายประสาทการโต้ตอบฮาร์ดแวร์การเคลื่อนไหวของสไลด์ที่ควบคุมโดยบลูทู ธ และทั้งหมดนี้ที่ทํางานโดยตรงบน iPhone ในเวลาเดียวกันฉันพยายามที่จะไม่เจาะเข้าไปในรายละเอียดทางเทคนิคอย่างมากดังนั้นบทความยังคงสามารถเข้าถึงได้แก่ผู้ชมที่กว้างขึ้น
A Few Words About the Product
แม้จะมีเครื่องวิเคราะห์เลือดที่ทันสมัยถึง 15% ของตัวอย่างยังคงต้องมีการตรวจสอบด้วยตนเองภายใต้จุลทรรศน์โดยเฉพาะอย่างยิ่งเมื่อพบความผิดปกติในเลือด ระบบจุลทรรศน์อัตโนมัติมีอยู่ แต่มีค่าใช้จ่ายเท่ากับปีกของเครื่องบินซึ่งเป็นเหตุผลที่ห้องปฏิบัติการส่วนใหญ่ยังคงตรวจสอบการอ้างอิงเลือดด้วยตนเอง เราทําได้แตกต่างกัน: โซลูชันของเราเปลี่ยนจุลทรรศน์ห้องปฏิบัติการมาตรฐานเป็นสแกนเนอร์ดิจิตอลที่มีการให้อาหารสไลด์อัตโนมัติและการจับภาพภาพ - ง่ายราคาไม่แพงและมีประสิทธิภาพ เราพัฒนาด้วย@ แคนาดา3และทีมในเคล็ดลับ.
ชุดจะเชื่อมต่อกับจุลทรรศการห้องปฏิบัติการมาตรฐานเปลี่ยนเป็นสแกนเนอร์ดิจิตอล ส่วนประกอบฮาร์ดแวร์รวมถึง:
- iPhone – การควบคุมระบบ, การวิเคราะห์เซลล์
- อะแดปเตอร์เลนส์ - การเชื่อมต่อสมาร์ทโฟนกับชิ้นส่วนตาของไมโครซอฟท์
- ขั้นตอนหุ่นยนต์ - ช่วยให้การเคลื่อนไหวสไลด์การควบคุมการโฟกัสและการสลับระหว่างตัวอย่าง
ในด้านซอฟต์แวร์ระบบประกอบด้วย:
- แอปพลิเคชันมือถือบน iPhone
- ตัวควบคุมบนเวที
- เว็บพอร์ทัล / Cloud
แอปพลิเคชันมือถือทําหน้าที่ดังต่อไปนี้:
- ประมวลผลการไหลของภาพจากกล้องตรวจจับจัดประเภทและนับเซลล์
- ส่งพวกเขาไปยังเว็บเซิร์ฟเวอร์พร้อมกับศิลปะการวิเคราะห์อื่น ๆ
- ควบคุมการเคลื่อนไหวของขั้นตอนหุ่นยนต์ดําเนินการสแกนรอยตามอัลกอริทึมที่กําหนดไว้ล่วงหน้า
- และยังเป็นผู้รับผิดชอบในการกําหนดค่าและการเริ่มต้นการวิเคราะห์การปรับพารามิเตอร์ของกล้องดูรายงานวิเคราะห์สั้น ๆ และงานที่เกี่ยวข้องอื่น ๆ
พอร์ทัลเว็บมีวัตถุประสงค์เพื่อดูผลลัพธ์การยืนยันจากแพทย์เกี่ยวกับการวิเคราะห์และการส่งออกรายงาน ด้านล่างเป็นวิดีโอแสดงให้เห็นว่าทั้งหมดทํางานร่วมกัน:
A Bit of Context About Hematological Diagnostics
การวิเคราะห์ขั้นพื้นฐานที่เราดําเนินการคือการทําไมโครสโครสโตรเลียมในเลือด มันเป็นส่วนประกอบของการคํานวณเลือดสมบูรณ์ (CBC) ซึ่งเป็นหนึ่งในการทดสอบทางการแพทย์ที่พบบ่อยที่สุดและพื้นฐาน หลายคนได้ผ่านมันและเห็นตารางที่คล้ายกันในผลลัพธ์ของพวกเขา (แหล่งที่มา) :
เมื่อดําเนินการ CBC ตัวอย่างเลือดจะถูกประมวลผลผ่านเครื่องวิเคราะห์เลือด หากอุปกรณ์แสดงให้เห็นถึงความผิดปกติตัวอย่างจะผ่านการตรวจสอบด้วยจุลทรรศน์
กระบวนการนี้ดูดังต่อไปนี้:
- นักเทคนิคห้องปฏิบัติการใส่หยดเลือดลงบนเลื่อนแก้ว
- เปลือกมันโดยใช้วิธีการ Romanowsky (หรือทางเลือกที่คล้ายกัน<)1 , แก้ไขมัน
- และตรวจสอบการหล่อลื่นที่เตรียมไว้ภายใต้จุลทรรศการด้วยภาพ
มันเป็นในขั้นตอนนี้ที่หนึ่งสามารถ:
- การตรวจจับการปรากฏตัวของเซลล์ผิดปกติ (เช่น neutrophils ที่ไม่สมบูรณ์, lymphocytes ที่ผิดปกติ, blast cells)
- การประเมินความสําเร็จขนาด granularity รวมและพารามิเตอร์อื่น ๆ
- และบางครั้งก็ทําให้การวินิจฉัยล่วงหน้าก่อนที่จะได้รับข้อมูล PCR2 หรือ ELISA3
But manual analysis is painful:
- มันเป็นเรื่อง subjektive มาก
- ขึ้นอยู่กับประสบการณ์ของเทคนิค
- คนมีแนวโน้มต่อความเหนื่อยล้าและความผิดพลาด
- และมันไม่ได้ปรับขนาดได้ดี
ระบบจุลทรรศการอัตโนมัติยอดเยี่ยม แต่มีราคาแพง (เริ่มต้นจาก $ 60,000 และสูงกว่า) นั่นคือเหตุผลที่มากกว่า 90% ของห้องปฏิบัติการยังคงพึ่งพาวิธีการด้วยตนเอง!
เราตั้งเป้าหมายในการสร้างชุดอัตโนมัติจุลทรรศการที่ราคาไม่แพง (ภายในหลายร้อยพัน rubles) ที่สามารถใช้กันอย่างแพร่หลายในห้องปฏิบัติการ และนี่คือสถานที่ที่ iPhone เข้าไปในขั้นตอน
[1] - ตัวอย่างเลือดบนลื่นจะได้รับการรักษาด้วยจุดพิเศษที่พัฒนาโดย Dmitry Leonidovich Romanowsky (1861-1921) จุดนี้ทําให้องค์ประกอบต่าง ๆ ของเซลล์เลือดเห็นได้มากขึ้นภายใต้จุลทรรศการเนื่องจากพวกเขามีสีที่แตกต่างกัน
[2] - PCR (Polymerase Chain Reaction) ช่วยให้สามารถตรวจจับแม้กระทั่งปริมาณเล็ก ๆ ของวัสดุทางพันธุกรรมเช่นไวรัสหรือแบคทีเรียซึ่งเป็นสิ่งสําคัญในการวินิจฉัยโรคติดเชื้อ เราจําได้ดีจากยุค COVID
[3] - ELISA (Enzyme-Linked Immunosorbent Assay) ใช้เมื่อมีความสําคัญในการตรวจจับการปรากฏตัวของโปรตีนเฉพาะ
What the iPhone Is Capable Of
เมื่อเราพูดถึง“ AI บนสมาร์ทโฟน” คนส่วนใหญ่จะจินตนาการสิ่งต่าง ๆ เช่นตัวกรองกล้องอัตโนมัติข้อความหรือ chatbots แต่ iPhone ของสมัยใหม่เป็นมินิคอมพิวเตอร์ที่มีโมดูลประสาทที่ทุ่มเทซึ่งสามารถดําเนินการงานอย่างจริงจัง - ในกรณีของเราการวิเคราะห์เซลล์เลือดในเวลาจริง ลองดูส่วนประกอบหลักสามส่วนที่ทําให้สิ่งนี้เป็นไปได้:
- หน่วยประมวลผลกราฟิก (GPU) ใช้สําหรับงานภาพ: การประมวลผลล่วงหน้าการกรองการแก้ไข ตัวอย่างเช่นการประเมินความล้มเหลวการแก้ไขสีการกําจัดศิลปะและงานที่เฉพาะเจาะจงอื่น ๆ ที่เกี่ยวข้องกับกราฟิกและการวิเคราะห์ภาพ
- หน่วยประมวลผลประสาท (NPU / Neural Engine) แอปเปิ้ลได้รวม Neural Engine ในอุปกรณ์ของตนเริ่มต้นด้วยชิป A11 (iPhone 8 / X) และจาก A12 (iPhone XR และใหม่กว่า) มันเป็นไปได้ที่จะดําเนินการมากกว่า 5 พันล้านขั้นตอนต่อวินาทีบน NPU (TOPS) ในขณะที่เขียนชิป A17 Pro และ A18 / A18 Pro ใหม่ล่าสุดสามารถ 35 TOPS นี้ใช้สําหรับการสรุปของรุ่นสําหรับการตรวจจับเซลล์และการจัดประเภทการประเมินพื้นหลังของตัวอย่างและงานคล้ายคลึงกันการปล่อย CPU / GPU
- หน่วยประมวลผลกลาง (CPU) มีความรับผิดชอบต่อกลยุทธ์โดยรวมการควบคุมการประมวลผลการกําหนดค่าการ serialization / deserialization การทํางานกับ API และระบบไฟล์ - โดยทั่วไปทุกสิ่งที่ไม่ตกอยู่ในส่วนประกอบสองส่วนก่อนหน้านี้
เราจะพูดคุยเกี่ยวกับเรื่องนี้โดยใช้ iPhone XR (A12 Bionic, 2018) เป็นชนิดของแนวตั้งแม้ว่ามันจะเป็นอุปกรณ์ที่เก่าแก่แล้ว แม้ในรุ่นนี้เราก็สามารถ:
- การประมวลผลสตรีมวิดีโอ 50fps จากกล้องจุลทรรศการ
- ดําเนินการ CoreML inference ( ~ 15ms ต่อกรอบ) ในเวลาเดียวกัน
- เก็บข้อมูลลงในไดรฟ์และซิงค์กับคลาวด์ในเวลาเดียวกัน
- เก็บอุณหภูมิภายในขอบเขตที่ยอมรับได้ (หากมีการกําหนดเป้าหมายและกําหนดเป้าหมายให้สําคัญอย่างระมัดระวัง)
อย่างไรก็ตามอุปกรณ์อาจอุ่นขึ้นอย่างเห็นได้ชัดและเริ่มชะลอตัว ตัวอย่างเช่นในระหว่างการวิเคราะห์รอยขีดข่วนมัลารีซึ่งจําเป็นต้องประมวลผลเซลล์มากกว่า 100 เซลล์ในกรอบเดียวการเจาะความร้อนจะเริ่มเมื่อรอยขีดข่วนที่สองหรือที่สาม - ความถี่ของ CPU จะลดลงและการชะลอตัวของอินเทอร์เฟซจะปรากฏ นอกจากนี้การสัมผัสอย่างใกล้ชิดของอะแดปเตอร์กับแผงด้านหลังของอุปกรณ์จะป้องกันการกระจายความร้อน
ภาพหน้าจอด้านล่างแสดงให้เห็นการวิเคราะห์ที่แตกต่างกันไม่ใช่มัลารี - แต่สิ่งสําคัญที่นี่คือการตรวจจับจํานวนมากที่เกิดต่อกรอบ
โดยทั่วไปบน iOS เป็นไปได้ที่จะตรวจสอบสถานะความร้อนของระบบผ่านทางProcessInfo.processInfo.thermalStateในสภาพแวดล้อมการผลิตของเราเราไม่เคยเข้าถึงระดับที่สําคัญ แต่ระดับที่รุนแรงเกิดขึ้นเป็นประจําภายใต้การโหลดที่สูงมาก สําหรับการวัดประสิทธิภาพเราใช้ Xcode Profiler ซึ่งช่วยให้คุณสามารถวัด CPU, GPU และโหลดหน่วยความจําเช่นเดียวกับสถานะความร้อน:
และนี่คือตารางของค่า thermalState พร้อมคําอธิบายจากเอกสาร:
Thermal State |
Recommendations |
System Actions |
---|---|---|
Nominal |
No corrective action required. |
— |
Fair |
Temperature is slightly elevated. Applications may proactively begin power-saving measures. |
Photo analysis is paused. |
Serious |
System performance is reduced. Applications should decrease usage of the CPU, GPU, and I/O operations. |
ARKit and FaceTime lower the frame rate (FPS). iCloud backup restoration is paused. |
Critical |
Applications should reduce CPU, GPU, and I/O usage and stop using peripheral devices (e.g., the camera). |
ARKit and FaceTime significantly lower the frame rate (FPS). |
หมายเลข
ไม่จําเป็นต้องดําเนินการแก้ไข
—
สัญญา
อุณหภูมิเพิ่มขึ้นเล็กน้อย แอปพลิเคชันสามารถเริ่มมาตรการประหยัดพลังงานอย่างมีนัยสําคัญ
การวิเคราะห์ภาพถูกหยุด
รุนแรง
ประสิทธิภาพของระบบลดลง การประยุกต์ใช้ควรลดการใช้ CPU, GPU และ I/O Operations
ARKit และ FaceTime ลดอัตราเฟรม (FPS) การกู้คืนการสํารองข้อมูล iCloud จะหยุด
ความคิดเห็น
แอปพลิเคชันควรลดการใช้ CPU, GPU และ I/O และหยุดใช้อุปกรณ์ภายนอก (เช่นกล้อง)
ARKit และ FaceTime ลดอัตราเฟรม (FPS) อย่างมีนัยสําคัญ
การวิเคราะห์ความร้อนและพลังงานเต็มรูปแบบควรมีบทความแยกต่างหาก - ตามที่ฉันกล่าวถึงในตอนแรกฉันไม่ต้องการไปลึกเกินไปที่นี่ ขึ้นอยู่กับแหล่งที่สาธารณะนอกจากนี้ยังสามารถคาดการณ์ได้ว่าSeriousสถานะสอดคล้องกับ 80–90 ° C ในระดับชิปและประมาณ ~ 40 ° C ที่พื้นผิว
iPhone ทํางานร่วมกับบลูทู ธ พลังงานต่ําอุปกรณ์ สําหรับอุปกรณ์อื่น ๆ มีการไหลแยกต่างหากซึ่งอุปกรณ์ต้องมีMFIการรับรอง (ทําสําหรับ iPhone) ทํางานผ่าน iAP2 (Apple Accessory Protocol) ฯลฯ ในระยะสั้น - นี่ไม่ใช่กรณีของเรา
มันเป็นประโยชน์ที่นี่ที่จะจําบทบาทและโครงสร้างพื้นฐานของโปรโตคอล:
- péripheric - อุปกรณ์ที่เชื่อมต่อกับ โดยปกติแล้ว péripheric จะส่งข้อมูลหรือรอการเชื่อมต่อ (ตัวอย่าง: นาฬิกา, thermometer, pulse monitor)
- ศูนย์ - อุปกรณ์ที่เชื่อมต่อกับอุปกรณ์ภายนอก มันเริ่มการเชื่อมต่อส่งคําสั่งและรับข้อมูล
- GATT (Generic Attribute Profile) — โครงสร้างผ่านทางที่อุปกรณ์ BLE แลกเปลี่ยนข้อมูล GATT ระบุว่า “ฟิลด์” มีอะไรสามารถอ่านเขียนหรือสมัครรับการแจ้งเตือน
- บริการและคุณสมบัติ – ข้อมูลภายในการเชื่อมต่อ BLE มีโครงสร้างเป็นบริการ (กลุ่มตรรกะ) และคุณสมบัติ (พารามิเตอร์เฉพาะ) ตัวอย่างเช่นเครื่องติดตามการออกกําลังกายอาจมีบริการ Heart Rate ซึ่งรวมถึงคุณลักษณะการวัดอัตราการเต้นหัวใจ (อัตราการเต้นหัวใจปัจจุบัน)
ในกรณีของเรา iPhone ควบคุมขั้นตอนผ่านโมดูล BLE ในตัวซึ่งเป็นที่รู้จักเป็น Peripheral กับบริการ GATT ที่กําหนดเองและดําเนินการสองงาน:
- การส่งคําสั่งการเคลื่อนไหวไปยังตัวควบคุมสําหรับแกน XY และการควบคุมการโฟกัสตามแกน Z
- การรับข้อมูลจากผู้ควบคุม (สถานะตําแหน่ง)
เมื่อพูดถึงการโหลดความร้อนการเชื่อมต่อ BLE ไม่ควรมีส่วนร่วมอย่างเห็นได้ชัด ตามข้อมูลจาก Silicon Labs ในรายงานเกี่ยวกับการใช้พลังงาน BLEการส่งคําสั่งหรือรับสถานะที่ความถี่ 20 Hz (ช่วง 50 มิลลิเมตร)
- ผลลัพธ์ในการเพิ่มน้อยกว่า 1 mW การบริโภคพลังงานแบบทั่วไปของ iPhone XR คือประมาณ 50-100 mW การเพิ่มน้อยกว่า 1 mW เป็นเกือบไม่สําคัญโดยเฉพาะอย่างยิ่งเมื่อเทียบกับการประมวลผลเครือข่ายประสาทการใช้งาน GPU และจอแสดงผล
- ช่องวิทยุจะใช้งานเพียงประมาณ 2% ของเวลาที่เหลือจะนอนหลับ
เราจะเจาะลึกลงในรายละเอียดของการทํางานของแอปกับโมดูล BLE และคอนโทรลเลอร์ในส่วน “ทํางานกับ Motorized Stage”
ตอนนี้คําพูดเล็กน้อยเกี่ยวกับกล้อง เราใช้กล้องหลัก (มุมกว้างด้านหลัง) เราจับภาพวิดีโอ H.264 ที่ความละเอียด 1280 × 720 และอัตราบิตประมาณ 40 Mbps
- อัตราบิตที่สูงขึ้นข้อมูลต่อหน่วยเวลา → คุณภาพภาพที่สูงขึ้น 40 Mbps ค่อนข้างสูงสําหรับความละเอียด 1280 × 720 (HD) มันมากกว่าเพียงพอสําหรับการวิเคราะห์ภาพเซลล์
- H.264 เป็นมาตรฐานการเข้ารหัสวิดีโอนานาชาติที่เรียกว่า AVC – Advanced Video Coding หรือ MPEG-4 Part 10 มันกําจัดข้อมูลที่ซ้ํากัน (ทั้งการบีบอัดระหว่างเฟรมและภายในเฟรม) ลดอัตราบิตและดังนั้นขนาดไฟล์ (เช่นกันเรายังมีภารกิจของการบันทึกวิดีโอของวิเคราะห์ทั้งหมดสําหรับวัตถุประสงค์ในการขัดถูและการตรวจสอบ)
ดังนั้นสิ่งที่เราจบลงไม่ได้เป็นเพียงลูกค้า UI มือถือ แต่เป็นอุปกรณ์ขอบที่สมบูรณ์แบบซึ่งหมายความว่าอุปกรณ์ที่ประมวลผลข้อมูลในท้องถิ่นโดยไม่ต้องเชื่อมต่อกับเซิร์ฟเวอร์อย่างต่อเนื่อง
แอปพลิเคชันมือถือ
ตอนนี้ที่เราได้ครอบคลุมส่วนฮาร์ดแวร์ให้ดูว่าทั้งหมดนี้ทํางานได้อย่างไรในระดับแอพพลิเคชัน ลองเริ่มต้นด้วยการกําหนดงาน:
- ที่อินพุตแอพพลิเคชันจะได้รับกระแสของกรอบจากกล้อง - ภูมิทัศน์ของจุลทรรศการเคลื่อนย้ายผ่านรอยขีดข่วน
- At the output, the application must:
- detect leukocytes (and other cells depending on the analysis)
- display detected objects with bounding boxes (BBoxes)
- perform cell counting
- send data in the background to the backend (images of cells, the scan, individual frames)
ตามที่แสดงในแผนภูมิข้างต้นทุกอย่างหมุนไปรอบ ๆ กรอบกล้อง - การตรวจจับการนําทางผ่านสไลด์และการกําหนดวัตถุประสงค์ที่จําเป็นต้องส่งไปยังคลาวด์ทั้งหมดขึ้นอยู่กับมัน ดังนั้นในใจกลางของทุกอย่างคือการประมวลผลเฟรมสตรีม ลองอธิบายขั้นตอนหลักและจุดสําคัญ
1) Preprocess the framesนี่รวมถึงการแก้ไขความผิดปกติการกําจัดสิ่งประดิษฐ์การประเมินระดับความมืดและการแก้ไขแสงและสี
ตัวอย่างเช่นแต่ละห้องปฏิบัติการหรือจุลทรรศการมีเงื่อนไขแสงที่เฉพาะเจาะจงซึ่งอาจทําให้เครือข่ายประสาทไม่ทํางานได้ ที่นี่มันเป็นสิ่งจําเป็นที่จะดําเนินการปกติสมดุลสีขาว - โดยการทิศทางสนามมองไปที่พื้นที่ว่างและเริ่มการปรับสมดุลสีขาวของกล้อง
นอกจากนี้เรายังมีข้อผิดพลาดที่เซลล์ถูกส่งไปยังพอร์ทัลโดยไม่มีการ kalibrating สี สิ่งนี้เกิดขึ้นเพราะการตรวจจับถูกเปิดตัวใน paralel ก่อนที่การตั้งค่ากล้องถูกนําไปใช้
2) Detect, classify,และcountเซลล์ที่ไม่มีซ้ํา
ตัวอย่างเช่นในภาพด้านล่างบาง duplicates มีเครื่องหมายเป็นสีแดงในหนึ่งในวิเคราะห์เก่า:
3) Control the microscopeเพื่อให้มันเคลื่อนย้ายผ่านสไลด์อย่างถูกต้องการเปลี่ยนแปลงจากสไลด์หนึ่งไปยังอีกสไลด์และที่สําคัญที่สุดคือการมุ่งเน้นไปที่สไลด์อย่างแม่นยําตรวจจับเมื่อมันข้ามขอบเขตของสไลด์หรือตกบนพื้นที่ว่างเปล่า
4) Upload batches of cells to the cloud (snapshots, metadata) without blocking the processing of the next analysis.
5) Repeat this process n times, as analyses are performed in batches.
6)และบรรลุทั้งหมดนี้โดยไม่ต้องทําให้โทรศัพท์ร้อนเกินไป
แอพพลิเคชันพัฒนาขึ้นในรูปแบบเริ่มต้นทั่วไป: การพิสูจน์แนวคิดถูกนํามาใช้กันอย่างรวดเร็วแล้วปรับปรุงให้เป็น MVP (Minimum Viable Product) ที่เหมาะสําหรับการทดลองในห้องปฏิบัติการและวางแผนให้กับนักลงทุน เป็นผลให้สถาปัตยกรรมของแอพพลิเคชันกลายเป็นไฮบริด: บางหน้าจอจะถูกนํามาใช้กับหน้าจอ UIKit MVP (Model-View-Presenter) ในขณะที่คุณสมบัติและอินเตอร์เฟซใหม่จะถูกเขียนใน Swift ด้วย MVVM (Model-View-ViewModel)
เราใช้ชั้นบริการเพื่อแยกกลยุทธ์ทางธุรกิจ:CameraService
,BluetoothController
,AnalysisService
ทั้งหมดขึ้นอยู่จะถูกฉีดผ่านผู้สร้างหรือผ่านภาชนะ DI ในแง่ของการตอบสนองและโซ่ asynchronous กับการสมัครงานเหตุการณ์เรามี "เส้นทางการพัฒนา" เราได้ใช้ RxSwift ในตอนแรกแล้วเริ่มเปลี่ยนเป็น Combine และพร้อมกับการมาถึงของ async/await ส่วนหนึ่งของโซ่จะย้ายไปที่นั่น ผลลัพธ์คือชนิดหนึ่งของ "Frankenstein" แต่เรายังแยกส่วนประกอบเหล่านี้เป็นโมดูลแยกต่างหากเพื่อให้ในอนาคตเราสามารถแลกเปลี่ยนส่วนประกอบสําหรับชุดเทคโนโลยีใหม่ แอปพลิเคชันทั้งหมดจะเชื่อมโยงกับการบันทึกรายละเอียดและสําหรับกรณีที่ซับซ้อน (โดยเฉพาะอย่างยิ่งที่เกี่ยวข้องกับการประมวลผลกรอบ) เราใช้ NSLogger: มันช่วยให้ไม่เพียงแค่บันทึกข้อความ แต่ยังรวมถึงรูปภาพ
บทความทั้งหมดสามารถเขียนเกี่ยวกับการทดสอบได้: จากการประยุกต์ใช้ส่วนต่าง ๆ ของการวิเคราะห์และตั้งค่าสภาวะที่ต้องการได้อย่างรวดเร็วผ่านทางProcessInfo
(โดยวิธีการที่ฉันมี aข้อสังเกตทางเทคนิคขนาดเล็กเกี่ยวกับหัวข้อนี้) เพื่อจําลองขั้นตอนแต่ละขั้นตอนของการวิเคราะห์และครอบคลุมทั้งหมดด้วยการบูรณาการและการทดสอบหน่วย
แต่ให้กลับไปที่การประมวลผลกรอบและดูแผนภูมิสถาปัตยกรรมที่ละเอียดอ่อนกว่าหนึ่งข้างต้น:
- Analysis Controller — the decision-making center: receives frames and launches processing in the Frame Pipeline.
- Camera Service — receives the raw frame stream from the camera, transforms it, and passes it onward.
- ตัวควบคุมจุลทรรศน์ - ควบคุมตัวควบคุมจุลทรรศน์
- Frame Pipeline — a chain consisting of several stages:
- Preprocessing — correction, filtering
- Detection — object/cell detection
- Counting — counting unique objects
- Postprocessing — final filtering and preparation for visualization
- UI - เป็นผู้รับผิดชอบในการแสดงผลให้กับผู้ใช้ในเวลาจริง (กล่อง จํากัด, สถิติ, การแจ้งเตือน)
- Uploader — synchronizes analysis artifacts (snapshots, cells, config) with the backend.
เกี่ยวกับผู้จัดการเสพติด: เราใช้ CocoaPods (ซึ่งเข้าสู่ระบบโหมดการบํารุงรักษาและหยุดการพัฒนาที่ใช้งานอยู่ตั้งแต่วันที่ 2024), แต่ในภายหลังนําเสนอ SPM (Swift Package Manager) บริการบางอย่าง (Computer Vision, Bluetooth, ยูทิลิตี) ถูกย้ายไปยังโมดูล SPM นอกจากนี้ยังมีการพยายามที่จะแยกโค้ด ObjC / C++ เป็น xcframeworks แต่ก็ไม่มีเวลาเพียงพอที่จะจัดเรียงทั้งหมดดังนั้นเราจึงปล่อยให้โค้ดในโครงการหลัก ObjC ต้องใช้เป็นตัวยึดรอบ ๆ C++ เพื่อให้สามารถเรียกได้จาก Swift สิ่งนี้ส่งผลให้ ObjC++ ชั้น: อินเตอร์เฟซของพวกเขาเป็น ObjC เท่านั้นช่วยให้ Swift สามารถโต้ตอบกับพวกเขาในขณะที่การใช้งานของพวกเขาผสมโค้ด ObjC และ C++ นี่คือก่อนSwift สนับสนุนการโทรตรงไปยัง C++.
ฉันควรพูดถึงว่าฉันไม่ได้เป็นกูรูในอัลกอริทึม C++ และ Computer Vision แต่ความรับผิดชอบของฉันรวมถึงการรับรู้พื้นฐานและการพอร์ตอัลกอริทึมและ heuristics จาก Python ซึ่งเป็นสถานที่ที่ R & D ส่วนใหญ่ของเราดําเนินการ ฉันจะอธิบายบางอย่างด้านล่าง
งาน
การกําจัดความผิดปกติ
หนึ่งในอะแดปเตอร์แสดงตัวอักษรการปลอมแปลงในภาพ เป็นผลให้เซลล์ที่ควรปรากฏรอบจะดูยืดหรือปลอมแปลงโดยเฉพาะอย่างยิ่งในทิศทางด้านขอบของกรอบ เราใช้การปรับระดับด้วยกริดสกีและcv::undistort() ของ OpenCVเพื่อคืนค่า Geometry ของกรอบ:
-
We calibrate the camera — capturing images of a chessboard/grid with known geometry.
-
OpenCV computes:
- the camera matrix K (projection parameters)
- distortion coefficients D = [k1, k2, p1, p2, k3, …]
-
We apply cv::undistort() or cv::initUndistortRectifyMap() + remap():
- this computes where each point “should have landed” in reality
- the image is “straightened” back to correct geometry
หลังจากนั้นอะแดปเตอร์ถูกแทนที่ - ขั้นตอนนี้ถูกลบออก
Determining Position on the Slide
การกําหนดตําแหน่งในสไลด์เพื่อคํานวณเซลล์ได้อย่างแม่นยําเป็นสิ่งสําคัญที่จะรู้การตั้งค่าของเซลล์อย่างแม่นยําที่สุดเท่าที่จะเป็นไปได้วิดีโอที่นี่คุณสามารถดูสิ่งที่เกิดขึ้นเมื่อการกําหนดการเปลี่ยนไม่ถูกต้อง
เริ่มต้นเราพยายามคํานวณการเปลี่ยนแปลงความสัมพันธ์ระหว่างสองกรอบและสรุปการเปลี่ยนแปลงที่แน่นอน เราทดสอบวิธีการหลายอย่าง:
- วิธีการบันทึกภาพแบบคลาสสิกผ่านการสอดคล้องขั้นตอนตาม Fast Fourier Transform เราใช้ OpenCV และใช้ Apple Accelerate
- methods based on local keypoints with descriptors: SURF, SIFT, ORB, and others.
- การไหลเวียนแสง
- Apple Vision ในตัว VNTranslationalImageRegistrationRequest
ในทางหนึ่งเรามีข้อคาดการณ์บางอย่าง:
- ไม่มีการปรับขนาดหรือการหมุนมีอยู่
- แบบออปติคอล: สะพานที่สะอาดและไม่มีความลึกลับโดยไม่มีพื้นที่ว่างเปล่า
แม้จะมีปัญหาเนื่องจากการเปลี่ยนแปลงของแสงสว่างโฟกัสข้อผิดพลาดที่สะสมการเปลี่ยนแปลงอย่างฉับพลันเสียงรบกวนหรือสิ่งประดิษฐ์ในภาพ
นี้ส่งผลให้มีตารางเปรียบเทียบเช่นเดียวกับที่ด้านล่าง:
นี่คือการแปลที่แม่นยําของตารางและข้อความที่ให้:
Method |
Advantages |
Disadvantages |
Usage Notes |
Speed |
Comment |
---|---|---|---|---|---|
FFT + cross-correlation (OpenCV, Accelerate) |
Very fast, global shift detection, simple to implement |
Accumulates error, not robust to abrupt shifts |
Requires images of identical size, suitable for “pure” shifts |
Very high |
Used as the primary method |
SIFT |
High accuracy, scale/rotation invariant |
Slow, used to be non-free |
Excellent for diverse scenes with texture and complex transformations |
Slow |
Experimental option |
SURF |
Faster than SIFT, also scale/rotation invariant |
Proprietary, not always available |
Slightly better suited for real-time but still “heavy” |
Medium |
Experimental option, especially since under patent |
ORB |
Fast, free, rotation invariant |
Sensitive to lighting, not robust to scale changes |
Works fairly well for image stitching |
High |
Before we moved stitching to the cloud, we had versions using this |
Optical Flow (Lucas-Kanade) |
Tracks movement of points between frames, good for video |
Doesn’t handle global transformations, sensitive to lighting |
Best in videos or sequences with minimal movement |
Medium |
We experimented with this for digitization (stitching) of images |
Optical Flow (Farneback) |
Dense motion map, applicable to the whole image |
Slow, sensitive to noise |
Good for analyzing local motions within a frame |
Slow |
We experimented with this for digitization (stitching) of images |
Apple Vision (VNTranslationalImageRegistrationRequest) |
Very convenient API, fast, hardware-optimized |
In our case, accuracy was poor |
Perfect for simple use cases on iOS/macOS |
Very high |
We tried it and abandoned it |
FFT + cross-correlation (OpenCV, Accelerate)
การตรวจจับการเปลี่ยนแปลงทั่วโลกอย่างรวดเร็วและใช้งานง่าย
เก็บข้อผิดพลาดไม่แข็งแกร่งสําหรับการเปลี่ยนแปลงอย่างฉับพลัน
ต้องการภาพที่มีขนาดเท่ากันเหมาะสําหรับการเปลี่ยนแปลง "บริสุทธิ์"
สูงมาก
ใช้เป็นวิธีการหลัก
SIFT
ความแม่นยําสูงสแควร์ / rotation invariant
Slow, ไม่เคยเป็นอิสระ
เหมาะสําหรับสถานการณ์ที่หลากหลายด้วยพื้นผิวและการเปลี่ยนแปลงที่ซับซ้อน
Slow
ตัวเลือกการทดลอง
SURF
เร็วกว่า SIFT นอกจากนี้ยังมีสแควร์ / การหมุนเวียน
เจ้าของที่ไม่ได้อยู่เสมอ
น้อย ๆ เหมาะสําหรับเวลาจริง แต่ยังคง "หนัก"
โพสต์
ตัวเลือกการทดลองโดยเฉพาะอย่างยิ่งเนื่องจากภายใต้สิทธิบัตร
ORB
รวดเร็วฟรีหมุนไม่เปลี่ยนแปลง
ความไวต่อแสงไม่แข็งแกร่งต่อการเปลี่ยนแปลงขนาด
ทํางานค่อนข้างดีสําหรับการยึดภาพ
สูง
Before we moved stitching to the cloud, we had versions using this
Optical Flow (Lucas-Kanade)
ติดตามการเคลื่อนไหวของจุดระหว่างกรอบดีสําหรับวิดีโอ
ไม่จัดการกับการเปลี่ยนแปลงทั่วโลกความไวต่อแสง
ดีที่สุดในวิดีโอหรือชุดที่มีการเคลื่อนไหวต่ําสุด
โพสต์
เราทดลองใช้เรื่องนี้เพื่อการดิจิตอล (สติช) รูปภาพ
Optical Flow (Farneback)
แผนผังการเคลื่อนไหวที่หนาแน่นซึ่งสามารถใช้ได้กับภาพทั้งหมด
อะไหล่ช้าอ่อนต่อเสียงรบกวน
เหมาะสําหรับการวิเคราะห์การเคลื่อนไหวท้องถิ่นภายในกรอบ
ความช้า
เราทดลองใช้เรื่องนี้เพื่อการดิจิตอล (สติช) รูปภาพ
Apple Vision (VNTranslationalImageRegistrationRequest)
API ที่สะดวกมากรวดเร็วและเพิ่มประสิทธิภาพฮาร์ดแวร์
ในกรณีของเราความแม่นยําไม่ดี
เหมาะสําหรับกรณีใช้งานง่ายบน iOS / macOS
สูงมาก
เราลองและทิ้งมัน
สําหรับแต่ละตัวเลือกเราพยายามหาการกําหนดค่าที่เหมาะสมในแง่ของความแม่นยําและประสิทธิภาพในการเปรียบเทียบกับการเปลี่ยนแปลงการอ้างอิง: เราแตกต่างกันความละเอียดของภาพพารามิเตอร์อัลกอริทึมและการตั้งค่าแสงที่แตกต่างกันของกล้องและจุลทรรศการ ด้านล่างเป็นสองกราฟจากการทดลองประเภทนี้
และนี่คือวิธีการที่กระบวนการแก้ไขปัญหาดูเหมือนสําหรับตรวจจับจุดสําคัญที่เราวางแผนจะใช้ในการคํานวณการเปลี่ยนแปลง
ผลลัพธ์คือเมื่อขั้นตอนหุ่นยนต์ถูกนําเข้าสู่ระบบของเราเราจึงเริ่มใช้สแกนเนอร์จากตัวควบคุมของมันซึ่งเราจึงปรับปรุงโดยใช้ CV heuristics
การนับเซลล์
โดยพื้นฐานงานของการนับเซลล์เป็นกรณีที่เฉพาะเจาะจงของการติดตามวัตถุและ deduplication: "เพื่อระบุสิ่งที่เซลล์คือหลีกเลี่ยงการนับมันสองครั้งหลีกเลี่ยงการนับมากเกินไปและไม่พลาดเซลล์ที่จําเป็น - ทั้งหมดในส่วนหนึ่งของวินาทีในเวลาจริงผ่านกล้องและทํางานบนฮาร์ดแวร์ของโทรศัพท์" นี่คือวิธีที่เราแก้ปัญหา:
- การตรวจจับวัตถุ เราใช้เครือข่ายประสาทเพื่อตรวจจับวัตถุในกรอบ (Bounding Box, BB) แต่ละ BB มีคะแนนความมั่นใจของตัวเอง (ความมั่นใจในเครือข่าย) และคลาสเซลล์
เพื่อต่อสู้กับเสียงรบกวนพื้นหลังและผลลัพธ์ที่ไม่ถูกต้องเราใช้การกรองอย่างรวดเร็ว:
- ขึ้นอยู่กับสี: ตัวอย่างเช่นตามความเข้มหรือช่วงสี ตัวอย่างเช่นที่นี่ในด้านซ้ายตัวชี้แจงสีแดงแสดงให้เห็นว่า erythrocyte - แต่เครือข่ายประสาทเริ่มจัดประเภทเป็น leukocytes
- อย่างไรก็ตามตัวกรองสีเข้ามาเล่นหลังจากนั้นและมันถูกกรองออก
ไฟฉายสีแดงแสดงให้เห็นว่า erythrocyte จะถูกทิ้งโดยตัวกรอง
-
geometric: we discard objects whose sizes fall outside typical cell dimensions.
-
we also discard cells that partially extend beyond the frame edges — those are of no interest to us
-
Counting unique objects. Some BBs may be counted more than once for the same cell, so it’s important to detect such cases and count them only once. At one point, we were inspired by a guide from MTurk that describes two options:
Option 1: Compare the distances between BB centers — if a new BB is too close to one already recorded, it’s likely “the same” cell.
Option 2: Calculate IoU (intersection over union, Jaccard Index) — the metric for overlap between rectangles. If a new BB overlaps significantly with an existing one, we count it only once.
โดยทั่วไปแล้วจําเป็นต้องรักษาการติดตามวัตถุระหว่างกรอบโดยเฉพาะอย่างยิ่งถ้าเราตรวจสอบพื้นที่ที่สแกนก่อนหน้านี้ของรอยขีดข่วน อีกครั้งที่นี่เป็นสิ่งสําคัญที่จะกําหนดตําแหน่งที่แม่นยําบนสไลด์ - มิฉะนั้นจํานวนทั้งหมดจะลดลง
การดิจิตอล
หนึ่งในงานคือการดิจิตอลการสแกนโดยพื้นฐานสร้างสแกนเนอร์ histology ที่ใช้ซอฟต์แวร์สําหรับรอยขีดข่วน ภาพด้านล่างแสดงให้เห็นว่ามันดูเหมือนอย่างไร: ลูกศรแสดงให้เห็นการเคลื่อนไหวที่ใช้ในการสร้างการสแกนซึ่งเราจับกรอบและแทรกเป็นภาพขนาดใหญ่เดียว
การเคลื่อนไหวของสนามมองผ่านการยืดตัว
ที่นี่อีกครั้งการกําหนดตําแหน่งที่แม่นยําเป็นสิ่งสําคัญอย่างยิ่งตามมาโดยการเย็บที่ราบรื่น
มันคุ้มค่าที่จะสังเกตเห็นว่าในตอนแรกเราไม่ได้มีขั้นตอนเครื่องยนต์และพึ่งพาการนําทางด้วยตนเอง ลองจินตนาการที่จะพยายามที่จะประกอบโมเสคจากร้อยชิ้น หากคุณพลาดสแกนเนทโมเสคจบลงไม่สอดคล้องกัน
นี่คือสิ่งที่การทดลองครั้งแรกดูเหมือน: หยุดมุมมอง, การเย็บ, ความแตกต่างในแสง, พื้นที่ว่างเปล่า
ในด้านซ้าย - แผนที่ที่มีความสว่างและสัมผัสไม่สม่ําเสมอซึ่ง "เย็บ" สามารถมองเห็นได้ที่การเชื่อมโยงของกรอบ ในด้านขวา - รูปภาพเนื้อเยื่อที่ไม่สม่ําเสมอที่มีช่องว่าง
หรือตัวอย่างเช่นผู้ใช้สแกนการหล่อลื่นเคลื่อนย้ายอย่างรวดเร็วผ่านมันบางพื้นที่สิ้นสุดจะสกปรก (Motion Blur) เราพยายามลบกรอบดังกล่าวหากพวกเขาไม่ตอบสนองขอบเขตความสกปรกที่ยอมรับได้หรือหากการเปลี่ยนแปลงไม่สามารถคํานวณได้สําหรับพวกเขา
กรอบสกปรกครอบคลุมบนสแกนในระหว่างการเคลื่อนไหวอย่างรุนแรง
เรามุ่งเน้นไปที่แนวทางต่อไปนี้
มีการทําซ้ําจํานวนมาก: การแทรกบนอุปกรณ์โดยใช้วิธีการที่แตกต่างกันในความละเอียดเฟรมต่างๆและการกําหนดค่ากล้องที่แตกต่างกัน ในที่สุดเราก็มาถึงโซลูชั่นที่สแกนจะประกอบขึ้นในคลาวด์และอุปกรณ์เคลื่อนที่จะส่งเฟรมที่มีความสมดุลสีขาวและสัมผัส
ด้านล่างเป็นตัวอย่างของวิธีการที่เราวัดความเร็วในการประมวลผลของส่วนประกอบการประมวลผลเฟรมแต่ละส่วนขึ้นอยู่กับการกําหนดค่า: การตั้งค่ากล้องอัลกอริทึมที่เลือกและพารามิเตอร์ของพวกเขา (มีบางส่วนผสมกับรัสเซียที่นี่ แต่ฉันหวังว่าความคิดโดยรวมจะชัดเจน)
การทํางานกับขั้นตอนมอเตอร์
ตอนนี้ – รายละเอียดเกี่ยวกับการเชื่อมต่อระหว่าง iPhone และขั้นตอนเครื่องยนต์: วิธีที่เราสื่อสารผ่าน BLE คําสั่งที่เราส่งและวิธีการที่เรากําหนดค่าการโฟกัสอัตโนมัติ อุปกรณ์มือถือเชื่อมต่อผ่านบลูทู ธ กับตัวควบคุมบนขั้นตอนและเคลื่อนไหวตามลําดับ XYZ โดยเฉพาะอย่างยิ่งมันเป็นขั้นตอนตัวเองที่เคลื่อนไหว แต่จากมุมมองของภาพที่มองผ่านเลนส์เลนส์โดยอุปกรณ์มือถือดูเหมือนว่าการเคลื่อนไหวเกิดขึ้นทั่วสไลด์
ขั้นตอนการออกแบบของเรายังถูกสร้างขึ้นตามที่กําหนดเอง - ไม่ใช่เพราะเราต้องการ "ทําทุกอย่างด้วยตัวเอง" แต่เพราะโซลูชั่นเชิงพาณิชย์เริ่มต้นด้วย $ 10,000 และนี่ไม่ใช่เรื่องตลก เราจ้างสํานักงานออกแบบและสร้างรุ่นของเราเองด้วยราคาประมาณ ~ $ 800 มันกลายเป็นที่ถูกกว่าอย่างมีนัยสําคัญเนื่องจากหนึ่งในวิศวกรสังเกตเห็นในเวลาที่การก่อสร้างของขั้นตอนการทําไมโครสโคปที่มีมอเตอร์ดูเหมือนกับเครื่องพิมพ์ 3D จิตวิทยาเดียวกัน XYZ, มอเตอร์ขั้นตอนเดียวกัน, เคล็ดลับเดียวกัน เป็นผลให้เราใช้ส่วนประกอบที่ผลิตมาในกลุ่มและราคาถูก แต่ปรับแต่งให้เหมาะกับความต้องการเฉพาะของเรา ในโครงสร้างขั้นตอนประกอบด้วยสามส่วน: แพลตฟอร์ม XY ด้วยตัวเองบล็อกการเน้น (Z-Axis ที่มอเตอร์ติดกับปุ่ม
ส่วนประกอบของขั้นตอนจุลทรรศน์มอเตอร์
สําหรับการเคลื่อนไหวขั้นตอนด้วยตนเองเราใช้ joystick แบบเสมือน (แสดงปุ่มการเคลื่อนไหวให้กับผู้ใช้บนหน้าจอ) - มันใช้ในการกําหนดค่าและสถานการณ์การตั้งค่าระบบ อย่างไรก็ตามในระหว่างการวิเคราะห์การควบคุมมักจะอัตโนมัติ นี่คือวิธีที่ joystick ทํางานในรุ่นแรก - ในภายหลังเราได้ปรับปรุงด้วยการจัดการเสียงและความล่าช้า
Communication Protocol
โปรโตคอลการสื่อสารในฐานะที่เป็นอินเตอร์เฟซบลูทู ธ เราใช้ฮีโร่โมดูล BLE ทํางานตามค่าเริ่มต้นในโหมดปลายทางข้อความซึ่งหมายความว่าคําขอและคําตอบผ่านไปและกลับ สําหรับการกําหนดค่าและงานระบบ (เปลี่ยนชื่อความเร็วในการสื่อสาร) ใช้คําสั่ง AT
ตัวควบคุมเองทํางานด้วยเฟิร์มแวร์ตาม GRBL โดยใช้รหัส Gคําสั่ง ที่นี่สถานการณ์หลักคือ:
- การเริ่มต้นการเชื่อมต่อ (โทรศัพท์ต้องตรวจจับว่าขั้นตอนมีการเชื่อมต่อ)
- การสแกนสไลด์ (เคลื่อนย้ายขั้นตอนตามแกนทั้งหมด)
- หยุด / สแกนใหม่
- การจัดการสถานการณ์ฉุกเฉิน: การเข้าถึงสวิทช์ขีด จํากัด การหยุดเคลื่อนไหวการไหลเวียนของ command buffer มีเอกสารแยกต่างหากที่ครอบคลุมการจัดการข้อผิดพลาด
GRBL มีชุดคําสั่งของตัวเองที่เริ่มต้นด้วย$
ตัวอย่างเช่นสัญลักษณ์:
- $H - homing หรือการ kalibrating และค้นหาฮาร์ดแวร์ศูนย์ผ่านสวิทช์ขีด จํากัด โดยปกติจะดําเนินการเมื่อเริ่มต้นและในภายหลังตามความจําเป็นหากเกิดข้อผิดพลาดที่สะสมอย่างมีนัยสําคัญในระหว่างการเคลื่อนไหว
$J=<command>
— Jogging mode, which simulates joystick control. The command itself should describe relative movement along all axes. An example of such a command:$J=G21G91Y1F10
G21
— units in millimetersG91
— relative positioningY1
— movement along the Y-axis by 1 millimeterF10
— movement speed.
- ? — GRBL สอบถามสถานะ. กลับลําดับที่มีพารามิเตอร์ที่สําคัญของเครื่อง ตัวอย่างการตอบสนอง: <Alarm FhMPos:0.000,0.000,0.000 FFS:0,0 FPn:XYZ FPWCO:-5.300,0.000,-2.062>
We’re interested in the first two parameters:
- สถานะ สามารถเป็น “Idle”, “Running” หรือ “Alarm”
- MPos - ตําแหน่งปัจจุบันของขั้นตอน
ฉันจะไม่เจาะลึกเข้าไปใน GRBL และโปรโตคอลการควบคุมขั้นตอน - นี่เป็นวัสดุสําหรับบทความแยกต่างหาก ในระยะสั้น: GRBL เป็นซอฟต์แวร์ซอฟต์แวร์ซอฟต์แวร์แบบเปิดจากโลก CNC ที่เหมาะสําหรับการควบคุมระบบสามแกน (XY + Z) ผ่านคําสั่ง G-code ที่เรียบง่าย เราเลือกโมดูล BLE ที่ง่ายที่สุดที่เป็นไปได้ - HC-08 - เพื่อหลีกเลี่ยงการจัดการกับ MFi และ iAP มันเป็นสิ่งสําคัญสําหรับเราว่า iPhone สามารถส่งคําสั่งได้อย่างน่าเชื่อถือและรับการอัปเดตสถานะด้วยความล่าช้าขั้นต่ําโดยไม่เพิ่มค่าใช้จ่ายของชุดอย่างมีนัยสําคัญ
งาน
อัตโนมัติ
ก่อนหน้านี้ฉันได้กล่าวถึงการมุ่งเน้น กระบวนการนี้จะดําเนินการเป็นระยะเวลาในระหว่างการสแกนรอยเนื่องจากตัวอย่างจะถูกนํามาใช้ไม่สม่ําเสมอซึ่งเป็นสิ่งสําคัญโดยเฉพาะอย่างยิ่งเมื่อมีการขยายตัวสูง มันเป็นสิ่งจําเป็นที่จะตรวจสอบระดับของความมุ่งเน้นและปรับความมุ่งเน้นในเวลา นี่คือวิธีการทํางาน
กราฟิกด้านล่างแสดงความสัมพันธ์ระหว่างระดับโฟกัสและเวลา เราเริ่มต้นด้วยภาพไม่ชัดเจนค่อยๆย้ายขั้นตอนไปยังตําแหน่งโฟกัสที่ดีที่สุด
การสแกน
ฉันได้กล่าวถึงการสแกนแบบดิจิตอลในด้านโทรศัพท์มือถือแล้ว ควรสังเกตเห็นที่นี่ว่าการสแกนแบบดิจิตอลสามารถดําเนินการได้ในขนาดที่แตกต่างกัน: จาก 5x ถึง 40x ที่ระดับการยืดหยุ่นต่ํากว่าจะง่ายต่อการนําทางและตรวจจับขอบเขตของรอยขีดข่วนในขณะที่ในขนาดที่สูงขึ้นรายละเอียดของเซลล์จะมองเห็นได้
ในกรณีของเราเราทํางานในสองระดับ:
-
Boundary detection at 4x magnification. The algorithm scans the entire slide, determines the smear area, and generates a boundary map for the next stage. The output is something like a heat map. For example, from the low-magnification image on the left, we obtain a matrix that we then use to plan the steps for navigating at higher magnification:
-
Scanning the smear at 20x magnification (or another level). The algorithm scans and saves images for subsequent assembly into a single map. Scanning proceeds line by line, within the boundaries of the smear. A photo is captured for stitching when:
- the image is in focus
- the controller is in an idle state, i.e., not moving
เพื่อให้ผู้ใช้ไม่จําเป็นต้องเปลี่ยนวัตถุทุกครั้งเราทําการตรวจจับขอบเขตและการสแกนสไลด์ทั้งหมดในชุดในเวลาเดียวกันในขณะที่อัปโหลดชุดก่อนหน้านี้ไปยังคลาวด์ใน paralel การแทรกหรือประกอบภาพจะเกิดขึ้นในคลาวด์ แต่นี่เป็นหัวข้อสําหรับบทความแยกต่างหาก
ข้อสรุป
โครงการนี้แสดงให้เห็นว่าแม้กระทั่งสมาร์ทโฟนจากปี 2018 สามารถจัดการกับงานที่ก่อนหน้านี้ต้องใช้เดสก์ท็อปเซิร์ฟเวอร์และไมโครสโคปอัตโนมัติที่มีราคาแพง แน่นอนว่ายังคงมีจํานวนมากที่เหลืออยู่ด้านหลัง: จากการเก็บรวบรวมชุดข้อมูลจนถึงการปรับแต่งการตั้งค่าการสัมผัส หากคุณสนใจฉันจะยินดีที่จะครอบคลุมสิ่งนี้แยกต่างหาก เพลิดเพลินไปกับการถามคําถามแบ่งปันประสบการณ์ของคุณเองและบางทีร่วมกันเราจะสร้างการติดตามหรือจูบลึกลงในแง่มุมที่เฉพาะเจาะจง ขอบคุณสําหรับการอ่าน!
Let’s Connect!
แอนซาร์
- อีเมล: ansaril3g@gmail.com
- ลําโพง: Ansar Zhalyal
- โทรศัพท์: @celly_ai
มินิ
- อีเมล์: amin.benarieb@gmail.com
- ลําโพง: Amin Benarieb
- โทรศัพท์: @aminbenarieb