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 ก็ยังชิล ๆ
จากที่ได้กล่าวไปแล้วข้างต้นว่าการแบ่งส่วนของภาพเป็นกระบวนการที่อยู่เบื้องหลังการตรวจจับวัตถุ ดังนั้นแน่นอนว่านอกจากใช้เบลอภาพพื้นหลังอย่างที่ยกตัวอย่างไปแล้ว แอปพลิเคชันที่นิยมนำเทคโนโลยีนี้ไปใช้จะค่อนข้างคล้ายหรือเกี่ยวข้องหรือบางทีก็อาจจะรู้สึกว่าแยกกันไม่ค่อยออกกับการตรวจจับวัตถุครับ เช่น
ใช้ AI วิเคราะห์โรค
ในบทความที่แล้ว ผมได้พูดเรื่องการนำ AI เข้ามาช่วยวิเคราะห์โรคว่าจะช่วยให้แพทย์ทำงานได้เร็วขึ้นและช่วยให้ดูแลผู้ป่วยได้ดียิ่งขึ้น พร้อมยกตัวอย่างภาพที่ AI ระบุตำแหน่งที่น่าจะเป็นมะเร็งและไม่ใช่มะเร็งไปแล้ว สำหรับเรื่อง Image Segmentation นี้ก็มีบทบาทสำคัญไม่แพ้กัน ตัวอย่างที่มีผู้ทำวิจัยค่อนข้างเยอะคือการแบ่งส่วนของสมองจากภาพถ่ายทางการแพทย์
เนื่องจากสมองของมนุษย์มีโครงสร้างที่ซับซ้อนประกอบด้วยเนื้อเยื่อต่าง ๆ ซึ่งแต่ละส่วนมีลักษณะเฉพาะที่แตกต่างกัน การแบ่งส่วนภาพสามารถใช้เพื่อแยกเนื้อเยื่อต่าง ๆ ในสมองเหล่านั้น เช่น สมองเนื้อสีเทา สมองเนื้อสีขาว น้ำหล่อเลี้ยงสมองและไขสันหลัง เป็นต้น ข้อมูลนี้สามารถใช้เพื่อวินิจฉัยโรคทางสมองต่าง ๆ เช่น โรคอัลไซเมอร์ โรคหลอดเลือดสมอง ฯลฯ นอกจากนี้ยังสามารถใช้การแบ่งส่วนสมองเพื่อวางแผนขั้นตอนการผ่าตัดและติดตามอาการของโรคได้อีกด้วย วิดีโอด้านล่างเป็นตัวอย่างการแบ่งส่วนเนื้องอกในสมองแบบอัตโนมัติด้วย AI โดยนักวิจัยของ NVIDIA
รถอัตโนมัติ
นอกจากรถอัตโนมัติ หรือ Self-driving cars จะใช้เทคโนโลยีการตรวจจับวัตถุเพื่อตรวจจับตั้งแต่คนเดินถนน ยานพาหนะอื่น ๆ ไปจนถึงป้ายบอกทางแล้ว อีกเรื่องที่สำคัญในการขับรถบนท้องถนนก็คือขับให้อยู่ในเลน ตรงนี้แหละครับที่น่าจะเห็นภาพการแบ่งส่วนภาพชัดเจนที่สุด และยิ่งเราแบ่งส่วนภาพระหว่างพื้นถนนกับเส้นเลนได้แม่นยำ รถอัตโนมัติก็จะยิ่งวิ่งได้อย่างปลอดภัยและมีประสิทธิภาพบนท้องถนน วิดีโอด้านล่างเป็นตัวอย่างการตรวจจับเลนถนนด้วย LaneNet DNN โดยนักวิจัยของ NVIDIA
และอีกมากมาย
สิ่งที่จำเป็นต้องติดตั้งในคอมพิวเตอร์ ได้แก่
สามารถดูวิธีติดตั้งได้จากบทความ AI105 - Hand Landmarks Detection Using MediaPipe
ข้อควรระวัง
Code ที่ใช้ในบทความนี้ได้รับการทดสอบบนเครื่อง Windows 10 64-bit ที่ติดตั้ง Python และ Package ต่าง ๆ ตามเวอร์ชันที่กำหนดไว้ในบทความนี้ ดังนั้นหากผู้เรียนใช้อะไรบางอย่างคนละเวอร์ชันกับที่กำหนดไว้ก็จะมีโอกาสสูงที่จะรันแล้วเกิดข้อผิดพลาดบางประการ สำหรับ Package (ทั้งที่ใช้และไม่ใช้) ทั้งหมดที่มีในเครื่องคอมพิวเตอร์ที่ใช้ทดสอบจะสรุปให้ดูที่ท้ายบทความ*
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 |
Tag ที่น่าสนใจ: image_segmentation ai mediapipe python opencv machine_learning object_detection hand_landmarks_detection pose_landmarks_detection self-driving_cars lane_detection brain_tumor_segmentation automatic_image_segmentation medical_imaging computer_vision
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM