Convolutional Neural Network — Backbone of Computer Vision

Source: Deep Learning on Medium

Convolutional Neural Network — Backbone of Computer Vision

Introduction

ณ เวลานี้เราจะเห็นเทคโนโลยีใหม่ๆทางด้าน Computer Vision หรือก็คือด้านรูปภาพออกมามากมาย ไม่ว่าจะเป็น Object detection, Image Classification, Super Resolution, Motion Transfer, Image-to-Image Translation หรือแม้กระทั่ง Image Generation ที่คนเราไม่สามารถแยกออกรูปที่ถูกสร้างขึ้นมากับรูปที่โมเดลสร้างขึ้นมาจริงๆ โดยโมเดลเหล่านี้นั้นล้วนแต่เป็นโมเดล Convolutional Neural Network(CNN) ที่พัฒนามาจาก Traditional Artificial Neural Network(ANN) สำหรับใช้ในด้านนี้โดยเฉพาะ

Object Detection with yolov3 source: https://pjreddie.com/darknet/yolo/
Super Resolution ที่มีใช้ใน google pixel 3 source: https://ai.googleblog.com/2018/10/see-better-and-further-with-super-res.html
Image-to-Image Translation ที่ได้จากการแปลง tiger มาเป็น cat source: https://arxiv.org/abs/1804.04732

อ่านบทความ Artificial Neural Network ได้จากด้านล่างนี้เลยครับ

Traditional vs Deep Neural Network

เวลาคนพูดถึง Neural Network นั้น เรามักจะเห็นเป็น layer ต่างๆ ที่มีเส้นตรงมากมายเชื่อมต่อกันระหว่าง layer ซึ่งจริงๆแล้วก็คือ Fully connected layer นั่นเอง ซึ่ง Traditional Artificial Neural Network นั้นจะมีเพียงแค่ 1 hidden layer ในขณะที่ถ้าโมเดลไหนมี hidden layer มากกว่า 1 layer เราสามารถเรียกได้ว่าเป็น deep neural network ซึ่งเป็นที่มาของ deep learning นั่นเอง ซึ่ง deep neural network นั้นก็ได้ถูกพิสูจน์แล้วว่าดีกว่า Traditional ANN ในแทบจะทุกสาขาของ Machine Learning โดยหนึ่งในนั้นคือด้าน Computer Vision นั่นเอง

ด้านซ้าย : traditional ANN ด้านขวา : deep neural network

Convolutional Neural Network

สำหรับ CNN นั้นเป็นกลุ่มหนึ่งของ artificial neural network ที่จัดว่าเป็น breakthrough ของสาขา computer vision ซึ่งในบทความนี้เราจะมาอธิบายกันว่า CNN นั้นมีอะไรบ้าง ทำงานอย่างไร และ ผลลัพท์เมื่อเทียบกับ neural network ทั่วๆไปจะเป็นอย่างไรนะครับ

โดย CNN นั้นจะมี hidden layer มากกว่า 1 เสมอ เพราะฉะนั้นจึงจัดเป็น deep neural network ซึ่งตัว CNN จะมีประกอบไปด้วยสองส่วนหลักๆคือ
1. Convolutional Layer ทำหน้าที่เป็น feature extractor
2. Fully Connected Layer ทำหน้าที่เป็น classifier/regressor

Convolutional Layer

ในส่วนของ Convolutional Layer นั้นเราใช้ไอเดียจากการทำ feature extraction ที่ใช ้Convolutional Mask(หรือ filter,kernel) ในการดึง feature ออกมา โดยfeature ที่ดึงออกมาได้จะขึ้นอยู่กับค่าที่เราใส่ไปใน mask แล้วคำนวณออกมาเป็นค่าใหม่ลงบน pixel นั้นๆ โดย mask size นั้นมักจะมีค่าเป็นเลขคี่ (1×1,3×3,5×5,…)

วิธีการคำนวณค่าของแต่ละ pixel source: https://arxiv.org/abs/1908.09630
ตัวอย่างการใช้ convolutional Maskในการดึง feature เส้นตรงแนวตั้งออกมา source: https://www.youtube.com/watch?v=VwVg9jCtqaU

