
สวัสดีครับ วันนี้ผมจะมารีวิว reComputer AI Industrial R2135-12 จาก Seeed Studio ซึ่งเป็นคอมพิวเตอร์ระดับ Industrial Edge ที่พัฒนาขึ้นบนแพลตฟอร์ม Raspberry Pi Compute Module 5 โดยโมเดลนี้มาพร้อมกับหน่วยความจำ LPDDR4 ขนาด 8GB และพื้นที่เก็บข้อมูล eMMC ขนาด 32GB ตัวเครื่องมีพอร์ต I/O มาให้เลือกใช้งานอย่างครบครัน ทั้ง Dual Gigabit Ethernet, USB 3.0/USB 2.0, ช่องต่อ HDMI รวมถึงอินเทอร์เฟซสำหรับงานอุตสาหกรรมอย่าง RS-485/RS-232, CAN และ GPIO พร้อมรองรับการเชื่อมต่อ Wi-Fi และ Bluetooth ตลอดจนรองรับช่วงแรงดันไฟ DC ขาเข้าที่กว้างซึ่งเหมาะสมอย่างยิ่งสำหรับสภาพแวดล้อมในงานอุตสาหกรรม
ในการรีวิวนี้นอกเหนือไปจากการตรวจสอบมาตรฐานของอุปกรณ์และการวัดประสิทธิภาพแล้ว ผมยังได้รวมการสาธิตแอปพลิเคชันที่ระบบจะรันโมเดล AI เพื่อตรวจจับและคำนวณตำแหน่งของบุคคลในภาพแบบเรียลไทม์ผ่านกล้อง USB จากนั้นจะส่งข้อมูลไปยังไมโครคอนโทรลเลอร์ ESP32 ภายนอก เพื่อสั่งงานแผงไฟ LED Matrix ให้แสดงตำแหน่งของบุคคลที่ตรวจจับได้ โดยผมได้จัดทำวิดีโอ YouTube ด้านล่างนี้เพื่อสาธิตประสิทธิภาพด้าน AI ของ reComputer รุ่น R2135-12 ให้ชมครับ
สำหรับการรีวิวในครั้งนี้ ผมพยายามที่จะรักษาโปรแกรมต่าง ๆ ในเครื่องให้อยู่ในสภาพเดิมจากโรงงานให้มากที่สุดครับ ดังนั้นนอกเหนือจากการติดตั้งเครื่องมือวัดประสิทธิภาพพื้นฐานอย่าง inxi, sbc-bench และ Geekbench แล้ว ผมเลือกใช้เพียงซอฟต์แวร์ที่ติดตั้งมาให้จากโรงงานเท่านั้น โดยไม่มีการอัปเดตระบบหรือลงแพ็กเกจเพิ่มเติมใดๆ ทั้งนี้เพื่อต้องการทดสอบว่าตัวเครื่องมีความพร้อมใช้งานมากน้อยแค่ไหนทันทีที่แกะกล่องครับ
เปิดกล่อง
พัสดุถูกจัดส่งจากประเทศจีนมายังประเทศไทย โดยใช้เวลาเดินทางประมาณ 10 วัน ตัวกล่องกระดาษภายนอกมีความแข็งแรงทนทาน ส่วนภายในมีการป้องกันตัวสินค้ามาอย่างดีด้วยกระดาษฝอยสีน้ำตาลเป็นวัสดุกันกระแทก อุปกรณ์ทุกชิ้นด้านในถูกจัดวางอย่างเป็นระเบียบและแน่นหนา ช่วยป้องกันไม่ให้เกิดการเคลื่อนที่หรือได้รับความเสียหายระหว่างการขนส่ง และนี่คือรายการอุปกรณ์ทั้งหมดที่ได้รับมาครับ
- reComputer Industrial R2135-12
- Mounting brackets
- Bracket screws
- DIN-rail clip
- DC power female jack to screw terminal adapter
- 12V/3A power adapter (with 4 interchangeable adapter plugs)
- 15*2-pin terminal block connector (male)
- 120Ω resistors
- Wi-Fi/BLE antenna
- User manual (not in the photo)


การต้้งค่าและใช้งานครั้งแรก
ตัวเครื่องมีน้ำหนักประมาณ 1.3 กิโลกรัม ซึ่งตอนที่ผมหยิบขึ้นมาครั้งแรกก็รู้สึกว่ามันค่อนข้างมีน้ำหนักมากกว่าที่คาดไว้เล็กน้อย สำหรับตัวเคสหลักนั้นทำมาจากอะลูมิเนียมซึ่งจะทำหน้าที่เป็นทั้งเคสป้องกันและเป็นฮีตซิงก์ระบายความร้อนแบบพาสซีฟ (Passive Heatsink) โดยส่วนแผงด้านล่างจะมีฉลากระบุชื่อรุ่นไว้อย่างชัดเจนว่าเป็น reComputer Industrial R2135-12 ครับ


เมื่อลองเทียบกับเกณฑ์การตั้งชื่อที่ระบุไว้ในเอกสารอย่างเป็นทางการ ข้อมูลบนฉลากนี้ยืนยันว่าตัวเครื่องที่ผมได้รับนั้นสร้างขึ้นบน Raspberry Pi Compute Module 5 โดยมาพร้อมกับ RAM 8 GB และพื้นที่เก็บข้อมูล eMMC ในตัวขนาด 32 GB นอกจากนี้ยังรองรับการเชื่อมต่อเครือข่ายไร้สาย และติดตั้งตัวเร่งความเร็ว AI อย่าง Hailo-8 มาให้ในตัวด้วยครับ
การแกะเครื่อง
ผมได้ลองถอดแยกชิ้นส่วนเพื่อตรวจสอบอุปกรณ์ภายใน โดยเริ่มจากการไขสกรู 4 ตัวที่แผงด้านล่างออก ซึ่งช่วยให้สามารถถอดแผงด้านข้างออกมาได้ จากนั้นผมจึงค่อย ๆ ยกแผงด้านบนขึ้นเพื่อสำรวจภายใน อย่างไรก็ตามเนื่องจากเสาอากาศ Wi-Fi นั้นถูกยึดติดกับแผงด้านข้างไว้ค่อนข้างแน่น และดูเหมือนว่าจะมีการทาซิลิโคนระบายความร้อนไว้ระหว่างแผงด้านล่างกับชิ้นส่วนบางตัวบนบอร์ดหลักด้วย ดังนั้นเพื่อหลีกเลี่ยงการรบกวนจุดเชื่อมต่อเหล่านี้ ผมจึงตัดสินใจคงสภาพทุกอย่างไว้ตามเดิม ดังที่แสดงในรูปภาพด้านล่างครับ




โดยรวมแล้ว การจัดวางเลย์เอาต์ภายในดูเป็นระเบียบเรียบร้อยดี โดยที่คอมโพเนนต์สำคัญทุกชิ้นถูกติดตั้งไว้อย่างแน่นหนา หากไม่นับคราบกาวซิลิโคนส่วนเกินเล็กน้อยบริเวณรอบ ๆ ตัวเก็บประจุบางตัวแล้ว โดยรวมก็ถือว่างานประกอบดูสะอาดและแข็งแรงทนทานมาก

การเปิดใช้งานตัวเครื่อง
ตามคู่มือการใช้งานระบุว่า ตัวเครื่องรองรับการจ่ายไฟเข้าได้สองรูปแบบด้วยกัน แบบแรกคือผ่านขั้วต่อ DC Terminal (รอบรับแรงดันไฟในช่วง 9–36V DC) และแบบที่สองคือผ่านพอร์ต PoE ขนาด 30W โดยทางผู้ผลิตแนะนำให้ใช้การจ่ายไฟผ่าน DC Terminal เมื่อต้องเชื่อมต่อกับอุปกรณ์ต่อพ่วงที่กินไฟสูงหรืออุปกรณ์ภายนอกหลายชิ้น โดยการรีวิวครั้งนี้ ผมเลือกจ่ายไฟให้กับตัวเครื่องผ่านขั้วต่อ DC Terminal แบบ 2 พิน ที่ผมเชื่อมต่อเข้ากับอะแดปเตอร์ 12V/3A ที่ให้มาในชุดด้วย ตามที่แสดงในภาพด้านล่างครับ อย่างไรก็ตาม ตัวเครื่องไม่มีปุ่มเปิด-ปิดเครื่องให้ใช้งานและอุปกรณ์จะเริ่มกระบวนการบูตระบบโดยอัตโนมัติทันทีที่มีการจ่ายไฟเข้า ดังนั้นผู้ใช้ควรปิดเครื่องอย่างถูกต้องผ่านตัวระบบปฏิบัติการทุกครั้งก่อนหยุดการจ่ายไฟหรือถอดปลั๊ก

