Skip to content
Home » [Update] 10 Concepts เริ่มต้นเรียนรู้การเขียนโปรแกรมด้วย Excel VBA | เยอะแยะ ภาษา เขียน – NATAVIGUIDES

[Update] 10 Concepts เริ่มต้นเรียนรู้การเขียนโปรแกรมด้วย Excel VBA | เยอะแยะ ภาษา เขียน – NATAVIGUIDES

เยอะแยะ ภาษา เขียน: นี่คือโพสต์ที่เกี่ยวข้องกับหัวข้อนี้

การเขียนโปรแกรมให้ Excel ทำงานแบบอัตโนมัติด้วย VBA (Visual Basic for Application) เป็นหัวข้อทักษะขั้นสูงใน Excel ที่มีคนอยากเรียนรู้เยอะมากที่สุดตลอดกาลลลลลเลยล่ะ!

ผมจึงได้รับคำเรียกร้องจากแฟนเพจจำนวนมาก ให้ทำเนื้อหาเกี่ยวกับ VBA ได้แล้ว ดังนั้นวันนี้จึงถึงเวลาที่ผมจะมาพูดถึงเรื่อง VBA ซะทีครับ ซึ่งทำทั้งที ก็เริ่มปูพื้นบานให้ใหม่ตั้งแต่แรกเลย ^^

Table of Contents

VBA คืออะไร?

มันก็คือการเขียนโปรแกรมแบบหนึ่ง ซึ่งแทนที่เราจะนั่งเอาเม้าส์หรือคีย์บอร์ดกดคำสั่ง Excel ทีละ Step ตามปกติ เราสามารถเขียนคำสั่งใน VBA เอาไว้ เพื่อให้ Excel สามารถทำงานต่างๆ ตามที่เรากำหนดได้เลย แถมยังใส่ความฉลาดให้มันได้ด้วยนะ เช่น ถ้าสถานการณ์เป็นแบบนี้ๆๆ จะให้มันทำงานยังไงต่อ (คล้ายๆ ใส่ฟังก์ชั่น IF นั่นแหละครับ แต่เป็นการใส่ให้กับชุดคำสั่งแทน)

แนวทาง VBA ที่ผมจะสอน

การเรียนรู้ VBA ตามแนวทางที่ผมจะสอน ต้องบอกก่อนว่าจะเป็นแนวทางที่ใช้ VBA เป็นตัวเสริมการทำงานเท่านั้น นั่นคือจะใช้มันทำงานถึกๆ งานที่ไม่ต้องใช้ความคิดอะไร หรือ ใช้เมื่อไม่สามารถใช้สูตรหรือเครื่องมือปกติของ Excel ทำได้ 

งานอะไรที่ Excel ทำได้ เราจะปล่อยให้ Excel ทำไป (เช่น พวกสูตรคำนวณ หรือเครื่องมือ Ribbon อย่าง Pivot Table) ส่วนงานไหนที่ทำไม่ได้ เราถึงจะใช้ VBA มาช่วย!!

ดังนั้นก่อนอื่นคุณควรมีความรู้พื้นฐาน Excel ให้ดีพอสมควรก่อน แล้วค่อยมาเรียนรู้ VBA ในแบบที่ผมจะสอนให้นะครับ

และต้องขอบอกไว้ก่อนว่า ในบทความนี้เราจะยังไม่ลงลึกถึงการเขียนเชิงเทคนิคจริงๆ แต่จะเน้นให้เห็นแนวคิดและภาพรวมก่อน (ซึ่งสำคัญกว่าความรู้เชิงเทคนิคมาก!) สำหรับความรู้เชิงเทคนิคจะอยู่ในบทความถัดๆ ไปครับ

เอาล่ะ…อ่านมาถึงตรงนี้ก็เริ่มยาวแล้ว เพื่อไม่ให้เสียเวลา เรามาดูกันเลยว่า 10 Concepts ที่ผมจะบอกมีอะไรบ้าง?

Concept 1 : งาน 3 ส่วนของการเขียน VBA ใน Excel

การเขียนโปรแกรม VBA ขึ้นมาซักชิ้นหนึ่ง ผมอยากให้แบ่งงานออกเป็น 3 ส่วนดังนี้

3types

  1. งานวางแผน/ออกแบบ : เป็นการวางแผนภาพใหญ่ ว่าจะให้แต่ละส่วนทำงานร่วมกันยังไง เปรียบได้กับผู้บริหารขององค์กร
  2. งานควบคุม : งานที่คอยควบคุมการทำงานว่า จะให้ทำงานชิ้นไหนก่อนหลัง ทำซ้ำกี่ที หรือทำตามเงื่อนไขที่กำหนดก็ได้ เปรียบได้กับเป็นหัวหน้าทีมที่พร้อมคุมพนักงานปฏิบัติการ โดยรับนโยบายแผนงานภาพรวมมากจากผู้บริหารอีกที
  3. งานปฏิบัติการ : เป็นงานที่ต้องลงแรง มี action บางอย่างเกิดขึ้น ซึ่งเป็นการสั่งให้ Excel ทำงานแต่ละชิ้นตามที่เราต้องการ เปรียบได้กับพนักงานระดับปฏิบัติการทั่วไป

ถ้าลองพิจารณางานแต่ละส่วน จะมีความยากง่ายต่างกัน ดังนี้

  • ส่วนที่ง่ายที่สุด ก็คือ ส่วนที่ 3 : งานปฏิบัติการ
    • โชคดีที่ใน Excel มีเครื่องมือสุดเจ๋งที่เรียกว่า Macro Recorder ซึ่งสามารถ “บันทึก action ที่เราทำบน Excel ให้กลายเป็นภาษา VBA ได้เลย” ดังนั้นถึงคุณจะยังเขียนภาษา VBA ไม่เป็น คุณก็ให้ Macro Recorder ทำหน้าที่นี้ไปได้ (เป็นผู้ช่วยพนักงาน)  นอกจากนี้คุณยังสามารถไปหา Code ในโลกออนไลน์ที่มีคนเขียนเอาไว้ มาประยุกต์ใช้กับ Code ของคุณก็ยังได้!
  • ส่วนที่จะว่ายากก็ยาก จะว่าง่ายก็ง่าย ก็คือ ส่วนที่ 1 : งานวางแผน/ออกแบบ ซึ่งเป็นสิ่งที่ไม่ค่อยเกี่ยวกับเนื้อหาของ Excel หรือ VBA เท่าไหร่
    • เป็นเรื่องของตรรกะในการทำงานของ Program ว่ามันควรจะทำงานอย่างไรเพื่อที่จะแก้ปัญหาที่กำลังเผชิญหน้าอยู่ ซึ่งแต่ละคนอาจมีวิธีแก้ที่แตกต่างกันได้
    • แต่สิ่งสำคัญที่อยากให้ทำคือ คุณควรวางแผนการทำงานโดยรวมของโปรแกรมก่อนว่า หลักการทำงานจะทำยังไง โดยอาจจะวาดเป็น Flow Diagram หรือจะเขียนเป็น Concept แบบภาษาพูดไว้ก็ได้ไม่ว่ากัน ขอให้วางแผนเถอะ!
    • เคล็ดลับคือ หากคุณนึกวิธีแก้ปัญหาหรือเงื่อนไขในสมองคุณได้ คุณก็ให้ VBA ทำตามแบบที่คุณคิดนั่นแหละ แต่ถ้ายังคิดไม่ออก คุณก็แค่ศึกษาทางแก้ไขของคนอื่นไปซักพัก คุณจะพบทางแก้ของตัวเองในที่สุด
  • ส่วนที่เราจะต้องเรียนรู้เพิ่มเติมเป็นหลักก็คือ ส่วนที่ 2 : งานควบคุม 
    • ส่วนนี้เป็นภาษา VBA ที่ไม่สามารถใช้ Macro Recorder มาช่วยได้ ซึ่งผมมีหน้าที่ทำให้คุณสามารถเขียน VBA ส่วนนี้ให้ได้นั่นเอง

Concept 2 : ทุกอย่างใน Excel คือ พนักงานที่พร้อมจะทำงานให้คุณ!!

ผมจะบอกว่า องค์ประกอบทุกอย่างใน Excel ล้วนยอมเป็นพนักงานให้คุณสั่งงานได้หมดเลย ไม่ว่าจะเป็นตัวแต่ละ Sheet แต่ละ Cell เครื่องมือ Filter/Pivot ก็ยอมให้คุณสั่งงานได้เช่นกัน ซึ่งภาษาอย่างเป็นทางการของ “พนักงาน” ที่ผมพูดถึง เรียกว่า “Object” นั่นเองครับ

