บทนำ
Thresholding เป็นเทคนิคที่ง่ายและมีประสิทธิภาพในการแบ่งส่วนพื้นฐานในรูปภาพ และทำให้เป็นไบนารี่ (เปลี่ยนให้เป็นภาพไบนารี) โดยที่พิกเซลอยู่อย่างใดอย่างหนึ่ง 0
or 1
(หรือ 255
หากคุณใช้จำนวนเต็มแทนจำนวนเต็ม)
โดยทั่วไป คุณสามารถใช้การจำกัดขอบเขตเพื่อทำการแบ่งส่วนพื้นหลัง-เบื้องหน้าอย่างง่ายในรูปภาพ และรวมถึงตัวแปรโดยใช้เทคนิคง่ายๆ สำหรับแต่ละพิกเซล:
if pixel_value > threshold:
pixel_value = MAX
else:
pixel_value = 0
การกำหนดเกณฑ์อย่างง่ายมีปัญหาที่ชัดเจนและต้องการข้อมูลที่บริสุทธิ์พอสมควร ซึ่งทำให้ไม่สามารถใช้งานได้จริงสำหรับกรณีการใช้งานจำนวนมาก ผู้กระทำผิดหลักคือธรณีประตูส่วนกลางซึ่งนำไปใช้กับรูปภาพทั้งหมด ในขณะที่รูปภาพมักจะไม่เท่ากันเพียงพอสำหรับธรณีประตูแบบครอบคลุมที่จะทำงานได้ เว้นแต่จะเป็นของปลอม
เกณฑ์สากลจะทำงานได้ดีในการแยกอักขระในหนังสือขาวดำบนหน้าที่สแกน เกณฑ์ทั่วโลกมักจะล้มเหลวในรูปภาพโทรศัพท์ของหน้าเดียวกันนั้น เนื่องจากสภาพแสงอาจแตกต่างกันระหว่างส่วนต่างๆ ของหน้า ทำให้จุดตัดทั่วโลกมีความอ่อนไหวต่อข้อมูลจริงมากเกินไป
เพื่อต่อสู้กับสิ่งนี้ – เราจ้างได้ ในประเทศ ธรณีประตูโดยใช้เทคนิคที่เรียกว่า การปรับตัวตามเกณฑ์. แทนที่จะรักษาทุกส่วนของภาพด้วยกฎเดียวกัน เราสามารถเปลี่ยนเกณฑ์สำหรับแต่ละส่วนได้ พื้นที่ท้องถิ่น ที่ดูเหมาะสมกับมัน ซึ่งทำให้การกำหนดเกณฑ์ไม่เปลี่ยนแปลงบางส่วนกับการเปลี่ยนแปลงของแสง เสียง และปัจจัยอื่นๆ แม้ว่าจะมีประโยชน์มากกว่าการจำกัดขอบเขตทั่วโลก แต่การจำกัดเกณฑ์เองนั้นเป็นเทคนิคที่จำกัดและเข้มงวด และเหมาะที่สุดสำหรับความช่วยเหลือในการประมวลผลภาพล่วงหน้า (โดยเฉพาะอย่างยิ่งเมื่อต้องระบุรูปภาพที่จะทิ้ง) มากกว่าการแบ่งส่วน
สำหรับแอปพลิเคชันที่ละเอียดอ่อนมากขึ้นซึ่งต้องการบริบท คุณควรใช้เทคนิคขั้นสูง ซึ่งรวมถึงการเรียนรู้เชิงลึก ซึ่งได้ขับเคลื่อนความก้าวหน้าล่าสุดในการมองเห็นด้วยคอมพิวเตอร์
Adaptive Thresholding ด้วย OpenCV
มาโหลดรูปภาพที่มีสภาพแสงแบบปรับได้ โดยที่ส่วนหนึ่งของภาพอยู่ในโฟกัสมากกว่าส่วนอื่น โดยที่รูปภาพถูกถ่ายจากมุมหนึ่ง รูปภาพที่ฉันถ่ายของ Harold McGee's “เรื่องอาหารและการทำอาหาร” จะให้บริการที่ดี!
img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
ตอนนี้ เราใช้เกณฑ์ปกติเพื่อแยกตัวอักษรออกจากพื้นหลัง เนื่องจากมีความแตกต่างของสีที่ชัดเจน กระดาษสีทั้งหมดจะถือเป็นพื้นหลัง เนื่องจากเราไม่รู้จริงๆ ว่าเกณฑ์ควรเป็นอย่างไร ลองใช้วิธีของ Otsu เพื่อหาค่าที่เหมาะสม โดยคาดว่าภาพจะค่อนข้างไบโมดอล (ส่วนใหญ่มีสองสีเป็นหลัก):
img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
มาดูผลลัพธ์กัน:
อุ๊ย ส่วนด้านซ้ายของข้อความส่วนใหญ่จะจางลง เงารอบๆ รางน้ำกินส่วนหนึ่งของภาพไปจนหมด และข้อความก็อิ่มตัวเกินไป! นี่คือภาพ "ในธรรมชาติ" และกฎแบบครอบคลุม เช่น การจำกัดขอบเขตทั่วโลกทำงานได้ไม่ดี เกณฑ์ควรเป็นอย่างไร? ขึ้นอยู่กับส่วนของภาพ!
พื้นที่ cv2.adaptiveThreshold()
วิธีช่วยให้เราทำสิ่งนี้ได้อย่างแน่นอน:
cv2.adaptiveThreshold(img,
max_value,
adaptive_method,
threshold_method,
block_size,
C)
พื้นที่ adaptive_method
สามารถ a cv2.ADAPTIVE_THRESH_MEAN_C
or cv2.ADAPTIVE_THRESH_GAUSSIAN_C
ที่นี่มี C
เป็นอาร์กิวเมนต์สุดท้ายที่คุณตั้งไว้ ทั้งสองวิธีคำนวณเกณฑ์ตามเพื่อนบ้านของพิกเซลที่เป็นปัญหาโดยที่ block_size
กำหนดจำนวนเพื่อนบ้านที่จะพิจารณา (พื้นที่ใกล้เคียง)
ADAPTIVE_THRESH_MEAN_C
เอาค่าเฉลี่ยเพื่อนบ้านมาหักC
ในขณะที่ADAPTIVE_THRESH_GAUSSIAN_C
เอาผลรวมถ่วงน้ำหนักของเพื่อนบ้านแล้วหักC
.
ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!
นอกจากนี้ยังช่วยให้คุณกำหนดกลยุทธ์ไบนารีได้ แต่จำกัดไว้ที่ THRESH_BINARY
และ THRESH_BINARY_INV
และการเปลี่ยนระหว่างสิ่งเหล่านี้จะสลับระหว่าง "พื้นหลัง" และ "เบื้องหน้า" อย่างมีประสิทธิภาพ
วิธีนี้จะคืนค่ามาสก์สำหรับรูปภาพ ไม่ใช่รหัสส่งคืนและมาสก์ มาลองแบ่งกลุ่มอักขระในภาพเดียวกันเหมือนเมื่อก่อน โดยใช้เกณฑ์แบบปรับได้:
img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)
mask = cv2.adaptiveThreshold(blurred,
255,
cv2.ADAPTIVE_THRESH_MEAN_C,
cv2.THRESH_BINARY,
31,
10)
fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()
ส่งผลให้ภาพชัดเจนขึ้นมาก:
หมายเหตุ พื้นที่ block_size
อาร์กิวเมนต์ต้องเป็นจำนวนไม่เท่ากัน
ในทำนองเดียวกัน เราสามารถใช้เกณฑ์แบบเกาส์เซียนได้:
mask = cv2.adaptiveThreshold(blurred,
255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY,
31,
10)
ซึ่งสร้างภาพที่น่าพึงพอใจในที่สุด:
ทั้งขนาดบล็อก (พื้นที่ใกล้เคียง) และ C
เป็นไฮเปอร์พารามิเตอร์ที่จะปรับแต่งที่นี่ ลองใช้ค่าต่างๆ และเลือกค่าที่เหมาะสมกับภาพของคุณมากที่สุด โดยทั่วไป ค่า Gaussian Thresholding จะไวต่อสัญญาณรบกวนน้อยกว่า และจะทำให้เกิดภาพที่เยือกเย็นกว่าและสะอาดกว่าเล็กน้อย แต่จะแตกต่างกันไปและขึ้นอยู่กับอินพุต
ข้อ จำกัด ของเกณฑ์การปรับตัว
ด้วยการกำหนดธรณีประตูแบบปรับได้ เราสามารถหลีกเลี่ยงข้อจำกัดที่ครอบคลุมของธรณีประตูได้ แต่ก็ยังค่อนข้างเข้มงวดและไม่ได้ผลดีสำหรับอินพุตที่มีสีสัน ตัวอย่างเช่น หากเราโหลดรูปภาพของกรรไกรและชุดอุปกรณ์ขนาดเล็กที่มีสีต่างกัน แม้แต่การกำหนดเกณฑ์แบบปรับได้ก็ยังมีปัญหาในการแบ่งส่วนอย่างถูกต้อง โดยมีการสรุปคุณลักษณะสีเข้มบางอย่าง แต่ไม่มีการพิจารณาวัตถุทั้งหมด:
ถ้าเราปรับขนาดบล็อกและ C
เราสามารถกำหนดให้แพทช์ที่ใหญ่กว่าเป็นส่วนหนึ่งของวัตถุเดียวกันได้ แต่จากนั้นก็พบปัญหาในการสร้างขนาดเพื่อนบ้าน สากลเกินไปกลับไปสู่ปัญหาเดียวกันกับขีดจำกัดทั่วโลก:
สรุป
ในช่วงไม่กี่ปีที่ผ่านมา การแบ่งกลุ่มแบบไบนารี (เช่นเดียวกับที่เราทำที่นี่) และการแบ่งกลุ่มแบบหลายป้ายกำกับ (ซึ่งคุณสามารถเข้ารหัสคลาสได้ตามต้องการ) ได้สร้างโมเดลสำเร็จด้วยเครือข่ายการเรียนรู้เชิงลึก ซึ่งมีประสิทธิภาพและยืดหยุ่นมากกว่ามาก นอกจากนี้ ยังสามารถเข้ารหัสบริบทส่วนกลางและท้องถิ่นลงในรูปภาพที่แบ่งกลุ่มได้ ข้อเสียคือ คุณต้องใช้ข้อมูลในการฝึกอบรม ตลอดจนเวลาและความเชี่ยวชาญ
คุณสามารถใช้ OpenCV และต่อสู้กับข้อจำกัดบางอย่างได้โดยใช้การจำกัดขีดจำกัดแบบปรับเปลี่ยนได้ แทนที่จะใช้กลยุทธ์การกำหนดขีดจำกัดทั่วโลก เพื่อการแบ่งส่วนระดับการผลิตที่แม่นยำ คุณจะต้องใช้โครงข่ายประสาทเทียม
ก้าวต่อไป – การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์
ธรรมชาติที่อยากรู้อยากเห็นของคุณทำให้คุณต้องการไปต่อหรือไม่? เราขอแนะนำให้ตรวจสอบของเรา คอร์ส: “การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์ด้วย Python”.
หลักสูตร Computer Vision อื่น?
เราจะไม่ทำการจำแนกตัวเลข MNIST หรือแฟชั่น MNIST พวกเขาทำหน้าที่ส่วนของตนเมื่อนานมาแล้ว ทรัพยากรการเรียนรู้จำนวนมากเกินไปมุ่งเน้นไปที่ชุดข้อมูลพื้นฐานและสถาปัตยกรรมพื้นฐาน ก่อนปล่อยให้สถาปัตยกรรมกล่องดำขั้นสูงรับภาระด้านประสิทธิภาพ
เราต้องการที่จะมุ่งเน้นไปที่ การทำให้ลึกลับ, การปฏิบัติจริง, ความเข้าใจ, ปรีชา และ โครงการจริง. ต้องการเรียน อย่างไร คุณสามารถสร้างความแตกต่าง? เราจะพาคุณเดินทางตั้งแต่วิธีที่สมองของเราประมวลผลภาพไปจนถึงการเขียนตัวแยกประเภทการเรียนรู้เชิงลึกระดับการวิจัยสำหรับมะเร็งเต้านม ไปจนถึงเครือข่ายการเรียนรู้เชิงลึกที่ "หลอน" สอนหลักการและทฤษฎีแก่คุณผ่านการทำงานจริง เพื่อให้คุณมี ความรู้และเครื่องมือในการเป็นผู้เชี่ยวชาญในการประยุกต์ใช้การเรียนรู้เชิงลึกเพื่อแก้ปัญหาคอมพิวเตอร์วิทัศน์
อะไรอยู่ข้างใน?
- หลักการมองเห็นเบื้องต้นและวิธีการสอนคอมพิวเตอร์ให้ “มองเห็น”
- งานต่างๆ และการประยุกต์ใช้คอมพิวเตอร์วิทัศน์
- เครื่องมือการค้าที่จะทำให้งานของคุณง่ายขึ้น
- การค้นหา การสร้าง และการใช้ชุดข้อมูลสำหรับคอมพิวเตอร์วิทัศน์
- ทฤษฎีและการประยุกต์ใช้ Convolutional Neural Networks
- การจัดการการเปลี่ยนแปลงโดเมน การเกิดขึ้นร่วม และอคติอื่นๆ ในชุดข้อมูล
- ถ่ายทอดการเรียนรู้และใช้เวลาฝึกอบรมและทรัพยากรการคำนวณของผู้อื่นเพื่อประโยชน์ของคุณ
- การสร้างและฝึกอบรมผู้จำแนกมะเร็งเต้านมที่ล้ำสมัย
- วิธีการใช้ความสงสัยที่ดีต่อสุขภาพกับแนวคิดกระแสหลักและทำความเข้าใจกับความหมายของเทคนิคที่นำมาใช้กันอย่างแพร่หลาย
- การแสดงภาพ "พื้นที่แนวคิด" ของ ConvNet โดยใช้ t-SNE และ PCA
- กรณีศึกษาวิธีที่บริษัทต่างๆ ใช้เทคนิคการมองเห็นด้วยคอมพิวเตอร์เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น
- การประเมินแบบจำลองที่เหมาะสม การสร้างภาพพื้นที่แฝง และการระบุความสนใจของแบบจำลอง
- ดำเนินการวิจัยโดเมน ประมวลผลชุดข้อมูลของคุณเอง และสร้างการทดสอบแบบจำลอง
- สถาปัตยกรรมล้ำสมัย ความก้าวหน้าของแนวคิด สิ่งที่ทำให้มีเอกลักษณ์เฉพาะตัว และวิธีนำไปใช้
- KerasCV – ไลบรารี WIP สำหรับสร้างไปป์ไลน์และโมเดลที่ทันสมัย
- วิธีแยกวิเคราะห์และอ่านเอกสารและนำไปใช้เอง
- การเลือกรุ่นขึ้นอยู่กับการใช้งานของคุณ
- การสร้างไปป์ไลน์การเรียนรู้ของเครื่องแบบ end-to-end
- ภูมิทัศน์และสัญชาตญาณในการตรวจจับวัตถุด้วย R-CNN ที่เร็วกว่า, RetinaNets, SSD และ YOLO
- การแบ่งกลุ่มตัวอย่างและความหมาย
- การจดจำวัตถุแบบเรียลไทม์ด้วย YOLOv5
- การฝึกอบรมเครื่องตรวจจับวัตถุ YOLOv5
- การทำงานกับ Transformers โดยใช้ KerasNLP (ไลบรารี WIP ที่มีความแข็งแกร่งในอุตสาหกรรม)
- การรวม Transformers เข้ากับ ConvNets เพื่อสร้างคำบรรยายภาพ
- Deepdream
- การเพิ่มประสิทธิภาพโมเดล Deep Learning สำหรับคอมพิวเตอร์วิทัศน์