🚀 實戰指南:在 Streamlit Cloud 部署 YOLOv8 辨識系統

更新 發佈閱讀 10 分鐘

當我們嘗試在雲端環境執行電腦視覺專案時,最常遇到的不是程式碼錯誤,而是**「底層系統依賴」「記憶體管理」**的挑戰。

Streamlit 網頁app

核心問題與解決方案

1. 解決「依賴地獄」 (Apt & OpenCV)

Streamlit Cloud 的 Debian 環境通常缺少 OpenCV 所需的圖形庫(如 libGL.so.1libgthread-2.0.so.0)。

  • 錯誤戰術:packages.txt 指定舊版套件,這會導致系統版本衝突(如 libffi7 缺失)。
  • 正確戰術: * 清空 packages.txt,避免觸發系統層級的安裝失敗。
    • 在 requirements.txt 中使用 opencv-python-headless,它不依賴系統圖形庫。

2. PyTorch 2.6+ 的安全性攔截

新版 PyTorch 預設禁止載入未經許可的自定義類別(如 YOLO 的模型結構)。

  • 解決方法: 使用 torch.serialization.add_safe_globalsDetectionModel 加入白名單。

🛠️ 最終推薦的檔案結構

📄 requirements.txt (關鍵清單)

Plaintext

# 務必將 headless 版本置頂 opencv-python-headless==4.8.0.74 ultralytics==8.1.1 streamlit numpy==1.26.4 torch>=1.8.0 pillow scikit-image matplotlib

📄 8_🛸_辨識_yoloV8辨識_🐱.py (核心代碼)

Python

import streamlit as st
from skimage import io
import numpy as np
from ultralytics import YOLO
import matplotlib.pyplot as plt # 新增這一行
from ultralytics.utils.plotting import Annotator
from PIL import Image #1024
#新增20260310
import os
import sys

# 自動安裝缺失的系統庫 (針對 Streamlit Cloud 環境)
def install_packages():
try:
# 嘗試檢查是否有 libGL,若無則嘗試用 pip 補救或提醒
import cv2
except ImportError:
# 強制重新安裝 headless 版本確保路徑正確
subprocess.check_call([sys.executable, "-m", "pip", "install", "opencv-python-headless", "--force-reinstall"])

# 執行安裝
install_packages()
# 強制告訴環境我們不需要 GUI
os.environ["QT_QPA_PLATFORM"] = "offscreen"

# 【核心修正】告訴 PyTorch 許可 Ultralytics 的自定義類別
try:
from ultralytics.nn.tasks import DetectionModel
torch.serialization.add_safe_globals([DetectionModel])
except Exception:
pass
# 2. 如果系統找不到 libgthread,嘗試動態加載一個通用的 glib
# 這是一個小撇步,有時能讓 Python 內部機制跳過檢查
try:
import ctypes
ctypes.CDLL('libgthread-2.0.so.0', mode=os.RTLD_GLOBAL)
except Exception:
pass
import streamlit as st
st.title("上傳圖片辨識")
st.info("YOLO_V8), 80 個類別的物體檢測,這些類別包括人,動物,交通工具,家具等")

uploaded_file = st.file_uploader("上傳圖片", type=['jpg', 'jpeg', 'png', 'gif'])
colors_rgb = {str(i): ((i * 30) % 256, (i * 50) % 256, (i * 70) % 256) for i in range(30)}

if uploaded_file is not None:
image = io.imread(uploaded_file)
if image.shape[-1] == 4:
image = image[:, :, :3]

# 【關鍵修正 1】確保記憶體連續,否則 Annotator 會報錯
image = np.ascontiguousarray(image)

# 載入模型
pretrained_weights_path = './model/yolov8n.pt'
yolo = YOLO(pretrained_weights_path) # 建議直接載入,更簡潔

try:
results = yolo.predict(image)
st.subheader("檢測結果")

# 【關鍵修正 2】Annotator 應該放在迴圈外面,不然每一框都會蓋掉前一框
annotator = Annotator(image)

result_str = []
colors_count = 0

for result in results:
boxes = result.boxes
for box in boxes:
cls = int(box.cls[0])
xyxy = box.xyxy[0]
label = yolo.names[cls]
result_str.append(label)

# 繪製標籤
annotator.box_label(xyxy, label, colors_rgb.get(str(colors_count), (255, 0, 0)))
colors_count += 1

# 取得標註後的圖片 (BGRRGB)
img_result = annotator.result()

# 顯示圖片
st.image(img_result, caption="檢測結果", use_container_width=True)
st.write(f"偵測到物品: {', '.join(result_str)}")

except Exception as e:
st.error(f"預測過程中發生錯誤: {e}")





💡 部署小秘帖

  1. 記憶體節省: 如果 App 出現 Connection Reset,請嘗試移除 requirements.txt 中不必要的套件(如 tensorflow),因為 Streamlit Cloud 免費版只有 1GB RAM。
  2. 快取機制: 務必使用 @st.cache_resource 載入模型,否則每次上傳圖片都會重新載入一次模型,非常吃效能。
  3. 色彩管理: YOLO 預設使用 BGR 格式,而 skimagePIL 使用 RGB。若顏色看起來怪怪的,記得檢查顏色通道轉換。