ถ้าเรามี Object หลายตัว (คนทำงานหลายคน) การที่เราจะสั่งงานได้นั้น เราจะต้องมีวิธีเรียกถึงสิ่งนั้นจริงมั้ยครับ? เช่น ถ้าคุณมีพนักงานอยู่ 3 คนที่พร้อมจะทำตามคำสั่งคุณได้ คุณก็ต้องมีวิธีเรียกแต่ละคนว่าจะเรียกเค้าว่าอะไร? เช่น พนักงาน A นัดหมายการประชุม, พนักงาน B เตรียมขนมเบรค, พนักงาน C จดบันทึกการประชุม เป็นต้น

แปลว่า เราจะต้องมีวิธีอ้างอิงเพื่อเรียกใช้พนักงานแต่ละคนนั่นเอง… (เรียกชื่อได้ก็ควบคุมได้)

เรื่องของเรื่องคือ เราจะอ้างอิงไปหาคนงานแต่ละคนใน Excel ยังไงดีล่ะ?

ข่าวดีคือ เรื่องนี้คุณสามารถใช้ Macro Recorder ลองบันทึกการสั่งการของเราที่ทำกับ Object นั้นๆ ใน Excel แล้วค่อยมาดู Code VBA ภายหลังได้ว่าจะต้องเรียก Object นั้นว่าอะไร แค่นี้ก็ไม่เป็นปัญหาแล้วครับ ดังนั้นเรื่องนี้จึงไม่ใช่สิ่งที่ต้องกังวลมากนัก

ซึ่งเมื่อคุณลองดู Code ที่โผล่มาจะพบว่า แต่ละ Object นั้นมีความเป็นแม่ลูกกันอยู่พอสมควร และจะอยู่ในรูปแบบของ Objectแม่.Objectลูก เช่น ถ้า Object แม่เป็นคน เราก็สามารถอ้างอิงไปที่แขนของนาย A ได้ว่า นายA.แขน หรือจะอ้างอิงไปที่แขนของนาย B ได้ว่า นายB.ขา เป็นต้น

Concept 3 : เราสั่งอะไรกับ Object ได้บ้าง?

เมื่อรู้แล้วว่าเราจะเรียก Object แต่ละอันว่าอะไร… คำถามถัดไปก็คือ แล้วเราจะสั่งงานอะไรมันได้บ้าง?

การสั่งงาน Object นั้นมีอยู่ 2 ลักษณะด้วยกัน คือ

  1. สั่งให้มันทำงานบางอย่าง (มีการกระทำ เช่น ลบ sheet, เพิ่มแถว, sort ข้อมูล)
    ซึ่ง action ที่ Object ทำได้ มีชื่ออย่างเป็นทางการว่า Method ครับ (คล้ายๆ กับ Verb ในภาษาอังกฤษ)
  2. สั่งให้เปลี่ยนลักษณะ/คุณสมบัติ (ทำให้คุณสมบัติเปลี่ยนไป เช่น เปลี่ยนค่า เปลี่ยนสี)
    ซึ่งคุณสมบัติของ Object นั้นมีชื่ออย่างเป็นทางการว่า Property ครับ (คล้ายๆ กับ Adjective ในภาษาอังกฤษ)

ซึ่งแต่ละ Object จะมี Property และ Method เป็นของตัวเอง เช่น เครื่องมือ Filter มันทำการ Filter ได้ แต่ไม่สามารถสั่ง Filter ให้ Pivot สรุปข้อมูลได้ (เพราะไม่ใช่หน้าที่ของมัน) เป็นต้น

แล้วเราจะรู้ได้ยังไงว่า Object แต่ละตัวมี Method หรือ Property อะไรบ้าง?

วิธีที่ง่ายที่สุดก็คือใช้ Macro Recorder (อีกแล้ว!) บันทึกสิ่งที่เราทำใน Excel แล้วมาดู Code เช่นเดิมครับ แต่วิธีสังเกตคือ ชื่อของ Method และ Property จะตามอยู่หลังจากชื่อ Object ครับ ซึ่งจะอยู่ในรูปแบบ Object.Method หรือ Object.Property ครับ

ยกตัวอย่างเช่น คุณสามารถกดบันทึก Macro แล้วลองสั่ง Filter ให้ทำการกรองข้อมูล จากนั้นค่อยไปดู Code VBA ที่ถูกสร้างขึ้นมาได้ซึ่งคุณจะเห็น Property และ Method ที่ถูกสร้างขึ้นมาอย่างแน่นอน ดังนั้นเรื่องนี้จึงไม่ใช่สิ่งที่ต้องกังวลอีกเช่นกัน

Concept 4 : ตัวแปร และ Operator

ตัวแปร

การเขียนโปรแกรมนั้นมี Concept หนึ่งที่สำคัญนั่นก็คือ ตัวแปร

คำว่าตัวแปร ตัวที่ค่าสามารถ “แปรเปลี่ยน” ไปได้เรื่อยๆ… พูดเหมือนขวานผ่าซาก แต่ก็เป็นแบบนั้นจริงๆ…

หน้าที่ของมัน… ถ้าจะให้เข้าใจง่ายๆ ก็เป็นเหมือน กล่องที่เอาไว้เก็บค่าต่างๆ ซึ่งเราสามารถอ้างอิงค่าจากกล่องตัวแปรนี้ได้ ตรงนี้จะคล้ายๆกับการใช้ Cell Reference ใน Excel ที่เราสามารถเก็บค่าที่คำนวณแล้วเอาไว้ใน Cell เช่น A1 แล้วสามารถเอาค่าไปใช้ต่อได้โดยการใช้ Cell Reference ได้

แต่ VBA เจ๋งกว่าตรงทีเราเปลี่ยนค่าของตัวแปรไปเรื่อยๆ ได้ด้วย! ทำยังไงมาดูกัน

วิธีการใส่ค่าใหม่ลงไปในตัวแปร

ให้ใช้เครื่องหมายเท่ากับ ในรูปแบบ ตัวแปร=ค่าที่จะใส่ลงไปในตัวแปร เช่น 

x=30

ถ้าต่อมาเราแสดงค่า x+5 ก็จะได้ค่า 35 ออกมานั่นเอง

การสั่งงาน VBA จะเอาค่าฝั่งขวา มาใส่ในตัวแปรฝั่งซ้าย ดูแล้วเหมือนไม่มีอะไร แต่ถ้าเจอแบบนี้อาจมึนได้ เช่น
x=x+1

เฮ้ย ท่าจะเพี้ยนแล้ว x จะเท่ากับ x +1 ได้ไงกัน!?

ใจเย็นครับ วิธีตีความที่ถูกต้องของคำสั่งบรรทัดนี้ก็คือ ให้เพิ่มค่า x จากเดิมไป 1 หน่วยต่างหากล่ะ!

ก่อนจะจบในเรื่องของตัวแปร ผมต้องบอกก่อนว่า ตัวแปรใน VBA นั้นมีด้วยกันหลายประเภท (คล้ายๆ ใน Excel แหละครับ) เช่น เป็นตัวหนังสือ ตัวเลข ตรรกะ วันที่  แต่ละประเภทก็จะรองรับข้อมูลได้ต่างกันทำให้กินหน่วยความจำต่างกัน แต่ในเบื้องต้นนี้คุณยังไม่ต้องซีเรียสเรื่องนี้มากก็ได้ครับ

Operator

นอกจากตัวแปรแล้ว ใน VBA ก็จะมีพวกตัวดำเนินการ (Operator) คล้ายๆ Excel เลย  เช่น +,-,*,/, =,>,<,& …และอีกมายมาย ซึ่งเราสามารถนำมาใช้เขียนคำสั่งต่างๆ ได้ อีกเยอะแยะครับ เช่น เครื่องหมายทางคณิตศาสตร์เอาไว้คำนวณ, เครื่องหมายเปรียบเทียบ ทำให้เกิดค่า TRUE/FALSE ได้, เครื่องหมาย & เอาไว้เชื่อมข้อความ เป็นต้น

Concept 5 : คำสั่งภาษา VBA จะทำงานจากบนลงล่างทีละบรรทัด

VBA  มันจะทำจากบรรทัดบนลงล่างครับ (สั่งก่อนทำก่อนว่างั้นเถอะ)

ดังนั้น ถ้าเขียนว่า

พนักงาน A นัดหมายการประชุม

พนักงาน B เตรียมขนมเบรค

พนักงาน C จดบันทึกการประชุม

แปลว่า พนักงาน A นัดหมายการประชุม ก่อน จากนั้น พนักงาน B เตรียมขนมเบรค แล้วจบด้วย พนักงาน C จดบันทึกการประชุม เรียงตามลำดับแบบนี้ ทีละบรรทัด ทีละคำสั่ง ไม่มีอะไรยุ่งยากครับ

