สมัครเรียนโทร. 085-350-7540 , 084-88-00-255 , ntprintf@gmail.com

Tutorial AI

AI001 The brief history of AI AI101 Jupyter Notebook on AWS AI102 Pandas Tutorials AI103 Animated Drawings AI104 Video to BVH AI105 Hand Landmarks Detection Using MediaPipe AI106 Object Detection Using MediaPipe AI107 Image Segmentation Using MediaPipe AI108 Pose Landmarks Detection Using MediaPipe

AI107 - Image Segmentation Using MediaPipe

ใช้ AI แบ่งส่วนภาพคนกับฉากหลังแบบง่าย ๆ แป๊บเดียวเสร็จ

 

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

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

บทความนี้เป็นบทความในชุด “ตรวจจับสารพัดสิ่งด้วย MediaPipe” ชุดบทความที่จะชวนท่านผู้อ่านมาลองใช้งาน Machine Learning บนเครื่องคอมพิวเตอร์ของเราเองเพื่อตรวจจับสารพัดสิ่ง เช่น มือ คน สัตว์ สิ่งของ ไปจนถึงอิริยาบถของเรา บทความชุดนี้ประกอบไปด้วย

แต่ละบทความจะเป็นบทความสั้น ๆ พร้อม Code ที่ทาง EPT ปรับให้ง่ายที่สุดเพื่อให้ทุกคนนำไปใช้ได้เลยแม้จะไม่มีพื้นฐาน Python มาก่อน (แต่ต้องมีพื้นฐานการใช้งานคอมพิวเตอร์อยู่สักหน่อยนะครับ) 

สำหรับใครที่ต้องการเรียนรู้เกี่ยวกับการเขียน การสร้าง AI โดยละเอียดเรียนเชิญได้ที่ Course AI701 แต่ถ้าท่านยังไม่มีพื้นฐานการเขียนโปรแกรมเลยสามารถลงเรียน คอร์ส Python + Web Programming + Machine Learning (PY203) ได้ ซึ่งจะพาท่านไปเริ่มเรียนเขียนโปรแกรมตั้งแต่รู้จักเลขฐาน 2 รู้ว่าคอมพิวเตอร์เครื่องแรกของโลกทำงานอย่างไร เรียนภาษาเขียนโปรแกรม Python เรียนการเขียน Web HTML CSS JavaScript AJAX jQuery Bootstrap และอื่น ๆ อีกมากมาย จนไปจบที่ AI เนื้อหาอัดแน่นกว่า 200 ชั่วโมง และมีคอร์สแถมยิบย่อยตามฤดูกาลอีก เรียกได้ว่าคุ้มสุด จากไม่รู้อะไรจะเปลี่ยนมาทำงานด้าน Programmer เลยก็ยังได้ หรือจากไม่รู้อะไรจะเปลี่ยนสายมาทำ Data science ก็ยังชิล ๆ

 

Image Segmentation นำไปใช้ทำอะไรได้บ้าง?  

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

ใช้ AI วิเคราะห์โรค

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

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

รถอัตโนมัติ

นอกจากรถอัตโนมัติ หรือ Self-driving cars จะใช้เทคโนโลยีการตรวจจับวัตถุเพื่อตรวจจับตั้งแต่คนเดินถนน ยานพาหนะอื่น ๆ ไปจนถึงป้ายบอกทางแล้ว อีกเรื่องที่สำคัญในการขับรถบนท้องถนนก็คือขับให้อยู่ในเลน ตรงนี้แหละครับที่น่าจะเห็นภาพการแบ่งส่วนภาพชัดเจนที่สุด และยิ่งเราแบ่งส่วนภาพระหว่างพื้นถนนกับเส้นเลนได้แม่นยำ รถอัตโนมัติก็จะยิ่งวิ่งได้อย่างปลอดภัยและมีประสิทธิภาพบนท้องถนน วิดีโอด้านล่างเป็นตัวอย่างการตรวจจับเลนถนนด้วย LaneNet DNN โดยนักวิจัยของ NVIDIA 


