---
title: 'IOT Project'
disqus: hackmd
---
智能汽車保全專家(Raspberry Pi)
===
## 目錄
### Made By Bryant Wu(吳浩瑋)
<details>
<summary>📂 點擊展開目錄</summary>
[TOC]
</details>
專案概述
---
隨著電動車的快速發展,實現了許多應用的情境,但對於非電動車的汽車而言,也希望可以有一些智能的功能。針對現代駕駛需求,如何透過低成本的硬體與雲端技術進行模擬交通號誌辨識、車輛移動偵測,以及人臉與情緒辨識,成為一項具挑戰性且實用的課題。
本專案整合樹莓派5與多種API (Google Cloud Vision、OpenAI、LINE、Amazon Rekognition),實現車主身份辨識與情緒偵測、交通號誌辨識,以及車輛移動監測提醒的多功能系統。此系統不僅提升駕駛安全性,也能在未來應用於無人駕駛的汽車等場景,進一步探索智慧交通技術的可能性。
系統架構
---
1. 硬體架構
* 樹莓派 RaspberryPi5 *1
* 記憶卡 64GB *1
* 樹莓派PI5專用電源供應器 *1
* 藍芽音箱 *1
* 攝影機 *2
* 手機(行動網路) *1
* 遙控車 *1
2. 軟體架構
* Python 3.11
* Open AI gpt-4o-mini
* Google Cloud Vision API
* LINE Messaging API
* Amazon Rekognition
* pyttsx3 2.98
* opencv-python 4.10.0.84
* imgur API
實作照片
---



功能模組
---
* 所有系統功能

* 所有系統關聯串接應用

1. 車主識別與情緒偵測
*使用後置鏡頭 (車主臉部辨識與情緒監測)
*AWS Rekognition =>辨識車主
*Google Cloud Vision API =>辨識情緒
*Imgur API =>上傳車主照片並提供給Line通知使用
*LINE Message API =>傳送車主辨識通知
*Pyttsx3 =>啟動汽車迎賓語音
2. 交通標誌辨識與提醒
*使用前置鏡頭 (交通號誌分析)
*OpenAI API =>辨識紅綠燈是否可以紅燈左轉或右轉
*Pyttsx3 =>提醒駕駛是否可以紅燈左轉或右轉
3. 車輛移動偵測
*使用前置鏡頭 (前車移動辨識)
*Google Vision API =>偵測前車是否移動
*Pyttsx3 =>提醒駕駛注意前車行車
程式碼與技術細節
---
## 🔧 1. OpenCV (cv2)
**OpenCV** 是一個功能強大的開源影像處理庫,在這裡是用來處理判斷前車距離所使用。
### 📥 安裝指令
```bash
pip install opencv-python
```
---
## 🔧 2. NumPy (numpy)
**NumPy** 是 Python 的核心數值計算庫,支援大量矩陣與陣列操作,此專案用來計算與前車的距離。
### 📥 安裝指令
```bash
pip install numpy
```
---
## 🔧 3. Boto3 (boto3)
**Boto3** 是與 AWS (Amazon Web Services) 互動的 Python SDK,可以存取 AWS 的雲端服務,此專案用於 Rekognition 影像辨識。
### 📥 安裝指令
```bash
pip install boto3
```
---
## 🔧 4. Tkinter (tkinter)
**Tkinter** 是 Python 內建的 GUI 工具包,可用於建立桌面應用程式或視覺化控制面板。此專案用來模擬啟動Power On的介面。
### 📥 安裝指令
```bash
sudo apt install python3-tk
```
---
## 🔧 5. Pillow (PIL)
**Pillow** 是 PIL (Python Imaging Library) 的進階版本,提供影像編輯、濾鏡與格式轉換等功能,此專案用於UI背景的處理。
### 📥 安裝指令
```bash
pip install pillow
```
---
## 🔧 6. Google Cloud Vision (google-cloud-vision)
**Google Cloud Vision** 是 Google 的雲端影像分析服務,可用於物件偵測、文字辨識與影像標記等任務,此專案用於車子標示與情緒辨識。
### 📥 安裝指令
```bash
pip install google-cloud-vision
```
> **注意**:如尚未設定 Google Cloud SDK,請參考 [官方安裝指南](https://cloud.google.com/sdk/docs/install)。
---
## 🔧 7. Google Auth (google-auth)
**Google Auth** 負責 Google API 的身份驗證與授權流程,為使用 Vision API 等服務的必要套件。
### 📥 安裝指令
```bash
pip install google-auth google-auth-oauthlib google-auth-httplib2
```
---
## 🔧 8. Picamera2 (picamera2)
**Picamera2** 是 Raspberry Pi 官方推出的攝影機驅動程式,專為 Pi Camera Module 設計,用於拍攝照片或錄製影片,此專案的前後鏡頭驅動程式。
### 📥 安裝指令
```bash
pip install picamera2
```
---
## 🔧 9. pyttsx3 (pyttsx3)
**Pyttsx3** 是一個文字轉語音 (TTS) 的離線工具,支援多種平台,不依賴網路即可合成語音,此專案用於迎賓語音與提示語音。
### 📥 安裝指令
```bash
pip install pyttsx3
```
---
## 🔧 10. Requests (requests)
**Requests** 是一個簡潔的 HTTP 請求庫,用於與網頁或 API 進行互動,發送 POST/GET 請求等,此專案與API串接使用。
### 📥 安裝指令
```bash
pip install requests
```
---
## 🔧 11. Base64 (base64)
**Base64** 是 Python 內建的標準庫,用於編碼與解碼資料。**無需安裝**,直接匯入即可使用,此專案用於上傳Imgur時使用。
---
## 🔧 12. OpenAI (openai)
**OpenAI** 提供 GPT 模型的 API,支援語言模型推理與影像辨識等功能,此專案用於辨識紅綠燈是否可以紅燈左轉或紅燈右轉。
### 📥 安裝指令
```bash
pip install openai
```
---
## 🔧 13. Line Bot SDK (line-bot-sdk)
**Line Bot SDK** 是 LINE 官方的 Python 開發工具,用於建立與管理 LINE Bot,發送文字、圖片訊息等,此專案用於發送車主辨識Line通知。
### 📥 安裝指令
```bash
pip install line-bot-sdk
```
---
## ⚙️ 一次安裝所有套件
如果希望一次安裝所有套件,請執行以下指令:
```bash
pip install opencv-python numpy boto3 pillow google-cloud-vision google-auth google-auth-oauthlib google-auth-httplib2 picamera2 pyttsx3 requests openai line-bot-sdk
```
## ⚙️ API申請與設定
## 🌐 AWS Rekognition 設定(免費)
### 1. 註冊 AWS 帳號
- 前往 [AWS 官網](https://aws.amazon.com/) 並註冊帳號。
- 登入 AWS 控制台後,選擇「IAM」(身分與存取管理)。
### 2. 建立 IAM 使用者與權限設定
- 進入 IAM > 使用者 > 新增使用者。
- 新增權限,選擇「附加現有原則」,搜尋 `AmazonRekognitionFullAccess` 並加入。
### 3. 取得 Access Key 與 Secret Key
- 建立完成後,下載 Access Key 與 Secret Key,把這兩個key進行保存。
- 這些憑證將用於身份驗證,並允許您在程式中使用 Rekognition API。
### 4. 參考做法
> https://ithelp.ithome.com.tw/m/articles/10261749
## 🔍 GCP Vision API 設定(免費)
### 1. 註冊 Google Cloud 帳號
- 前往 [Google Cloud Console](https://console.cloud.google.com/) 並註冊帳號。
- 登入後,建立新的專案。
### 2. 啟用 Google Cloud Vision API
- 在 Google Cloud Console 中選擇「API 和服務」>「啟用 API 和服務」。
- 搜尋並啟用「Vision API」。
### 3. 建立服務帳號 (Service Account)
- 進入建立服務帳號。
- 讓服務帳戶直接為專案擁有者 (也就可以使用Cloud Vision API)。
### 4. 下載服務帳號金鑰 (JSON)
- 在服務帳號頁面中,選擇「金鑰」,建立並下載 JSON 金鑰檔案(iotpi.json)。
- 將 JSON 檔案保存在專案資料夾中。
### 5. 在程式中設定 Google Cloud 認證
- 在程式中指定該JSON檔案,讓程式可以讀取的到此檔案。
### 6. 參考做法
> https://ithelp.ithome.com.tw/articles/10259836
## 📝 LINE Message API 設定(免費)
### 1. 註冊 LINE Developers 帳號
- 前往 [LINE Developers 官方網站](https://developers.line.biz/) 並使用 LINE 帳號登入。
- 登入後,建立新的應用程式 (Channel)。
- 使用個人帳號就可以註冊。
### 2. 建立 LINE Messaging API Channel
- 點選「建立新專案」並選擇「Messaging API」來建立新的 Channel。
- 輸入應用程式名稱等基本資訊。
### 3. 取得 Channel 設定資料
- 建立完成後,會進入該 Channel 的設定頁面。
- 在「Messaging API」頁籤下,下面這些都要記得,很重要!!!:
- **Channel ID**
- **Channel Secret**
- **Channel Access Token**。
### 4. 參考做法
> https://ithelp.ithome.com.tw/articles/10285331
## 🤖 OpenAI API 設定(需付費)
### 1. 註冊 OpenAI 帳號
- 前往 [OpenAI 官方網站](https://platform.openai.com/) 並註冊帳號。
- 登入後,開始建立 API 金鑰和設定。
### 2. 取得 API 金鑰
- 登入後,點選右上角的帳號名稱,並選擇「API Keys」。
- 點選「Create new secret key」,這樣您就可以取得一組新的 API 金鑰。
- 複製並妥善保存好 API 金鑰,因為將在程式中使用這個金鑰來認證請求。
### 3. 參考做法
> https://ithelp.ithome.com.tw/articles/10333531
## 🖼️ Imgur API 設定(免費)
### 1. 註冊 Imgur 帳號
- 前往 [Imgur 官方網站](https://imgur.com/) 並註冊帳號。
- 登入後,前往 [Imgur API](https://api.imgur.com/) 頁面來建立應用程式。
### 2. 建立 Imgur API 應用程式
- 在 Imgur API 頁面中,點選「Register an Application」來建立新的應用程式。
- 選擇應用程式的類型,並輸入應用程式名稱、描述及其他相關資訊。
- 記得選擇「OAuth 2 authorization without a callback URL」,因為我們只需要上傳就好。
- 送出後,您將能夠獲得 **Client ID** 和 **Client Secret**,這些是與 Imgur API 互動時需要的憑證。
### 3. 參考做法
> https://medium.com/front-end-augustus-study-notes/imgur-api-3a41f2848bb8
## ⚙️ 主程式
```
import os
import cv2
import numpy as np
import boto3
import time
import tkinter as tk
from tkinter import Frame, Button, Canvas, Text, Scrollbar
from PIL import Image, ImageTk
from google.cloud import vision
from google.oauth2 import service_account
from picamera2 import Picamera2
import io
import pyttsx3
import requests
import base64
import openai
from linebot import LineBotApi
from linebot.models import TextSendMessage, ImageSendMessage
# 設定 Google Cloud Vision API 的認證檔案
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "iotpi.json"
# Line Messaging API 設定
LINE_CHANNEL_ACCESS_TOKEN = '#請替換LINE Message Token#'
USER_ID = '#請替換目標用戶ID#'
line_bot_api = LineBotApi(channel_access_token=LINE_CHANNEL_ACCESS_TOKEN)
# Google Vision API 客戶端
client_g = vision.ImageAnnotatorClient()
# 設定 Imgur API
CLIENT_ID = '#請替換Imgur使用者ID#'
running = False # 控制執行狀態
prev_bbox = None
# 初始化樹莓派相機和語音合成引擎
camera = Picamera2()
camera_2 = Picamera2(1) # 前置鏡頭,用於紅綠燈辨識
engine = pyttsx3.init()
engine.setProperty('rate', 150)
engine.setProperty('voice', 'zh') #中文語音
# 設定 OpenAI API Key
client = openai.Client(api_key='#請替換Open AI Key#')
# 發送訊息至 Line
def send_line_message(message):
try:
line_bot_api.push_message(USER_ID, TextSendMessage(text=message))
except Exception as e:
print(f"發送 LINE 訊息失敗: {e}")
# 發送圖片訊息至 Line
def send_line_image(image_url):
try:
line_bot_api.push_message(USER_ID, ImageSendMessage(original_content_url=image_url, preview_image_url=image_url))
except Exception as e:
print(f"發送 LINE 圖片訊息失敗: {e}")
# 上傳圖片至 Imgur
def upload_image_to_imgur(image_data):
url = "https://api.imgur.com/3/upload"
headers = {
'Authorization': f'Client-ID {CLIENT_ID}',
}
# 使用 Pillow 來處理圖片,確保圖片是 JPEG 格式
image = Image.open(image_data)
img_byte_arr = io.BytesIO()
image.convert('RGB').save(img_byte_arr, format='JPEG') # 確保轉換為 JPEG 格式
img_byte_arr.seek(0)
# 上傳圖片
response = requests.post(url, headers=headers, files={'image': img_byte_arr})
data = response.json()
# 顯示回應訊息
if data['success']:
return data['data']['link']
else:
print("Imgur API 回應:", data)
raise Exception("Imgur API 上傳失敗")
# 使用 Google Cloud Vision API 偵測臉部與情緒
def detect_faces(image_data):
image = vision.Image(content=image_data)
response = client_g.face_detection(image=image)
return response.face_annotations
# 載入圖片的函式
def load_image(image_path):
# 讀取圖片並轉換為二進制資料
with open(image_path, "rb") as img_file:
return img_file.read()
# 使用 GCP Vision API 進行情緒辨識
def recognize_emotion_with_gcp(image_stream):
image = vision.Image(content=image_stream.read())
response = client_g.face_detection(image=image)
emotions = []
for face in response.face_annotations:
joy = face.joy_likelihood
sorrow = face.sorrow_likelihood
anger = face.anger_likelihood
# 根據情緒的可能性來推測情緒
if joy == vision.Likelihood.VERY_LIKELY:
emotions.append("您今天很愉快!")
elif sorrow == vision.Likelihood.VERY_LIKELY:
emotions.append("您今天很悲傷!")
elif anger == vision.Likelihood.VERY_LIKELY:
emotions.append("您今天很生氣!")
else:
emotions.append("情緒無法辨識")
# 返回情緒訊息
return " ".join(emotions)
# 比對兩張圖片的臉部
def compare_faces(image_a, image_b):
# 載入 AWS Rekognition 設定
aws_access_key_id = '#請替換AWS Key#'
aws_secret_access_key = '#請替換AWS Secret Key#'
region_name = '#請替換Region Name#'
rekognition = boto3.client(
'rekognition',
aws_access_key_id=aws_access_key_id,
aws_secret_access_key=aws_secret_access_key,
region_name=region_name
)
response = rekognition.compare_faces(
SourceImage={'Bytes': image_a},
TargetImage={'Bytes': image_b},
SimilarityThreshold=80 # 設定相似度閾值
)
if response['FaceMatches']:
for match in response['FaceMatches']:
similarity = match['Similarity']
print(f"找到相似的臉部,匹配度:{similarity}%")
return 'Y' # 臉部匹配
else:
print("未找到匹配的臉部")
return 'N' # 未匹配
# 1. 拍攝照片(使用鏡頭2)
def take_photo_with_picamera2(filename='traffic_light.jpg'):
camera_2.start()
camera_2.capture_file(filename)
camera_2.stop()
print(f"紅綠燈照片已儲存: {filename}")
# 2. 上傳至 OpenAI 並判斷紅綠燈號狀態
def analyze_traffic_light(image_path):
with open(image_path, "rb") as image_file:
encoded_image = base64.b64encode(image_file.read()).decode('utf-8')
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{
"role": "system",
"content": "你是一位交通專家,請根據紅綠燈號判斷是否允許紅燈左轉或右轉,或是燈號顯示綠燈或黃燈。\
這是判斷標準:\n\
1. 如果看到紅燈旁有『綠色向左箭頭』,代表紅燈允許左轉,回傳 '可以紅燈左轉'\n\
2. 如果看到紅燈旁有『綠色向右箭頭』,代表紅燈允許右轉,回傳 '可以紅燈右轉'\n\
3. 如果只看到單一綠燈,代表直行綠燈,回傳 '綠燈直行'\n\
4. 如果只看到單一黃燈,回傳 '黃燈快過'\n\
5. 若紅燈旁沒有箭頭燈或無法判斷,回傳 'N/A'\n\
注意:右轉箭頭通常出現在紅燈的右側或下方,請仔細觀察燈箱細節。"
},
{
"role": "user",
"content": [
{"type": "text", "text": "請判斷這張照片中的紅綠燈號狀態,依照回傳格式回答:"},
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{encoded_image}"}}
]
}
],
max_tokens=10
)
result = response.choices[0].message.content.strip()
return result
# 使用藍牙音箱播放語音
def speak(message):
engine.say(message)
engine.runAndWait()
# 開啟相機並進行辨識的處理
def start_camera():
# 啟動樹莓派相機
camera.start()
time.sleep(2) # 等待相機初始化完成
# 捕捉影像並進行臉部辨識
image_stream = io.BytesIO()
camera.capture_file(image_stream, format='jpeg')
image_stream.seek(0)
# 載入已儲存的 ME.jpg 與當前捕獲的圖片進行比對
image_a = load_image('ME.jpg') # ME.jpg 是已儲存的臉部照片
image_b = image_stream.getvalue() # 當前捕獲的臉部照片
# 使用 AWS Rekognition 進行臉部比對
if compare_faces(image_a, image_b) == 'Y':
# 若匹配成功,進行 GCP 情緒辨識
sentiment = recognize_emotion_with_gcp(image_stream)
# 使用藍牙音箱播放訊息
message = f"Hello, Bryant,歡迎進入駕駛!{sentiment}"
engine.say(message)
engine.runAndWait()
# 上傳圖片到 Imgur 並取得圖片 URL
image_url = upload_image_to_imgur(image_stream)
# 發送圖片和訊息至 Line
send_line_message(message)
send_line_image(image_url)
else:
message = f"HI, 您不是駕駛本人,已通知車主,請儘速離開!"
# 上傳圖片到 Imgur 並取得圖片 URL
image_url = upload_image_to_imgur(image_stream)
engine.say(message)
send_line_image(image_url)
engine.runAndWait()
send_line_message("未找到臉部匹配,有陌生人入侵。")
# 停止相機
camera.stop()
return message
# 更新日誌顯示
def update_log(message):
global frame
log_output = Text(frame, height=15, width=80, yscrollcommand=scrollbar.set)
log_output.pack()
log_output.insert(tk.END, message + '\n')
log_output.yview(tk.END) # 滾動到最底部
# 交通燈擷取按鈕
def capture_traffic_light():
while True:
take_photo_with_picamera2() # 取得紅綠燈照片
take_photo_and_detect_car_from_file('traffic_light.jpg')
result = analyze_traffic_light('traffic_light.jpg') # 判斷交通燈
# 判斷 result 是否為 "N/A"、"" 或 None
if result not in ["N/A", "", None]:
speak(f"前方路口{result}") # 播放語音訊息
else:
print(f"無法識別交通燈,結果: {result}") # 這行是用來顯示錯誤訊息,根據需求可選擇性加上
time.sleep(2)
# 啟動/停止切換
def toggle_capture():
global running,root
if running:
running = False
root.capture_button.config(text="Capture Traffic Light")
else:
running = True
#root.capture_button.config(text="Stop Capture")
capture_traffic_light()
# 偵測車輛並返回車輛位置
def detect_objects_from_file(frame):
# 從檔案讀取圖像
#frame = cv2.imread(image_path)
# 使用 Google Vision API 偵測物體
_, encoded_image = cv2.imencode('.jpg', frame)
image = vision.Image(content=encoded_image.tobytes())
response = client_g.object_localization(image=image)
objects = response.localized_object_annotations
cars = [obj for obj in objects if obj.name.lower() == 'car']
return cars
def take_photo_and_detect_car_from_file(image_path):
# 從 JPG 檔案進行車輛偵測
global prev_bbox
# 從檔案讀取圖像
frame = cv2.imread(image_path)
cars = detect_objects_from_file(frame)
current_bbox = None
for car in cars:
vertices = car.bounding_poly.normalized_vertices
x1 = int(vertices[0].x * frame.shape[1])
y1 = int(vertices[0].y * frame.shape[0])
x2 = int(vertices[2].x * frame.shape[1])
y2 = int(vertices[2].y * frame.shape[0])
current_bbox = (x1, y1, x2, y2)
# 在畫面上標註車輛框
frame = cv2.imread(image_path)
cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(frame, f"Car: {int(car.score * 100)}%", (x1, y1 - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36, 255, 12), 2)
# 如果有上次的車輛框,判斷車輛是否移動
if prev_bbox and current_bbox:
dx = abs(current_bbox[0] - prev_bbox[0])
dy = abs(current_bbox[1] - prev_bbox[1])
if dx > 10 or dy > 10:
print("Y") # 如果車輛移動,返回 "Y"
speak(f"請注意前方車輛已駛離,請加速前進!") # 播放語音訊息
return "Y"
else:
print("N") # 車輛未移動,返回 "N"
return "N"
prev_bbox = current_bbox
return "N"
# 設定 GUI 的介面
def gui_main():
root = tk.Tk()
root.title("汽車儀表板")
root.geometry("1200x800")
# 設定儀表板背景圖片
original_img = Image.open("dashboard.png")
resized_img = original_img.resize((1200, 800)) # 保持圖片的比例
dashboard_img = ImageTk.PhotoImage(resized_img)
# 顯示儀表板背景
dashboard_canvas = tk.Canvas(root, width=800, height=400)
dashboard_canvas.create_image(0, 0, anchor=tk.NW, image=dashboard_img)
dashboard_canvas.pack()
# 控制相機的開關按鈕
button_frame = Frame(root)
button_frame.pack(pady=10)
power_on_button = Button(button_frame, text="Power On", command=start_camera, font=("Helvetica", 20), bg="green", fg="white")
power_on_button.grid(row=0, column=0, padx=10)
power_off_button = Button(button_frame, text="Power Off", command=root.quit, font=("Helvetica", 20), bg="red", fg="white")
power_off_button.grid(row=0, column=1, padx=10)
# 顯示 JSON 輸出的滾動區域
frame = Frame(root)
frame.pack(pady=20)
scrollbar = Scrollbar(frame)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
log_output = Text(frame, height=10, width=80, yscrollcommand=scrollbar.set)
log_output.pack()
scrollbar.config(command=log_output.yview)
# 紅綠燈擷取按鈕
root.capture_button = Button(root, text="Capture Traffic Light", command=toggle_capture, font=("Helvetica", 16), bg="blue", fg="white")
root.capture_button.pack(pady=20)
# 啟動 Tkinter GUI 介面
root.mainloop()
if __name__ == "__main__":
gui_main()
```
---
## 📌 總結
以上為專案中使用到的所有 Python 套件及安裝方法,若在安裝過程中遇到問題,請隨時查閱官方文件或提問。
專案成果與未來展望
---
### 1. 專案成果
這個專案的主要成果是成功整合了多個 API(如 AWS Rekognition、GCP Vision API、OpenAI、Imgur API 和 LINE Messaging API)來實現以下功能:
- **車主辨識與情緒分析**:利用相機進行車主的臉部辨識,並透過 GCP Vision API 和 AWS Rekognition 辨識車主與情緒分析。
- **紅綠燈辨識與前車距離行駛指示**:系統能夠辨識紅燈是否可以左轉或右轉,以及前車是否已經移動的偵測,並透過語音的方式來做提醒。
### 2. 持續改進與未來展望
儘管目前的系統已經達到了預期的功能,未來仍有許多功能提升和進步的空間。希望可以造福沒有電動車的相關智慧功能的駕駛車主。
參考
---
* 【專案簡報】
>https://docs.google.com/presentation/d/1ZrXrDlduoQPCOpzM_eqGjjczYIqqJgDd/edit?usp=sharing&ouid=114547611257416047571&rtpof=true&sd=true
* 【動手玩系列#1】Google Cloud Vision API
> https://mile.cloud/zh/resources/blog/hands-on-Google-Cloud-Vision-API_43
* Imgur API:upload, load 上傳、讀取 心得筆記
> https://medium.com/front-end-augustus-study-notes/imgur-api-3a41f2848bb8
* Day-26 OpenAI API 實作 part 1
> https://ithelp.ithome.com.tw/articles/10333531
* Line Messaging API 串接筆記-建立 Channel & 回應設定
> https://ithelp.ithome.com.tw/articles/10285331
* [Day4] Face Detection - 使用Google Cloud Vision API
> https://ithelp.ithome.com.tw/articles/10259836
* [Day7] Face Detection - 使用Amazon Rekognition
> https://ithelp.ithome.com.tw/m/articles/10261749
###### tags: `Imgur API` `Line Message API` `Face Detection` `Open AI` `Google Cloud Vision API` `AWS Rekognition`