ผู้เขียนบทความ : นายปิยะภัทร พรมนุกูล COE#15
คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566
1. ความเป็นมา
ปัญหาของการจอดรถนอกอาคารในสถานที่ต่างๆ ยังไม่ได้รับการแก้ไขปัญหาที่ดีนักในปัจจุบัน เนื่องจากหลายที่มักใช้เจ้าหน้าที่รักษาความปลอดภัยในการตรวจสอบพื้นที่ว่างสำหรับที่จอดรถนอกอาคาร จึงเกิดความล้าช้าเป็นอย่างมาก เนื่องจากเจ้าหน้าที่รักษาความปลอดภัยอาจไม่เพียงพอ
ระบบตรวจสอบที่จอดภายนอกอาคาร เป็นนวัตกรรมที่เข้ามาช่วยในการบริหารจัดการที่จอดรถให้เป็นระเบียบและมีประสิทธิภาพ เพื่อให้ประชาชนในพื้นที่และนักท่องเที่ยวที่เข้าใช้บริการที่จอดรถสามารถตรวจสอบที่จอดรถล่วงหน้าก่อนเข้าไปจอด เพื่ออำนวยความสะดวกสบายแก่ประชาชนในพื้นที่และนักท่องเที่ยว
2. วัตถุประสงค์
2.1 เพื่อศึกษาและพัฒนาการเขียนโปรแกรมภาษา python เพื่อตรวจจับที่จอดรถ
2.2 เพื่อนำความรู้การเขียนโปรแกรมภาษา python ไปประยุกต์ได้จริง
2.3 เพื่อนำการเขียนโปรแกรมภาษา python ไปใช้ตรวจจับที่จอดรถ
2.4 เพื่อความสะดวกสะบายในการหาที่จอดรถ
3. ขอบเขต
3.1 โปรแกรมสามารถตรวจจับที่จอดรถได้
3.1.1 เมื่อไม่มีรถจอดอยู่จะเป็นกรอบสี่เหลี่ยมสีเขียว
3.1.2 เมื่อมีรถจอดอยู่จะเป็นกรอบสี่เหลี่ยมสีแดง
3.2 โปรแกรมสามารถรับเข้าข้อมูลที่เป็นภาพและวิดีโอได้
3.3 ระบบสามารถวาดพิกัดสีเหลี่ยมเพื่อบอกพิกัดในการตรวจจับที่จอดรถได้
4. ประโยชน์ที่คาดว่าจะได้รับ
4.1 ได้ศึกษาและเข้าใจการเขียนโปรแกรมภาษา python เพื่อตรวจจับที่จอดรถ
4.2 สามารถนำความรู้การเขียนโปรแกรมภาษา python ไปประยุกต์ใช้ได้จริง
4.3 สามารถเขียนโปรแกรมภาษา python เพื่อตรวจจับที่จอดรถได้
4.4 สามารถช่วยเหลือนักท่องเที่ยวในการหาที่จอดรถได้
4.5 สามารถนำระบบเข้าสู่เชิงพาณิชย์ได้
5. ความรู้ที่เกี่ยวข้อง
Image Processing
5.1 โมดูล argparse
เป็นโมดูลใน Python ที่ช่วยในการสร้างสคริปต์คำสั่ง (command-line interfaces) ให้กับโปรแกรมของคุณอย่างง่ายและมีประสิทธิภาพ โดยที่ผู้ใช้สามารถใช้คำสั่งของโปรแกรมได้ผ่านหน้าสายคำสั่ง (command line) โดยไม่ต้องแก้ไขโค้ดของโปรแกรม โมดูล argparse ช่วยให้คุณสามารถรับข้อมูลจากผู้ใช้ผ่าน command line arguments และจัดการกับข้อมูลเหล่านั้นได้อย่างสะดวกและเรียบง่าย
5.2โมดูล yaml
เป็นโมดูลในภาษา Python ที่ใช้สำหรับการทำงานกับข้อมูลในรูปแบบ YAML (YAML Ain’t Markup Language) ซึ่งเป็นภาษามาสเตอร์ในรูปแบบของข้อมูลโครงสร้าง (structured data) ที่สามารถอ่านและเขียนได้อย่างสะดวก โดยมักใช้ในการกำหนดค่าต่าง ๆ ในการกำหนดค่าคอนฟิกเริ่มต้น, การเก็บข้อมูลที่ไม่ซับซ้อนเป็นแฟ้มข้อมูล, และในหลายแอปพลิเคชันอื่น ๆ ที่ต้องการจัดเก็บข้อมูลโครงสร้างแบบต่าง ๆ
YAML เป็นรูปแบบข้อมูลที่มีลักษณะคล้ายกับ JSON โดยสามารถใช้เพื่อระบุโครงสร้างข้อมูลด้วยข้อความแบบโครงสร้าง (structured text) โดยไม่ต้องใช้เครื่องหมายปีกกา (curly braces) หรือเครื่องหมายคอลอน (colon) แต่ใช้การเว้นวรรค (indentation) เพื่อระบุโครงสร้างข้อมูลและความสัมพันธ์ระหว่างข้อมูล
5.3 โมดูล Logging
เป็นโมดูลใน Python ที่ใช้สำหรับการจัดการและบันทึกข้อมูลการเหตุการณ์ (logs) ในแอปพลิเคชัน โดยมีวัตถุหลักคือ Logger
ซึ่งช่วยให้คุณสามารถบันทึกข้อมูลเหตุการณ์ที่เกิดขึ้นในโปรแกรมของคุณ เช่น ข้อผิดพลาด (errors), ข้อมูลการดำเนินการ (informational messages), และข้อมูลการตรวจสอบ (debugging information) โดยอัตโนมัติ และคุณสามารถกำหนดระดับการบันทึก (log levels) เพื่อควบคุมความสำคัญของข้อมูลที่ถูกบันทึกได้ตามความเหมาะสม
5.3.1 Handler
เป็นคลาสที่ใช้ในการกำหนดวิธีการจัดการกับข้อมูลการเหตุการณ์ที่ถูกบันทึกโดย Logger โดยจะกำหนดว่าข้อมูลการเหตุการณ์จะถูกส่งไปที่ที่ไหนหรือจะทำอะไรกับข้อมูลนั้น เช่น บันทึกลงไฟล์ ส่งไปยังคอนโซล ส่งไปยังระบบจัดการข้อมูลการเหตุการณ์เพิ่มเติม หรือทำกิจกรรมอื่น ๆ ตามความต้องการ การเลือกใช้ Handler ขึ้นอยู่กับความต้องการของโปรแกรม และลักษณะของข้อมูลการเหตุการณ์ที่ต้องการจะบันทึกหรือจัดการ สามารถใช้หลาย Handler ใน Logger เดียวกันหากต้องการส่งข้อมูลการเหตุการณ์ไปยังสถานที่หลาย ๆ แห่งพร้อมกัน เพื่อบันทึกหรือจัดการข้อมูลการเหตุการณ์ในรูปแบบที่หลากหลายตามความต้องการของผู้ใช้
5.3.2 Formatter
หากต้องการใส่วันที่ หรือต้องการจัดให้มีความอ่านง่าย เดิมที อาจจะต้องเขียน Function เอง ให้มันจัดมาให้ แล้วยัดใส่ Logger ได้เลย แต่แน่นอนว่า เขาทำมาให้เราแล้วคือ Formatter ซึ่งมันอยู่ใน Handler นั่นแปลว่า ถ้าเรามี Handler สำหรับการแสดงออกหน้าจอ กับ ออกเป็นไฟล์ เราสามารถใช้ Formatter แยกกันได้
5.4 โมดูล OpenCV
opencv เป็นซอฟต์แวร์โอเพนซอร์ซที่เอาไว้ใช้จัดการรูปภาพ เริ่มพัฒนาขึ้นโดยบริษัทอินเทล (Intel) ในปี 1999 คำว่า opencv ย่อมาจาก open source computer vision ขอบเขตการใช้งานของ opencv ค่อนข้างกว้าง มีความสามารถหลากหลายหลากหลาย นอกจากรูปภาพธรรมดาแล้วยังใช้จัดการกับวีดีโอภาพเคลื่อนไหว อัลกอริธึมที่ใช้มีตั้งแต่แบบง่ายๆไปจนถึงระดับสูงซึ่งรวมถึงการใช้เทคนิคการเรียนรู้ของเครื่อง ด้วย opencv เขียนขึ้นจากภาษาซี แต่สามารถเรียกใช้ผ่านภาษาอื่นเช่น ไพธอน, จาวา, แมตแล็บ ได้ด้วย ใช้ได้ในระบบปฏิการหลากหลายทั้ง Windows, Linux, OS X, Android, iOS
opencv-python คือมอดูลในภาษาไพธอน ซึ่งใช้สำหรับเขียนโปรแกรมใช้งาน opencv ผ่านภาษาไพธอนได้ ตราสัญลักษณ์ของ opencv เป็นวงล้อสีแดงเขียวน้ำเงิน โดยด้านบนสีแดงเป็นสัญลักษณ์ของโอเพนซอร์ซ ส่วนสีเขียวทำเป็นตัว c สีน้ำเงินคล้ายตัว v
5.5 โมดูล NumPy
เป็นโมดูลส่วนเสริมของภาษา Python สำหรับใช้คำนวณทางคณิตศาสตร์และวิทยาศาสตร์ โดยมีคำสั่งพร้อมใช้งานจำนวนมากมาย และโมดูลนี้สามารถสร้างข้อมูลชนิดอาร์เรย์ (ที่ภาษา Python ไม่มี) และคำนวณอาร์เรย์ของตัวเลข สตริงและวัตถุได้ครับโมดูล NumPy รองรับทั้ง Python 2 , Python 3 และใช้ License: BSD
5.6 Hough Transform
เป็นเทคนิคยอดนิยมการแยกคุณลักษณะของเส้น สำหรับใช้ในการตรวจจับเส้น Hough Transform เป็นเทคนิคในการวิเคราะห์ภาพที่ใช้ในการตรวจหารูปร่าง (shapes) และวัตถุที่มีรูปร่างในภาพ โดยเฉพาะแนวทแยง (lines) และวง (circles) ในภาพ วิธีการนี้ถูกคิดค้นโดย Paul Hough ในปี 1962 และมีการพัฒนาและปรับปรุงต่อมาในหลายรูปแบบ
6.การดำเนินงาน
การใช้งานโปรแกรมตรวจสอบที่จอดรถสามารถใช้การได้ดังนี้
เริ่มจากการอัปโหลดไฟล์วิดีโอที่เราต้องการจะทดสอบลงไปในโฟลเดอร์video และทำการPrintscreenหน้าจอจากวิดิโอมา 1 รูปและอัปโหลดลงในโฟลเดอร์image เพื่อนำรูปมากำหนดตำแหน่งของขอบเขตในการตรวจจับ
เมื่ออัปโหลดเสร็จสิ้นให้ทำให้ Run โปรแกรมโดยใช้คำสั่งดังนี้
คำสั่งที่ใช้ Run Code บน Terminal
python main.py –image images/SML_01.png –data data/coordinates_1.yml –video videos/N45.mp4 –start-frame 100
ใส่ที่อยู่ไฟล์ของรูปภาพใน –image ของวิดีโอใน –video และ เลือกเฟรมที่จะเริ่มต้นใน –start-frame
เมื่อเริ่ม Run หน้าต่างแรกที่ขึ้นมาจะเป็นหน้าต่างรูป
โดยจะใช้หน้าต่างนี้ในการกำหนดขอบเขตตีกรอบขนาดของที่จอดรถ โดยในที่นี้จะกำหนดไว้ 6 ช่อง
เมื่อกำหนดที่จอดแล้วให้กด Q เพื่อสั่งให้โปรแกรมตรวจสอบทำงาน
เมื่อมีรถเข้ามาจอดกรอบจะขึ้นเป็นสีแดง หากที่จอดว่างจะขึ้นเป็นสีเขียว
การทดลอง
โดยการทดลองจะใช้วิดีโอที่อัดจากที่จอดรถที่หาดสมิหลา โดยจะกำหนดช่องจอดรถที่จะตรวจจับไว้ 6 ช่อง
โดยจะทำการทดสอบทั้งหมด 20 ครั้ง
ผลการทดลอง
กราฟแสดงการทดลอง
7.สรุปผลการทดลองและข้อเสนอแนะ
7.1 สรุปการทดลอง
จากการทดลองผลว่าระบบตรวจจับสามารถตรวจจับได้อย่างประสิทธิภาพขึ้นอยู่กับปัจจัยหลายอย่าง เช่น
มุมกล้อง หากเป็นมุมกล้องจากกล้องวงจรปิดจะสามารถมองเห็นที่จอดจากมุมสูงได้ทำให้ครอบคลุมพื้นที่ได้มากขึ้น
การตีกรอบ การตีกรอบควรที่จะครอบคลุมวัตถุภายในกรอบไม่ใหญ่จนเลยขอบเขตที่ต้องการตรวจจับ
ความนิ่งของวิดิโอ เมื่อมีการสั่นจะทำให้กรอบเลื่อนขยับไปจากขอบเขตที่ต้องการตรวจจับ
7.2 ข้อเสนอแนะ
1)การนำไปประยุกต์เพื่อการใช้งานแบบReal-time
2)การนำไปประยุกต์ใช้เพื่อตรวจสอบวัตถุต่างๆ
3)การสร้างUser Interface เพื่อการใช้งานที่ง่ายขึ้น
8.ข้อมูลอ้างอิง
8.1 รหัสต้นฉบับ
orgarose.(2561). Parking Space Detection in OpenCV. สืบค้นเมื่อ 30 มกราคม 2564,
จาก https://olgarose.github.io/ParkingLot/
8.2 opencv
opencv-python เบื้องต้น บทที่ ๑: บทนำ
Hough Line Transform
OpenCV: Image Filtering
Canny
How to detect lines in OpenCV?
High-level GUI
Mouse as a Paint-Brush
open cv พื้นฐาน
เริ่มต้นทำวิดีโอด้วย OpenCV กับ Python
เขียนโปรแกรม Python รับภาพจากกล้องด้วย OpenCV
VideoCapture::get
Perspective Warping คืออะไร? | OpenCV และ Python
Python cv2.EVENT_LBUTTONDOWN Examples
opencv-python เบื้องต้น บทที่ ๕: การเติมรูปร่างต่างๆลงไปในภาพ
Learning the OpenCV and NumPy Image Coordinate Systems
opencv-python เบื้องต้น บทที่ ๑๓: การหาเส้นเค้าโครง
opencv-python เบื้องต้น บทที่ ๑๕: การวิเคราะห์องค์ประกอบของเส้นเค้าโครง
ฟังก์ชัน Drawing ใน OpenCV กับ Python
Drawing Functions
Flags for video I/O
Save Video from Opencv
8.3 Python
ทำความรู้จักกับภาษา python (9) : ฟังก์ชันการแปลงชนิดข้อมูลใน python
Input/output with files
python if name == main คืออะไร ?
การใช้งาน range ใน Python
List methods
Lists ในภาษา Python
รวม syntax พื้นฐานของภาษา Python ฉบับรวบรัด
คำสั่ง enumerate ใน Python
8.4 PyYAML
PyYAML yaml.load(input) Deprecation
ทำความรู้จัก YAML ไฟล์ นามสกุล .yml กับ Symfony Framework
PyYAML Documentation
ใช้รูปแบบข้อมูล YAML ใน Python
8.5 Logging
Log Level สำคัญไฉนlogging
— Logging facility for Python
ฮาวทู Logging ไลค์อะโปร ใน Python
How To Use Logging in Python 3
8.7 Numpy
จับภาพวิดีโอจากกล้องด้วย Python
พื้นฐานการใช้ NumPy ใน Python 3