留言
avatar-img
螃蟹_crab的沙龍
163會員
320內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。 興趣是攝影,踏青,探索未知領域。 人生就是不斷的挑戰及自我認清,希望老了躺在床上不會後悔自己什麼都沒做。
螃蟹_crab的沙龍的其他內容
2024/06/21
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
2024/06/21
微調(Fine tune)是深度學習中遷移學習的一種方法,其中預訓練模型的權重會在新數據上進行訓練。 本文主要介紹如何使用新的訓練圖檔在tesseract 辨識模型進行Fine tune 有關於安裝的部分可以參考友人的其他文章 Tesseract OCR - 繁體中文【安裝篇】 將所有資料
Thumbnail
2024/06/01
平時都在用tesseract來辨識OCR的部分,在網路上也常常聽說easyOCR比tesseract好用,就拿之前測試的OCR素材來比較看看囉。 以下輸入同樣圖片直接測試,並非絕對誰就比較準,只單純測試數字含英文的部分。 圖片素材就是15碼(英文加數字),檔名為OCR正確結果
Thumbnail
2024/06/01
平時都在用tesseract來辨識OCR的部分,在網路上也常常聽說easyOCR比tesseract好用,就拿之前測試的OCR素材來比較看看囉。 以下輸入同樣圖片直接測試,並非絕對誰就比較準,只單純測試數字含英文的部分。 圖片素材就是15碼(英文加數字),檔名為OCR正確結果
Thumbnail
2024/05/26
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
2024/05/26
本文將展示使用不同激活函數(ReLU 和 Sigmoid)的效果。 一個簡單的多層感知器(MLP)模型來對 Fashion-MNIST 資料集進行分類。 函數定義 Sigmoid 函數 Sigmoid 函數將輸入壓縮到 0到 1 之間: 特性: 輸出範圍是 (0,1)(0, 1)(0,1
Thumbnail
看更多
你可能也想看
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文深度解析賽勒布倫尼科夫的舞臺作品《傳奇:帕拉贊諾夫的十段殘篇》,如何以十段殘篇,結合帕拉贊諾夫的電影美學、象徵意象與當代政治流亡抗爭,探討藝術在儀式消失的現代社會如何承接意義,並展現不羈的自由靈魂。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
如果你對製作 EPUB 電子書足夠熟悉的話,你應該知道 Sigil 這個製作 EPUB 的專業工具。 我自己本來是透過 Adobe InDesign 轉製 EPUB,不過這兩年經過 Adobe 的神助攻,InDesign 鼓勵我尋找其他解決方案。🤣 當深度使用 Sigil 之後就發現,Sigi
Thumbnail
如果你對製作 EPUB 電子書足夠熟悉的話,你應該知道 Sigil 這個製作 EPUB 的專業工具。 我自己本來是透過 Adobe InDesign 轉製 EPUB,不過這兩年經過 Adobe 的神助攻,InDesign 鼓勵我尋找其他解決方案。🤣 當深度使用 Sigil 之後就發現,Sigi
Thumbnail
本文介紹如何在Python開發過程中建立虛擬環境以避免程式庫衝突,並使用Jupyter Notebook切換不同的虛擬環境。讓開發者能夠輕鬆地在不同環境中工作,提升開發效率。本文涵蓋從建立虛擬環境到管理Jupyter核心的完整步驟,適合希望優化其Python開發流程的讀者。
Thumbnail
本文介紹如何在Python開發過程中建立虛擬環境以避免程式庫衝突,並使用Jupyter Notebook切換不同的虛擬環境。讓開發者能夠輕鬆地在不同環境中工作,提升開發效率。本文涵蓋從建立虛擬環境到管理Jupyter核心的完整步驟,適合希望優化其Python開發流程的讀者。
Thumbnail
教大家如何使用 pip 備份 python 虛擬環境,並移植到其他電腦之中,詳細圖文解說
Thumbnail
教大家如何使用 pip 備份 python 虛擬環境,並移植到其他電腦之中,詳細圖文解說
Thumbnail
建置 vscode + python 開發環境的完整流程,詳細且附圖
Thumbnail
建置 vscode + python 開發環境的完整流程,詳細且附圖
Thumbnail
在 Linux 系統創建 python 虛擬環境的詳細流程 (完全不需要 Anaconda)
Thumbnail
在 Linux 系統創建 python 虛擬環境的詳細流程 (完全不需要 Anaconda)
Thumbnail
創建 python 虛擬環境 (不需要安裝 Anaconda)
Thumbnail
創建 python 虛擬環境 (不需要安裝 Anaconda)
Thumbnail
最近剛好在試著研究Python的虛擬環境,今天就來稍稍筆記一下。 在之前我其實也一直搞不懂這個,直到前陣子好好靜下心研究研究後有些心得。 在 Python 開發中,經常需要建立虛擬環境,來隔離不同專案所需的套件及依賴關係。這樣可以確保每個專案使用的套件版本都是一致的,避免可能的衝突和混淆。
Thumbnail
最近剛好在試著研究Python的虛擬環境,今天就來稍稍筆記一下。 在之前我其實也一直搞不懂這個,直到前陣子好好靜下心研究研究後有些心得。 在 Python 開發中,經常需要建立虛擬環境,來隔離不同專案所需的套件及依賴關係。這樣可以確保每個專案使用的套件版本都是一致的,避免可能的衝突和混淆。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News