Tutorial

Hocrox กับการทำ Image Augmentation ที่โคตรง่าย เหมือนใช้ Keras

By Arnon Puitrakul - 16 กุมภาพันธ์ 2022 - 1 min read min(s)

Hocrox กับการทำ Image Augmentation ที่โคตรง่าย เหมือนใช้ Keras

ก่อนที่เราจะทำ Machine Learning กับข้อมูลที่เป็นรูปภาพ หรือเอารูปภาพมาเป็น Dataset ทำอะไรบางอย่างต่อ เราจะต้องมีการเตรียมข้อมูลให้พร้อมสำหรับการนำไปใช้ต่อ เราเรียกขั้นตอนพวกนี้ว่า Image Preparation เช่นการย่อ (Resize) หรือ ตัดรูป (Crop) นอกจากนั้น ถ้าเราเอาข้อมูลแค่นั้นไปใส่เลย เครื่องมันก็จะจำแบบตรง ๆ ถ้าเราใส่มาเบี้ยว ๆ หน่อย เราใส่มาอยู่อีกมุมของรูป ก็ทำให้เครื่องมันอ่านไม่ได้ก็ได้เหมือนกัน ดังนั้น เราจะต้องทำอีกอย่างคือ การทำ Image Augmentation เช่นการเปลี่ยน Brightness ให้สว่างขึ้น, กลับหัว (Rotate), พลิกกลับด้าน (Flip) เป็นต้น

ก่อนหน้านี้เราบอกเลยว่า เราปวดหัวกับ Process นี้มาก ๆ โดยตอนนั้นเราใช้พวก Image Generator ที่เป็น Helper Function ที่อยู่บน Keras ซึ่งเป็น Deep Learning Library ที่สร้าง Model ง่าย แต่.... ทำงานกับ Image Dataset ได้ปวดหัวมาก ๆ มันจะดีกว่ามั้ย ถ้าเรามี Library ที่ทำให้การทำ Image Preparation และ Augmentation ได้ง่ายเหมือนเราสร้าง Model แบบ Keras ใช่แล้ววว มันคือ Hocrox

เหมือน Keras เป็นยังไง ?

สำหรับคนที่ยังไม่คุ้นเคยกับ Keras เราลองมาดูกันก่อนว่า เวลาเราจะสร้าง Model บน Keras มันทำยังไงกัน

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(20))
model.add(Dense(100))
model.add(Dense(2), activation='relu')

จาก Code ด้านบน เป็นการสร้าง Model โดยใช้ Keras อย่างง่าย ๆ ที่ประกอบด้วย 3 Fully-Connected Layer ด้วยกัน เราจะเห็นว่า แทนที่เราจะต้องมานั่งกำหนดทีละ Node ใน Layer เราก็สามารถจัดการทั้ง Layer ได้ใน 1 บรรทัดเท่านั้น เช่น เราอยากได้ Dense 20 Node เราก็ใส่แบบใน Layer แรกได้เลย ถือว่าทำให้การทำ Model ง่ายมาก ๆ มันจะดีมาก ๆ ถ้าการทำ Image Preparation และ Augmentation มันจะง่ายเท่านี้

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(rotation_range=30, horizontal_flip=0.5)

สำหรับใน Keras ถ้าเราอยากทำ Augmentation เราก็สามารถทำได้เหมือนกัน โดยใช้ Class ที่ชื่อว่า ImageDataGenerator ได้เลย แต่มันก็แอบปวดหัวหลาย ๆ เรื่อง ไหนจะโหลดรูปอะไรอีก มาดูของดีในวันนี้ดีกว่า

ทดลองใช้ Hocrox

pip install hocrox

ก่อนที่เราจะใช้งาน Hocrox ได้ เราจะต้องทำการติดตั้งก่อน ซึ่งก็จะใช้งานได้ง่ายมาก ๆ โดยการติดตั้งผ่าน pip เท่านั้น เราลองใช้ conda แล้ว มันไม่มี Package นี้อยู่ใน Channel ของ Anaconda นอกจากนั้น ไส้ในของ Hocrox จริง ๆ มันคือ OpenCV ทำให้เวลาเราติดตั้ง มันจะต้องติดตั้ง OpenCV ลงไปด้วย ซึ่งหลาย ๆ เครื่องก็จะมาตายตรงนี้แหละ บางเครื่องมันจะต้องโหลดมา Compile เอง อะไรก็ว่ากันไป แต่โดยทั่วไป เราจะสามารถติดตั้งได้เลย

