ระบบตรวจจับที่จอดรถสำหรับสถานศึกษา (AI parking for educational institution)

ผู้เขียนบทความ : นายสรวิชญ์ ศรีปะนะ COE#15

คณะวิศวกรรมศาสตร์ : สาขาวิศวกรรมคอมพิวเตอร์

วิชา : 04-513-201 การโปรแกรมคอมพิวเตอร์ชั้นสูง 1/2566

1. ความเป็นมา

    ในปัจจุบันการหาที่จอดรถในสถานศึกษาในหลายๆแห่งมีความยากลำบาก เพราะนักเรียนและนักศึกษามีจำนวนเพิ่มมากขึ้น ยังไม่รวมถึงอาจารย์ผู้สอน บุคคลากรภายในสถานศึกษา และบุคคลภายนอกที่เข้ามาเยี่ยมชมสถานศึกษาจึงยิ่งทำให้การหาที่จอดรถมีความยากมากขึ้น   

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

2. วัตถุประสงค์

2.1 เพื่อศึกษาและเข้าใจการเขียนโปรแกรมภาษา python เพื่อตรวจจับที่จอดรถ
2.2 เพื่อนำความรู้การเขียนโปรแกรมภาษา python ไปประยุกต์ได้จริง
2.3 เพื่อนำการเขียนโปรแกรมภาษา python ไปใช้ตรวจจับที่จอดรถ
2.4 เพื่อนำการเขียนโปรแกรมภาษา python เพิ่มความสะดวกสบายในการหาที่จอดรถ

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. ความรู้ที่เกี่ยวข้อง

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

 

สำหรับ Python สามารถติดตั้งได้โดยการ pip ผ่าน Command Prompt หรือ Terminal

pip install opencv-python

5.5 โมดูล NumPy

    เป็นโมดูลส่วนเสริมของภาษา Python สำหรับใช้คำนวณทางคณิตศาสตร์และวิทยาศาสตร์ โดยมีคำสั่งพร้อมใช้งานจำนวนมากมาย และโมดูลนี้สามารถสร้างข้อมูลชนิดอาร์เรย์ (ที่ภาษา Python ไม่มี) และคำนวณอาร์เรย์ของตัวเลข สตริงและวัตถุได้ครับโมดูล NumPy รองรับทั้ง Python 2 , Python 3 และใช้ License: BSD

สามารถติดตั้ง NumPy ผ่าน  pip Command Prompt หรือ Terminal

pip install numpy


5.6 Hough Transform

    เป็นเทคนิคยอดนิยมการแยกคุณลักษณะของเส้น สำหรับใช้ในการตรวจจับเส้น Hough Transform เป็นเทคนิคในการวิเคราะห์ภาพที่ใช้ในการตรวจหารูปร่าง (shapes) และวัตถุที่มีรูปร่างในภาพ โดยเฉพาะแนวทแยง (lines) และวง (circles) ในภาพ วิธีการนี้ถูกคิดค้นโดย Paul Hough ในปี 1962 และมีการพัฒนาและปรับปรุงต่อมาในหลายรูปแบบ

เริ่มอ่านรูปภาพโดย  cv2.imread ซึ่งใช้ HoughLines ในการตรวจจับเส้นตรงในภาพ

img = cv2.imread(filename='examples/hough_lines/p_lots.jpg')

แปลงภาพเป็นภาพสีเทาเพื่อลดข้อมูลในรูปภาพ ทำให้การประมวลผลดีขึ้นและประหยัดทรัพยากรคำนวณ

gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

ใช้ Gaussian blur เพื่อการลดการรบกวน (noise) ที่ไม่จำเป็น หรือความไม่คมชัดในภาพ ทำให้ภาพดูสะอาดและนุ่มนวลมากยิ่งขึ้น

gray = cv2.cvtColor(src=img, code=cv2.COLOR_BGR2GRAY)