ไม่อยากสั่งทีละคำสั่ง อยากสั่งเป็นชุดเลยได้มะ?

ในหลายๆ สถานการณ์ ถ้าผมขี้เกียจสั่งคำสั่ง 3 อันแยกกันแบบนั้นทุกครั้ง ผมก็สามารถรวบให้มันอยู่ภายใต้ชุดคำสั่งเดียวกันได้เลยครับ ซึ่งใน VBA เราจะเรียกชุดคำสั่งว่า Sub (ซึ่งจะ Run ชุดคำสั่งย่อยที่อยู่ภายในนั้นจากบนลงล่าง)

เช่น ถ้าผมรวม 3 อันนั้นเข้าไปใน Sub ที่ชื่อว่า จัดงานประชุม ดังนี้

Sub จัดงานประชุม()

พนักงาน A นัดหมายการประชุม

พนักงาน B เตรียมขนมเบรค

พนักงาน C จดบันทึกการประชุม

End sub

แล้วครั้งต่อไปเมื่อผมสั่งคำสั่งว่า Call จัดงานประชุม() คราวนี้ VBA ก็จะทำ 3 คำสั่งนั้นตามลำดับเลย! ไม่ต้องมาสั่งแยกอีกต่อไป

แล้วถ้ามีอยู่ Action เดียวยังต้องมี Sub อีกมั้ย?

ใน VBA เราไม่สามารถใส่คำสั่งโดยที่ไม่มีที่อยู่ได้ แปลว่าถึงมีอยู่คำสั่งเดียว เราก็ต้องเอาไว้ใน Sub อยู่ดี

แต่ในความจริงแล้ว ยังมีชุดคำสั่งอีกแบบนอกจาก Sub นั่นก็คือ Function ซึ่งจะพูดถึงใน Concept ถัดไป

Concept 5 : เราสร้างฟังก์ชั่นใช้เองใน Excel ได้ด้วย VBA

อย่างที่ผมบอกว่านอกจาก Sub แล้ว ใน VBA เรายังมีชุดคำสั่งอีกประเภทนั่นก็คือ Function นั่นเอง แล้วมันต่างจาก Sub ยังไงล่ะ?
คำตอบคือ Function ต่างจาก sub ตรงที่สุดท้ายแล้วจะส่งค่าผลลัพธ์บางอย่างกลับออกมายังตัวแปร (ที่ชื่อเดียวกับฟังก์ชั่น) ด้วย

พูดง่ายๆ Sub คือชุดคำสั่งที่ทำ Action ต่างๆ แล้วจบไป…
แต่ Function ทำอะไรบางอย่าง (เช่นคำนวณค่า) แล้วส่งผลลัพธ์กลับมาไว้ในตัวแปร…

ถ้าฟังแล้วยังดูงงๆ อีก ผมอยากให้นึกถึงฟังก์ชั่นที่เราใช้ในสูตร Excel ตามปกติครับ มันคือสิ่งเดียวกันเลย!

เช่น ฟังก์ชั่น LEFT จะเห็นว่ามี Argument อยู่ 2 ตัวด้วยกัน ซึ่งพอใส่ Input เข้าไปแล้ว ฟังก์ชั่น LEFT ก็จะทำงานอะไรซักอย่าง สุดท้ายก็จะได้ผลลัพธ์คือ อักขระจำนวน num_char จากทางซ้ายของข้อความ text  ออกมาใน Cell จนได้

ซึ่งอันนี้แหละที่คล้ายกับการใช้ชุดคำสั่ง Function ใน VBA ซึ่งจะได้ผลลัพธ์เก็บไว้ในตัวแปร
เช่น ถ้าผมอยากสร้างฟังก์ชั่นไว้หา % ที่เปลี่ยนแปลงไป โดยจะให้ชื่อว่า PERDIF ผมก็ทำได้ดังนี้

Function PERDIF(ค่าก่อน,ค่าหลัง)

ค่าที่เปลี่ยน = ค่าหลัง-ค่าก่อน

PERDIF = ค่าที่เปลี่ยน/ค่าก่อน

End Function

เพียงแค่นี้ คุณก็สามารถใส่สูตร =PERDIF(100,150) ใน Cell แล้ว Excel ก็จะคำนวณออกมาจนได้เป็น 0.5 หรือ 50% ได้ทันที!
เห็นมั้ยว่าการสร้างฟังก์ชั่นใช้เองไม่ยากเลย นี่แหละคือพลังของ VBA ล่ะ นี่ถ้าเอาไปใช้กับฟังก์ชั่นซับซ้อนๆ จะเจ๋งขนาดไหน!!

Concept 6 : ชุดคำสั่ง VBA จะเริ่มทำงานเมื่อมีเหตุการณ์ (Event) บางอย่าง

ชุดคำสั่งทั้ง Sub และ Function อยู่ดีๆ มันจะเริ่มทำงานเองไม่ได้ครับ มันจะต้องมีกลไกบางอย่างไปสั่งการให้ VBA Run ชุดคำสั่งดังกล่าว ซึ่งเราจะเรียกกลไกหรือเหตุการณ์ที่มาสั่งการนี้ว่า Event ครับ

ตัวอย่างของ Event เช่น การคลิ๊กปุ่มบนหน้าจอ, การกดปุ่มบน Keyboard, การเปิดไฟล์ขึ้นมา, การแก้ไขข้อมูล, การเรียกใช้ Sub , การเรียกใช้ Function เป็นต้น

แปลว่าเราสามารถกำหนดได้ว่า เมื่อเกิดเหตุการณ์ xx จะใช้สั่งคำสั่ง yy เป็นต้น ซึ่งสิ่งเหล่านี้มีประโยชน์มากในการทำงานอัตโนมัติ เมื่อผู้ใช้งานทำงานต่างๆ ใน Excel ก็ล้วนสามารถสั่งให้ VBA ทำงานได้ทั้งสิ้น (ที่ฮิตมากคือการกดปุ่ม, การเปิดไฟล์เข้ามา)

เช่น

Private Sub Workbook_Open()

คำสั่ง A (ที่จะให้ทำ เมื่อเปิดไฟล์ขึ้นมา)

End Sub

เมื่อเราใส่คำสั่งลงไปใน Event Workbook_Open() แปลว่า
เมื่อผู้ใช้งานเปิดไฟล์นี้ขึ้นมา มันจะรันคำสั่ง A โดยอัตโนมัติเลย เจ๋งป่ะล่ะ!!

เรียกใช้ Sub หรือ Function ซ้อนกันก็ได้นะ

สิ่งที่ผมอยากจะบอกเพิ่มเติมก็คือ เราสามารถเรียกใช้ Sub หนึ่งภายใต้อีก Sub/Function ได้ เช่น เรียก SubA ถายใต้ Sub B ได้ และในทำนองเดียวกัน เราก็สามารถเรียกใช้ Function หนึ่งภายใต้อีก Sub/Function ได้เช่นกัน!!

จะเห็นได้ว่า ถ้ามันซ้อนกันได้ขนาดนี้ VBA ก็จะทรงพลังมากขึ้นอีก เพราะเราใช้หลักการของ Divide & Conquer หรือ แบ่งหน้าที่กันทำทีละส่วนได้ แล้วค่อยสั่งคำสั่งให้มันมาทำงานร่วมกันอีกที!

Concept 7 : ถ้าอยากให้ VBA ทำงานตามเงื่อนไขทำไง?

อย่างที่ผมบอกใน Concept 5 ไปว่า VBA จะทำงานทีละบรรทัด.. แล้วถ้าเราไม่อยากให้มันทำงานทีละบรรทัด ต้องทำไงล่ะ?

