สร้าง API ตรวจจับวัตถุด้วย YOLOv5 ผ่าน LINE (ตอนที่ 2 deploy ด้วย Docker ขึ้น Heroku Cloud)

Karn Yongsiriwit
4 min readFeb 5, 2021

--

Docker, Heroku, Line, Python, Flask, Heroku and object detection with YOLOv5

บทความนี้จะแนะนำการ build Docker Image และ run Container ไว้บน Heroku Cloud เพื่อตรวจจับวัตถุ (พัฒนาโดย Python, Flask และ YOLOv5) ให้บริการผ่าน LINE แบบใช้ได้ทุกที่ทุกเวลากันเลยครับ 😇

โดยภาคต่อจากบทความที่แล้วนะครับ ของคุณ Thannob นะครับ แนะนำว่าให้ทำตามบทความตอนที่ 1 ก่อนแล้วค่อยมาทำตามตอนที่ 2 นี้นะครับ

Software Installation

ทำการติดตั้ง software ที่จำเป็นก่อนดังนี้ครับ ติดตั้งเสร็จแล้ว restart ซักครั้งด้วยนะครับ

ดาวน์โหลด 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 อีกครั้ง ถ้าทำสำเร็จจะได้ผลลัพธ์ตามด้านล่าง

Cloud ฟรีก็จะช้า ๆ หน่อย 😁

ถ้าติดปัญหาในส่วนของการ deploy ขึ้น Heroku สามารถดู log ได้จากคำสั่งนี้นะครับ (เปลี่ยนชื่อ line-yolo-api ด้วยนะครับ)

$ heroku logs --tail -a line-yolo-api

บทความโดย อ.ดร.กานต์ ยงศิริวิทย์
วิทยาลัยนวัตกรรมดิจิทัลเทคโนโลยี มหาวิทยาลัยรังสิต

--

--

Karn Yongsiriwit
Karn Yongsiriwit

Written by Karn Yongsiriwit

Lecturer at Digital Innovation Technology, Rangsit University

Responses (5)