ซึ่งการที่ mask ขยับไปทีละ pixel นั้นเรียกว่า Stride โดยทั่วไปเราจะเลื่อนไปทีละ 1 pixel เพราะฉะนั้น output เราจะออกมามีความกว้างความยาวเท่ากับ input แต่ถ้าเรากำหนด stride = (2,2) หมายถึงว่าเราจะ apply mask ทุกๆ 2 pixel ของความกว้าง และ 2 pixel ของความยาว ซึ่ง output ที่ได้จะมีความกว้างและความยาวลดลงครึ่งหนึ่ง

การใช้ mask 3×3 stride ทีละ 2 pixel Source: http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

Padding

ที่นี้เราจะมีปัญหาคือที่บริเวณ“ขอบ”ของรูป ซึ่งจะไม่มีข้อมูลในบาง pixel ที่จะต้องใช้ในการคำนวณค่าจาก mask(บริเวณ pixel สีขาวของรูปด้านบน) ซึ่งวิธีแก้ปัญหาก็คือการ Padding นั่นเอง

วิธีการ padding คือการเพิ่ม size ของ input ที่ได้มา ซึ่งการที่จะเพิ่ม size เท่าไหร่นั้นขึ้นอยู่กับว่า convolutional layer นั้นๆมี mask size ขนาดใด คิดง่ายๆก็คือถ้าเอา mask ไปวางไว้ที่มุมของรูปภาพ เราจะต้องเพิ่มอีก กี่ pixel ถึงจะสามารถคำนวณค่า output ได้ เช่น ถ้าเป็น mask size 3×3 เราก็ต้องทำการ padding ไปด้านละ 1 pixel ทั้งด้าน บน ล่าง ซ้ายขวา (เช่นจาก input 6×6 ก็แปลงเป็น 8×8) หรือถ้าเราใช้ mask size เป็น 5×5 เราก็จำเป็นต้องใช้วิธีการ padding ไปด้านละ 2 pixel (จาก input 6×6 เป็น 10×10) โดยค่าที่เราใส่ไปเพิ่มนั้นมีได้หลายวิธี เช่น

  1. Constant Padding คือการใส่ค่าคงที่ค่าเดียวกันไปในทุก pixel ที่เกิดจากการ padding ซึ่ง zero padding ที่ใช้กันถือว่าเป็น Subset ของกลุ่มนี้ ยกตัวอย่างเช่นถ้าแถวหนึ่งมี 6 pixel ที่มีค่าของแต่ละ pixel คือ [3,4,1,4,2,6] แล้วทำการ zero padding โดยlayer นั้นมี mask size ขนาด 5×5 ก็คือเราต้อง padding ไปด้านละ 2 pixel เราก็จะได้ผลลัพท์ดังนี้
    0 0 | 3 4 1 4 2 6 | 0 0
  2. Reflection Padding เป็นการสะท้อนข้ามboundary ซึ่งถ้าใช้ตัวอย่างด้านบนก็จะได้ผลลัพท์เป็น
    4 3 | 3 4 1 4 2 6 | 6 2
  3. Replication Padding คือการนำค่าจาก pixel ที่ใกล้ที่สุดเป็นค่าของ pixel ที่เพิ่มขึ้นมา ถ้านำไปใช้กับตัวอย่างด้านบนก็จะได้ผลลัพท์เป็น
    3 3 | 3 4 1 4 2 6 | 6 6
ตัวอย่างการ zero padding ก่อนที่จะ apply mask

นอกจากนี้ยังมีอีกวิธีหนึ่งคือ no padding(หรือ valid padding ใน keras) คือเราจะ apply mask เฉพาะบริเวณที่สามารถคำนวณได้ ซึ่งวิธีนี้จะลด shape ของ input ลง ขึ้นอยู่กับขนาดของ mask เช่น ถ้าเราใช้ mask 3×3 ลงบน input 7×7 เราจะได้ output ขนาด 5×5 ออกมา แต่ถ้าเกิดว่าเราใช้ mask 5×5 ลงบน input 7×7 โดยใช้วิธี no padding เราจะได้output ออกมามีขนาด 3×3เท่านั้น ซึ่งจะเห็นว่าวิธีนี้จะไม่เหมาะกับ model ที่ input มีขนาดเล็ก หรือ model ที่มีความลึกมาก(มี hidden layer ที่เป็น convolutional layer จำนวนเยอะ)

