ทดลองใช้งาน GoogleNet
GoogleNet ก็เป็น Deep Learning ประเภท CNN ที่เทรนเสร็จเรียบร้อย พร้อมให้เราใช้งานอีกตัวหนึ่ง ซึ่งมี object ที่ใช้เทรนทั้งหมด 1000 ชนิด และเทรนด้วยรูปภาพมากกว่า 1 ล้านรูป เช่นเดียวกันกับ AlexNet
ในตัวอย่างนี้ เราจะมาดูวิธีการใช้งาน GoogleNet ในการ classify รูปภาพเช่นเดียวกันกับ AlexNet นะครับ ซึ่งจะมีวิธีการใช้งานยังไงนั้น เรามาดูกันเลยครับ
ผลที่ได้
โปรแกรมตอบว่า ภาพนี้คือ bell pepper หรือ พริกหยวก ซึ่งก็ถูกต้องนะครับ โดยโปรแกรมมีความมั่นใจ 95.5% ว่าภาพนี้คือพริกหยวก
งั้นเราลองมาดูกันดีกว่าครับว่า 5 อันดับแรกของผลการวิเคราะห์ของ googlenet จะมีอะไรบ้าง
รองลงมาก็คือ cucumber หรือ แตงกวานั่นเองครับ ซึ่งตัว predict scores นี่มีประโยชน์มากนะครับ เพราะมันทำให้เราทราบว่า ผลการวิเคราะห์ที่ได้มีความน่าเชื่อถือระดับไหน ซึ่งเราสามารถนำไปเขียนโปรแกรมคัดกรองอีกชั้นหนึ่งได้ เช่น ถ้า score น้อยกว่า 80% ให้ตอบว่า Unknow
เรามาลองทดสอบกับภาพอื่นๆ ดูนะครับ
googlenet วิเคราะห์ว่าเป็น eggnog (เครื่องดื่มที่ใส่ไข่ไก่ผสมกับแอลกอฮอล์) ซึ่งคำตอบที่ได้ถือว่าใกล้เคียงมากกว่า Alexnet เพราะอย่างน้อย ผลการวิเคราะห์ก็ยังเป็นเครื่องดื่มอยู่
ส่วนภาพนี้ก็ยังเป็นดอกเดซี่เหมือนเดิม สงสัยต่างประเทศเขาไม่มีดอกทานตะวันจริงๆ นั่นแหละ
สำหรับการใช้งาน googlenet ขั้นต้นก็จบเพียงเท่านี้นะครับ แล้วเจอกันใหม่ในบทความหน้าครับ
ในตัวอย่างนี้ เราจะมาดูวิธีการใช้งาน GoogleNet ในการ classify รูปภาพเช่นเดียวกันกับ AlexNet นะครับ ซึ่งจะมีวิธีการใช้งานยังไงนั้น เรามาดูกันเลยครับ
ขั้นตอนที่ 1 สร้างตัวแปร Network ของ GoogleNet
>> net = googlenet;
(ถ้าใครยังไม่ได้ติตตั้งมันจะมีข้อความแจ้งเตือน error นะครับ ก็ให้ติดตั้งก่อน ก็จะใช้งานได้ปกติ)
ขั้นตอนที่ 2 ดูขนาดของ Input layer และ Outpu layer
ก่อนที่เราจะใช้งานมันได้ สิ่งแรกที่เราต้องรู้เลยก็คือ googlenet มันรับ input แบบไหน ขนาดเท่าไร เราจึงจะสามารถป้อน input ให้มันคำนวณได้อย่างถูกต้อง ไม่ใช่ว่าเราอยากป้อนอะไรก็ป้อนนะครับ
>> inputSize = net.Layers(1).InputSize
ซึ่งคำตอบที่ได้ก็คือ [224 , 224 , 3] ซึ่งก็คือรูปภาพสี ขนาด 224x224 พิกเซล นั่นเองครับ
ต่อมา เรามาลองดูกันครับว่า object ทั้ง 1000 ชนิดที่ googlenet ได้เรียนมานั้น มีอะไรบ้าง ซึ่งในตัวอย่างนี้ผมจะสุ่มมาแสดง 10 ชื่อนะครับ ดังนั้นหากใครรันโค้ดเดียวกันกับผมแล้วได้คำตอบไม่เหมือนกันก็ไม่ต้องตกใจนะครับ
>> classNames = net.Layers(end).ClassNames;
>> numClass = numel(classNames);
>> disp(classNames(randperm(numClass,10)))
>> numClass = numel(classNames);
>> disp(classNames(randperm(numClass,10)))
ก็จะได้คำตอบประมาณนี้
'alp'
'custard apple'
'catamaran'
'sleeping bag'
'redshank'
'Band Aid'
'wooden spoon'
'sewing machine'
'lemon'
'megalith'
'custard apple'
'catamaran'
'sleeping bag'
'redshank'
'Band Aid'
'wooden spoon'
'sewing machine'
'lemon'
'megalith'
จากนั้นเราลองหารูปภาพมาทดสอบดูครับ
clc;clear;close all; net = googlenet; inputSize = net.Layers(1).InputSize; classNames = net.Layers(end).ClassNames; numClass = numel(classNames); %disp(classNames(randperm(numClass,10))) I = imread('peppers.png'); pic = imresize(I,inputSize(1:2)); [label,scores] = classify(net,pic); figure; imshow(I) title(string(label)+' , '+num2str(100*scores(classNames==label),3)+'%');
ผลที่ได้
โปรแกรมตอบว่า ภาพนี้คือ bell pepper หรือ พริกหยวก ซึ่งก็ถูกต้องนะครับ โดยโปรแกรมมีความมั่นใจ 95.5% ว่าภาพนี้คือพริกหยวก
งั้นเราลองมาดูกันดีกว่าครับว่า 5 อันดับแรกของผลการวิเคราะห์ของ googlenet จะมีอะไรบ้าง
%% display top predict [~,idx] = sort(scores,'descend'); idx = idx(5:-1:1); classNamesTop = net.Layers(end).ClassNames(idx); scoresTop = scores(idx); figure barh(scoresTop) xlim([0 1]) title('Top 5 Predictions') xlabel('Probability') yticklabels(classNamesTop)
รองลงมาก็คือ cucumber หรือ แตงกวานั่นเองครับ ซึ่งตัว predict scores นี่มีประโยชน์มากนะครับ เพราะมันทำให้เราทราบว่า ผลการวิเคราะห์ที่ได้มีความน่าเชื่อถือระดับไหน ซึ่งเราสามารถนำไปเขียนโปรแกรมคัดกรองอีกชั้นหนึ่งได้ เช่น ถ้า score น้อยกว่า 80% ให้ตอบว่า Unknow
เรามาลองทดสอบกับภาพอื่นๆ ดูนะครับ
ส่วนภาพนี้ googlenet ก็ไม่แน่ใจเหมือนกันครับว่ามันคืออะไร จะเห็นได้จาก % ความั่นใจมีแค่ 11.5% เท่านั้นครับ
ส่วนเจ้าตัวนี้ ในที่สุดก็ถูกมองว่าเป็นแมวแล้วครับ ฮ่าๆๆ (Tabby แปลว่าแมวลาย)
ส่วนภาพนี้ก็ยังเป็นดอกเดซี่เหมือนเดิม สงสัยต่างประเทศเขาไม่มีดอกทานตะวันจริงๆ นั่นแหละ
สำหรับการใช้งาน googlenet ขั้นต้นก็จบเพียงเท่านี้นะครับ แล้วเจอกันใหม่ในบทความหน้าครับ