ตัวเครื่องที่ผมได้รับมานั้นมีการติดตั้ง Image ของระบบปฏิบัติการ Raspberry Pi มาให้พร้อมใช้งานล่วงหน้าแล้ว ทำให้เราสามารถเริ่มใช้งานได้ทันทีตั้งแต่แกะกล่อง โดยรูปภาพด้านล่างนี้จะแสดงให้เห็นหน้าจอเดสก์ท็อปเริ่มต้นของระบบ และข้อมูลจากคำสั่ง htop ซึ่งแสดงรายการ Process ต่าง ๆ ที่ทำงานอยู่เป็นค่าเริ่มต้นของเครื่องครับ


ตามคู่มือระบุว่า ผู้ใช้งานสามารถแฟลชระบบปฏิบัติการใหม่ (re-burn) ได้เอง โดยใช้ไฟล์ Image จาก GitHub อย่างเป็นทางการ และเลือกตัวเลือก reComputer-R2x-arm64 ครับ ซึ่งในคู่มือการใช้งานจะมีขั้นตอนสอนอย่างละเอียด ตั้งแต่การใช้ rpiboot ร่วมกับ Raspberry Pi Imager เพื่อแฟลชระบบใหม่ นอกจากนี้ ผู้ใช้ยังสามารถติดตั้งระบบปฏิบัติการ Ubuntu ลงบน reComputer Industrial R2135-12 ได้เช่นเดียวกัน โดยให้ผู้ใช้ทำตามคำแนะนำในคู่มือการติดตั้ง Ubuntu บน Raspberry Pi เพื่อแฟลช Image ที่ดาวน์โหลดมา ซึ่งผู้ผลิตได้เตรียมแนวทางการติดตั้งโดยละเอียดสำหรับอุปกรณ์ในซีรีส์ reComputer ไว้ในคู่มือการใช้งานครับ
การตรวจสอบฟีเจอร์พื้นฐานผ่าน Command Line
ในคู่มือการใช้งานมีตัวอย่างคำสั่งสำหรับการทดสอบการทำงานผ่าน Command Line ไว้หลายส่วนครับ เช่น การเรียกดูข้อมูล GPIO ขาต่าง ๆ , การสแกนหาเครือข่าย Wi-Fi และการสั่งเปิด-ปิดไฟ User LED ซึ่งโดยรวมแล้วผมได้ลองรันคำสั่งเหล่านี้ดูและผลลัพธ์ที่ได้ก็ทำงานถูกต้องตามปกติครับ โดยข้อมูลด้านล่างนี้จะแสดงผลลัพธ์จากการใช้คำสั่งตรวจสอบตำแหน่งขา GPIO ครับ
|
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 |
cat /sys/kernel/debug/gpio ... gpiochip0: GPIOs 569-622, parent: platform/1f000d0000.gpio, pinctrl-rp1: gpio-569 (ID_SDA |spi2 CS0 ) out hi ACTIVE LOW gpio-570 (ID_SCL ) gpio-571 (GPIO2 ) gpio-572 (GPIO3 ) gpio-573 (GPIO4 |spi3 CS0 ) out hi ACTIVE LOW gpio-574 (GPIO5 ) gpio-575 (GPIO6 ) gpio-576 (GPIO7 ) gpio-577 (GPIO8 ) gpio-578 (GPIO9 |sysfs ) in hi gpio-579 (GPIO10 ) gpio-580 (GPIO11 ) gpio-581 (GPIO12 ) gpio-582 (GPIO13 ) gpio-583 (GPIO14 ) gpio-584 (GPIO15 ) gpio-585 (GPIO16 ) gpio-586 (GPIO17 ) gpio-587 (GPIO18 ) gpio-588 (GPIO19 ) gpio-589 (GPIO20 ) gpio-590 (GPIO21 ) gpio-591 (GPIO22 ) gpio-592 (GPIO23 ) gpio-593 (GPIO24 |spi2 CS1 ) out hi ACTIVE LOW gpio-594 (GPIO25 |spi3 CS1 ) out hi ACTIVE LOW gpio-595 (GPIO26 ) gpio-596 (GPIO27 ) ... |
ถัดมา ผมได้ทดสอบไฟ RGB LED ของตัวเครื่องโดยลองเปลี่ยนให้เป็นสี magenta ซึ่งทำได้โดยการสั่งเปิดการทำงานของ LED สีแดงและสีน้ำเงินผ่านคำสั่งต่อไปนี้