จากนั้น ตรวจจับขอบด้วย Canny ของ Opencv เป็น edge detection บนภาพที่ได้ทำการ Gaussian blur มาก่อนหน้านี้

edges = cv2.Canny(image=blur_gray, threshold1=50, threshold1=150, apertureSize=3)

ในภาพมีรถจอดอยู่แล้ว 1 คัน Canny จะแสดงผลเป็นเส้นโค้ง ทำให้รู้ว่าตรงนี้มีรถจอดอยู่ และเมื่อมีรถคันอื่นเข้าก็จะแสดงเส้นโค้งด้วยเช่นกันซึ่งระบบนี้เอาเส้นโค้งดังรูป มาใช้ในการตรวจจับรถที่เข้ามาในกรอบที่วาดไว้

6. ผลการดำเนินงาน

ผังการทำงานของระบบ

วิธีการใช้งานโปรแกรม

ก่อนเริ่มต้นใช้งานโปรแกรมตรวจจับที่จอดรถ จะต้องนำเข้าชื่อข้อมูล รูปภาพ และวิดีโอ ที่ต้องการตรวจจับก่อน ดังตัวอย่างนี้

python main.py --image images/parkingtest2.png --data data/coordinates_1.yml --video videos/parkingtest2.mp4 --start-frame 400

จากนั้นก็ปรากฎหน้าต่างรูปที่เราต้องทำการวาดพิกัดเพื่อตรวจจับที่จอดรถ

หลังจากนั้นทำการวาดพิกัดเป็นพื้นที่สี่เหลี่ยม ตามที่ผู้ใช้ต้องการ ในตัวอย่างจะวาดพิกัดไว้ทั้งหมด 4 ตำแหน่งด้วยกัน

 

หลังจากนั้นกด “Q” เพื่อสั่งให้โปรแกรมเริ่มทำงาน ในรูปจะเห็นว่าทั้ง 3 พื้นที่ยังเป็นสีเขียวเนื่องจากยังไม่มีรถมาจอดและพื้นที่สีแดงคือมีรถจอดอยู่แล้ว

และเมื่อมีรถมาจอดที่พิกัดที่ 1 สีก็จะเป็นสีแดง แสดงให้เห็นว่า ที่จอดรถตรงนี้ไม่ว่าง

การทดลอง

การทดลองที่ 1 ทดลองนำระบบตรวจจับที่จอดรถ ให้ทำงานโดยรับเข้าภาพและวิดีโอที่ถ่ายจากมุมด้านบน ทำมุม 45 องศา โดยทำการทดลองทั้งหมด 20 ครั้ง โดยตรวจจับพื้นที่ทั้งหมด 3 จุด

ผลการทดลอง

สรุปผลและข้อเสนอแนะ

1.สรุปผล

จากผลการทดลองหากกล้องมีอาการสั่นจะทำเส้นที่วาดไว้ขยับออกไปทำให้การตรวจจับมีความผิดพลาด ซึ่งคุณภาพของรูปและวิดีโอก็ต้องมีคุณภาพเช่นกันเพราะจะทำให้ขั้นตอนตรวจจับเส้น (Hough Transform)ตรวจเจอได้ดีขึ้น และมุมกล้องที่ได้จากการทดลองนั้นยังไม่ดีเท่าที่ควรทำให้ตรวจจับได้ยาก

2.ข้อเสนอแนะ
2.1 สามารถนำไปประยุกต์ใช้กับกล้อง ip camera ได้และสามารถใช้กับไมโครคอลโทรลเลอร์อย่าง Raspberry pi และ esp32 เพื่อขยายความสามารถอื่นๆและประหยัดพลังงานที่ใช้

2.2 ควรจัดหามุมกล้องที่ดีเพื่อใช้ในการตรวจจับเส้นได้ง่ายเช่นมุมกล้อง 90 องศา Top view หรือ Bird’s Eye View จะมีโอกาศสูงกว่ามากสามารถตรวจจับได้ง่าย

 

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

วิดีโอแสดงการทำงาน

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *