Super Ai Image Classification -DataGenerator –

Original article was published by Pawut Jingjit on Deep Learning on Medium


Super Ai Image Classification -DataGenerator –

Data Augment ไม่ว่าจะเอียงยังไง ก็เป็นแมวตัวเดียวกันนะ Credit : jugsi.blogspost

หลายๆคนคงจะมีปัญหาเวลาจะนำ Data Image เข้าสู่ Jupyter Notebook โดยเฉพาะเพื่อนๆที่กำลังทำการบ้าน ‘ Super Ai Image Classification’ อยู่ แต่เพื่อนๆจะบอกลาปัญหาเอา Data เข้า Model ไปได้เลย เมื่อเพื่อนๆรู้จัก ‘สิ่งนั้น’

Image Data Generator คืออะไร

โดยปกติที่เราต้องทำ Image Classification เราต้องทำหลายขั้นตอนมาก ไม่ว่าจะเป็น Re-Scale( แปลงRGBจาก 0–255 เป็น 0–1 ) , Train-Valid-Test Split , Data Augment , หรือจะเป็นแปลง Image to Numpy ซึ่งขั้นตอนเหล่าจะหมดไป เมื่อเราใช้ ‘Image Data Generator’

ขั้นตอนที่ 0 จัด Directory

ใครไม่อยากจัดเอง สามารถดึงจากDrive ของเจ้าของบทความได้เลย https://drive.google.com/drive/folders/1jqUCJMide7swP9Uc9zck2gJl6PA_8BVr?usp=sharing

เราจะสามารถกำหนด Label ของรูปภาพที่มาจาก Image Data Generator จาก Directory Name ในภาพ รูปที่มาจาก train/0 จะมี Label 0 และ train/1 จะมี Label 1

ขั้นตอนที่ 1 Init ImageDataGen

ดู Param เพิ่มเติมได้ที่ https://keras.io/api/preprocessing/image/

ส่วนที่สำคัญคือการ Re-Scale เพราะโมเดลส่วนใหญ่ต้องใช้ RGB ในช่วง 0–1 เท่านั้น โดยเราสามารถเพิ่มเติม Data Augment ได้ตอนที่ Init อย่างในตัวอย่างนี้ ใช้ Data Augment เป็นกลับภาพซ้าย – ขวา

Data Augment จะเป็นการปรับภาพเบื้องต้นเพื่อลด overfitting แมวน้ำหันหน้าซ้ายกับแมวน้ำหันหน้าขวาก็เป็นแมวน้ำฉันใด โมเดลก็ควรจะรู้ว่าแมวน้ำทั้งสองเป็นแมวน้ำเหมือนกัน ฉันนั้น

สำหรับใครที่จะไม่อยากรู้อะไร อยากจับเข้าโมเดลอย่างเดียวเลย สามารถใช้หา preprocessing_function จาก Model เช่น xception.preprocess_input จะได้ไม่ต้องทำ rescale , resize

โดย validation_split จะเป็นการบอกว่า จะแบ่ง train-valid เป็นอัตราส่วนเท่าไหร่

ขั้นตอนที่ 2 train-valid split

Path ต้องตรงเป้ะๆนะ , ดูรายละเอียดแต่ละ Param ได้ที่ https://keras.io/api/preprocessing/image/

Data Gen สามารถใช้งานได้หลายแบบ แต่ที่จะใช้ในที่นี้ คือ flow_from_directory ซึ่งก็คือ การดึงภาพจาก Directory มา Feed เข้าโมเดลนั่นเอง น่าสนใจตรงสามารถใช้ Param subset = training เพื่อบอกว่าเป็น trainset ได้เลย (แบ่งอัตราส่วนตั้งแต่ ขั้นตอนที่ 1 )

หลังจากนี้ก็สามารถนำ train-it เข้า Model ได้แล้ว แต่ถ้าจบบทความที่ตรงนี้ มันคงจะสั้นไปหน่อย จึงแถมวิธีการ Transfer Learning ให้เพื่อนๆที่ตามในคาบไม่ทัน

แต่เจ้าของบทความก็ล่อไปท้ายตารางอะนะ จึงได้แต่สอนวิธีการสร้าง Model ได้อย่างเดียว

ถ้าถามว่า ทำไมใช้ Model ตัวนี้ คือดู https://keras.io/api/applications/ แล้วคะแนนเยอะดีเฉยๆ

คำถามว่า มีโมเดลไหนให้ใช้มั้ง ให้ดูที่ https://keras.io/api/applications/ แต่บางทีอาจจะอัพเดทช้าหน่อย ซึ่ง Code นี้ ใครอ่านแล้วลืมๆ แนะนำให้ย้อนไปดูที่ อ. สอนอีกซักครั้ง จะเข้าใจอย่างแน่นอน

ที่น่าสนใจคือ line 6,7 เป็นการ Freeze Model ไม่ให้เปลี่ยนค่า weigh ในโมเดล

เพราะแน่นอน โมเดล Deep 500 กว่า เราไม่สามารถ train ใหม่ได้ด้วยข้อมูลแค่ 2000 ตัวแน่นอน ส่วนใครอยากจะ next level play ให้เทรนด์เฉพาะ 5–6 Layer ท้าย ก็สามารถลองได้ หรืออาจจะเติม Dense Layer ข้างหลัง InceptionResNet ก็สามารถทำได้เช่นกัน

ก่อนจะจบบทความ อยากจะเพิ่มเติมซักนิดว่า อันนี้แบ่ง train , valid set เพื่อทดสอบเท่านั้น เวลาที่จะส่งจริงๆ ให้ fit ด้วย ข้อมูลทั้งหมดนะ

แล้วก็ ใครเทรนด์ในเครื่อง accuracy 95% + ทั้ง train , valid แต่ส่งจริงได้ 80 คะแนนนี่ จะบอกว่า โจทย์นี้ใช้ f1_score มาตรวจนะ

// ถ้าด้วยปาฏิหารย์ใดๆก็ตามที่ทำให้เจ้าของบทความหนีจากท้ายตารางมาได้ แน่นอนว่าจะเอามาเล่าให้เพื่อนๆฟังอย่างแน่นอน