การสแกนหาเครือข่าย Wi-Fi ก็สามารถทำงานได้ถูกต้องตามปกติ
|
1 2 3 4 5 6 |
ls /sys/class/leds/ recomputer@reComputer-R2x:/sys/class/leds $ ls ACT input21::capslock input21::kana input21::scrolllock led-green mmc0 mmc1:: default-on input21::compose input21::numlock led-blue led-red mmc0:: PWR echo 1 > /sys/class/leds/led-red//brightness echo 1 > /sys/class/leds/led-blue/brightness |
ส่วนผลลัพธ์จากการสแกน Bluetooth แสดงให้เห็นตามด้านล่างนี้ครับ
|
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 |
recomputer@reComputer-R2x:~ $ sudo iwlist wlan0 scan wlan0 Scan completed : Cell 01 - Address: 9C:63:5B:CD:36:ED Channel:157 Frequency:5.785 GHz Quality=37/70 Signal level=-73 dBm Encryption key:on ESSID:"JUDA_TP_5GHz" Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s Mode:Master ... Cell 02 - Address: 9C:63:5B:FD:36:EC Channel:9 Frequency:2.452 GHz (Channel 9) Quality=51/70 Signal level=-59 dBm Encryption key:on ESSID:"JUDA_TP" Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 9 Mb/s 18 Mb/s; 36 Mb/s; 54 Mb/s Bit Rates:6 Mb/s; 12 Mb/s; 24 Mb/s; 48 Mb/s Mode:Master ... Cell 03 - Address: 9E:63:5B:FD:36:ED Channel:157 Frequency:5.785 GHz Quality=36/70 Signal level=-74 dBm Encryption key:on ESSID:"" Bit Rates:6 Mb/s; 9 Mb/s; 12 Mb/s; 18 Mb/s; 24 Mb/s 36 Mb/s; 48 Mb/s; 54 Mb/s Mode:Master ... |
สำหรับการทดสอบสุดท้ายในส่วนนี้ ผมจะเน้นไปที่การตรวจสอบการทำงานของพอร์ต DO (Digital Output) โดยวิธีทดสอบก็ง่าย ๆ คือผมใช้มัลติมิเตอร์วัดแรงดันไฟฟ้าที่ขา GPIO638 (DO1) ซึ่งพบว่าแรงดันมีการสลับไปมาระหว่าง 0V และประมาณ 1V ได้อย่างถูกต้อง ตามจังหวะการปรับสถานะเอาต์พุตระหว่าง Low และ High ผ่านคำสั่ง Command Line ต่อไปนี้ครับ
|
1 2 3 4 5 6 7 |
sudo bluetoothctl scan on [bluetooth]# scan on Discovery started [CHG] Controller 88:A2:9E:31:39:96 Discovering: yes [NEW] Device 8C:DF:2C:AA:BF:CA vivo Y27 5G [CHG] Device 8C:DF:2C:AA:BF:CA RSSI: -51 |
ข้อมูลระบบ
ถัดมาผมได้ติดตั้งและรันเครื่องมือ inxi ผ่าน Command Line เพื่อตรวจสอบข้อมูลพื้นฐานของระบบ โดยมีรายละเอียดปรากฏตามด้านล่างนี้ครับ
|
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 |
recomputer@reComputer-R2x:~ $ inxi -F System: Host: reComputer-R2x Kernel: 6.12.34+rpt-rpi-2712 arch: aarch64 bits: 64 Desktop: LabWC Distro: Debian GNU/Linux 12 (bookworm) Machine: Type: ARM System: Raspberry Pi Compute Module 5 Rev 1.0 details: N/A rev: d04180 serial: d2f02181ab20c2b1 CPU: Info: quad core model: N/A variant: cortex-a76 bits: 64 type: MCP cache: L2: 2 MiB Speed (MHz): avg: 2400 min/max: 1500/2400 cores: 1: 2400 2: 2400 3: 2400 4: 2400 Graphics: Device-1: bcm2712-hdmi0 driver: vc4_hdmi v: N/A Device-2: bcm2712-hdmi1 driver: vc4_hdmi v: N/A Display: wayland server: X.org v: 1.21.1.7 with: Xwayland v: 22.1.9 compositor: LabWC driver: gpu: vc4-drm,vc4_crtc,vc4_dpi,vc4_dsi,vc4_firmware_kms,vc4_hdmi,vc4_hvs,vc4_txp,vc4_v3d,vc4_vec resolution: 1920x1080~60Hz API: OpenGL v: 3.1 Mesa 24.2.8-1~bpo12+rpt3 renderer: V3D 7.1.10.2 Audio: Device-1: bcm2712-hdmi0 driver: vc4_hdmi Device-2: bcm2712-hdmi1 driver: vc4_hdmi API: ALSA v: k6.12.34+rpt-rpi-2712 status: kernel-api Server-1: PipeWire v: 1.2.7 status: active Network: Device-1: Raspberry Pi RP1 PCIe 2.0 South Bridge driver: rp1 IF: wlan0 state: down mac: 88:a2:9e:31:39:95 Device-2: Microchip (formerly SMSC) SMSC9512/9514 Fast Ethernet Adapter type: USB driver: smsc95xx IF: eth1 state: down mac: 2c:f7:f1:22:ee:3d IF-ID-1: can0 state: down mac: N/A IF-ID-2: can1 state: down mac: N/A IF-ID-3: eth0 state: up speed: 1000 Mbps duplex: full mac: 88:a2:9e:31:39:94 Bluetooth: Device-1: bcm7271-uart driver: bcm7271_uart Report: hciconfig ID: hci0 state: up address: 88:A2:9E:31:39:96 bt-v: 3.0 Drives: Local Storage: total: 29.12 GiB used: 7.8 GiB (26.8%) ID-1: /dev/mmcblk0 type: Removable vendor: Samsung model: BJTD4R size: 29.12 GiB Partition: ID-1: / size: 28.08 GiB used: 7.72 GiB (27.5%) fs: ext4 dev: /dev/mmcblk0p2 Swap: ID-1: swap-1 type: file size: 512 MiB used: 0 KiB (0.0%) file: /var/swap Sensors: System Temperatures: cpu: 47.9 C mobo: N/A Fan Speeds (RPM): N/A Info: Processes: 270 Uptime: 11m Memory: 7.88 GiB used: 2.21 GiB (28.1%) gpu: 8 MiB Shell: Bash inxi: 3.3.26 |
รายงานยืนยันว่าตัวระบบทำงานบนพื้นฐานของ Raspberry Pi Compute Module 5 Rev 1.0 รันระบบปฏิบัติการ Debian GNU/Linux 12 (bookworm) ร่วมกับ Kernel เวอร์ชัน 6.12.34+rpt-rpi-2712 บนสถาปัตยกรรม 64-bit ARM (aarch64) ส่วนหน่วยประมวลผลหลักเป็นแบบ Quad-core Cortex-A76 ความเร็วสูงสุด 2.4 GHz (ปรับระดับได้ระหว่าง 1.5 – 2.4 GHz) ซึ่งจากรายงานพบว่าทั้ง 4 แกนกำลังทำงานอยู่ที่ความเร็วสูงสุด ในด้านหน่วยความจำนั้นระบบตรวจพบ RAM ขนาด 7.88 GB โดยมีการใช้งานอยู่ที่ประมาณ 23–28% หลังบูตเครื่องได้ไม่นาน และมีพื้นที่เก็บข้อมูลภายใน 29.12 GB ซึ่งถูกใช้งานไปแล้วประมาณ 27% สำหรับอุณหภูมิ CPU ขณะนั้นอยู่ที่ประมาณ 47–48°C ซึ่งถือว่าการจัดการความร้อนทำได้คงที่ภายใต้สภาวะโหลด
ในส่วนของหน่วยประมวลผลกราฟิกส์ ตัวเครื่องใช้ GPU ของ Broadcom BCM2712 (VC4/V3D) ร่วมกับ Mesa 24.2.8 ซึ่งรองรับ OpenGL 3.1 และสามารถขับจอที่ความละเอียด 1920 × 1080 @ 60 Hz ผ่านพอร์ต HDMI ได้อย่างสบาย โดยตัวเดสก์ท็อปรันอยู่บนสภาพแวดล้อมแบบ Wayland (LabWC) และเปิดใช้งาน Xwayland ไว้ด้วย ด้านการเชื่อมต่อเครือข่าย พบว่าอินเทอร์เฟซ Gigabit Ethernet (eth0) กำลังทำงานอยู่ระหว่างการทดสอบ ในขณะที่พอร์ต Ethernet อื่นๆ รวมถึง Wi-Fi, CAN และ Bluetooth ตรวจพบในระบบแต่ยังไม่ได้เปิดใช้งาน ส่วนระบบเสียงส่งสัญญาณผ่าน HDMI โดยใช้ ALSA และมี PipeWire ทำงานอยู่เบื้องหลังครับ
โดยรวมแล้ว รายละเอียดซอฟต์แวร์และฮาร์ดแวร์ที่ตรวจพบนั้น ตรงตามสเปกที่ระบุไว้ ของ reComputer Industrial R2135-12 ไม่ว่าจะเป็นแพลตฟอร์ม Compute Module 5, CPU Quad-core Cortex-A76 และการกำหนดค่าหน่วยความจำขนาด 8 GB ครับ
การทดสอบประสิทธิภาพ
SBC-Bench
ถัดมาผมได้ติดตั้งและรันเครื่องมือ sbc-bench ซึ่งการทดสอบเสร็จสมบูรณ์และผ่านเกณฑ์ โดยผลลัพธ์แสดงให้เห็นว่าไม่มีอาการ CPU Throttling หรือการใช้หน่วยความจำสำรอง (Swapping) เกิดขึ้นเลย โดยความเร็วสัญญาณนาฬิกามีความเสถียรและขึ้นไปถึงระดับสูงสุดตามที่ระบุไว้ นอกจากนี้ ระหว่างการทดสอบยังตรวจพบการทำงานเบื้องหลัง (Background activity) ในระดับที่ยอมรับได้
ในส่วนของประสิทธิภาพหน่วยความจำ ผลที่ได้มีความสม่ำเสมอในทุกแกนของ Cortex-A76 โดยมีค่าจาก memcpy throughput อยู่ที่ประมาณ 5.1 GB/s และจาก memset throughput อยู่ที่ประมาณ 8.5 GB/s ด้านความหน่วงเวลาของหน่วยความจำ (Memory latency) ยังคงต่ำมากในช่วงที่เป็น Cache (ประมาณ 1.7 ns) และค่อย ๆ เพิ่มขึ้นตามขนาดของ Buffer จนไปอยู่ที่ประมาณ 120–135 ns สำหรับ Buffer ขนาดใหญ่ครับ
|
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 |
... Memory performance (all 8 CPU clusters measured individually): memcpy: 5149.2 MB/s (Cortex-A76) memset: 8584.0 MB/s (Cortex-A76) memcpy: 5148.8 MB/s (Cortex-A76) memset: 8577.6 MB/s (Cortex-A76) memcpy: 5143.4 MB/s (Cortex-A76) memset: 8584.4 MB/s (Cortex-A76) memcpy: 5145.6 MB/s (Cortex-A76) memset: 8585.5 MB/s (Cortex-A76) memcpy: 5154.8 MB/s (Cortex-A76) memset: 8585.6 MB/s (Cortex-A76) memcpy: 5133.8 MB/s (Cortex-A76) memset: 8577.9 MB/s (Cortex-A76) memcpy: 5149.0 MB/s (Cortex-A76) memset: 8576.4 MB/s (Cortex-A76) memcpy: 5149.6 MB/s (Cortex-A76) memset: 8590.0 MB/s (Cortex-A76) ... 32k: 1.691 1.690 1.690 1.690 1.690 1.691 1.692 3.296 64k: 1.701 1.697 1.701 1.697 1.700 1.700 1.702 3.303 128k: 5.072 5.071 5.071 5.073 5.071 5.769 7.212 12.81 256k: 5.426 5.259 5.251 5.216 5.251 5.837 7.288 12.82 512k: 7.258 7.734 7.469 7.737 7.159 8.220 9.185 15.00 1024k: 17.89 17.10 17.78 17.10 17.68 17.87 20.00 29.25 2048k: 19.21 18.72 18.64 18.72 18.74 19.88 23.22 31.64 4096k: 76.75 78.28 77.24 78.45 76.25 89.41 120.7 159.3 8192k: 119.0 102.7 104.4 103.1 102.8 109.7 142.4 193.9 16384k: 113.6 112.0 113.4 112.9 112.9 118.7 143.9 162.7 32768k: 126.9 123.9 125.8 123.5 125.4 126.6 131.4 141.6 65536k: 129.4 126.8 128.7 126.7 128.7 127.8 130.5 133.9 131072k: 129.8 128.5 129.6 128.5 129.6 128.5 129.8 132.5 ... |
ในส่วนของประสิทธิภาพการประมวลผล ผลการทดสอบจาก 7-Zip benchmark ทำคะแนนรวมแบบหลายแกน (Multi-core) ได้ประมาณ 11,100 คะแนนจากการทดสอบซ้ำหลายครั้ง และทำคะแนนแบบแกนเดียว (Single-threaded) ได้ประมาณ 3,121 คะแนน ซึ่งแสดงให้เห็นถึงประสิทธิภาพในการบีบอัดและคลายบีบอัดข้อมูลที่เสถียรและคงเส้นคงวาดี
|
1 2 3 |
... 7-zip total scores (3 consecutive runs): 11110,11136,11131, single-threaded: 3121 ... |
สำหรับการทดสอบด้านการเข้ารหัส (Cryptographic tests) ผลลัพธ์จาก OpenSSL นั้นออกมาดีและสม่ำเสมอในทุกแกน โดยมีค่า Throughput ของ AES-128-CBC อยู่ที่เกือบ 1.88 GB/s ส่วน AES-192-CBC อยู่ที่ประมาณ 1.57 GB/s และ AES-256-CBC อยู่ที่ประมาณ 1.35 GB/s เมื่อทดสอบกับ Block size ขนาดใหญ่ ผลลัพธ์ทั้งหมดนี้ยืนยันประสิทธิภาพในภาพรวมที่ชัดเจน ทั้งในเรื่องพฤติกรรมของหน่วยประมวลผลกลางที่เสถียร, แบนด์วิดท์ของหน่วยความจำที่ดี, การเพิ่มขึ้นของความหน่วงต่าง ๆ เป็นไปตามที่คาดการณ์ได้ รวมถึงประสิทธิภาพการคำนวณเลขจำนวนเต็มและการเข้ารหัสที่น่าเชื่อถือ
|
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 |
... OpenSSL results (all 8 CPU clusters measured individually): type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes 16384 bytes aes-128-cbc 594976.14k 1290786.28k 1694330.03k 1827406.51k 1881746.09k 1886972.59k (Cortex-A76) aes-128-cbc 595541.14k 1291237.40k 1693894.83k 1828485.12k 1881284.61k 1887262.04k (Cortex-A76) aes-128-cbc 596013.89k 1289307.41k 1694745.86k 1827424.94k 1881426.60k 1887447.72k (Cortex-A76) aes-128-cbc 595018.13k 1293503.04k 1694060.89k 1826374.66k 1881770.67k 1887300.27k (Cortex-A76) aes-128-cbc 598141.49k 1291072.23k 1694859.86k 1827430.40k 1881655.98k 1887485.95k (Cortex-A76) aes-128-cbc 598797.65k 1289548.05k 1694564.52k 1826965.50k 1881718.78k 1887327.57k (Cortex-A76) aes-128-cbc 594819.94k 1290364.86k 1696595.46k 1827517.78k 1881795.24k 1887431.34k (Cortex-A76) aes-128-cbc 595902.32k 1289898.33k 1695651.93k 1827775.15k 1881655.98k 1887316.65k (Cortex-A76) aes-192-cbc 562560.68k 1124640.34k 1432901.29k 1518641.83k 1569901.23k 1573453.82k (Cortex-A76) aes-192-cbc 562473.23k 1124936.36k 1432863.06k 1518676.99k 1569764.69k 1573306.37k (Cortex-A76) aes-192-cbc 564201.12k 1124473.24k 1433254.57k 1518724.44k 1569559.89k 1573650.43k (Cortex-A76) aes-192-cbc 563271.49k 1125458.18k 1432898.47k 1518941.18k 1569434.28k 1573557.59k (Cortex-A76) aes-192-cbc 561526.78k 1123707.39k 1433080.75k 1518962.69k 1569876.65k 1573759.66k (Cortex-A76) aes-192-cbc 563839.60k 1124952.77k 1432805.12k 1518688.60k 1569884.84k 1573726.89k (Cortex-A76) aes-192-cbc 561921.38k 1124819.56k 1432981.25k 1518673.92k 1569901.23k 1573765.12k (Cortex-A76) aes-192-cbc 563001.52k 1124441.58k 1432818.69k 1517664.60k 1569540.78k 1573694.12k (Cortex-A76) aes-256-cbc 548336.69k 998419.99k 1242847.57k 1316564.65k 1346516.31k 1349380.78k (Cortex-A76) aes-256-cbc 547503.40k 998072.36k 1242349.57k 1316630.87k 1346502.66k 1347960.83k (Cortex-A76) aes-256-cbc 547646.89k 998284.86k 1241602.13k 1316511.40k 1346497.19k 1349074.94k (Cortex-A76) aes-256-cbc 539631.60k 992004.89k 1239950.42k 1315208.19k 1345888.26k 1349211.48k (Cortex-A76) aes-256-cbc 547980.23k 998398.10k 1242483.54k 1316303.19k 1346377.05k 1349167.79k (Cortex-A76) aes-256-cbc 547453.64k 999679.94k 1242614.87k 1316233.22k 1346546.35k 1349326.17k (Cortex-A76) aes-256-cbc 547551.88k 998091.35k 1242746.37k 1316634.28k 1346527.23k 1349266.09k (Cortex-A76) aes-256-cbc 547312.89k 998043.54k 1241990.14k 1316261.21k 1346543.62k 1349413.55k (Cortex-A76) ... |
สรุปโดยรวมแล้ว ผลการทดสอบด้วย sbc-bench แสดงให้เห็นว่าตัวเครื่องมีประสิทธิภาพที่เสถียรดี ไม่ว่าจะเป็นการทำงานของหน่วยประมวลผลกลาง, แบนด์วิดท์หน่วยความจำ, การหน่วยงาน และประสิทธิภาพด้านการคำนวณและการเข้ารหัสที่ดีครับ
การทดสอบความเร็วในการอ่าน-เขียนไฟล์ด้วย iozone
ผมได้ทดสอบประสิทธิภาพของระบบไฟล์โดยใช้เครื่องมือ iozone เพื่อวัดประสิทธิภาพการรับ-ส่งข้อมูลของหน่วยเก็บข้อมูลครับ โดยการทดสอบนี้ถูกตั้งค่าให้ใช้ไฟล์ขนาด 512 MB และกำหนดขนาด Record ไว้ที่ 1 MB และ 16 MB ซึ่งผลลัพธ์ที่ได้มีรายละเอียดดังนี้ครับ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... Include fsync in write timing O_DIRECT feature enabled Auto Mode File size set to 524288 kB Record Size 1024 kB Record Size 16384 kB Command line used: iozone -e -I -a -s 512M -r 1024k -r 16384k -i 0 -i 1 -i 2 Output is in kBytes/sec Time Resolution = 0.000001 seconds. Processor cache size set to 1024 kBytes. Processor cache line size set to 32 bytes. File stride size set to 17 * record size. random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 524288 1024 83964 95051 319753 320757 319815 78884 524288 16384 81408 77665 334355 332469 333798 76082 ... |
ประสิทธิภาพการอ่านแบบลำดับ (Sequential Read) ให้ผลลัพธ์ที่สม่ำเสมอทั้งสองขนาด โดยวัดความเร็วได้ประมาณ 320–337 MB/s ส่วนผลการอ่านซ้ำ (Re-read) และการอ่านแบบสุ่ม (Random Read) ก็อยู่ในช่วงความเร็วใกล้เคียงกัน ซึ่งบ่งบอกถึงความเร็วในการอ่านที่เสถียรภายใต้การเข้าถึงข้อมูลซ้ำ ๆ สำหรับประสิทธิภาพการเขียนแบบลำดับ (Sequential Write) ทำความเร็วได้ประมาณ 100–111 MB/s ทั้งสองขนาดเช่นเดียวกับความเร็วในการเขียนแบบสุ่ม (Random Write) ที่ให้ค่าใกล้เคียงกันครับ โดยรวมแล้ว ผลการทดสอบนี้ชี้ให้เห็นว่าอุปกรณ์มีแบนด์วิดท์ในการอ่านที่สูงและสม่ำเสมอ ส่วนประสิทธิภาพในการเขียนนั้นอยู่ในระดับปานกลางและให้ผลที่คงเส้นคงวาเมื่อทดสอบผ่าน Direct I/O ครับ
การทดสอบประสิทธิภาพด้วย Geekbench 6.5
ถัดมาผมได้ติดตั้งและรัน Geekbench 6.5.0 โดยระบบทำคะแนน Single-core ได้ 865 คะแนน และ Multi-core ได้ 1,982 คะแนน ซึ่งสะท้อนถึงประสิทธิภาพโดยรวมของหน่วยประมวลผลกลางได้เป็นอย่างดี โดยสามารถดูผลการทดสอบฉบับเต็มได้ที่ลิงก์ผลทดสอบ Geekbench นี้ครับ
ในการทดสอบแบบ Single-core นั้น พบว่าคะแนนส่วนใหญ่จะเกาะกลุ่มอยู่ในช่วงกลาง 800 โดยงานที่โดดเด่นเป็นพิเศษคือ Clang compilation, Horizon Detection, Navigation และ PDF Rendering ในขณะที่งานทั่วไปอย่างการประมวลผลข้อความ (Text Processing), HDR, การเปิดเบราว์เซอร์ HTML5, Ray Tracing และ Structure from Motion นั้นทำคะแนนได้ใกล้เคียงค่าเฉลี่ย ส่วนงานด้าน Computer Vision ที่ต้องใช้พลังประมวลผลสูงอย่างการ Object Detection และ Object Remover จะมีคะแนนที่ต่ำกว่าอย่างเห็นได้ชัด