No padding source:http://deeplearning.net/software/theano_versions/dev/tutorial/conv_arithmetic.html

Pooling

นอกจากที่กล่าวมานั้น โมเดลของ CNN มักจะมีสิ่งที่นำมาใช้ร่วมกันคือ Pooling Layer คือการ downsampling feature ที่ได้มาจาก Convolutional Layer ซึ่งจะมีอยู่สองแบบหลักๆคือ Max Pooling กับ Average Pooling โดยการ Pooling จะเป็นการแบ่ง input ออกเป็น region ซึ่งมักจะใช้ region ขนาด 2*2 แล้วก็จะเลือกค่าที่มากที่สุด(max) หรือ ค่าเฉลี่ย(average) ใน region นั้นๆออกมา โดย output ที่ได้จะมีขนาดความกว้างและความยาวลดลงครึ่งหนึ่งเมื่อเทียบกับ input ซึ่งการทำ pooling จะช่วยลด feature ที่ไม่สำคัญได้ ทำให้โมเดลสามารถเรียนรู้ได้ดียิ่งขึ้น

Max Pooling source : http://cs231n.github.io/convolutional-networks/

Putting together

ในส่วนของ Convolutional Layer นั้นจะเรียนรู้ค่าของตัว mask เองโดยไม่ต้องมาทำ manual feature extraction ซึ่งการที่ CNN มี Convolutional Layer ทำให้สามารถลดเวลา preprocess ลงมาก

ซึ่งหลังจากที่ extract feature ออกมาแล้วก็จะนำเข้าไปให้ fully connected layer ใช้ข้อมูลจาก feature ที่ได้ทั้งหมด เพื่อเรียนรู้ที่จะทำ classification/regression task ต่อไปได้

นอกจากนี้นั้น input ของ computer vision นั้นมักจะมีfeature เยอะมาก (เช่น รูปขนาด 100×100 pixel จะมีfeature ทั้งหมด 30,000 feature, แต่ถ้าหาเป็น 1000×1000 ก็จะกลายเป็น 3ล้าน feature!) ถ้าใช้ Fully Connected Layer ตัวโมเดลจะมีขนาดใหญ่มาก (จะได้เห็นในส่วนของ Experiment ของบทความนี้) ทำให้ computational cost เยอะขึ้นตามไปด้วย และยังจำเป็นที่จะต้องใช้ dataset ขนาดใหญ่มิเช่นนั้น model จะ overfit ได้ง่ายมาก เมื่อเทียบกับ CNN

architecture โดยทั่วไปของ CNN

Experiment

สำหรับครั้งนี่เราจะลองทำ Classifier สำหรับแยกโรคบนใบไม้ของพืชกันนะครับ โดยเราจะใช้ทั้ง CNN และ deep Neural Network ที่เพิ่ม hidden layer จากตัว Traditional ANN(แทนด้วย ANN)เพื่อดูความแตกต่างระหว่างตัวโมเดลทั้งสอง

Dataset

โดยในส่วนของตัว dataset เราจะใช้ข้อมูลจาก PlantVillage โดยมีพืชทั้งหมด 14 ชนิด รวม 38 class แต่เนื่องจาก dataset มีขนาดประมาน 50,000 กว่ารูป ซึ่งจะใช้เวลานานในการเทรนโมเดล เราจึงเลือกใช้การ sampling มา class ละประมาน 10% เพื่อความรวดเร็วในการทดสอบ Architecture ที่ต่างกัน

ตัวอย่างใบไม้จาก dataset

ANN & CNN Model

ทั้งสองโมเดลที่ใช้นั้นจะรับ input เป็น tensor 128x128x3 โดย 128×128 คือความกว้างและความยาวของรูปภาพ ส่วน x3 คือ channel ของสี RGBส่วน output layer ก็จะมีขนาด 38 ตามที่เราต้องการ 38 class นั่นเอง

หากไม่เข้าใจว่า tensor (128,128,3) หมายถึงอะไรสามารถอ่านได้จากบทความด้านล่างเลยครับ

ANN Hidden Layer

hidden layer ของ ANN เราจะให้มี 4 hidden layer ที่เป็น fully connected layer ขนาด 2048, 1024, 512, 256 ตามลำดับ ซึ่งจะมีลักษณะตามด้านล่างนี้เลย

