ผู้เขียนบทความ : นายฐิติศักดิ์ มโนกิจอุดม COE#15
คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์
วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566
1. ความเป็นมา
เนื่องด้วยปัญหาการหาพื้นที่จอดรถในปัจจุบันนี้ยังคงได้รับการแก้ไขได้ไม่ดีมากนัก ไม่ว่าจะเป็นสถานที่ท่องเที่ยว ชุมชน สถานศึกษา โรงพยาบาล หรือสถานที่ที่มีพื้นที่สำหรับจอดรถ ผู้ใช้รถไม่สามารถรู้ได้เลยว่าสถานที่ที่กำลังจะไปนั้น มีพื้นที่ว่างสำหรับจอดรถหรือไม่ ทางผู้จัดทำได้เล็งเห็นถึงปัญหานี้ และได้จัดทำระบบตรวจจับที่จอดรถเพื่อนำมาแก้ไขปัญหาในจุดนี้
ทั้งนี้ผู้จัดทำได้จัดทำระบบตรวจจับที่จอดรถ บริเวณลานจอดรถโรงพยาบาล ซึ่งเป็นสถานที่ที่จะนำระบบนี้ไปทดลองใช้จริง ระบบตัวนี้จะสามารถตรวจสอบพื้นที่จอดรถได้แบบเรียลไทม์ ว่าขณะนั้นมีพื้นที่ว่างสำหรับจอดรถหรือไม่ ซึ่งโครงการชิ้นนี้เป็นส่วนหนึ่งในรายวิชา การโปรแกรมคอมพิวเตอร์ขั้นสูง โดย อ.สันติ สถิตวรรธนะ เป็นผู้สอนและที่ปรึกษาโครงงานย่อยชิ้นนี้ ซึ่งจะช่วยพัฒนาความสามารถ พัฒนาความรู้ และเป็นนำความรู้ที่ได้ศึกษามาในรายวิชานี้มาประยุกต์เป็นโปรแกรมตรวจจับที่จอดรถด้วยภาษา python
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 ผู้ใช้รู้ว่ามีประโยชน์ต่อชีวิตปประจำวันจริง
5. ความรู้ที่เกี่ยวข้อง
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. การดำเนินงาน
ผังงานการทำงานของระบบ
7. วิธีการใช้งานโปรแกรม
ก่อนเริ่มต้นใช้งานโปรแกรมตรวจจับที่จอดรถ จะต้องนำเข้าชื่อข้อมูล รูปภาพ และวิดีโอ ที่ต้องการตรวจจับก่อน ดังตัวอย่างนี้
python main.py
: เริ่มการเรียกใช้โปรแกรม Python โดยรันไฟล์main.py
.--image images/parking_lot_1.png
: นระบุไฟล์รูปภาพที่จะใช้ในกระบวนการ ในที่นี้คือparking_lot_1.png
ที่อยู่ในโฟลเดอร์images
--data data/coordinates_1.yml
: ระบุไฟล์ YAML ที่ใช้เก็บข้อมูลเกี่ยวกับพิกัด (coordinates) ของที่จอดรถในรูปภาพ ไฟล์นี้คือcoordinates_1.yml
ที่อยู่ในโฟลเดอร์data
--video videos/parking_lot_1.mp4
: ระบุไฟล์วิดีโอที่จะถูกสร้างขึ้นหลังจากการประมวลผล ไฟล์วิดีโอจะชื่อparking_lot_1.mp4
และจะถูกบันทึกในโฟลเดอร์videos
--start-frame 400
: ระบุเฟรมเริ่มต้นในวิดีโอที่จะเริ่มประมวลผล ซึ่งในที่นี้คือเฟรมที่ 400
จากนั้นก็ปรากฎหน้าต่างรูปที่เราต้องทำการวาดพิกัดเพื่อตรวจจับที่จอดรถ และทำการวาดพิกัดเป็นพื้นที่สี่เหลี่ยม ตามที่ผู้ใช้ต้องการ ในตัวอย่างจะวาดพิกัดไว้ทั้งหมด 3 จุดด้วยกัน
หลังจากนั้นกด “Q” เพื่อสั่งให้โปรแกรมเริ่มทำงาน ในรูปจะเห็นว่าพื้นที่ยังเป็นสีเขียวเนื่องจากยังไม่มีรถมาจอดอยู่ และอาจมีบางพื้นที่มีการทำงานผิดพลาดอยู่บ้างขึ้นอยู่กับมุมกล้องและการเคลื่อนไหวของภาพ
8. การทดลอง
ทดลองนำระบบตรวจจับที่จอดรถ ให้ทำงานโดยรับเข้าภาพและวิดีโอที่ถ่ายจากมุมด้านบน โดยทำการทดลองทั้งหมด 20 ครั้ง โดยตรวจจับพื้นที่ทั้งหมด 3 จุด
8.1 ผลการทดลอง
9 เทคนิกการประยุคเพื่อเพิ่มประสิทธิภาพมากขึ้น
การตรวจจับพื้นที่จอดรถโดยใช้ AI camera เพื่อให้แม่นยำมากขึ้นสามารถทำได้โดยใช้หลายเทคนิกและวิธีการต่าง ๆ ได้แก่:
การใช้ Object Detection:
- ใช้โมเดล Object Detection เพื่อระบุตำแหน่งของรถบนภาพหรือวิดีโอ.
- YOLO (You Only Look Once) หรือ Faster R-CNN เป็นตัวอย่างของโมเดลที่นิยมในงาน Object Detection.
การใช้ Semantic Segmentation:
- การแบ่งแยกพื้นที่ในภาพเป็นพื้นที่ที่มีรถและพื้นที่ที่ไม่มีรถ.
- DeepLab, U-Net เป็นตัวอย่างของโมเดลที่ใช้ในงาน Semantic Segmentation.
การใช้ Deep Learning:
- การใช้โครงข่ายประสาทเทียม (Neural Networks) เพื่อเรียนรู้ลักษณะของพื้นที่จอดรถ.
- การใช้ Convolutional Neural Networks (CNNs) เป็นที่นิยม.
การปรับแต่งและปรับค่าพารามิเตอร์:
- ปรับค่าไฮเปอร์พารามิเตอร์ของโมเดลให้เหมาะสมกับการตรวจจับพื้นที่จอดรถในที่ที่เฉพาะเจาะจง.
- การใช้ Transfer Learning เพื่อให้โมเดลมีความสามารถในการตรวจจับพื้นที่จอดรถมากขึ้น.
การใช้วิธีการคำนวณทางคณิตศาสตร์:
- ใช้วิธีการคำนวณทางคณิตศาสตร์เพื่อหาพื้นที่ที่มีความน่าจะเป็นที่จะจอดรถ.
- การใช้การประมวลผลภาพทางคณิตศาสตร์เพื่อคำนวณพื้นที่ที่เหมาะสมสำหรับการจอดรถ.
- การรวมข้อมูลจากหลายแหล่งที่มา เช่น กล้อง, เซ็นเซอร์ระยะทาง, และเซ็นเซอร์อื่น ๆ เพื่อเพิ่มประสิทธิภาพของการตรวจจับ.
ที่แน่นอนว่าวิธีการไหนที่เหมาะสมที่สุด และสามารถปรับเปลี่ยนได้ตามความต้องการและเป้าหมายของการใช้งาน
.เทคนิกการปรับแต่งสีภาพแลการตรวจจับ
การตรวจจับจากขอบรถและแปลงภาพเป็นขาวดำ (grayscale) สามารถทำได้ด้วยหลายวิธีต่าง ๆ ซึ่งขึ้นอยู่กับที่มาของข้อมูลและวัตถุประสงค์ของการใช้งาน. ต่อไปนี้คือวิธีที่สามารถนำมาใช้ได้:
- การตรวจจับจากขอบรถ (Edge Detection):
- ใช้เทคนิคการตรวจจับขอบ เช่น Sobel, Prewitt, Canny, หรือ Laplacian เพื่อช่วยในการจำแนกและดึงเนื้อหาที่สำคัญในภาพได้แม่นยำมากขึ้น โดยจะลบสีสันออกไปเพื่อ ประมวนผลได้ง่ายขึ้น
10. สรุปผลและข้อเสนอแนะ
9.1 สรุปผล จากการทดลองผลปรากฎว่าการใช้งานโปรมีความขัดข้องสูงหากภาพวิดีโอที่ใช้จับภาะทดลองมีการสั่นหรือการขยับเพียงเล็กน้อยก็สามารถทำให้การทำงานผิดเพี้ยนไปจากความต้องการได้ แต่โดยรวมในมุมกล้องที่ดีก็สามารถทำให้โปรแกรมทำงานได้อย่างมีประสิทธิภาพ
9.2 ข้อเสนอแนะ – ประยุกต์และทดลองเพื่อตรวจจับบุคคลหรือวัตถุอื่น ๆ ที่น่าสนใจ – ควรจัดหามุมกล้องที่ดีเพื่อประสิทธิที่สูงขึ้นอย่างมาก
11. ข้อมูลอ้างอิง
10.1 รหัสต้นฉบับ
orgarose.(2561). Parking Space Detection in OpenCV. สืบค้นเมื่อ 30 มกราคม 2564,
จาก https://olgarose.github.io/ParkingLot/
10.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
10.3 Python
ทำความรู้จักกับภาษา python (9) : ฟังก์ชันการแปลงชนิดข้อมูลใน python
Input/output with files
python if name == main คืออะไร ?
การใช้งาน range ใน Python
List methods
Lists ในภาษา Python
รวม syntax พื้นฐานของภาษา Python ฉบับรวบรัด
คำสั่ง enumerate ใน Python
10.4 PyYAML
PyYAML yaml.load(input) Deprecation
ทำความรู้จัก YAML ไฟล์ นามสกุล .yml กับ Symfony Framework
PyYAML Documentation
ใช้รูปแบบข้อมูล YAML ใน Python
10.5 Logging
Log Level สำคัญไฉนlogging
— Logging facility for Python
ฮาวทู Logging ไลค์อะโปร ใน Python
How To Use Logging in Python 3
10.7 Numpy
จับภาพวิดีโอจากกล้องด้วย Python
พื้นฐานการใช้ NumPy ใน Python 3