วิธีสร้างการแบ่งส่วนรูปภาพด้วย SVM: คำแนะนำทีละขั้นตอน
เผยแพร่แล้ว: 2024-12-05การแบ่งส่วนรูปภาพเป็นงานสำคัญในคอมพิวเตอร์วิทัศน์ โดยที่รูปภาพจะถูกแบ่งออกเป็นขอบเขตหรือส่วนที่มีคุณลักษณะร่วมกัน เช่น สี พื้นผิว หรือความเข้ม กระบวนการแบ่งส่วนนี้มีประโยชน์ในด้านต่างๆ รวมถึงการถ่ายภาพทางการแพทย์ การตรวจจับวัตถุ และการวิเคราะห์ภาพถ่ายจากดาวเทียม เครื่องมืออันทรงพลังอย่างหนึ่งสำหรับการแบ่งส่วนภาพคือ Support Vector Machine (SVM) ในคำแนะนำทีละขั้นตอนนี้ เราจะแนะนำวิธีสร้างแบบจำลองการแบ่งส่วนรูปภาพโดยใช้ SVM
Support Vector Machine (SVM) คืออะไร
Support Vector Machines (SVM) เป็นอัลกอริธึมการเรียนรู้ของเครื่องที่ได้รับการดูแล โดยทั่วไปจะใช้สำหรับงานจำแนกประเภทและการถดถอย ในการแบ่งส่วนรูปภาพ SVM สามารถแบ่งแต่ละพิกเซลของรูปภาพออกเป็นคลาสที่แตกต่างกัน (เช่น เบื้องหน้า พื้นหลัง หรือวัตถุที่แตกต่างกัน) ตามคุณสมบัติของพิกเซล เช่น สี ความเข้ม หรือพื้นผิว
SVM ทำงานโดยการค้นหาไฮเปอร์เพลนที่เหมาะสมที่สุดซึ่งจะเพิ่มระยะขอบระหว่างคลาสต่างๆ ให้สูงสุด ในกรณีของการแบ่งส่วนรูปภาพ เป้าหมายคือการแบ่งแต่ละพิกเซลในรูปภาพให้เป็นหนึ่งในหมวดหมู่ที่กำหนดไว้ล่วงหน้าโดยใช้ตัวแยกประเภท SVM ที่ได้รับการฝึกอบรม
ขั้นตอนที่ 1: นำเข้าไลบรารีที่จำเป็น
ขั้นแรก มาตั้งค่าสภาพแวดล้อมและนำเข้าไลบรารีที่จำเป็นกัน เราจะใช้ Python กับไลบรารียอดนิยมเช่น OpenCV, Scikit-learn และ NumPy
import cv2 import numpy as np from sklearn import svm from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, accuracy_score
ขั้นตอนที่ 2: โหลดรูปภาพ
ขั้นตอนแรกในกระบวนการแบ่งส่วนคือการโหลดภาพที่คุณต้องการแบ่งส่วน คุณสามารถใช้ OpenCV เพื่อโหลดรูปภาพและแปลงเป็นรูปแบบที่เหมาะสมสำหรับการแบ่งส่วน
# Load the image image = cv2.imread('your_image.jpg') # Convert to grayscale for simplicity (you can also work with color channels if needed) gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
การประมวลผลล่วงหน้า (ไม่บังคับ)
ในบางกรณี การใช้เทคนิคการประมวลผลล่วงหน้าบางอย่างเพื่อปรับปรุงรูปภาพก่อนการแบ่งส่วนจะเป็นประโยชน์ ขั้นตอนทั่วไปในการประมวลผลล่วงหน้า ได้แก่ การปรับให้เรียบ การลดสัญญาณรบกวน และการปรับสมดุลฮิสโตแกรม
# Optional: Apply GaussianBlur to reduce noise blurred_image = cv2.GaussianBlur(gray_image, (5, 5), 0)
ขั้นตอนที่ 3: การแยกคุณสมบัติ
ในการแบ่งส่วนรูปภาพตาม SVM งานถัดไปคือการแยกคุณสมบัติที่เกี่ยวข้องออกจากรูปภาพที่สามารถใช้เพื่อจัดประเภทแต่ละพิกเซล คุณสมบัติทั่วไป ได้แก่ ความเข้มของพิกเซล พื้นผิว และฮิสโตแกรมสี เพื่อความง่าย เราจะเริ่มต้นด้วยความเข้มของพิกเซลเป็นคุณลักษณะ
# Flatten the image to create a feature vector for each pixel features = gray_image.flatten() # Using grayscale intensity as a feature
สำหรับภาพสี คุณอาจต้องการใช้ฮิสโตแกรมสี (ค่า RGB หรือ HSV) หรือคุณสมบัติขั้นสูงเพิ่มเติม เช่น Local Binary Patterns (LBP) สำหรับพื้นผิว
ขั้นตอนที่ 4: กำหนดป้ายกำกับ
สำหรับการเรียนรู้แบบมีผู้สอน เราจำเป็นต้องมีข้อมูลที่ติดป้ายกำกับ โดยทั่วไปแล้ว ในการแบ่งส่วนรูปภาพ จะเกี่ยวข้องกับการติดป้ายกำกับแต่ละพิกเซลในรูปภาพ คุณสามารถติดป้ายกำกับชุดย่อยของรูปภาพด้วยตนเอง หรือใช้ข้อมูลพื้นฐานที่มีอยู่ (ถ้ามี) ป้ายกำกับอาจเป็นไบนารี (เบื้องหน้าและเบื้องหลัง) หรือหลายคลาส (หลายวัตถุ)
เพื่อความง่าย สมมติว่าเราติดป้ายกำกับพิกเซลด้วยตนเอง:
# Manually define labels (0 for background, 1 for object) labels = np.array([0, 1, 1, 0, 1, 0]) # Example, label values for each pixel
หากคุณมีป้ายกำกับความจริงภาคพื้นดินในรูปแบบของรูปภาพ คุณสามารถใช้ป้ายกำกับดังกล่าวได้โดยตรง
ขั้นตอนที่ 5: ฝึกอบรม SVM Classifier
เมื่อคุณมีคุณสมบัติและป้ายกำกับแล้ว ขั้นตอนต่อไปคือการแบ่งข้อมูลออกเป็นชุดการฝึกและการทดสอบ และฝึกตัวแยกประเภท SVM
# Split the data into training and testing sets X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42) # Initialize the SVM classifier (using a linear kernel as an example) svm_classifier = svm.SVC(kernel='linear') # Train the SVM model svm_classifier.fit(X_train.reshape(-1, 1), y_train)
ขั้นตอนที่ 6: การประเมินแบบจำลอง
หลังจากฝึกฝนโมเดลแล้ว การประเมินประสิทธิภาพโดยใช้ชุดการทดสอบถือเป็นสิ่งสำคัญ ซึ่งจะช่วยให้คุณประเมินความสามารถของตัวแยกประเภทในการแบ่งส่วนรูปภาพได้อย่างถูกต้อง
# Predict using the test set y_pred = svm_classifier.predict(X_test.reshape(-1, 1)) # Evaluate the classifier performance print(classification_report(y_test, y_pred)) print(f'Accuracy: {accuracy_score(y_test, y_pred)}')
ขั้นตอนที่ 7: ใช้โมเดล SVM ที่ได้รับการฝึกอบรมสำหรับการแบ่งส่วน
เมื่อตัวแยกประเภท SVM ได้รับการฝึกอบรมและประเมินผลแล้ว เราสามารถใช้เพื่อคาดการณ์ป้ายกำกับสำหรับแต่ละพิกเซลในภาพต้นฉบับ และสร้างภาพที่แบ่งส่วนได้
# Predict labels for the entire image segmented_image = svm_classifier.predict(features.reshape(-1, 1)) # Reshape the result back to the original image shape segmented_image = segmented_image.reshape(gray_image.shape) # Display the segmented image cv2.imshow('Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()
รูปภาพที่แบ่งส่วนจะแสดงส่วนต่างๆ ของรูปภาพตามการจัดหมวดหมู่ของ SVM คุณสามารถเห็นภาพผลการแบ่งส่วน โดยที่แต่ละคลาสจะแสดงด้วยสีหรือป้ายกำกับที่ไม่ซ้ำกัน
ขั้นตอนที่ 8: หลังการประมวลผล (ไม่บังคับ)
ในบางกรณี เทคนิคหลังการประมวลผล เช่น การดำเนินการทางสัณฐานวิทยา (เช่น การกัดเซาะ การขยาย) สามารถช่วยทำความสะอาดบริเวณที่แบ่งส่วนและกำจัดสิ่งแปลกปลอมขนาดเล็กได้
# Apply morphological operations to improve segmentation (optional) kernel = np.ones((5, 5), np.uint8) segmented_image = cv2.dilate(segmented_image, kernel, iterations=1) segmented_image = cv2.erode(segmented_image, kernel, iterations=1) # Display final segmented image cv2.imshow('Final Segmented Image', segmented_image) cv2.waitKey(0) cv2.destroyAllWindows()
บทสรุป
การใช้ SVM สำหรับการแบ่งส่วนภาพเป็นวิธีที่มีประสิทธิภาพในการจำแนกพิกเซลภาพเป็นหมวดหมู่ต่างๆ ด้วยการทำตามขั้นตอนเหล่านี้ ตั้งแต่การโหลดรูปภาพไปจนถึงการใช้โมเดล SVM ที่ได้รับการฝึกสำหรับการแบ่งส่วน คุณสามารถแบ่งส่วนรูปภาพตามคุณสมบัติพิกเซลได้ แม้ว่าคู่มือนี้จะใช้คุณสมบัติความเข้มของระดับสีเทาพื้นฐาน คุณสามารถปรับปรุงประสิทธิภาพได้โดยการรวมคุณสมบัติที่ซับซ้อนมากขึ้น เช่น ฮิสโตแกรมสี พื้นผิว หรือวิธีการที่ใช้การเรียนรู้เชิงลึกเพื่อแยกคุณสมบัติ
วิธีการ SVM สำหรับการแบ่งส่วนภาพมีความหลากหลายและสามารถนำไปใช้กับกรณีการใช้งานที่หลากหลาย รวมถึงการถ่ายภาพทางการแพทย์ การขับขี่อัตโนมัติ และการวิเคราะห์ภาพจากดาวเทียม ซึ่งให้ผลลัพธ์การแบ่งส่วนที่แม่นยำและมีประสิทธิภาพ