สำหรับผลการทดสอบแบบ Multi-core แสดงให้เห็นถึงความสามารถในการกระจายงานไปยังทุกแกนของหน่วยประมวลผลกลางภายใต้ภาระการทำงานแบบขนาน โดยทำคะแนนได้สูงในด้าน Asset Compression, Ray Tracing และการคอมไพล์ด้วย Clang ซึ่งบ่งบอกถึงการดึงพลังการทำงานหลายแกนมาใช้ในงานประมวลผลหนัก ๆ ได้อย่างมีประสิทธิภาพ นอกจากนี้ งานด้านอื่นอย่าง PDF Rendering, Structure from Motion, Navigation, Background Blur, Photo Library และ HDR ก็มีประสิทธิภาพเพิ่มจากการประมวลผลแบบขนานเช่นกัน ในขณะที่งานด้านการประมวลผลข้อความ, HTML5 และ Object Detection มีการเพิ่มขึ้นของประสิทธิภาพในระดับปานกลางครับ

สรุปในภาพรวม คะแนน Multi-core สูงกว่า Single-core ประมาณ 2.3 เท่า ซึ่งแสดงให้เห็นถึงประโยชน์ของการกระจายการประมวลผลไปยังหลาย ๆ แกนได้อย่างชัดเจน งานที่เคยทำได้ในช่วง 800 คะแนนในโหมดแกนเดียวมักจะพุ่งไปเกิน 2,000 คะแนน และบางส่วนเกิร 3,000 คะแนนได้ในโหมดหลายแกน ส่วนงานอย่าง Object Detection และ Object Remover แม้จะทำคะแนนได้ดีขึ้น แต่ก็ยังค่อนข้างต่ำเนื่องจากข้อจำกัดด้านประสิทธิภาพต่อแกนครับ
การทดสอบประสิทธิภาพเว็บเบราว์เซอร์ด้วย Speedometer 3.1
ถัดมาผมได้ใช้ Speedometer 3.1 เพื่อทดสอบประสิทธิภาพของเว็บเบราว์เซอร์ทั้งสองตัวที่ติดตั้งมาพร้อมกับระบบปฏิบัติการครับ ซึ่งผลปรากฏว่าเบราว์เซอร์ทั้งคู่ทำคะแนนออกมาได้ใกล้เคียงกันมาก
ในส่วนของ Chromium ผลการทดสอบ Speedometer ให้คะแนนเฉลี่ยอยู่ที่ประมาณ 4.16 โดยผลลัพธ์ในการรันแต่ละครั้งเกาะกลุ่มกันดี และมีค่าเฉลี่ยเวลา Geometric Mean อยู่ที่ประมาณ 240 ms ซึ่งบ่งบอกถึงประสิทธิภาพการทำงานของเบราว์เซอร์ที่เสถียร โดยเวลาส่วนใหญ่จะถูกใช้ไปกับการประมวลผล JavaScript และ DOM เช่น การอัปเดต UI ที่ซับซ้อนและการเรนเดอร์กราฟ
ทางด้าน Firefox ก็ให้ผลลัพธ์ที่ใกล้เคียงกันมาก และมีความแตกต่างของค่าระหว่างการทดสอบในแต่ละรอบต่ำเช่นกัน โดยมีค่าเฉลี่ยเวลาในการประมวลผลอยู่ในช่วง ~240 ms ซึ่งเท่ากับ Chromium ครับ


