Image sliding window using python
Read image from URL, Sliding window and Create GIF
ถ้าอ่านที่ Sub-title ของ Blog ตอนนี้อาจรู้สึกว่ามีหลายเรื่องในตอนเดียว แต่ทั้งหมดถูกคิดว่ามาแล้วว่า น่าจะเป็นการนำเสนอที่ดีที่สุด โดยเนื้อหาหลักเป็นเรื่องของการทำ Image sliding window ที่เป็น Algorithm ของ Object detection ในยุคบุกเบิก แต่เนื้หาอื่นเป็นส่วนประกอบการเสนอ เพื่อให้เห็นภาพการทำงานที่ชัดเจนเท่านั้น
Read image from URL
เริ่มต้นจากการ Read รูปภาพจาก Website อาจเป็นบริการฝากรูปที่ไหนก็ได้ แต่ Blog ตอนนี้ฝากไว้ที่ GitHub
Library ที่จำเป็นต้องใช้งานในการอ่านไฟล์รูปภาพจาก URL คือ urllib
ถ้า Editor เป็น Google Colab จะมีติดตั้งไว้ให้อยู่แล้ว
ใช้ urllib.request.urlopen()
สำหรับเปิด URL ที่มีรูปภาพเก็บไว้ สิ่งที่ Return ออกมาคือ File-like object เวลานำไปใช้งานต่อ ต้องใช้ .read()
เพื่อให้ Return ค่า Boby จาก URL นั้น ๆ
ต่อมา Body ที่ได้จากการอ่าน URL ต้องถูกแปลงให้อยู่ในรูปแบบ Byte array โดยค่าตั้งแต่ 0 ไปถึง 255 หรือเป็นช่วงของค่าสีในรูปภาพ Encoder จึงใช้เป็น unit8
และเก็บค่าเป็น Numpy array เพื่อใช้งานต่อไป
จากนั้นเป็นการเปลี่ยนรูป Byte array ให้เป็นรูปภาพ ใช้ cv2.imdecode()
เพื่ออ่านข้อมูลรูปภาพจาก Memory cache และเปลี่ยนให้สามารถแสดงผลเป็นรูปภาพได้ การแสดงรูปภาพด้วย OpenCV กับ IPython notebook ไม่ว่าจะเป็น Google Colab หรือ Jupyter ยังเป็นปัญหาอยู่ ดังนั้นจึงใช้ Matplotlib ทำหน้าที่นี้แทน
แต่สีที่ได้จากการอ่านรูปภาพด้วย OpenCV อยู่ในรูปแบบ BGR ไม่ใช่ RGB อย่างที่คุ้นเคย ดังนั้นจึงต้องสลับ Array ด้วย [:, :, ::-1]
เพื่อให้ plt.imshow()
แสดงสีได้ถูกต้อง
Sliding window
เมื่อได้รูปภาพแล้ว ขั้นตอนต่อมาเป็นการสร้าง Sliding window บนรูปภาพ Sliding window เป็นเหมือนการตีกรอบในรูปภาพด้วย Given window จากนั้นสามารถใช้กรอบที่สร้างขึ้นมา Extract รูปภาพแล้วนำไปใช้งานอย่างอื่นต่อไปได้ เช่น Classification model เป็นต้น
เริ่มต้นจากเขียน Function slidingWindow()
ขึ้นมา โดยรับตัวแปรทั้งหมด 3 ค่าคือ
image
: รูปภาพที่ใช้งานstepSize
: จำนวนความกว้างที่ต้องการ Slide เป็น Window ถัดไปwindowSize
: คู่อันดับ Tuple ที่ระบุขนาดของ Window ที่ต้องการ
ใช้ Iteration 2 ชั้น เริ่มจากแกน Y ไปตามความยาวของรูปภาพ และแกน X ไปตามความกว้างของรูปภาพตามลำดับ จากนั้นใช้ yield
เพื่อให้โปรแกรมจำเฉพาะค่าสุดท้ายที่เกิดขึ้นในแต่ละ Iteration โดยเก็บค่าเป็นตำแหน่ง x, y และ Array ของรูปภาพที่ Extract ออกมา
การใช้งาน Function slidingWindow()
สามารถใช้งานใน Iteration โดยกำหนด Parameters ตามที่ระบุไว้ด้านบน เพื่อให้เห็นภาพการทำงานของ Function ขอวาดเป็นกรอบสีเหลี่ยม และแสดงผลลัพธ์ออกมาทั้งหมด 4 รูป
หรือหากต้องการรูปที่ Extract ออกมาในแต่ละ Iteration ก็สามารถแสดงจาก window
ที่เป็นผลลัพธ์จาก slidingWindow()
ได้เช่นกัน
Create GIF
เพื่อแสดงการทำงานของ Function ให้ครบทั้ง Loop (รูปภาพ) การ Save รูปภาพเป็น .gif
คงทำให้เห็นภาพได้ง่ายที่สุด เพราะเป็นไฟล์ภาพที่มีการเคลื่อนไหว
การ Save เป็น .gif
สามารถได้ง่าย ๆ ด้วยการเก็บ Array ของภาพแต่ละภาพไว้ใน List จากนั้นใช้ .get_writer()
จาก Library imageio
แล้วใช้ Iteration .append_data()
ที่อยู่ใน List ที่เก็บรูปภาพไว้ไปเรื่อย ๆ จนครบ ผลลัพธ์ที่ได้ออกมาเป็นเหมือนรูป GIF ด้านล่าง
Appending images: 0
Appending images: 10
Appending images: 20
Appending images: 30
Appending images: 40
Appending images: 50
Appending images: 60
Appending images: 70
Conclusion
ถ้าติดตามมาครบทั้งสองตอน อาจเริ่มเห็นส่วนประกอบแล้วว่า HOG Features extraction สามารถนำมาประกอบร่างกับ Sliding window เพื่อให้เกิดเป็น Object detection model ขึ้นมาได้ ซึ่งถ้ารวมร่างกันได้แล้ว คงเขียนเป็นตอนยาวเกี่ยวกับ Object detection อีกครั้งหนึ่ง สำหรับเนื้อหาตอนก่อนหน้านี้สามารถติดตามได้ที่ Link ด้านล่าง
และสำหรับ Colab notebook ของเนื้อหาตอนนี้ สามารถติดตามได้ที่ Link ด้านล่างเช่นกัน
(ไฟล์ใหญ่)