our ANN model
our ANN diagram

CNN

ในขณะที่ CNN เราจะให้มี 4 hidden layer เหมือนกับ ANN แต่จะใช้ 5×5 Convolutional layer with stride 2,2 โดยมีจำนวน mask เป็น 64 ตามด้วย 3×3 convolutional layer ที่มี 128 mask และ max pooling layer แทน จากนั้นจึงตามด้วย fully connected layer แล้วจึงแปลงออกเป็น output ทั้งหมด 38 คลาส โดยตัว CNN เราจะไม่ทำการ padding ใดๆทั้งสิ้น (no padding) ซึ่งจะได้ตัวโมเดลตามด้านล่างเลย

our CNN model
our CNN diagram

จะเห็นได้ว่าจำนวน parameter ของ CNN นั้นน้อยกว่า ANN ถึง 3.5 เท่า นอกจากนี้ หลายๆท่านอาจจะสังเกตเห็นargument ของบางlayer ที่เขียนว่า activation=’???’ แล้วสงสัยว่ามันคืออะไรนะครับ ก็คือการนำผลลัพท์ของแต่ละ layer ไปผ่าน non-linear function ซึ่งในที่นี้มี relu กับ softmax ก่อนที่จะส่งต่อให้ layer ต่อไปนั่นเอง โดย relu คือฟังก์ชัน f(x) = max(0,x) ส่วน softmax คือฟังก์ชันเพื่อแปลงให้range ของ classification output อยู่ในrange 0 ถึง 1 สำหรับ Flatten layer คือการแปลงให้เป็น 1D tensor เพื่อให้ fully connected layer สามารถนำไปใช้ได้

Training

ในส่วนต่อไปเราก็จะเทรนโมเดลกัน โดยทั้งสองโมเดลจะใช้ optimizer เป็น adam ที่มี learning rate = 0.0005 และใช้ loss function เป็น categorical crossentropy loss ในส่วนของการวัดผลเราจะใช้ความแม่นยำ(accuracy)ในวัดครับ โดยจะเทรนทั้งหมด 40 epoch

code สำหรับเทรน ANN
code สำหรับเทรน CNN

Evaluation

ผลการเทรนโมเดลของทั้งตัว CNN กับ ANN เทียบกัน

หลังจากที่เราเทรนโมเดลมา ตัวโมเดล CNN จะมี accuracy อยู่ที่ 73.30% ในขณะที่ ANN จะอยู่ที่ 57.42% ซึ่งเราจะเห็นได้ว่า accuracy ห่างกันอย่างเห็นได้ชัด นอกจากนี้ CNN ยัง converge เร็วกว่าตัว ANN อีกตัว

Conclusion

ก็เป็นอันจบแล้วนะครับสำหรับบทความนี้ หลายๆท่านน่าจะได้เห็นความแตกต่างระหว่างทั้ง Traditional Artificial Neural Network กับ Convolutional Neural Network นะครับ และพอจะเข้าใจไอเดียคร่าวๆว่าทำไม CNN จึงให้ผลลัพท์ที่ดีกว่า Neural Network ทั่วๆไปในสาขา Computer Vision มาก

ในส่วนของพารามิเตอร์หลายๆอย่างที่ใช้ในการสร้างและเทรนโมเดลนั้น หลายๆท่านอาจจะยังไม่คุ้นเคยนัก อย่างเช่น optimizer หรือ learning rate คืออะไร เนื่องจากถ้าจะให้ลงลึกไปในแต่ละอันจะต้องใช้เวลาพอสมควร แต่ถ้าหากมีโอกาสก็จะมาเขียนอธิบายในภายภาคหน้าครับ

สำหรับ notebook นั้นสามารถ import ไปที่ google drive ของตนเองแล้วรันจาก colab ได้เลยครับ link notebook

— — — — — — — — — — — — — — — — — — — — — — — — — —

สนใจเรียน Data science -> Botnoi Classroom

สนใจใช้บริการในสร้างแชทบอท หรือให้คำปรึกษาเกี่ยวกับ AI & data science ติดต่อได้ผ่านเวป -> Botnoi และ FB Page Botnoi Consulting