<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Supapon Rabiebpo</title>
    <description>The latest articles on DEV Community by Supapon Rabiebpo (@supapon_rabiebpo_5de8ed89).</description>
    <link>https://dev.to/supapon_rabiebpo_5de8ed89</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1059440%2F6986d771-735b-4302-82f4-9f50bb800628.png</url>
      <title>DEV Community: Supapon Rabiebpo</title>
      <link>https://dev.to/supapon_rabiebpo_5de8ed89</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/supapon_rabiebpo_5de8ed89"/>
    <language>en</language>
    <item>
      <title>เขียนโปรแกรมตรวจจับจำนวนใบหน้าคน OpenCV Haar Cascades โดยใช้ python</title>
      <dc:creator>Supapon Rabiebpo</dc:creator>
      <pubDate>Sun, 09 Apr 2023 16:50:52 +0000</pubDate>
      <link>https://dev.to/supapon_rabiebpo_5de8ed89/ekhiiynopraekrmtrwcchcchabcchamnwnaibhnaakhnbnruupphaaph-dwy-opencv-odyaich-python-3cp6</link>
      <guid>https://dev.to/supapon_rabiebpo_5de8ed89/ekhiiynopraekrmtrwcchcchabcchamnwnaibhnaakhnbnruupphaaph-dwy-opencv-odyaich-python-3cp6</guid>
      <description>&lt;p&gt;ในการตรวจจับใบหน้า (face detection) ด้วย AI สามารถใช้ไลบรารีต่าง ๆ ได้ เช่น face_recognition, OpenCV, dlib และอื่น ๆ ซึ่งได้รับความนิยมมากในงาน Computer Vision และ Deep Learning และยังมีประโยชน์ที่ช่วยให้เราสามารถตรวจจับใบหน้าจากกล้องได้ด้วย&lt;/p&gt;