เราก็ต้องใส่คำสั่งที่ทำงานประเภท งานควบคุม ได้ ซึ่งการควบคุมมีประเภทหลักๆ ดังนี้

  1. ประเภททำงานตามเงื่อนไข เช่น
    • IF…Then…Else สามารถสั่งได้ว่า ถ้าเงื่อนไขเป็นจริง ให้ใช้ชุดคำสั่งอะไร เป็นเท็จจะใช้ชุดคำสั่งอะไร (มีทางแยก 2 ทาง) คล้ายๆ กับฟังก์ชั่น IF ของ Excel เลยครับ
    • Select Case… :ทำได้คล้ายๆ IF แต่จะแยกได้หลายๆ ทางเลย กำหนดได้ว่า ถ้าตัวแปรที่สนใจมีค่าเป็น A, B, C แต่ละอันจะให้ทำอะไรต่อ ตัวนี้คล้ายๆ กับฟังก์ชั่น CHOOSE ของ Excel เลยครับ แต่ดีกว่าตรงที่ไม่ได้จำกัดว่าตัวแปรต้องเป็นตัวเลขเหมือนกับ CHOOSE
    • On Error : เอาไว้จัดการเวลาเจอค่า Error ต่างๆ
  2. ประเภทให้ทำงานซ้ำ เช่น
    • For … Next  : สามารถกำหนดให้ทำงานซ้ำ (Loop) เป็นจำนวนรอบที่ต้องการได้ ซึ่งจะใช้ตัวแปร (เช่น i) มาช่วยนับจำนวนรอบ  เช่น อยากทำงาน 100 รอบ เมื่อเริ่มรอบแรกตัวแปรมีค่าเป็น 1 พอทำจบ โปรแกรมจะเพิ่มค่าไปอีก 1 ซึ่งทำจนตัวแปร i มีค่าเป็น 100 ก็จะเลิกทำนั่นเอง
    • For Each… : ใช้กับ Object ที่มีลูกๆ หลายตัว สามารถทำงานซ้ำจนกว่าจะวนครบลูกๆ ทุกคน
    • Do While…..Loop : สามารถกำหนดให้ทำซ้ำขณะที่เงื่อนไขยังเป็นจริง (ไม่รู้จำนวนรอบที่แน่นอน)
    • Do Until…..Loop : สามารถกำหนดให้ทำจนกว่าเงื่อนไขจะเป็นจริง (ไม่รู้จำนวนรอบที่แน่นอน)

เมื่อรู้คำสั่งที่จะใช้ควบคุม Code VBA ได้แล้ว เราก็สามารถที่จะใช้เทคนิค Macro Recorder เพื่อสร้าง Code ที่เป็นส่วนงานปฏิบัติการ จากนั้นค่อยเอา Code ที่เอาไว้ควบคุมงานไปครอบ เพียงเท่านี้เราก็สามารถสร้างโปรแกรมที่ทรงพลังได้!

Concept 8 : VBA เรียกใช้ฟังก์ชั่นของ Excel ได้ แถมควบคุมการทำงานนอก Excel ก็ยังได้!!

จริงๆ แล้วใน VBA ก็มีฟังก์ชั่นพื้นฐานหลายๆ อย่างให้ใช้โดยไม่เกี่ยวกับฟังก์ชั่นใน Excel เลย! บางตัวก็คล้ายกับฟังก์ชั่นใน Excel บางตัวก็ไม่เหมือนเลย เช่น LEN (นับจำนวนอักขระ), Cstr (แปลงให้เป็น Text), Datepart ( ดึงเอาส่วนของวันที่ออกมา เช่น วัน เดือน ปี), Instr (หาว่าอักขระที่ต้องการอยู่ตำแหน่งที่เท่าไหร่ของคำ) เป็นต้น

แม้จะมีฟังก์ชั่นให้เลือกเยอะแยะ แต่มันก็ไม่เยอะเท่าใน Excel แน่นอน! ข่าวดีคือ ใน VBA เราสามารถเรียกใช้ฟังก์ชั่นของ Excel ได้ด้วย โดยการใช้คำสั่งที่ชื่อว่า WorksheetFunction ในรูปแบบ Application.WorksheetFunction.ชื่อฟังก์ชั่นในExcel(argument) เพียงเท่านี้คุณก็สามารถดึงพลังของ Excel มาช่วยใน VBA ได้อีกเยอะแยะ

และนอกจากจะเอาพลังของฟังก์ชั่นใน Excel มาใช้ใน VBA ได้แล้ว เรายังสามารถใช้ VBA ควบคุมโปรแกรมอื่นๆ ได้ด้วย เช่น คุณสามารถสั่งให้ VBA ลบไฟล์ในเครื่องทิ้งได้เลยแบบไม่รู้เนื้อรู้ตัว (น่ากลัวมาก! ดังนั้นถ้าใครไม่แน่ใจ อย่าไปเปิด Run File Excel ที่มี VBA ของคนที่ไม่รู้จักนะครับ)  ซึ่ง Concept ในการไปควบคุมคนอื่นได้นั้น จะเป็นการเชื่อมต่อด้วยเครื่องมือที่ชื่อว่า Reference Library ซึ่งมีเครื่องมือให้เลือกอีกมากมายเลย

Concept 9 : ติดปัญหาไม่ต้องกลัว ใช้เครื่องมือ Debug สิ

การทำงานใน VBA นั้น แทบไม่มีทางที่คุณจะเขียน Code ทีเดียวแล้วใช้ได้เลยแบบไม่ผิดพลาด สิ่งสำคัญคือ ถ้าเกิด Error ขึ้นแล้วเราจะต้องหาทางแก้ไข

credit รูป : http://university.utest.com/writing-quality-bug-reports-and-utest-etiquette/

ซึ่ง VBA ก็มีเครื่องมือช่วยเหลือดีๆ มาช่วยมากมาย โดยเฉพาะเครื่องมือในหมวด Debug ( Bug เป็นศัพท์คอมพิวเตอร์ หมายถึงความผิดพลาดของโปรแกรม ดั้งนั้น Debug จึงหมายถึงการกำจัดข้อผิดพลาดนั่นเอง)

เครื่องมือ Debug จะช่วยหยุดการทำงานของ Code ในตำแหน่งที่เกิดความผิดพลาดให้ จากนั้นเราก็สามารถสั่งให้โปรแกรมค่อยๆ ทำงานทีละ Step แล้วค่อยตรวจดูผลลัพธ์ทีละขั้นได้ว่าผลลัพธ์เป็นไปตามที่คิดหรือไม่?

ซึ่งเมื่อแก้ไขข้อผิดพลาดได้แล้ว ก็สามารถลอง Run โปรแกรมใหม่ เพื่อตรวจดูว่าข้อผิดพลาดหายไปรึยัง? (หรือมีข้อผิดพลาดใหม่เพิ่มมาอีก!)

ปัญหาที่อาจจะพบได้บ่อยๆ และควรระวังไว้

  • รูปแบบของ Error ในการเขียนโปรแกรม : มี 3 รูปแบบใหญ่ๆ คือ
    • Error แบบจะๆ เขียนรูปแบบผิด ทำให้ Run ไม่ได้ : แบบนี้มันจะเตือนเราจะๆ เลย โดนเตือนก็แก้ไป เปิดหาวิธีการเขียนที่ถูกต้องตามเว็บ ตามหนังสือ หรือใน Help ก็ได้ ไม่ต้องคิดมากครับ
    • Run ได้แล้ว แต่ไปหยุดชะงักที่บางที่ : แบบนี้เจอที่ผิดแล้วค่อยแก้ไขไป ด้วยการ Debug จะช่วยได้ครับ
    • Run ได้ฉลุย แต่ผลลัพธ์ผิดโดยสิ้นเชิง : แบบนี้เรียกว่าผิดที่แนวคิดและตรรกะตั้งแต่แรก ต้องทบทวนความเข้าใจกันใหม่เลยทีเดียว
  • VBA เมื่อ Run Code ไปแล้วจะ Undo ไม่ได้! : ข้อนี้เป็นข้อจำกัดของ VBA เลย ที่ว่าเมื่อทำงานตามคำสั่งไปแล้ว หากเราไม่พอใจ เราจะไม่สามารถ Undo ได้เลย หากเผลอสั่งลบไป ก็จะหายไปเลยตลอดกาล!
    • ทางแก้ไข : หมุ่น Save Excel ไว้ก่อนจะ Run Code VBA เสมอ (Save ไหว้หลาย Version ได้ก็ดี 555)
  • มีการย้ายที่ Cell แล้ว Error : มีการเขียน VBA อ้างอิงกับ Cell อันนึงไว้โดยใช้ Cell Reference แต่ภายหลัง Cell นั้นถูกย้ายที่ใน Sheet Excel (ไม่ว่าจะ Cut/Insert/Delete) ผลคือ VBA ยังอ้างอิงไปยังที่เก่าอยู่ทำให้เกิด Error ได้
    • สาเหตุ : การเขียน Code ใน VBA มันไม่ฉลาดเหมือนสูตรใน Formula Bar ที่ว่าหากเราย้ายที่ Cell อ้างอิงแล้วสูตรจะย้ายตามให้โดยอัตโนมัติ เพราะ VBA จะยึดตามสิ่งที่เราเขียนไว้ ไม่มีการเปลี่ยนแปลง Code ให้เด็ดขาด
    • ทางแก้ไข : ให้ใช้การอ้างอิงไปที่ Defined name แทนการอ้างไปที่ Cell Reference เพราะ Defined Name มันเป็นส่วนหนึ่งของ Excel เองที่มีความฉลาดในการย้ายที่ Cell อยู่แล้ว

Concept 10 : ความสามารถของ VBA ขึ้นกับจินตนาการของคุณ!