และอีกมากมาย

 

เตรียมตัวก่อนเริ่มทำ

สิ่งที่จำเป็นต้องติดตั้งในคอมพิวเตอร์ ได้แก่

  • Python เวอร์ชัน 3.9.5
  • OpenCV สำหรับ Python เวอร์ชัน 4.7.0.72
  • MediaPipe เวอร์ชัน 0.10.0

สามารถดูวิธีติดตั้งได้จากบทความ AI105 - Hand Landmarks Detection Using MediaPipe

 

ข้อควรระวัง

Code ที่ใช้ในบทความนี้ได้รับการทดสอบบนเครื่อง Windows 10 64-bit ที่ติดตั้ง Python และ Package ต่าง ๆ ตามเวอร์ชันที่กำหนดไว้ในบทความนี้ ดังนั้นหากผู้เรียนใช้อะไรบางอย่างคนละเวอร์ชันกับที่กำหนดไว้ก็จะมีโอกาสสูงที่จะรันแล้วเกิดข้อผิดพลาดบางประการ สำหรับ Package (ทั้งที่ใช้และไม่ใช้) ทั้งหมดที่มีในเครื่องคอมพิวเตอร์ที่ใช้ทดสอบจะสรุปให้ดูที่ท้ายบทความ* 

 

เขียน Code กันเลย

1. เปิดโปรแกรม Python IDE ขึ้นมาแล้วเขียน code ดังต่อไปนี้

# Import libraries
import cv2
import numpy as np
import mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision

BG_COLOR = (192, 192, 192) # gray
MASK_COLOR = (255, 255, 255) # white

# Create the options that will be used for ImageSegmenter
base_options = python.BaseOptions(model_asset_path='deeplabv3.tflite')
options = vision.ImageSegmenterOptions(base_options=base_options,
                                       output_category_mask=True)

# Create the image segmenter
with vision.ImageSegmenter.create_from_options(options) as segmenter:
    webcam = cv2.VideoCapture(0)
    image = webcam.read()
    mp_draw = mp.solutions.drawing_utils

    while True:
        success, image = webcam.read()
        image_rgb = cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
        cv2.imshow("real",image)
        image = mp.Image(image_format=mp.ImageFormat.SRGB, data=image_rgb)

        # Create the MediaPipe image file that will be segmented

        # Retrieve the masks for the segmented image
        segmentation_result = segmenter.segment(image)
        category_mask = segmentation_result.category_mask

        # Generate solid color images for showing the output segmentation mask.
        image_data = image.numpy_view()
        fg_image = np.zeros(image_data.shape, dtype=np.uint8)
        fg_image[:] = MASK_COLOR
        bg_image = np.zeros(image_data.shape, dtype=np.uint8)
        bg_image[:] = BG_COLOR

        condition = np.stack((category_mask.numpy_view(),) * 3, axis=-1) > 0.2
        output_image = np.where(condition, fg_image, bg_image)

        cv2.imshow("segment",output_image)

        k =cv2.waitKey(1)
        if k == 27:
            break

    cv2.destroyAllWindows()

 

2. เมื่อสั่งรัน จะได้หน้าต่างสำหรับแสดงผลภาพจากกล้องเว็บแคมแบบเรียลไทม์พร้อมทั้งแสดง Segment ของคนดังภาพตัวอย่าง 

 

เพียงเท่านี้เราก็จะได้โปรแกรมแสดง Segment ของคนแยกออกจากฉากหลังแบบเรียลไทม์ด้วย Python แล้ว นอกจากจะใช้งานเป็นโปรแกรมบนเครื่องได้แล้ว เรายังสามารถใช้ MediaPipe ทำแอปพลิเคชันสำหรับแอนดรอยด์ หรือใช้งานบนเว็บก็ได้ ใครสนใจสามารถดูตัวอย่างได้ที่นี่