&lt;p&gt;บทความนี้จะแนะนำไอเดียการตรวจจับใบหน้าง่าย ๆ ด้วยการตรวจจับหน้าคนผ่านรูปภาพและกล้องจากคอมพิวเตอร์ ด้วยไลบรารี Haar Cascades ของ Opencv โดยใช้ python &lt;br&gt;
ทั้งนี้ Haar Cascades เป็นเพียง ไลบรารีที่ถูกเทรนมาเพื่อตรวจจับ object , face และอื่น ๆ ซึ่งจะไม่สามารถระบุชนิดหรือบุคคลของแต่ละใบหน้า และ สิ่งของแต่ละชนิดได้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ไอเดียแรก คือตรวจจับจำนวนใบหน้าจากรูปภาพ&lt;/strong&gt;&lt;br&gt;
ก่อนจะไปเริ่มขั้นตอนแรก ให้เราเลือกภาพที่มีใบหน้าคนมา 1 ภาพเพื่อใช้ในการตรวจจับใบหน้าก่อน&lt;br&gt;
ถ้าเลือกได้แล้วก็ไปดูขั้นตอนแรกกันเลย&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 1&lt;/strong&gt; import Modul cv2 และ matplotlib.pyplot ก่อน&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2 as cv2
import matplotlib.pyplot as plt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 2&lt;/strong&gt; โหลดไลบรารี haarcascade เพื่อให้สามารถใช้คลาส CascadeClassifier ในการโหลดไฟล์โมเดลที่ถูกเทรนให้สามารถตรวจจับใบหน้าคนมาแล้ว&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Load the cascade
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ต่อมาสิ่งที่จะขาดไปไม่ได้เลยคือ นำเข้ารูปภาพที่เราต้องการตรวจจับใบหน้าและอ่านรูปภาพซึ่งสามารถทำได้ตามขั้นตอนที่ 3 &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 3&lt;/strong&gt; นำเข้าและอ่านรูปภาพ&lt;br&gt;
ในขั้นตอนนี้ต้องระวังเรื่อง file path ด้วยนะถ้าโปรแกรมหาภาพไม่เจอ ก็จะทำการตรวจจับใบหน้าไม่ได้นะ😓&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Read the input image
img = cv2.imread(r"--file path--")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;เมื่ออ่านรูปภาพเรียบร้อยเราก็สามารถตรวจจับใบหน้าได้แล้ว สามารถทำตามขั้นตอนที่ 4  ได้เลย&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 4&lt;/strong&gt; ทำการตรวจจับใบหน้าจากรูปภาพด้วย ฟังก์ชัน detectMultiScale&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Detect faces
faces = face_cascade.detectMultiScale(img,1.1,5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ซึ่งในการใช้ฟังก์ชัน detectMultiScale จำเป็นจะต้องกำหนดค่าพารามิเตอร์ด้วย คือ &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;img รูปภาพที่เราต้องการจะตรวจจับ &lt;/li&gt;
&lt;li&gt;scaleFactor ขนาดที่ใช้ในการสกัดรูปภาพ&lt;/li&gt;
&lt;li&gt;minNeighbors ตรวจสอบรอบๆของพิกัดเพื่อลดปัญหา false positives&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 5&lt;/strong&gt; ทำการวาดช่องสี่เหลี่ยมรอบใบหน้าที่ตรวจจับได้ และ นับจำนวนใบหน้าที่ทำการตรวจจับได้จากการวาดช่องสี่เหลี่ยม&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Draw bounding box around the faces
countFace = 0
for (x, y, w, h) in faces:
    rect = cv2.rectangle(img, (x, y), (x+w, y+h), (2, 150, 255), 2)
    countFace = countFace + 1
    num = str(countFace)
    cv2.putText(rect, num, (x, y-5), cv2.FONT_ITALIC, 0.5, (2, 150, 255), 2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ฟังก์ชันที่ใช้ในขั้นตอนที่ 5 เนี้ยจะมีการกำหนดค่าพารามิเตอร์ดังนี้&lt;br&gt;
1.ฟังก์ชัน cv2.rectangle&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;img เป็นรูปภาพที่เราจะวาดช่องสี่เหลี่ยมลงไป&lt;/li&gt;
&lt;li&gt;(x,y) เป็นค่าจุดเริ่มต้นวาดช่องสี่เหลี่ยม&lt;/li&gt;
&lt;li&gt;(x+w, y+h) เป็นจุดสุดท้ายของการวาดสี่เหลี่ยม&lt;/li&gt;
&lt;li&gt;(2, 150, 255) กำหนดค่าสีของช่องสี่เหลี่ยม&lt;/li&gt;
&lt;li&gt;2 ค่าความหนาของเส้นสี่เหลี่ยมที่เราจะวาด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.ฟังก์ชัน cv2.putText&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;rect ภาพที่เราจะใส่ตัวอักษรไป&lt;/li&gt;
&lt;li&gt;num ข้อความที่เราจะเขียนลงไป ซึ่งจะต้องเป็น string เพราะงั้นเลยต้องทำการแปลงจาก int string ก่อนด้วย str(countFace)&lt;/li&gt;
&lt;li&gt;(x,y-10) เป็นตำแหน่งที่ต้องการให้ตัวอักษรอยู่&lt;/li&gt;
&lt;li&gt;cv2.FONT_ITALIC เป็นรูปแบบตัวหนังสือ&lt;/li&gt;
&lt;li&gt;0.5 เป็นขนาดตัวอักษร&lt;/li&gt;
&lt;li&gt;(2, 150, 255) เป็นสีของตัวอักษร&lt;/li&gt;
&lt;li&gt;2 เป็นความหนาของตัวอักษร&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 6&lt;/strong&gt; โค้ดส่วนนี้จะเป็นการแสดงค่าจำนวนใบหน้าที่ตรวจจับได้&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Showing number of faces detected in the image
print(len(faces),"faces detected!")
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;และแล้วก็มาถึงขั้นตอนการแสดงผลลัพธ์ที่เราทำมาทั้งหมด&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 7&lt;/strong&gt; แสดงรูปภาพผลลัพธิ์การตรวจจับจำนวนใบหน้า&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Plotting the image with face detected
# picture size
plt.figure(figsize=(10,10))
#show Picture detected
cv2.imshow('Results',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ฟังก์ชันที่ใช้ในขั้นตอนที่ 7 เนี้ยจะมีการกำหนดค่าพารามิเตอร์ดังนี้&lt;/p&gt;

&lt;p&gt;1.ฟังก์ชัน plt.figure(figsize=(10,10))&lt;br&gt;
ฟังก์ชันนี้เป็นฟังก์ชันที่ใช้ในการวาดกราฟ และวาดภาพ ซึ่งการใช้ figure ทำให้เราสามารถกำหนดขนาดรูปภาพได้ด้วย&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;(10,10) กำหนดขนาดรูปภาพที่ต้องการวาด&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;2.ฟังก์ชัน cv2.imshow('Results',img)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Results' ชื่อหน้าต่างการแสดงผล จะต้องเป็น string เท่านั้น&lt;/li&gt;
&lt;li&gt;img ภาพที่ต้องการแสดงผล&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ผลการตรวจจับจำนวนใบหน้าที่ได้ก็จะแสดงผลได้ตามรูปภาพตัวอย่างเลยย&lt;br&gt;
ภาพแรก เป็นการแสดงผลจำนวนใบหน้าที่ตรวจจับได้ จากขั้นตอนที่ 6&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq9xn3mrv7l1ou835k2a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbq9xn3mrv7l1ou835k2a.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
และภาพนี้ก็ เป็นผลของภาพวาดช่องสี่เหลี่ยมแสดงจำนวนใบหน้าที่ตรวจจับได้ จากขั้นตอนที่ 7&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zy2yd2mp2gyxan3w6gg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zy2yd2mp2gyxan3w6gg.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;แค่นี้เราก็ได้รูปที่ภาพตรวจจับจำนวนใบหน้าจากรูปภาพได้แล้ววว&lt;br&gt;
เป็นไงง๊ายง่ายยย✨&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;ไอเดียที่สอง&lt;/strong&gt; ตรวจจับจำนวนใบหน้าด้วยกล้อง จะมีการเขียนโค้ดที่ต่างกันนิดหน่อย อยากรู้ว่าทำยังไงก็ไปดูโค้ดกันเลยย&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 1&lt;/strong&gt;  import Modul cv2 และ matplotlib.pyplot และ โหลดไลบรารี haarcascade&lt;br&gt;
&lt;/p&gt;


&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2 as cv2
import matplotlib.pyplot as plt
# Load the cascade
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 2&lt;/strong&gt; เรียกใช้ฟังก์ชัน cv2.VideoCapture เพื่อเปิดกล้อง&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# open camera
cap = cv2.VideoCapture(0)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ซึ่งค่า 0 ที่ใส่เข้ามาหมายถึงการเรียกใช้งาน กล้องหน้า&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ขั้นตอนที่ 3&lt;/strong&gt; ขั้นตอนนี้จะเป็นการตรวจจับใบหน้าจาก frame ซึ่งจะเป็นลูปตรวจจับจำนวนใบหน้าที่อยู่ในกล้องเฟรมต่อเฟรม และทำการวาดช่องสี่เหลี่ยมพร้อมทำการระบุจำนวนที่จับได้ด้วย&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;while True:
    # read frame
    ret, frame = cap.read()
    # detect face from cmera frame
    faces = face_cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=5)
    countFace = 0
    # drawing rectangle
    for (x, y, w, h) in faces:
        rect = cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
        countFace = countFace + 1
        num = str(countFace)
        cv2.putText(rect, num, (x, y-5), cv2.FONT_ITALIC, 0.5, (2, 150, 255), 2)
    # show image
    cv2.imshow('Face Detection', frame)

    # press ESC to close camera tap
    if cv2.waitKey(1) == 27:
        break

# close camera and tap
cap.release()
cv2.destroyAllWindows()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;รายละเอียดค่าพารามิตเตอร์ของฟังก์ชันต่างๆได้อธิบายไปแล้วในไอเดียที่ 1 ขั้นตอนที่ 4-5 แต่จะอธิบายเพิ่มเติมในส่วนของ &lt;br&gt;
ฟังก์ชัน cv2.waitKey(1) ซึ่ง 1 หมายถึงการรับค่าเพียงค่าเดียวจากผู้ใช้ ซึ่ง ณ ที่นี้ใช้ในการจบการทำงานของกล้องนั่นเอง&lt;br&gt;
ผลลัพธิ์ที่ได้ก็แบบนี้เลย&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc3lt43lym15xfopu78f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frc3lt43lym15xfopu78f.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เสร็จแล้ววเย้ 🎉&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tm24xr4ivf8p2iukkz5.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tm24xr4ivf8p2iukkz5.gif" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;reference&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://dev.toface%20detection%20in%2015%20lines"&gt;https://dev.to/saharshlaud/face-detection-in-just-15-lines-of-code-ft-python-and-opencv-37ci&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;https://medium.com/@wanchatpookhuntod_1602/face-detection-opencv-%E0%B9%84%E0%B8%9E%E0%B8%98%E0%B8%AD%E0%B8%99-%E0%B8%87%E0%B9%88%E0%B8%B2%E0%B8%A2-%E0%B9%86-ef8749f7f473&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;https://pongpich-v.blogspot.com/2018/11/blog-post.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.tourl"&gt;https://www.mindphp.com/%E0%B8%9A%E0%B8%97%E0%B9%80%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B8%AD%E0%B8%AD%E0%B8%99%E0%B9%84%E0%B8%A5%E0%B8%99%E0%B9%8C/python-gui/7048-example-use-module-cv2.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opencv</category>
      <category>ai</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