จริงๆ Concept หลักๆ ของ VBA ก็ไม่พ้น 9 ข้อข้างบนอย่างที่ผมบอกไปแหละครับ มีแค่นี้จริงๆ แต่การที่เราจะสร้างโปรแกรม VBA เจ๋งๆ ขึ้นมาได้นั้น มันขึ้นอยู่กับความคิดของเรามากกว่า ว่าจะแก้ปัญหาที่พบเจอด้วยวิธีไหนดี?

บางทีเราแก้ปัญหาหนึ่งๆ ได้เช่นกัน แต่ใช้เวลารันนานมาก หรือไม่คงทนต่อการเปลี่ยนแปลง (เช่น หากมีคนแทรกแถวปุ๊ป Code เราพังเลย) แบบนี้เมื่อเรามีประสบการณ์มากขึ้น เราก็จะหาวิธีเขียนที่ดีขึ้น รันเร็วขึ้น ยืดหยุ่นมากขึ้นได้เรื่อยๆ เรียกได้ว่า เรียนรู้กันทั้งชีวิตก็คงไม่หมด เพราะถึงจะดีแล้ว..ก็ย่อมมีสิ่งที่ดีกว่าเสมอ แต่ผมว่ามันสนุกดีออก! ที่เราจะสามารถพัฒนาฝีมือ พัฒนางานของเราไปได้เรื่อยๆ

ดังนั้นอย่าหยุดพัฒนาครับ ใครยังไม่ได้มีโอกาสลองใช้ VBA ก็เริ่มลองได้เลยครับ ไม่มีอะไรยากเกินความพยายาม!

Step ต่อไป?

ทั้งหมดในบทความนี้เป็นเพียง Concept ปูพื้นฐานทางความคิดก่อนครับ ตอนถัดๆ ไปจะมีตัวอย่างให้เห็นถาพชัดขึ้นนะ (โดยใช้ concepts ที่บอกนี่แหละ) อย่าลืมติดตามกันต่อนะครับ ^^

[NEW] ตรวจจับวัตถุในรูปภาพด้วยโค้ด AI แค่ 10 บรรทัด สู่การตรวจจับวัตถุแบบเรียลไทม์ และการทำ segmentation | เยอะแยะ ภาษา เขียน – NATAVIGUIDES

ไม่มีวัตถุใด รอดพ้นสายตา AI ไปได้

คำกล่าวนี้ไม่ใช่เรื่องเกินจริงปัจจุบันเราสามารถเขียน AI

เพื่อตรวจจับวัตถุในรูปภาพ (Object detection) ได้ง่ายนิดเดียว
มีตัวอย่างโค้ด ให้ลองเขียนตามมีวีดีโอ มีบทความสอนเยอะแยะเกลื่อนเนต

มีโมเดล AI ที่ถูกเทรนมาเรียบร้อยแล้ว เอามาใช้ได้เลย

มีงานวิจัย paper ตีพิมพ์ โชว์ให้เห็นกันเยอะ

รวมทั้งงานวิจัยใหม่ๆ ที่จะอัพเกรดความสามารถ AI ที่รอวันตีพิมพ์

ซึ่งตอนนี้ AI แนวนี้ก็ถูกนำไปใช้งานจริงแล้วด้วยอย่างประเทศจีนที่ได้ติดกล้อง CCTV

ทำราวกับเป็น skynet เอาไว้ตรวจจับผู้คนในท้องถนนด้วย AI

เมื่อพูดถึงอัลกอริทึม AI ที่ตรวจจับวัตถุต่างๆ ในรูป ก็มีหลายตัว เช่น

R-CNN, Fast-RCNN, Faster-RCNN, RetinaNet, SSD, YOLO เป็นต้น

การตรวจจับวัตถุในรูปภาพด้วย AI เพียงจำนวน 10 บรรทัด

อันนี้จะพามาลองเขียน AI ง่ายๆ นิดเดียว

จากบทความต้นฉบับภาษาอังกฤษ object detection ภายใน 10 บรรทัด

ตัวโค้ดจะเป็น python นะครับ เพราะงานด้านนี้ (deep learning) นิยมใช้ Python มาเป็นอันดับหนึ่ง

ภาษาอื่นอาจเสียเปรียบเยอะหน่อย ตัวอย่างมีน้อย

1) ติดตั้ง python

หาอ่านได้ตามอินเตอร์เนต ไม่ยาก หรือจะอ่านจากตำรา “วิทยาการคำนวณ” ของเด็ก ม.1 ก็ได้ มีเขียนไว้

ลิงค์ดาวน์โหลด https://www.python.org/downloads/

แต่ผมเชียร์ให้ลง anaconda ดีกว่า มันเป็นแพลตฟอร์มสำหรับงาน Data science

และเหมาะกับการงาน AI สาย machine learning และ deep learning

ที่สำคัญเหมาะกับบทความนี้ด้วยขอบอกเลย

2) ติดตั้งมอดูลพวกนี้ให้หมด อย่าตกหล่นอันใดเด็ดขาดนะครับ

pip install tensorflow==1.15.0

pip install numpy

pip install scipy

pip install opencv-python

pip install pillow

pip install matplotlib

pip install h5py

pip install keras==2.1.5

สุดท้ายแล้วลงมอดูล imageai ซึ่งเป็นพระเอกในการเขียน AI ตรวจจับรูปภาพ (เฉพาะบทความนี้)

pip install imageai --upgrade

แล้วต้องติดตั้ง Microsoft Visual C++ 2015-2019 ด้วยครับ

สำหรับ imageai มันเป็นไลบรารี่ Deep Learning

สำหรับงาน Computer Vision (ทำให้คอมมีวิชั่นในการมองเห็น)

ช่วยทำให้เราเขียนโค้ดไม่กี่บรรทัดก็เสร็จแล้ว

3) ดาวน์โหลดโมเดล AI ชื่อ resnet50_coco_best_v2.0.1.h5

resnet50_coco_best_v2.0.1.h5 จะถูกเทรนมาเรียบร้อยแล้ว

ขนาดไฟล์จะใหญ่หน่อย 145 MB

ลิงค์ดาวน์โหลด

4) โค้ดก็ก็อปปี้ตามนี้ จากบทความต้นฉบับ

from imageai.Detection import ObjectDetection
import os

execution_path = os.getcwd()

detector = ObjectDetection()
detector.setModelTypeAsRetinaNet()
detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5"))
detector.loadModel()
detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))

for eachObject in detections:
  print(eachObject["name"] , " : " , eachObject["percentage_probability"] )

หรือจะไปดาวน์โหลดโค้ดนี้ได้ที่นี้

ทริคเล็กน้อย ถ้าต้องการแสดงรูป “imagenew.jpg” ให้เด้งขึ้นมา ก็อาจเพิ่มโค้ดตรงนี้ก็ได้

from PIL import Image
image = Image.open('imagenew.jpg')
image.show()

เสร็จแล้วบันทึกไฟล์เป็นชื่อ FirstDetection.py

++++สำหรับโค้ดตัวอย่างนี้+++++

โค้ดตัวอย่างที่แสดงเขาใช้โมเดลที่เรียกว่า RetinaNet เท่านั้น

ลองเล่นดู รันได้ไม่ยาก ถ้าจะยากคงเป็นเรื่องทฤษีสำหรับผู้สนใจ

ก็หาอ่านจาก paper ต้นฉบับบโดยตรง หรือบทความออนไลน์ต่างๆ เพื่อความกระจ่าง

5) หาไฟล์รูปภาพมาทดสอบ

ในโค้ดจะระบุรูปภาพ ใช้เป็นอินพุตชื่อ “image.jpg”

ทั้งนี้ไฟล์ image.jpg

โมเดล resnet50_coco_best_v2.0.1.h5

และ FirstDetection.py

ทั้ง 3 ไฟล์จะอยู่ที่เดียวกันนะครับ

6) แล้วรันด้วยคำสั่ง

python FirstDetection.py

หรือจะรันผ่าน IDE ที่ถนัดก็ได้ครับ ไม่ต้องทำผ่านคอมมานไลน์โดยตรงแบบนี้

(วิธีรัน python ไม่ยากศึกษาได้ตามเนต หรือตามคู่มือเด็ก ม.1)

7) ผลลัพธ์จะได้ออกมาเป็นรูป imagenew.jpg

โดย AI จะตีกรอบในรูปว่ามีวัตถุอะไรได้บ้าง?

พร้อมบอกความน่าจะเป็น (เป็นตัวเลข) ว่าเป็นวัตถุอะไร

ถ้าไปดูที่คอนโซล จะบอกว่า

มันตรวจจับได้อะไรออกมา

ด้วยความน่าจะเป็นเท่าไร

(แต่ถ้ารูปขนาดใหญ่ ยิ่งเครื่องไม่แรงด้วยแล้ว ก็จะทำงานช้านะครับ)

traffic light : 50.23456811904907
traffic light : 60.74821352958679
person : 88.47966194152832
backpack : 87.8473162651062
handbag : 58.078956604003906
umbrella : 62.925803661346436
car : 82.95613527297974
person : 62.71200180053711
person : 75.42724013328552
person : 88.47867250442505
person : 94.76819634437561

.+++++++++++++++++++

สรุป จากผลลัพธ์ที่ได้

AI จะตรวจจับได้หลายสิ่ง ทั้งคน รถ กระเป๋า ไฟจราจร ร่ม ก็ทำได้

หรือจะพัฒนาต่อไปให้ตรวจับคนในรูปว่าเป็นใคร?

อย่างหลังจะเกินขอบเขตที่โค้ดทำได้

ต้องใช้อัลกอริทึมอื่นประกอบ

เช่น DeepFace ของเฟสบุ๊ค ที่ใช้ระบุตัวคนบนรูปภาพได้

การเขียนโปรแกรมตรวจจับวัตถุแบบเรียลไทม์

จากรูปภาพเดียวในหัวข้อก่อน ก็อาจพอเล่าเบื้องหลังการทำงานให้ทราบได้คร่าวๆ ดังนี้

โดยจะให้คุณมองว่า AI คือกล่องดำอะไรซักอย่าง เราสนใจแค่อินพุต กับเอาท์พุตอย่างเดียว

อย่าเพิ่งไปสนใจว่าข้างในมันเป็นอะไรในตอนนี้ (มันซับซ้อนเอาเรื่อง เพราะเป็น deep learning)

เมื่อเราป้อนรูปให้ AI ใช้ไหมครับ …เดียว AI จะให้คำตอบมาว่า

  • มีจำนวนวัตถุอะไรบ้าง เช่น 3 อัน 10 อัน ก็ว่ากันไป
  • เป็นวัตถุอะไร ซึ่งจะให้ค่าออกมาเป็นตัวเลข เช่น เลข 1 หมายถึง ไก่ เลข 10 หมายถึง รถยนต์
  • วัตถุนั้นอยู่ในตำแหน่งอะไร (boxes)
  • ด้วยความน่าจะเป็นอะไร ปกตจะเป็นเลข 0-1  ถ้า 0 คือไม่ใช่เลย ถ้าเป็น 1 คือเป็นวัตถุนั้น 100%

สำหรับค่า boxes ออกเสียงว่า บ็อกๆๆๆ ไม่ใช่เสียงหมาเห่านะ แต่มันคือค่ากล่อง

โดยจะขออธิบายเพิมเติม ก็อย่างรูปที่เห็นข้างล่าง

มันเป็นตัวเลข 4 ตัว เช่น พิกัด x, y, สูง (Height) , กว้าง (Width) …ซึ่ง AI แต่ละตัวอาจไม่เหมือนกัน

ค่าพวกนี้นี่แหละ ที่จะให้เรานำไปใช้ตีกรอบล้อมวัตถุอีกที

ถึงตรงนี้พอนึกภาพออกนะ ข้อมูลพวกนี้ที่เราได้จาก AI

เราจะนำมาแปลความหมาย

นำมาวาดใส่กรอบล้อมวัตถุ จะให้สีแดง สีเขียว

แล้วบอกว่าเป็นไก่ เป็นนก อะไรทำนองนี้ พอนึกภาพออกไหม

แต่ทว่าไลบรารี่ imageai ที่นำมาแสดงให้ดู มันทำให้เราแล้ว จึงซ้อนความยุ่งนี้ลงไป

คำถาม

แล้วถ้าจะตรววจับวัตถุแบบเรียลไทม์ต้องทำอย่างไร

คำตอบ ง่ายนิดเดียว จังหวะที่เราอ่านภาพจากกล้องเว็บแคม เราก็อ่านทีละรูปซิ

แล้วส่งรูปไปให้ AI ประมวล เมื่อ AI ตอบกลับ เราก็เอาข้อมูลที่ได้มาตีกรอบใส่ในรูปอีกที

แล้วนำรูปผลลัพธ์นี้ ประกอบกับคืนเป็นภาพเคลื่อนไหวต่อไป

แต่ถ้าเรามาใช้โมเดล “resnet50_coco” ข้างต้น ตรววจับวัตถุแบบเรียลไทม์ มันจะช้าครับ

เลยต้องเปลี่ยนโมเดลด่วน

ในที่นี้ผมเลือกใช้โมเดล “ssd_mobilenet_v1_coco”

เพราะทำงานได้เร็วกว่าเยอะ ทว่าความผิดพลาดยังเยอะอยู่นะครับ

แต่ถ้าเอามาเป็นกรณีศึกษา ผมว่าน่าลองเล่นนะ

ดูตัวอย่างคลิปที่ผมทำเล่นได้ครับ

เป็น AI อย่างง่ายสุด เขียนง่ายมากครับ

มันทำงานได้เร็ว ใช้ CPU ก็พอ

ต้องบอก อย่างนี้นะครับ โมเดลตรววจับวัตถุมีหลายตัวอือซ่าเลย

มีงานวิจัย มีผู้ผลิตสร้างโมเดล AI ขึ้นมาหลายตัว ดูได้ตามลิงค์ข้างล่าง

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

ประสิทธิภาพและข้อดีข้อเสีย ก็แตกต่างกัน

ส่วนใหญ่ก็หนีไม่พ้นเทคนิค deep learning

ถ้าใครสนใจอยากทำแบบเรียลไทม์ ก็ลองเล่นดูตามนี้ครับ เป็นภาษา python เช่นเคย

https://github.com/tensorflow/models/blob/master/research/object_detection/object_detection_tutorial.ipynb

แต่ถ้าคิดจะเล่นยุ่งยากพอสมควร เพราะต้องติดตั้ง protocol-buffers และใช้งานตอนติดตั้งโปรเจค ด้วยเหตุนี้ผมจึงหาวิธีติดตั้งง่าย (นี้คิดว่าง่ายสุดแหละครับ)

การใช้โปรเจคตรวจจับวัตถุแบบเรียลไทม์

1) ติดตั้ง python
ก็ทำตามหัวข้อก่อนหน้านี้ทุกประการเลยครับ (ที่ตรวจจับวัตถุจากรูปภาพอันเดียว)

แต่มอดูลที่สำคัญและจำเป็นจริงๆ ที่ต้องติดตั้ง ก็ 2 ตัวนี้ครับ

pip install tensorflow

pip install opencv-python

2) ดาวน์โหลดโค้ดเป็น zip จากโปรเจคนี้

https://github.com/am-sirdaniel/Real-Time-Object-detection-API

ดาวน์โหลดเสร็จก็แตกไฟล์ด้วยครับ

ถ้าใครใช้ git เป็น ก็ใช้คำสั่งบนคอมมานไลน์

git clone https://github.com/am-sirdaniel/Real-Time-Object-detection-API.git

เดี่ยวโค้ดของโปรเจคจะดาวน์โหลดมาอยู่ที่เครื่องเรา (อย่าลืมต่อเน็ตด้วย)

3) ถึงตรงนี้ควรเห็นโฟลเดอร์ Real-Time-Object-detection-API จากนั้นก็ cd ผ่านทางคอมมานไลน์ เข้าไป

cd Real-Time-Object-detection-API/object_detection

4) จากข้อ 3 ควรจะเห็นไฟล์ object_detection_webcam.py อยู่ในไดเรคเทอรี่

และเปิดไฟล์ object_detection_webcam.py ด้วย editor ธรรมดา  เช่น notepad หรือจะเป็น IDE ก็ได้ครับ

แล้วทำการค้นหาประโยคนี้

get_ipython().run_line_magic('matplotlib', 'inline')

จากนั้นทำการคอมเมนต์ บรรทัดข้างล่างไม่ได้ใช้ครับ

(ในช่วงที่ผมเล่นโปรเจคนี้ ตัวอย่างเขาแถมบั๊กบรรทัดนี้มาฝากครับ เลยต้องเอาออก)

#get_ipython().run_line_magic('matplotlib', 'inline')

5)รันคำสั่งต่อไปนี้ เดี่ยวกล้องเว็บแคมในคอมเรา ก็จะเปิดขึ้นมาเอง จากนั้น  AI ก็ดักจับทุกสิ่งอย่างให้เรา

python object_detection_webcam.py

หรือจะรันผ่าน IDE ที่ถนัดก็ได้ครับ ไม่ต้องทำผ่านคอมมานไลน์โดยตรงแบบนี้

หมายเหตุ เราสามารถปรับขนาดหน้าจอเว็บแคมที่โชว์ได้

โดยเข้าไปหาโค้ดชุดนี้

cv2.imshow('image',cv2.resize(image_np,(1280,960)))