ซึ่งความแตกต่างเพียงเล็กน้อยระหว่างเบราว์เซอร์ทั้งสองนี้ถือว่าอยู่ในเกณฑ์ความคลาดเคลื่อนปกติของการทดสอบ และไม่ได้แสดงถึงความแตกต่างของประสิทธิภาพอย่างมีนัยสำคัญ โดยสรุปแล้ว ทั้ง Chromium และ Firefox มอบประสิทธิภาพในการท่องเว็บที่เทียบเท่ากันบนระบบนี้ครับ
การทดสอบประสิทธิภาพการเล่นวิดีโอ YouTube
ถัดมาผมได้ทดสอบการเล่นวิดีโอบน YouTube โดยเปิดวิดีโอความละเอียด 4K ในโหมดเต็มหน้าจอ บนหน้าจอความละเอียด 4K (3840 × 2160) พร้อมเปิดฟีเจอร์ “Stats for Nerds” เพื่อดูข้อมูลเพิ่มเติม ผมพบว่าการเล่นวิดีโอทำได้ลื่นไหลและเสถียรมากตั้งแต่ความละเอียด 144p ไปจนถึง 1080p โดยไม่พบอาการสะดุดหรือเฟรมเรตตก (Dropped frames) เลย อย่างไรก็ตาม ระบบไม่ได้แสดงตัวเลือกความละเอียดที่สูงกว่า 1080p ให้เลือกใช้งานครับ
ที่ความละเอียดระดับต่ำ (144p–360p) การเล่นวิดีโอใช้บิตเรตไม่สูงนักและรักษาความยาวของบัฟเฟอร์ (Buffer health) ได้ดีโดยคงอยู่ที่ประมาณ 120 วินาทีเสมอ ซึ่งแสดงให้เห็นว่าระบบสามารถถอดรหัสวิดีโอได้ดีและมีแบนด์วิดท์เครือข่ายเหลือแม้จะขยายภาพให้เต็มจอ 4K ก็ตาม
เมื่อขยับมาที่ความละเอียดสูงขึ้น (480p–1080p) การเล่นวิดีโอก็ยังคงเสถียรบนหน้าจอเดิม โดยความเร็วในการเชื่อมต่อปรับตัวขึ้นอย่างเหมาะสมกับขนาดภาพ และบัฟเฟอร์ก็อยู่ในระดับที่น่าพอใจ คือ ช่วง 30 ถึง 120 วินาทีครับ แม้จะเล่นที่ความละเอียด 1080p/30fps ระบบนี้ก็ยังคงรักษาความลื่นไหลไว้ได้โดยไม่มีเฟรมเรตตก ผลการทดสอบนี้แสดงให้เห็นว่าตัวเครื่องมีความสามารถในการถอดรหัสวิดีโอและการจัดการบัฟเฟอร์ที่ดีในทุกระดับความละเอียดมาตรฐานของ YouTube ครับ






