บทนําสู่ข้อมูลรูปภาพ
- 10 นาที
ในคอมพิวเตอร์วิทัศน์ โดยปกติเราจะแก้ปัญหาอย่างใดอย่างหนึ่งต่อไปนี้:
- การจําแนกรูปภาพเป็นงานที่ง่ายที่สุดเมื่อเราต้องการจําแนกรูปภาพออกเป็นหนึ่งในหมวดหมู่ที่กําหนดไว้ล่วงหน้าเช่นแยกแยะแมวจากสุนัขในภาพถ่ายหรือจดจําตัวเลขที่เขียนด้วยลายมือ
- การตรวจจับวัตถุ เป็นงานที่ยากกว่าเล็กน้อยซึ่งเราจําเป็นต้องค้นหาวัตถุที่รู้จักในรูปภาพและแปลเป็นภาษาท้องถิ่นนั่นคือส่งคืน กล่องขอบเขต สําหรับวัตถุที่รู้จักแต่ละรายการ
- การแบ่งส่วน คล้ายกับการตรวจจับวัตถุ แต่แทนที่จะให้กล่องขอบเขตเราจําเป็นต้องส่งคืนแผนที่พิกเซลที่แน่นอนซึ่งร่างวัตถุที่รู้จักแต่ละชิ้น
ภาพจาก CS231n Stanford Course
รูปภาพเป็นเทนเซอร์
คอมพิวเตอร์วิทัศน์ทํางานร่วมกับรูปภาพ อย่างที่คุณอาจทราบ รูปภาพประกอบด้วยพิกเซล ดังนั้นจึงสามารถคิดได้ว่าเป็นคอลเลกชันสี่เหลี่ยมผืนผ้า (อาร์เรย์) ของพิกเซล
ในส่วนแรกของโมดูลนี้ เราจะจัดการกับการจดจําตัวเลขที่เขียนด้วยลายมือ เราจะใช้ชุดข้อมูล MNIST ซึ่งประกอบด้วยภาพระดับสีเทาของตัวเลขที่เขียนด้วยลายมือ 28x28 พิกเซล แต่ละภาพสามารถแสดงเป็นอาร์เรย์ 28x28 และองค์ประกอบของอาร์เรย์นี้จะแสดงถึงความเข้มของพิกเซลที่สอดคล้องกัน - ไม่ว่าจะเป็นมาตราส่วนของช่วง 0 ถึง 1 (ซึ่งในกรณีนี้จะใช้ตัวเลขทศนิยม) หรือ 0 ถึง 255 (จํานวนเต็ม) ไลบรารี Python ยอดนิยมที่เรียกว่า numpy มักใช้กับงานคอมพิวเตอร์วิทัศน์ เนื่องจากช่วยให้คุณทํางานกับอาร์เรย์หลายมิติได้อย่างมีประสิทธิภาพ
ในการจัดการกับภาพสี เราจําเป็นต้องมีวิธีแสดงสี ในกรณีส่วนใหญ่ เราแสดงแต่ละพิกเซลด้วยค่าความเข้ม 3 ค่า ซึ่งสอดคล้องกับส่วนประกอบสีแดง (R) สีเขียว (G) และสีน้ําเงิน (B) การเข้ารหัสสีนี้เรียกว่า RGB ดังนั้นภาพสีขนาด W×H จะแสดงเป็นอาร์เรย์ขนาด H×W×3 (บางครั้งลําดับของส่วนประกอบอาจแตกต่างกัน แต่แนวคิดก็เหมือนกัน) ในการแสดงอาร์เรย์ ความสูง (จํานวนแถว) มาก่อนความกว้าง (จํานวนคอลัมน์) ซึ่งตรงกันข้ามกับแบบแผนภาพทั่วไปของ W×H
อาร์เรย์หลายมิติเรียกอีกอย่างว่าเทนเซอร์ การใช้เทนเซอร์เพื่อแสดงภาพก็มีข้อได้เปรียบเช่นกัน เนื่องจากเราสามารถใช้มิติพิเศษเพื่อจัดเก็บลําดับของภาพได้ ตัวอย่างเช่น ในการแสดงส่วนวิดีโอที่ประกอบด้วย 200 เฟรมที่มีขนาด 800x600 (กว้าง×สูง) เราอาจใช้เทนเซอร์ขนาด 200x600x800x3 โปรดจําไว้ว่ามิติของเทนเซอร์ใช้ลําดับ H×W (แถวหลัก) ไม่ใช่แบบแผน W×H ที่เห็นได้ทั่วไปในโปรแกรมแก้ไขรูปภาพ ลําดับที่นี่คือเฟรม×ความสูง (600) ×ความกว้าง (800) ×ช่อง การเรียงลําดับนี้เรียกว่า channels_last และเป็นค่าเริ่มต้นใน TensorFlow เฟรมเวิร์กอื่น ๆ บางเฟรมเวิร์กจะวางช่องก่อนความสูงและความกว้าง (channels_first)
import tensorflow as tf
import keras
import matplotlib.pyplot as plt
import numpy as np
# Prints the installed TensorFlow version
print(tf.__version__)
เราจะใช้เฟรมเวิร์ก Keras สําหรับการทดลองของเรา ตลอดโมดูลนี้ เราใช้ import keras (รูปแบบการนําเข้า Keras 3 แบบสแตนด์อโลน) ซึ่งต้องใช้ TensorFlow 2.16 หรือใหม่กว่า (หรือการติดตั้งแบบสแตนด์อโลนผ่าน pip install keras>=3.0) หากคุณใช้ TensorFlow 2.x เวอร์ชันเก่า ให้แทนที่import kerasด้วยfrom tensorflow import keras
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Output: (60000, 28, 28) (60000,)
print(x_train.shape, y_train.shape)
# Output: (10000, 28, 28) (10000,)
print(x_test.shape, y_test.shape)
แสดงภาพชุดข้อมูลตัวเลข
ตอนนี้เราได้ดาวน์โหลดชุดข้อมูลแล้วเราสามารถเห็นภาพตัวเลขบางส่วน:
fig, ax = plt.subplots(1, 7)
for i in range(7):
ax[i].imshow(x_train[i])
ax[i].set_title(y_train[i])
ax[i].axis('off')
# Displays a row of seven handwritten digit images with their labels
โครงสร้างชุดข้อมูล
เรามีภาพการฝึกอบรมทั้งหมด 60,000 ภาพและภาพทดสอบ 10,000 ภาพ และแต่ละภาพมีขนาด 28×28 พิกเซล:
print('Training samples:', len(x_train))
print('Test samples:', len(x_test))
print('Tensor size:', x_train[0].shape)
print('First 10 digits are:', y_train[:10])
print('Type of data is ', type(x_train))
# Output:
# Training samples: 60000
# Test samples: 10000
# Tensor size: (28, 28)
# First 10 digits are: [5 0 4 1 9 2 1 3 1 4]
# Type of data is <class 'numpy.ndarray'>
อย่างที่คุณเห็นประเภทของข้อมูลคือ numpy อาร์เรย์ ความเข้มของพิกเซลแต่ละพิกเซลจะแสดงด้วยค่าจํานวนเต็มระหว่าง 0 ถึง 255:
print('Min intensity value: ', x_train.min())
print('Max intensity value: ', x_train.max())
# Output:
# Min intensity value: 0
# Max intensity value: 255
เหตุผลที่อยู่ระหว่าง 0 ถึง 255 เป็นเพราะแต่ละพิกเซลแสดงด้วยจํานวนเต็ม 8 บิต ในหลายกรณี โดยเฉพาะอย่างยิ่งเมื่อทํางานกับโครงข่ายประสาทเทียม จะสะดวกกว่าในการปรับขนาดค่าทั้งหมดให้อยู่ในช่วง [0, 1] โดยหารด้วย 255 กระบวนการนี้เรียกว่า การทําให้เป็นมาตรฐาน:
x_train = x_train.astype(np.float32) / 255.0
x_test = x_test.astype(np.float32) / 255.0
# Pixel values are now floating point numbers in the range [0, 1]
ตอนนี้เรามีข้อมูลแล้ว และเราพร้อมที่จะเริ่มฝึกโครงข่ายประสาทเทียมตัวแรกของเราแล้ว!
ตรวจสอบความรู้ของคุณ
คำติชม
หน้านี้มีประโยชน์หรือไม่
ไม่
ต้องการความช่วยเหลือในหัวข้อนี้หรือไม่
ต้องการลองใช้ Ask Learn เพื่อทําให้ชัดเจนหรือแนะนําคุณผ่านหัวข้อนี้หรือไม่