แล้วปรับขนาดหน้าจอเว็บแคม อย่างของผมปรับเป็นขนาด 640 x 480 ก็เข้าไปแก้โค้ดตามนี้

cv2.imshow('image',cv2.resize(image_np,(640,480)))

การใช้โปรเจคตรวจจับวัตถุแบบเรียลไทม์ อีกทางเลือกหนึ่ง

ในหัวข้อนี้จะกล่าวถึงการใช้โปรเจคตรวจจับวัตถุแบบเรียลไทม์อีกเวอร์ชั่น(เป็นทางเลือก) อันนี้จะเป็นตัวต้นฉบับจริง ซึ่งยุ่งยากกว่าก่อนหน้านี้ (ติดตั้งบน linux)

วิธีการติดตั้งโปรเจค
1) ติดตั้ง python
ก็ทำตามหัวข้อก่อนหน้านี้ทุกประการเลยครับ (ที่ตรวจจับวัตถุจากรูปภาพอันเดียว)

แต่มอดูลที่สำคัญและจำเป็นจริงๆ ที่ต้องติดตั้ง ก็ 2 ตัวนี้ครับ

pip install tensorflow

pip install opencv-python

2) ดาวน์โหลดโค้ดเป็น zip จากโปรเจคนี้

https://github.com/tensorflow/models

ดาวน์โหลดเสร็จก็แตกไฟล์ด้วยครับ

ถ้าใครใช้ git เป็น ก็ใช้คำสั่งบนคอมมานไลน์

git clone https://github.com/tensorflow/models.git

เดี่ยวโค้ดของโปรเจคจะดาวน์โหลดมาอยู่ที่เครื่องเรา (อย่าลืมต่อเน็ตด้วย) ซึ่งควรจะเห็นโฟลเดอร์ models นะ

3) ดาวน์โหลด protobuf
https://github.com/google/protobuf/releases/download/v3.0.0/protoc-3.0.0-linux-x86_64.zip

แตก zip ไปที่ bin

unzip -o protobuf.zip

ซึ่งจากนี้ควรจะใช้คำสั่ง protoc ได้

4) ให้ cd ไปที่โฟลเดอร์ models/research/ ของโปรเจค แล้วรันคำสั่ง