การทดสอบประสิทธิภาพการเรนเดอร์ 3D บนเว็บเบราว์เซอร์ด้วย WebGL
ถัดมาผมได้ประเมินประสิทธิภาพการเรนเดอร์ 3D ผ่านเว็บเบราว์เซอร์ โดยใช้ตัวอย่าง WebGL Aquarium และรันบนเบราว์เซอร์ Chromium ครับ
ผมกำหนดขนาดหน้าจอการเรนเดอร์ (Canvas) ไว้ที่ 1024 × 1024 ผลลัพธ์แสดงให้เห็นถึงการลดทอนของประสิทธิภาพที่ชัดเจนและคาดการณ์ได้ตามความซับซ้อนของฉากที่เพิ่มขึ้นครับ ในช่วงที่มีจำนวนวัตถุไม่มาก ประสิทธิภาพถือว่ายอดเยี่ยมดี โดยสามารถรันได้ที่ 60 fps อย่างเสถียรเมื่อมีปลา 1–100 ตัว และยังคงใกล้เคียงระดับ Real-time ที่ประมาณ 54 fps เมื่อเพิ่มเป็น 500 ตัว ส่วนที่ 1,000 ตัวก็ยังให้ความลื่นไหลที่ยอมรับได้ที่ประมาณ 48 fps ครับ อย่างไรก็ตาม เมื่อจำนวนปลาเพิ่มขึ้นมากกว่านี้ เฟรมเรตก็เริ่มตกลงอย่างต่อเนื่อง โดยเหลือประมาณ 29 fps ที่ปลา 5,000 ตัว ซึ่งเริ่มรู้สึกได้ว่าแอนิเมชันไม่ลื่นไหลเท่าที่ควร

เมื่อเจอกับ Workload ที่หนักขึ้น ข้อจำกัดของ GPU ก็เริ่มปรากฏชัดเจนขึ้น โดยที่ปลา 10,000 ตัวนั้น อัตราการแสดงผลตกลงมาอยู่ที่ประมาณ 16 fps และลดลงเหลือเพียง 11 fps เมื่อมีปลา 15,000 ตัว และแสดงผลได้เพียง 8 fps ที่ปลา 20,000 ตัวครับ ส่วนในฉากที่มีความหนาแน่นสูงมากระดับ 25,000–30,000 ตัว ประสิทธิภาพจะลดลงเหลือเพียง 6–7 fps ซึ่งต่ำเกินการเรนเดอร์แบบ Real-time ไปแล้ว โดยรวมแล้ว ผลการทดสอบนี้ชี้ให้เห็นว่า Chromium สามารถรับมือกับงาน WebGL ระดับปานกลางได้อย่างลื่นไหล แต่ประสิทธิภาพจะลดลงอย่างรวดเร็วเมื่อมีการเรียกใช้งานการวาดภาพและการประมวลผลที่มากขึ้น ซึ่งอาจจะสะท้อนถึงอาการ GPU-bound มากกว่าที่จะเป็นปัญหาเรื่องความไม่เสถียรของตัวเบราว์เซอร์ครับ โดยกราฟสรุปด้านล่างนี้จะเปรียบเทียบเฟรมเรตในแต่ละสถานการณ์ให้เห็นภาพชัดเจนขึ้นครับ


การทดสอบตัวเร่งความเร็ว AI Hailo-8
reComputer Industrial R2135-12 ของผมมาพร้อมกับตัวเร่งความเร็ว AI Hailo-8 ที่ติดตั้งมาให้ในตัว โดยมีไลบรารีและแพ็กเกจที่จำเป็นทั้งหมดพร้อมใช้งานทันทีครับ ในการทดสอบ Hailo Raspberry Pi 5 examples นั้น ผมเพียงแค่ตั้งค่า Source โดยใช้สคริปต์จาก /mnt/hailo-rpi5-examples/setup_env.sh ซึ่งจะทำการเปิดใช้งาน Virtual Environment และกำหนดเส้นทาง (Paths) ที่จำเป็นสำหรับ Hailo-8 Runtime ให้โดยอัตโนมัติ เมื่อตั้งค่าสภาพแวดล้อมเสร็จ ระบบก็พร้อมที่จะรันแอปพลิเคชันตัวอย่างและ Workload ด้านการประมวลผล AI ได้ทันทีโดยไม่ต้องติดตั้งอะไรเพิ่มเติมครับ โดยสคริปต์ตัวอย่าง Python ทั้งหมดนั้นสร้างขึ้นบน GStreamer และ Pipeline ภายใน ซึ่งทำหน้าที่จัดการทั้งการสตรีมวิดีโอ, การประมวลผลวิดีโอ และการประมวลผล AI ไปพร้อมกัน

ในการทดสอบเบื้องต้น ผมเริ่มจากสคริปต์ simple_detection.py ซึ่งเป็นโปรแกรมตัวอย่างการตรวจหาวัตถุแบบเน้นลดภาระของ CPU ให้เหลือน้อยที่สุด โดยมีตัวเลือก Command Line ที่น่าสนใจอย่าง --input สำหรับเลือกแหล่งข้อมูล (เช่น ไฟล์วิดีโอหรือเว็บแคม USB) และ --show-fps เพื่อแสดงเฟรมเรตซ้อนทับบนวิดีโอครับ จากการตั้งค่าเริ่มต้น สคริปต์นี้รันบนไฟล์วิดีโอตัวอย่างโดยมีการจำกัดเฟรมเรตไว้ ซึ่งบนหน้าจอ Console จะแสดงรายละเอียดการตรวจจับ เช่น ค่าความเชื่อมั่น (Confidence score) ของวัตถุแต่ละชิ้น โดยรวมแล้วโปรแกรมตัวอย่างนี้ทำงานได้อย่างลื่นไหลที่ประมาณ 30 fps ภาพด้านล่างนี้คือผลลัพธ์จากการรันสคริปต์ simple_detection.py ครับ

ภาพถัดมาแสดงผลการทดสอบการตรวจหาวัตถุแบบเต็มรูปแบบ (Full detection) โดยใช้สคริปต์ detection.py ครับ

และนี่คือผลลัพธ์จากการรันสคริปต์ instance_segmentation.py เพื่อการแบ่งส่วนวัตถุ (Object segmentation) ซึ่งทำงานได้ตามความคาดหมาย โดยทำความเร็วได้ใกล้เคียงกันที่ 30 FPS ภายใต้การตั้งค่าเริ่มต้นครับ

ส่วนสคริปต์ depth_estimation.py นั้นทำงานบนโมเดลการประมาณค่าความลึก SCDepthV3 ซึ่งให้ผลลัพธ์ออกมาดีมากเช่นกัน

โปรแกรมตัวอย่างตัวสุดท้ายที่ผมทดสอบคือการประมาณท่าทาง (Pose estimation) ซึ่งระบบจะส่งคืนจุดสำคัญ (Keypoints) ทั้งหมด 17 จุด (HAILO_LANDMARKS) สำหรับแต่ละคนที่ตรวจหาพบในภาพ เช่น จมูก, ตา, หู, ไหล่, ข้อศอก, ข้อมือ, สะโพก, เข่า และข้อเท้า ซึ่งสคริปต์ตัวอย่างนี้ก็ทำงานได้ถูกต้องตามปกติ และให้ผลการประมาณท่าทางที่เสถียรและแม่นยำค่อนข้างดี