from hocrox.model import Model
from hocrox.layer import Read

model = Model()
model.add(Read(path="./images", name="Read images"))

ถ้าเราเทียบกับ Model มันจะมี Input, Hidden และ Output Layer ถ้าเป็นใน Hocrox มันจะมี Read ที่เป็นเหมือนกับ Input Layer ที่เราสั่งให้อ่านรูปเข้ามา จากตัวอย่างด้านบน จะเห็นว่า เราทำการสร้าง Model และ บรรทัดต่อไปคือ เราเพิ่ม Read เข้าไปเป็น Layer แยก

from hocrox.layer.preprocessing.transformation import Resize
from hocrox.layer.augmentation.flip import RandomFlip
from hocrox.layer.augmentation.transformation import RandomRotate

model.add(Resize((224, 244), interpolation="INTER_LINEAR", name="Resize images"))

model.add(
    RandomRotate(
        start_angle=-10.0, end_angle=10.0, probability=0.7, number_of_outputs=5, name="Randomly rotates the image"
    )
)

model.add(RandomFlip(probability=0.7, name="Randomly flips the image"))

จากนั้น มาถึงขั้นตอนของการจัดการรูปกันแล้ว โดยในตัวอย่างนี้เราจะทำทั้งหมด 3 อย่างด้วยกัน ขั้นตอนแรก เราทำการเพิ่ม Layer ของการ Resize หรือย่อรูปให้เหลือ 224 x 224 Pixel ซึ่งเรียกได้ว่าเป็นขั้นตอนปกติของการทำงานกับรูปเลยคือ ทำให้รูปมีขนาดเท่ากันกับ Input Layer ของ Model จริง ๆ ของเรา

จากนั้น เราเรียก RandomRotate หรือ การสั่งให้มันสุ่มหมุนรูป เราบอกว่าให้มันหมุนตั้งแต่ -10 องศา ถึง 10 องศา เลย และจะทำกับแค่ 70% ของข้อมูลเท่านั้น และสุดท้าย เป็น RandomFlip หรือสุ่มกลับด้าน ก็ใช้แค่ 70% ของรูป

from hocrox.layer import Save

model.add(Save('./preprocessed_image', 'img')

หมด Hidden Layer แล้ว เราก็จะมาทำ Output Layer กัน นั่นก็คือ Save นั่นเอง เราก็ทำการใส่พวกปลายทางว่าจะให้มันเอารูปที่จัดการเสร็จแล้วไปใส่ในไหนแค่นั้นเลย

model.transform()

สุดท้ายหลังจากเราสร้าง Model เสร็จแล้ว เราก็สามารถที่จะสั่งให้มันทำการจัดการกับรูปตามที่เรากำหนดไว้ได้เลย ผ่านคำสั่ง transform() ซึ่งมันจะ Generate รูปเป็นไฟล์ปกติให้เราได้เลย แต่ ๆ เท่าที่เราใช้งานมาบน macOS รูปมันจะไม่ออก เราจะต้องสร้าง Folder ให้มันหน่อย น่าจะเป็นเรื่องของ Permission ละมั้ง

สรุป

Hocrox เป็น Library ที่ทำให้การทำ Image Preparation และ Augmentation ทำได้ง่ายมาก ๆ ยิ่งใครที่คุ้นเคยกับ Keras อยู่แล้ว เราไม่จำเป็นต้องเรียนรู้อะไรใหม่เลย นอกจากนั้น มันยังมี Layer สำหรับการทำ Preparation และ Augment มาให้เราค่อนข้างเยอะเลย เรียกได้ว่าเป็น Final Solution สำหรับเราเลย แถมทำงานได้เร็วด้วย แนะนำว่า ลองไปเอาใช้กันดูได้