protoc object_detection/protos/*.proto --python_out=.

เมื่อดูในโฟลเดอร์ models/research/object_detection/protos ควรจะเห็นไฟล์ .py ต่างๆ ถูกสร้างขึ้นมา

5) เวลาจะใช้งานก็ให้ไปที่โฟลเดอร์ models/research/object_detection
ซึ่งจะเห็นไฟล์ตัวอย่าง object_detection_tutorial.ipynb

การเปลี่ยนโมเดล AI

สำหรับโมเดล AI ที่ดักจับวัตถุแบบเรียลไทม์ผ่านกล้องเว็บแคม
จากโค้ดตัวอย่างที่สาธิต เขาจะใช้โมเดลที่ชื่อ “ssd_mobilenet_v1_coco”

ถ้าค้นหาในโค้ดควรเห็นบรรทัดนี้ครับ

MODEL_NAME = 'ssd_mobilenet_v1_coco_2017_11_17'

ซึ่งมันจะทำงานเร็ว บน CPU ก็ทำได้สบายๆ (แต่เครื่องควรแรงจะดีมากครับ)

แล้วถ้าต้องการเปลี่ยนโมเดล AI ก็ลองเข้าไปดูที่ลิงนี้ detection model zoo ตามที่กล่าวมาข้างต้น ก็จะเห็นตารางตามรูปข้างล่าง

ซึ่งวิธีเลือก AI ให้ดูว่ามันบอกสปีดความเร็วตอนทำงานว่าช้าหรือเร็วเท่าไร (หน่วยเป็น ms)

พร้อมดูค่า COCO mAP เพื่อเปรียบเทียบ ถ้าค่านี้สูงแสดงว่าทำงานดีเยี่ยมมากกว่า

อย่างของผม ลองเปลี่ยนไปใช้โมเดลชื่อ “ssd_mobilenet_v2_coco” โดยคลิก Copy link address ก็จะเห็น url

http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v2_coco_2018_03_29.tar.gz

ผมแค่ตัดเหลือคำว่า  ssd_mobilenet_v2_coco_2018_03_29 แล้วเอาไปแปะแก้ไขในโค้ด

MODEL_NAME = 'ssd_mobilenet_v2_coco_2018_03_29'

จากนั้นก็รันโค้ด python object_detection_webcam.py อีกครั้งหนึ่ง

สำหรับขั้นตอนนี้อย่าลืมต่อเนตด้วยนะ เพราะโค้ดจะไปดาวน์โหลดโมเดล AI จากข้างนอกเข้ามาครับ

  • สังเกตให้ดีควรเห็นไฟล์ ssd_mobilenet_v2_coco_2018_03_29.tar.gz
  • พร้อมทั้งโฟลเดอร์ ssd_mobilenet_v2_coco_2018_03_29 ซึ่งถูกแตกออกมาโดยอัตโนมัติ

โดยไฟล์ทั้งหมดจะอยู่ใต้โฟลเดอร์ Real-Time-Object-detection-API/object_detection อีกที
หรือ models/research/object_detection

จากนั้นก็ลองเล่นผ่านกล้องเว็บแคมดูได้เลย

*** แต่ทั้งนี้ใช้ว่าจะทำได้ทุกโมเดลที่กล่าวมานะครับ บางอันก็ทำไม่ได้

การทำ Segmentation

จากที่เล่ามาข้างต้น Object detection  สามารถระบุตำแหน่งของวัตถุด้วยการใส่ box ตีกรอบล้อมวัตถุ

แต่โมเดล AI บางตัวสามารถให้ค่าตัวเลขเป็น masks  เพิ่มเติมนอกจากตัวเลขค่า boxes
โดย mask จะเป็นชุดตัวเลขที่จะนำไปไฮไฮท์วัตถุนั้นๆ ในรูปได้ ดังที่เห็นในรูปข้างล่าง

ค่า mask ประโยชน์เอาไว้ทำเรื่อง Segmentation  เพื่อแยกวัตถุในรูปออกจากรูปหลักได้

ประโยชน์เช่น เอาไว้ลบรูป background ออกไป

แนวคิดเรื่อง mask

จะขอยกรูปภาพข้างล่าง ที่เป็นสีน้ำเงิน

ซึ่งปกติภาพๆ ภาพหนึ่งจะประกอบด้วยพิกเซล (จุดสี)

สำหรับ mask มันก็คือ หน้ากากที่มีความกว้าง x สูง เท่ากับรูปภาพ เพียงแต่จุดพิกเซลของ mask จะระบุค่า true เมื่อจุดนั้นตรงกับรูปภาพต้นฉบับ ถ้าไม่ใช่จะระบุเป็น false

ซึ่ง true กับ false จะใช้เป็นค่าอย่างอื่นก็ได้เช่น 1,0 เป็นต้น

วิธีการเขียนโค้ดไม่ยาก (ค้างไว้เดี่ยวมาเขียนต่อ เลยให้ดูคลิปตัวอย่างการทำงานพลางๆ ก่อน)

สรุปในมุมโปรแกรมเมอร์

ถามว่าเขียนยากไม่ ก็ตอบไม่ยากเท่าไร
เพราะโมเดล AI พวกนี้ถูกเทรนออกมาเรียบร้อยแล้ว

เราแค่รู้จักส่งค่าอินพุต และนำเอาท์พุตที่ได้มาแปลความหมายอีกที
จะตีกรอบล้อมรูปภาพ บอกว่าเป็นอะไร
หรือจะประยุกต์ทำอย่างอื่นก็ได้เยอะครับ
แล้วแต่จะพลิกแพลง แล้วแต่ไอเดียเราครับ
(ความยากคือตอนสร้างและสอนให้ AI ฉลาด)

ถึงจะบอกว่าเขียนโปรแกรมไม่ยากก็จริง
แต่ก็อาจยุ่งยากสักหน่อย
เพราะส่วนใหญ่เป็น python เยอะเชียว
ภาษาอื่นอาจเสียเปรียบหน่อย
แต่อนาคตก็ไม่แน่
อาจจะมี API ที่ทำงานง่ายกว่านี้ก็เป็นได้
และก็ไม่ขึ้นอยู่กับภาษาเขียนโปรแกรมอีกด้วย

ขอให้โชคดีครับ กับโลกยุค AI
เรียนรู้ไว้ไม่เสียหาย เพราะเราคงปฏิเสธมันไม่ได้
ยิ่ง AI มีเขียนไว้ในยุทธศาสตร์ 20 ปี ของบ้านเรา เชียวน๊า

เครดิต

เขียนโดยแอดมินโฮ โอน้อยออก

AI ไม่ยาก เล่ม 1 เข้าใจได้ด้วยเลขม. ปลาย (เนื้อหาภาษาไทย)


ภาษาพูดภาษาเขียน ม ๑


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

ภาษาพูดภาษาเขียน ม ๑

9 สูตรขนมแสนอร่อยสำหรับซอมบี้


สมัครสมาชิกที่นี่: https://www.youtube.com/channel/UCZr7drqblTlL3Xr1XvBZxXw?sub_confirmation=1
โสด ปะทะ มีแฟนแล้ว / แบบไหนกันนะที่จะเหมาะกับคุณ https://youtu.be/vAo4COkjXP4?list=PLD8y3iz_hfSgMJOja42faaoNch9l9mWfA
ซอมบี้ชอบของหวานงั้นเหรอ แน่นอนว่าเราก็ชอบเหมือนกัน และในวิดีโอใหม่นี้เราได้รวม 9 สูตรขนมแสนอร่อยขนาดคนอย่างเรายังน้ำลายไหล
วัสดุและอุปกรณ์
• เกล็ดช็อกโกแลต
• สีผสมอาหาร
• โอริโอ้
• ปากกาสำหรับเขียนอาหาร
• ชามสีเขียว
• ดินสอ
• สีอะคริลิค
• ป๊อบคอร์น
• น้ำตาล
• น้ำเชื่อมคาราเมล
• ครีมข้น
• ภาพแม่แบบรูปป้ายหลุมศพ
• กระดาษรองอบ
• เนยถั่ว
• กระดาษแข็ง
• ป้ายฉลากซอมบี้
• ไวท์ช็อกโกแลต
• เจลาติน
• แม่พิมพ์ซิลิโคนรูปหมี
• มาร์ชเมลโล่
• เฮเซลนัท
• ขวดนูเทล่า
• เยลลี่รูปหนอน
• กระป๋องโค้ก
• โซดา
• หมากฝรั่ง Hubba Bubba
• ไม้นวดขนมปัง
• กรดซิตริก
• กล่องหมากฝรั่ง Hubba Bubba
• หมากฝรั่งรูปดวงตา
• ไม้แท่ง
• ปืนกาวร้อน
• ซองห่อลูกอม Chupa Chups
ดูเพิ่มเติม ทูม ทูม:
วิดีโอยอดนิยม:
14 Weird Ways To Sneak Food Into Class / Back To School Pranks: https://youtu.be/W5p2ndS34vA
18 Funny Pranks! Prank Wars! https://youtu.be/yWazGzCNtJ4
11 DIY Edible Makeup Ideas/11 Funny Pranks: https://youtu.be/kewz3hF63Xo
17 Weird Ways To Sneak Makeup Into Class: https://youtu.be/bvhBIsmzhwE
Gummy Food vs Real Food Challenge! https://youtu.be/jBIG6GsQcq8
เพลย์ลิสต์ยอดนิยม:
Funny Pranks: https://www.youtube.com/playlist?list=PLy0LaulZe0vRyRDcwVaqbvnbSqhSQNtS
Back to School: https://www.youtube.com/playlist?list=PLy0LaulZe0vSzNLVwlQZVJszbLCsIwl_C
Life Hacks: https://www.youtube.com/playlist?list=PLy0LaulZe0vSljAapkasaxsIKJp7I7j0
Beauty And Makeup Hacks: https://www.youtube.com/playlist?list=PLy0LaulZe0vSUQifjokDaw5m9aIgOQKt
Home Décor: https://www.youtube.com/playlist?list=PLy0LaulZe0vRWdxuF7xEwK_eJV2cZ8dt0
ติดตาม ทูม ทูม:
สมัครสมาชิก: https://www.youtube.com/channel/UCZr7drqblTlL3Xr1XvBZxXw?sub_confirmation=1
Instagram: https://www.instagram.com/troomtroom/
Facebook: https://www.facebook.com/troomhands
Pinterest: https://pinterest.com/troomtroom/
Troom Troom EN: https://www.youtube.com/channel/UCWwqHwqLSrdWMgp5DZG5Dzg?sub_confirmation=1
Troom Troom ES: https://www.youtube.com/channel/UCu6oyJJ6PlkeNNv6n26ZNyA?sub_confirmation=1
Troom Troom FR: https://www.youtube.com/channel/UCyNeKmBHI10u4bwYEKimlZA?sub_confirmation=1
Troom Troom RU: https://www.youtube.com/channel/UCq1JpGFxcZTbbOAz010Uog?sub_confirmation=1
Troom Troom DE: https://www.youtube.com/channel/UCzgmxZIlgfH1fgch7OpigIA?sub_confirmation=1
Troom Troom CN: https://www.youube.com/channel/UCV3NWBs2K7pOEGmI4w_2dhg?sub_confirmation=1
Troom Troom PT: https://www.youtube.com/channel/UCgCQlMYN2XypwYC2wcR32bA?sub_confirmation=1
Troom Troom JP: https://www.youtube.com/channel/UCPCwT9JMWPjg6xAWrQxhQaw?sub_confirmation=1
Troom Troom KR: https://www.youtube.com/channel/UClSxH8KQdfytf2raNAByMiA?sub_confirmation=1
Troom Troom India: https://www.youtube.com/channel/UCwP0n9or789Y33JNNetlA?sub_confirmation=1
Troom Troom Arabic: https://www.youtube.com/channel/UCyiLrFQqqJDQFOGAQ5pyC9w?sub_confirmation=1
Troom Troom TR: https://www.youtube.com/channel/UCprQp1WQZzwApvQdb31OtQ?sub_confirmation=1
Troom Troom PL: https://www.youtube.com/channel/UC8_99hNgsYFdPem3EA67HSg?sub_confirmation=1
Troom Troom IT: https://www.youtube.com/channel/UCQ94FCb9MnmhxtH67ADcQ?sub_confirmation=1
Troom Troom Vietnam: https://www.youtube.com/channel/UC3ZOEebvMhGBRmVvEcvrYKQ?sub_confirmation=1
Troom Troom Indonesia: https://www.youtube.com/channel/UCtGmhXT_NSTK5j_r9a9xdYA?sub_confirmation=1
Troom Troom SELECT: https://www.youtube.com/channel/UCIJ44QRtVGm_gBh_deuL5ow?sub_confirmation=1

เกี่ยวกับ ทูม ทูม:
บทเรียนวิดีโอ \”วิธีการ\” ไอเดีย DIY ง่ายๆ อุปกรณ์เสริมไอเดีย DIY , สอนแต่งหน้า , แฮ็กชีวิต ,เล่นแผลง ๆ , การตกแต่งบ้านและอีกมากมาย! ทำให้ง่ายขื้น!
สอบถามข้อมูลธุรกิจใด ๆ โปรดติดต่อฉันได้ที่: [email protected]
คำถามประจำวัน: วิดีโอส่วนไหนที่คุณชอบมากที่สุด? แสดงความคิดเห็นที่ด้านล่าง!
อย่าลืมเปิดการแจ้งเตือนเช่น กดไลนน์ และ กดสมัคร!

9 สูตรขนมแสนอร่อยสำหรับซอมบี้

รายการ ภาษา PLAZA ตอนที่ 37 ภาษาพูดกับภาษาเขียน


รายการ ภาษา PLAZA ตอนที่ 37  ภาษาพูดกับภาษาเขียน

น้องบีม | ร้านของเล่นหน้าโรงเรียน Toys


ร้านของเล่นหน้าโรงเรียน Toys

น้องบีม | ร้านของเล่นหน้าโรงเรียน Toys

น้องบีมลูกแม่บี | เล่นสวนสนุกฮาร์เบอร์แลนด์เกตเวย์บางซื่อ HaborLand Indoor Playground คลิปเต็ม


น้องบีมเล่นสวนสนุกฮาร์เบอร์แลนด์เกตเวย์บางซื่อ HaborLand Indoor Playground คลิปเต็ม
FB Fanpage
https://www.facebook.com/BeamCopphone/
IG : beamcopphone
ติดต่องาน
ส่งเมล์มาที่ ► [email protected]

น้องบีมลูกแม่บี | เล่นสวนสนุกฮาร์เบอร์แลนด์เกตเวย์บางซื่อ HaborLand Indoor Playground คลิปเต็ม

นอกจากการดูบทความนี้แล้ว คุณยังสามารถดูข้อมูลที่เป็นประโยชน์อื่นๆ อีกมากมายที่เราให้ไว้ที่นี่: ดูบทความเพิ่มเติมในหมวดหมู่MAKE MONEY ONLINE

ขอบคุณมากสำหรับการดูหัวข้อโพสต์ เยอะแยะ ภาษา เขียน

Leave a Reply

Your email address will not be published. Required fields are marked *