การสาธิตการใช้งาน – การตรวจจับตำแหน่งบุคคลในพื้นที่ที่กำหนด
ในส่วนนี้ ผมจะแสดงศักยภาพด้าน AI ของ reComputer Industrial R2135-12 ผ่านโปรเจกต์ตัวอย่างของผมเอง โดยใช้การตรวจหาบุคคลในวิดีโอสตรีม และจะคำนวณหาตำแหน่งของแต่ละคนในภาพออกมาเป็นพิกัดในโลกจริง (Real-world coordinates) จากนั้นจะส่งพิกัดนี้ไปแสดงผลบนแผงไฟ LED Matrix ขนาด 8×16 ที่ควบคุมด้วยบอร์ด ESP32 ซึ่งทำหน้าที่เสมือน “แผนผังไฟ LED” เพื่อระบุตำแหน่งว่ามีคนอยู่จุดไหนบ้างในพื้นที่นั้นครับ
อย่างไรก็ตามในการตั้งค่าใช้งานจริงและการประมาณตำแหน่งที่แม่นยำนั้นมักจำเป็นต้องมีหน้าจอ GUI เพื่อให้ผู้ใช้คลิกเลือกจุดอ้างอิงบนเฟรมวิดีโอเพื่อทำการสอบเทียบ (Calibration) แต่เนื่องจากข้อจำกัดด้านเวลาของการรีวิวนี้ ผมจึงข้ามขั้นตอนนี้ไปโดยใช้การรันสคริปต์ผ่านวิดีโอที่บันทึกไว้แทน เพื่อมุ่งเน้นไปที่การโชว์พลังการประมวลผลและขีดความสามารถด้าน AI ของตัวเครื่อง reComputer เป็นหลักครับ
ทฤษฎีพื้นฐาน
ภาพด้านล่างอธิบายถึงแนวคิดการแปลงพิกัดโลกจริงจากจุดบนภาพ (Image points) สรุปคร่าว ๆ ได้ว่า ถ้าหากเราทราบระนาบพื้น (Ground plane) และทราบพิกัดโลกจริงของจุดอ้างอิงอย่างน้อย 2 จุด (ในภาพคือ A และ B) เราจะสามารถระบุตำแหน่งที่สอดคล้องกันบนภาพได้ (คือจุด a และ b) ข้อมูลเหล่านี้ประกอบกับพารามิเตอร์ของกล้อง (Camera frustum – สามเหลี่ยมสีเหลือง) จะช่วยให้เราประมาณตำแหน่งและทิศทางการวางตัวของกล้องได้
เมื่อทราบค่าทุกอย่างข้างต้นแล้ว หากมีวัตถุใด ๆ อยู่บนพื้นและเราทราบตำแหน่งของมันบนภาพ (เช่น จุด c) เราก็จะสามารถหาพิกัดโลกจริงของวัตถุนั้นได้โดยการลากเส้นรังสีย้อนกลับ (Back-projecting) เช่น การลากเส้นสีส้มจากจุดศูนย์กลางกล้องผ่านจุด c บนภาพ เพื่อหาจุดที่รังสีนี้ไปตัดกับระนาบพื้นดินนั่นเอง

ภาพถัดมาแสดงตัวอย่างการประมาณพิกัดของฐานขาตั้งกล้องโดยอนุมาณว่าผมทราบค่าพารามิเตอร์ภายในของกล้อง (Intrinsics) ร่วมกับจุดควบคุมบนพื้น 4 จุด (A–D) โดยในการตั้งค่าตัวอย่างนี้ ผมกำหนดให้จุดกำเนิด (0, 0) อยู่ที่กึ่งกลางระหว่างจุด A–D โดยที่กระเบื้องปูพื้นแต่ละแผ่นมีขนาด 60 × 60 ซม. ตำแหน่งจริงของขาตั้งกล้องจะอยู่ที่ประมาณ (0, −60, 0) ในพิกัดโลก และผลจากการประมาณค่าได้ออกมาเป็น (0.3, -59.4, 0.0) ซึ่งถือว่าใกล้เคียงกับตำแหน่งจริงมากครับ สิ่งนี้พิสูจน์ให้เห็นว่าวิธีการกู้คืนพิกัด (Coordinate recovery) แบบง่าย ๆ นี้มีความแม่นยำเพียงพอสำหรับการใช้งานครับ

การจัดตั้งฉากและการประมาณท่าทางของกล้อง
ขั้นตอนแรก ผมได้ทำการสอบเทียบกล้อง (Calibration) โดยใช้ชุดภาพกระดานหมากรุก (Chessboard images) ร่วมกับฟังก์ชันของ OpenCV เพื่อหาค่าพารามิเตอร์ภายใน (Intrinsic parameters: fx,fy,cx,cy) และค่าสัมประสิทธิ์การบิดเบี้ยวของเลนส์ (Distortion coefficients: k1,k2,p1,p2,k3) ครับ
|
1 2 3 4 5 6 7 8 9 |
fx = 3238.6635331929683 fy = 3241.0613554172223 cx = 2042.009749715308 cy = 925.2763732253052 k1 = 0.2523496972079927 k2 = -1.4002772998133683 p1 = 0.002290276484551306 p2 = -0.0014385064745750323 k3 = 2.7815419705574613 |
จากนั้นผมได้จัดเตรียมฉากทดสอบตามภาพด้านล่าง โดยใช้เทปสีน้ำเงินทำเครื่องหมายเป็นจุดกำเนิดอ้างอิง (0, 0) กำหนดให้แกน +X วางตัวตามแนวทิศทาง A–B และแกน +Y ตามแนวทิศทาง A–D หลังจากนั้นผมได้บันทึกวิดีโอและดึงเฟรมออกมาหนึ่งภาพเพื่อระบุจุดอ้างอิงต่างๆ สำหรับใช้คำนวณหาค่าการแปลงพิกัดของกล้อง (Camera transformation) โดยใช้ฟังก์ชัน Python ที่พัฒนาจากวิธี Perspective-n-Point (PnP) ของ OpenCV ครับ


ด้านล่างนี้คือฟังก์ชันที่ผมใช้ในการประมาณท่าทางของกล้อง
|
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 |
def estimate_camera_poses(pts_img, pts_world, camera_matrix, dist_coeffs): print("-------------------------------------") n_image_points = pts_img.shape n_object_points = pts_world.shape poses = [] image_points = pts_img objp = pts_world.reshape(-1, 1, 3) imgp = pts_img.reshape(-1, 1, 2) success, rvec, tvec = cv2.solvePnP( objp, imgp, camera_matrix, dist_coeffs) R, _ = cv2.Rodrigues(rvec) pose = numpy.hstack((R, tvec)) # 3x4 matrix poses.append({ 'rotation_vector': rvec, 'translation_vector': tvec, "rotation_matrix": R, 'pose_matrix': pose }) return poses |
และนี่คือข้อมูลเมทริกซ์การหมุน (Rotation) และเวกเตอร์การแปลพิกัด (Translation) ของกล้องที่ประมาณค่าได้
|
1 2 3 4 |
R = [[ 0.02303737 -0.99858007 0.04803245], [-0.31316605 -0.05283524 -0.94822754], [ 0.94941893 0.00680254 -0.31393856]] t = [-211.98, 101.39, 121.58] |
ในขณะที่เมทริกซ์การหมุนนั้นค่อนข้างทำความเข้าใจได้ค่อนข้างยาก แต่ Translation vector (เวกเตอร์การเลื่อนพิกัด) นั้นเข้าใจง่ายกว่ามากครับ ซึ่งในตัวอย่างด้านบนนี้ข้อมูลระบุว่ากล้องติดตั้งอยู่ห่างจากจุด A ออกไปประมาณ 2.1 เมตร ตามแนวแกน X ทางลบ (ห่างออกมาทางด้านล่างของภาพ), ห่างจากแกน Y ประมาณ 1 เมตร และอยู่ที่ความสูงประมาณ 1.2 เมตรจากพื้นดินเมื่อเทียบกับจุด A ครับ
การประมาณตำแหน่งที่เท้า
ขั้นตอนถัดมาคือการหาตำแหน่งพิกัด 3 มิติบริเวณเท้าของบุคคลที่ตรวจพบครับ เพื่อความง่ายผมจึงเลือกใช้สคริปต์ตัวอย่าง pose_estimation.py ของ Hailo-8 ในการตรวจจับจุดสำคัญบนร่างกาย (Body landmarks) แล้วดึงพิกัด 2 มิติของ ข้อเท้าซ้ายและข้อเท้าขวาออกมา จากนั้นแปลงพิกัดบนภาพเหล่านี้ให้เป็นพิกัดโลกจริงด้วยเทคนิคการลากเส้นรังสีย้อนกลับ (Back-projection) ตามที่อธิบายไว้ก่อนหน้านี้ครับ
โดยผมได้ใช้ฟังก์ชัน 2 ส่วนนี้ในการสร้างรังสีจากจุดศูนย์กลางกล้อง และคำนวณหาจุดตัดบนระนาบพื้นดินครับ
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
def create_a_ray(u, v, K, distCoeffs, R, t): pts = numpy.array([[[u, v]]], dtype=numpy.float64) undist = cv2.undistortPoints(pts, K, distCoeffs) x_n, y_n = undist[0,0] d_cam = numpy.array([x_n, y_n, 1.0], dtype=numpy.float64) C = -R.T @ t d_world = R.T @ d_cam d_world = d_world / numpy.linalg.norm(d_world) return C.reshape(3), d_world.reshape(3) def intersect_ray_with_plane(C, d, n, d0): denom = n @ d if numpy.abs(denom) < 1e-9: return None, None s = -(n @ C + d0) / denom if s < 0: return None, None X = C + s * d return X, s |
จากการใช้วิธีนี้กับข้อมูลที่มี ทำให้ผมคำนวณค่าพิกัดเท้าได้ประมาณ (202.0, 44.2, 0.0) ในพิกัดอ้างอิงโลกจริง ซึ่งถือว่าเป็นผลลัพธ์ที่สมเหตุสมผลมากครับ เพราะขณะนั้นผมยืนอยู่ใกล้กับจุด B มาก ซึ่งมีพิกัดที่ทราบค่าอยู่แล้วคือ (240, 0)

