สร้าง API ตรวจจับวัตถุด้วย YOLOv5 ผ่าน LINE (ตอนที่ 2 deploy ด้วย Docker ขึ้น Heroku Cloud)
บทความนี้จะแนะนำการ build Docker Image และ run Container ไว้บน Heroku Cloud เพื่อตรวจจับวัตถุ (พัฒนาโดย Python, Flask และ YOLOv5) ให้บริการผ่าน LINE แบบใช้ได้ทุกที่ทุกเวลากันเลยครับ 😇
โดยภาคต่อจากบทความที่แล้วนะครับ ของคุณ Thannob นะครับ แนะนำว่าให้ทำตามบทความตอนที่ 1 ก่อนแล้วค่อยมาทำตามตอนที่ 2 นี้นะครับ
Software Installation
ทำการติดตั้ง software ที่จำเป็นก่อนดังนี้ครับ ติดตั้งเสร็จแล้ว restart ซักครั้งด้วยนะครับ
- Docker Desktop ใช้สำหรับ build Docker Image จากโปรแกรมที่เราเขียนด้วย Python + Flask เพื่อนำขึ้น Heroku Cloud Application Platform สามารถดาวน์โหลดและติดตั้ง Docker Desktop ได้จาก https://www.docker.com/get-started/
- สำหรับ Windows ให้ลง wsl2-kernel ด้วยครับ https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel
- set BIOS ให้รองรับการทำ Virtualization วิธีเปิดใช้งาน Virtualization
- ngrok เพื่อทดสอบ deploy จากเครื่องตนเองให้เป็นสาธารณะ https://ngrok.com/download
- Heroku CLI ดาวน์โหลดและติดตั้งได้จาก https://devcenter.heroku.com/articles/heroku-cli#download-and-install
- สร้าง Account ของ Heroku ด้วยครับ โดยสามารถ Deploy ได้สูงสุดถึง 5 Application ในแบบฟรี สมัครได้ที่ https://signup.heroku.com/login
ดาวน์โหลด Source Code ได้เลย
ถ้ายังไม่ได้ดาวน์โหลด source code จากบทความตอนที่ 1 นะครับ สามารถ git clone มาเลยก็ได้ครับ แต่แนะนำให้ทำตามบทความตอนที่ 1 ก่อนนะครับ
$ git clone https://github.com/thannob/line-yolo-api.git
build Docker Image จาก Dockerfile
cd เข้าไปที่ folder (ต่อไปนี้ทุกคำสั่งจะต้องเรียกใช้เมื่ออยู่ใน folder นี้เท่านั้นนะครับ)
$ cd line-yolo-api
สร้างไฟล์ .env สำหรับเก็บ LINE Secret และ Channel access token ให้สามารถเชื่อมต่อกับ LINE Chat Bot ที่สร้างจากบทความนี้ link
สังเกตไฟล์ .dockerignore จะเป็นการระบุว่าเวลา build Docker Image ให้ข้ามไฟล์เหล่านี้ไป
ไฟล์ Dockerfile เป็นการระบุถึงขั้นตอนในการ build Docker Image
- บรรทัดแรกคือการ pull Docker Image ที่มีสภาพแวดล้อมของ python 3.8 ซึ่งเราจะ build โดยต่อยอดจาก Image ตัวนี้นั้นเองครับ
- บรรทัดที่ 3 คือระบุ Path (WORKDIR) ที่ใช้ทำงานภายใน Image
- บรรทัดที่ 5–8 คือการติดตั้งตัวลงซอฟต์แวร์เพิ่มเติมลงใน Image ครับ
- บรรทัดที่ 10–11 คือการติด package ของ python ตามที่ระบุใน requirements.txt ด้วย pip นะครับ
- บรรทัดที่ 13 คือการ copy ไฟล์ .env ไปไว้ที่ WORKDIR ใน Image
- บรรทัดที่ 14 คือการ copy ทุก ๆ ไฟล์ที่อยู่ในโฟลเดอร์ปัจจุบัณไปไว้ที่ WORKDIR ใน Docker Image
- บรรทัดที่ 5 คือการ copy file ทุกไฟล์จาก path ที่อยู่ ไปยัง WORKDIR ภายใน Docker Image
- บรรทัดที่ 16–19 คือการทดสอบว่าได้มีการติดตั้ง torch และ flask เรียบร้อยหรือไม่ โดย Yolo จะใช้ torch ในการทำ object detection ส่วน flask ใช้สำหรับสร้าง API
- บรรทัดที่ 21 ที่เป็น CMD จะเป็นการระบุเมื่อ Docker ถูก Run ขึ้นมา จะให้เรียกใช้คำสั่งภายใน CMD โดยที่ระบุไว้ จะเป็นคำสั่งในการ start ตัว API ขึ้นมานั้นเอง โดยจะใช้เป็น port 8000
build Image ตามคำสั่งด้านล่าง โดยระบุชื่อของ Docker Image ว่าเป็น line-yolo-api (จะเรียกคำสั่งนี้ได้ ที่โฟล์เดอร์ปัจจุบันต้องมีไฟล์ Dockerfile อยู่)
$ docker build --tag line-yolo-api:latest .
ทดลอง run Container จาก Image
run Container จาก Image เพื่อเป็นการทดลอง deploy ภายในเครื่องคอมเราเองก่อน โดยให้ forward port 8000 จากเครื่องของเราไปยัง port เดียวกันภายใน Container
$ docker run -p 8000:8000 -d --name line-yolo-api line-yolo-api
*line-yolo-api แรก คือชื่อของ Container ส่วน line-yolo-api ด้านหลังสุดคือชื่อของ Image
ทดสอบจากการ deploy จากเครื่องของตนเองก่อนด้วย ngrok เปิด Command Prompt หรือ Terminal และให้เปลี่ยนตำแหน่งไปที่ Nrgok.exe จากนั้นสั่งคำสั่งต่อไปนี้
$ ngrok http 8000
นำ Forwarding url ของ ngrok ด้านบนไปใส่ไว้ที่ webhook ของ Line Channel ตามด้านล่าง และต่อท้ายด้วย /callback
ทดสอบผ่าน LINE จะได้ผลลัพธ์ของการตรวจจับวัตถุตามด้านล่าง
Deploy Docker Image ขึ้น Cloud (Heroku)
ใช้ Heroku CLI เพื่อ login
$ heroku login
$ heroku container:login
สร้าง Application บน Heroku โดยตั้งชื่อว่า line-yolo-api (ตรงนี้ตั้งชื่ออะไรก็ได้)
$ heroku create line-yolo-api
deploy API ขึ้นไปที่ Application line-yolo-api (ใช้ชื่อเดียวกับที่ตั้งไว้ด้านบน) บน Heroku Cloud ด้วยการ push และ release ตามคำสั่งด้านล่าง
$ heroku container:push web -a line-yolo-api
$ heroku container:release web -a line-yolo-api
นำ URL https://line-yolo-api.herokuapp.com/callback โดยเปลี่ยน line-yolo-api เป็นชื่อ Application ที่ตั้งไว้ด้านบน ใส่ไว้ที่ webhook ของ Line Channel ตามด้านล่าง
ทดสอบ API ว่านำขึ้น Heroku สำเร็จโดยการเรียก URL https://line-yolo-api.herokuapp.com/ (เปลี่ยน line-yolo-api เป็นชื่อ Application ที่ตั้งไว้ด้วย) บน Web Browser ได้ผลดังภาพ
ทดสอบผ่าน LINE อีกครั้ง ถ้าทำสำเร็จจะได้ผลลัพธ์ตามด้านล่าง
ถ้าติดปัญหาในส่วนของการ deploy ขึ้น Heroku สามารถดู log ได้จากคำสั่งนี้นะครับ (เปลี่ยนชื่อ line-yolo-api ด้วยนะครับ)
$ heroku logs --tail -a line-yolo-api
บทความโดย อ.ดร.กานต์ ยงศิริวิทย์
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต