Tutorial

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

By Arnon Puitrakul - 16 กุมภาพันธ์ 2022

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 สำหรับเราเลย แถมทำงานได้เร็วด้วย แนะนำว่า ลองไปเอาใช้กันดูได้

Read Next...

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

ฮาวทูย้าย Synology Add-on Package ไปอีก Volume

เรื่องราวเกิดจากการที่เราต้องย้าย Add-on Package ใน DSM และคิดว่าหลาย ๆ คนน่าจะต้องประสบเรื่องราวคล้าย ๆ กัน วันนี้เราจะมาเล่าวิธีการว่า เราทำยังไง เจอปัญหาอะไร และ แก้ปัญหาอย่างไรให้ได้อ่านกัน...

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

จัดการ Docker Container ง่าย ๆ ด้วย Portainer

การใช้ Docker CLI ในการจัดการ Container เป็นท่าที่เราใช้งานกันทั่วไป มันมีความยุ่งยาก และผิดพลาดได้ง่ายยังไม่นับว่ามี Instance หลายตัว ทำให้เราต้องค่อย ๆ SSH เข้าไปทำทีละตัว มันจะดีกว่ามั้ย หากเรามี Centralised Container Managment ที่มี Web GUI ให้เราด้วย วันนี้เราจะพาไปทำความรู้จักกับ Portainer กัน...

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

Host Website จากบ้านด้วย Cloudflare Tunnel ใน 10 นาที

ปกติหากเราต้องการจะเปิดเว็บสักเว็บ เราจำเป็นต้องมี Web Server ตั้งอยู่ที่ไหนสักที่หนึ่ง ต้องใช้ค่าใช้จ่าย พร้อมกับต้องจัดการเรื่องความปลอดภัยอีก วันนี้เราจะมาแนะนำวิธีการที่ง่ายแสนง่าย ปลอดภัย และฟรี กับ Cloudflare Tunnel ให้อ่านกัน...

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

จัดการข้อมูลบน Pandas ยังไงให้เร็ว 1000x ด้วย Vectorisation

เวลาเราทำงานกับข้อมูลอย่าง Pandas DataFrame หนึ่งในงานที่เราเขียนลงไปให้มันทำคือ การ Apply Function เข้าไป ถ้าข้อมูลมีขนาดเล็ก มันไม่มีปัญหาเท่าไหร่ แต่ถ้าข้อมูลของเราใหญ่ มันอีกเรื่องเลย ถ้าเราจะเขียนให้เร็วที่สุด เราจะทำได้โดยวิธีใดบ้าง วันนี้เรามาดูกัน...