การแสดงผลตำแหน่งเท้าที่ตรวจพบด้วย ESP32 และ LED Matrix
ขั้นตอนสุดท้ายคือการสร้างภาพจำลองตำแหน่งของบุคคลที่ตรวจพบ โดยใช้แผงไฟ LED Matrix ขนาด 8×8 จำนวน 2 ตัวต่อกันครับ ผมคำนวณหาตำแหน่งแถวและคอลัมน์ของ LED โดยการทำปรับสัดส่วนเชิงเส้น (Linear scaling) จากพิกัดโลกที่ประมาณค่าได้ (ครอบคลุมพื้นที่ประมาณ 480.0 × 240.0 ซม.) ให้สอดคล้องกับตาราง LED ขนาด 8×16 และหลังจากนั้นข้อมูลตำแหน่งเหล่านี้จะถูกส่งไปยังบอร์ด ESP32 ผ่านการเชื่อมต่อ USB ครับ
สำหรับการสาธิตนี้ ผมเลือกใช้บอร์ด KidBright 32 V1.3 ซึ่งมีชิปควบคุม LED Matrix รุ่น HT16K33 มาให้บนบอร์ดเรียบร้อยแล้ว ทำให้สะดวกและรวดเร็วมากในการสร้างชิ้นงานต้นแบบ ภาพด้านล่างแสดงการทำงานของระบบแบบเวลาจริง โดยรับสัญญาณจาก Web Cam ผ่านสาย USB ซึ่งไฟ LED ที่สว่างขึ้นจะเปลี่ยนตำแหน่งไปตามการเดินของบุคคลในฉากครับ ผู้อ่านสามารถรับชมวิดีโอสาธิตการทำงานของโปรเจกต์นี้ได้จากลิงค์ที่ส่วนบนสุดของบทความรีวิว หรือรับชมโดยตรงผ่านลิงก์ YouTube นี้ได้ครับ

อุณหภูมิและการกระจายความร้อน
การทดสอบสุดท้ายผมคือทดสอบพฤติกรรมด้านอุณหภูมิและการกระจายความร้อนของตัวเครื่องครับ โดยผมเริ่มจากการเปิดเครื่องทิ้งไว้ในสภาวะว่างงาน (Idle) เป็นเวลาประมาณ 5 นาที แล้วจึงบันทึกภาพด้วยกล้องถ่ายภาพความร้อน FLIR E4

ในสภาวะ Idle นั้น อุณหภูมิพื้นผิวภายนอกของอุปกรณ์มีค่าเฉลี่ยอยู่ที่ประมาณ 33 °C โดยขณะที่ทดสอบนั้นอุณหภูมิห้องมีค่าประมาณ 25 °C ดังที่แสดงในภาพด้านล่างครับ

จากนั้นผมได้ทดสอบตัวเครื่องภายใต้ภาระงานโหลดเต็มที่ โดยผมรัน WebGL Aquarium ที่จำนวนปลา 30,000 ตัว พร้อมกับเปิดวิดีโอ YouTube ที่ความละเอียด 1080p ในโหมดหน้าต่าง และรันแอปพลิเคชันตัวอย่าง AI ไปพร้อม ๆ กัน โดยผมปล่อยให้ระบบทำงานในสภาวะนี้เป็นเวลาประมาณ 10 นาทีก่อนจะบันทึกภาพความร้อนอีกครั้งครับ

จากภาพถ่ายความร้อน จะเห็นได้ว่าตัวเครื่องมีรูปแบบการกระจายความร้อนภายอกที่สม่ำเสมอและจัดการได้ดีในทุกสถานะการทำงานครับ โดยเมื่อต้องรับงานหนักขึ้นอุณหภูมิที่พื้นผิวของตัวเคสจะขึ้นไปสูงสุดที่ประมาณ 35–37 °C โดยบริเวณที่มีอุณหภูมิสูงที่สุดจะพบอยู่ที่แผงด้านบนและพื้นผิวด้านข้างส่วนบน ซึ่งค่อนข้างสอดคล้องกับแหล่งกำเนิดความร้อนภายใน ซึ่งน่าจะเป็น Compute Module 5 และตัวเร่งความเร็ว AI โดยอุปกรณ์ที่เกี่ยวข้องภายในสามารถถ่ายเทความร้อนมายังเคสอะลูมิเนียมที่ทำหน้าที่เป็นแผงระบายความร้อนได้ดี จุดที่น่าสนใจอีกอย่างคือผมไม่พบจุดที่ร้อนจัดสะสมเฉพาะจุด (Hot spots) เลย ซึ่งสะท้อนถึงการออกแบบการเชื่อมต่อทางความร้อนภายในและการกระจายความร้อนที่มีประสิทธิภาพครับ

สรุป
reComputer Industrial R2135-12 มีตัวเลือกการเชื่อมต่อที่ครบครัน ทั้งแบบใช้สายและไร้สาย จุดที่ผมประทับใจมากคือการติดตั้งระบบปฏิบัติการและซอฟต์แวร์มาให้พร้อมใช้งาน รวมถึงตัวอย่างการใช้งานร่วมกับตัวเร่งความเร็ว AI อย่าง Hailo-8 ซึ่งช่วยประหยัดเวลาในการตั้งค่าไปได้มากครับ ในด้านประสิทธิภาพ AI นั้นทำความเร็วเฉลี่ยได้ที่ประมาณ 30 FPS ซึ่งถือว่าเกินพอสำหรับการนำไปประยุกต์ใช้ในงานวิจัยหลาย ๆ ด้านของผม
ในการรีวิวครั้งนี้ ผมพบปัญหาเล็กน้อยเพียงจุดเดียว คือข้อมูลบนหน้าสินค้าอย่างเป็นทางการของผู้ผลิตนั้นค่อนข้างน่าสับสน เนื่องจากรูปภาพที่แสดงบนเว็บไซต์มีความแตกต่างจากตัวเครื่องที่ผมได้รับ ทำให้ในช่วงแรกผมหลงไปดูคู่มือการใช้งานผิดรุ่นครับ
สุดท้ายนี้ ขอขอบคุณทาง Seeed Studio ที่ส่ง reComputer Industrial R2135-12 มาให้เราได้รีวิวครับ สำหรับผู้ที่สนใจ สามารถสั่งซื้อได้จาก Seeed Studio ในราคา $279.00 (~8,700฿) สำหรับรุ่น RAM 8 GB / eMMC 32 GB (26 TOPS) ที่นำมารีวิวนี้ หรือจะเลือกเป็นรุ่น RAM 16 GB ในราคา $339 (~10,500฿) ก็ได้เช่นกันครับ นอกจากนี้ในอนาคต Raspberry Pi CM5 Edge AI PC รุ่นนี้อาจจะมีวางจำหน่ายเพิ่มเติมผ่านทางร้านค้าใน Amazon และ AliExpress ของบริษัท

I am an assistant professor in surveying engineering and geographic information systems at Rambhai Barni Rajabhat University. My primary research areas include digital image/audio processing, digital photogrammetry, AI, IoT, and UAV. I am open to other subjects as well.