สุดท้ายนี้สำหรับใครที่สนใจอยากทำ AI แต่ยังไม่มีพื้นฐานเขียนโปรแกรมมาก่อน ขอแนะนำคอร์ส Python + Web Programming + Machine Learning (PY203) ของทาง EPT ที่สอนแบบจัดเต็มตั้งแต่พื้นฐาน Python หรือหากมีพื้นฐาน Python แน่น ๆ อยู่แล้วแต่อยากเรียนเกี่ยวกับ AI แบบลงลึกถึงทฤษฎีก็ขอแนะนำคอร์ส Machine Learning (AI701) ครับ

ในบทความต่อไป เราจะมาใช้ MediaPipe เพื่อตรวจจับท่าทางของคนกันครับ

 

ที่มาและเว็บไซต์อ้างอิง

[1] https://developers.google.com/mediapipe
[2] https://developers.google.com/mediapipe/solutions/vision/image_segmenter

 

* เครื่องที่ใช้ทดสอบในบทความนี้เป็น Windows 10 64-bit และมี Package ต่าง ๆ ในเครื่องดังนี้

Package               Version
--------------------- --------
absl-py               1.4.0
asttokens             2.2.1
attrs                 23.1.0
backcall              0.2.0
cffi                  1.15.1
cloudpickle           2.2.1
colorama              0.4.6
comm                  0.1.3
cycler                0.11.0
debugpy               1.6.7
decorator             5.1.1
executing             1.2.0
flatbuffers           23.5.26
fonttools             4.33.3
importlib-metadata    6.6.0
ipykernel             6.23.1
ipython               8.13.2
jedi                  0.18.2
jupyter_client        8.2.0
jupyter_core          5.3.0
kiwisolver            1.4.2
matplotlib            3.5.2
matplotlib-inline     0.1.6
mediapipe             0.10.0
nest-asyncio          1.5.6
numpy                 1.22.4
opencv-contrib-python 4.7.0.72
opencv-python         4.7.0.72
packaging             21.3
pandas                1.2.1
parso                 0.8.3
pickleshare           0.7.5
Pillow                9.1.1
pip                   23.1.2
platformdirs          3.5.1
prompt-toolkit        3.0.38
protobuf              3.20.3
psutil                5.9.5
pure-eval             0.2.2
pycparser             2.21
Pygments              2.15.1
pyparsing             3.0.9
python-dateutil       2.8.2
pytz                  2022.2.1
pywin32               306
pyzmq                 25.1.0
setuptools            56.0.0
six                   1.16.0
sounddevice           0.4.6
spyder-kernels        2.4.3
stack-data            0.6.2
tornado               6.3.2
traitlets             5.9.0
typing_extensions     4.6.3
wcwidth               0.2.6
zipp                  3.15.0

 



บทความนี้อาจจะมีที่ผิด กรุณาตรวจสอบก่อนใช้

หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor

ไม่อยากอ่าน Tutorial อยากมาเรียนเลยทำอย่างไร?

สมัครเรียน ONLINE ได้ทันทีที่ https://elearn.expert-programming-tutor.com

หรือติดต่อ

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM

แผนที่ ที่ตั้งของอาคารของเรา

C Article


C++ Article


Java Article


C#.NET Article


VB.NET Article


Python Article


Golang Article


JavaScript Article


Perl Article


Lua Article


Rust Article


Article


Python


Python Numpy


Python Machine Learning



แผนผังการเรียนเขียนโปรแกรม

Link อื่นๆ

Allow sites to save and read cookie data.
Cookies are small pieces of data created by sites you visit. They make your online experience easier by saving browsing information. We use cookies to improve your experience on our website. By browsing this website, you agree to our use of cookies.

Copyright (c) 2013 expert-programming-tutor.com. All rights reserved. | 085-350-7540 | 084-88-00-255 | ntprintf@gmail.com

ติดต่อเราได้ที่

085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM
แผนที่ ที่ตั้งของอาคารของเรา