[Python][物件辨識]Yolo v8_Streamlit_網頁預測

更新 發佈閱讀 16 分鐘

python Streamlit連動github程式碼實現YoloV8網頁版偵測物件

先致敬,YoloV8原作Github程式碼

Streamlit網頁 實現YoloV8 偵測物件

套用模型為YoloV8(YOLOv8n)最小模型,因github上傳檔案最大上限為25mb

導入圖像(搜尋街景圖隨意抓取)

Streamlit網頁 實現YoloV8 偵測物件連結

raw-image

github資料夾說明

image -> 圖檔放置

model -> 存放模型

pages -> 呈現在streamlit上的程式碼放置位置

requirements.txt -> streamlit指定安裝python套件版本

packages.txt -> streamlit 安裝yolov8 libraries用

raw-image

程式碼:

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

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: # 如果通道數為4,通常是带有alpha通道的圖像
image = image[:, :, :3] # 去除alpha通道

# 載入模型
pretrained_weights_path = './model/yolov8n.pt'
yolo = YOLO()
yolo = yolo.load(pretrained_weights_path)
try:
results = yolo.predict(image) #預測指令
# 顯示結果
st.subheader("檢測結果")
colors_count = 0
result_str = []
# 顯示物件類別
print(results[0].boxes.cls)
# # print()
for i, result in enumerate(results):
annotator = Annotator(image)
boxes = result.boxes
for box in boxes:
cls = box.cls
xyxy = box.xyxy[0]
result_str_1 = yolo.names[int(cls[0])]
result_str.append(result_str_1)
annotator.box_label(xyxy,yolo.names[int(cls[0])],colors_rgb[f'{colors_count}'])
colors_count += 1
img = annotator.result()
# 顯示標註後的圖片
st.image(img, caption="檢測結果", use_column_width=True)
st.write(result_str)

except Exception as e:
print(f"Error during prediction: {e}")

程式碼說明

st.title("上傳圖片辨識")
st.info("YOLO_V8), 80 個類別的物體檢測,這些類別包括人,動物,交通工具,家具等")

`st.title` 網頁開頭標題,Streamlit 中用來顯示標題的函式

`st.info` 可新增說明內容,是 Streamlit 中的一個函式,用於顯示信息提示框

raw-image
uploaded_file = st.file_uploader("上傳圖片", type=['jpg', 'jpeg', 'png', 'gif'])

st.file_uploader 是 Streamlit 中用來創建檔案上傳元件的函式。它允許使用者在應用程式的網頁界面上選擇並上傳檔案,通常用於接收使用者提供的圖片、文件等。

raw-image
colors_rgb = {str(i): ((i * 30) % 256, (i * 50) % 256, (i * 70) % 256) for i in range(30)}

這一段程式碼創建了一個名為 colors_rgb 的字典,其中包含了30種不同的RGB顏色,為了YoloV8偵測到的物件,框起來顏色不同所設計,用到的是python語法中生成器的一種概念。

  1. for i in range(30):這是一個迴圈,從0到29迭代,共迭代30次。
  2. {str(i): ((i * 30) % 256, (i * 50) % 256, (i * 70) % 256) for i in range(30)}:這是一個字典生成式,用於創建一個包含30個鍵值對的字典。每個鍵都是i的字串表示,而對應的值是一個包含三個數字的元組,這三個數字分別代表紅色(R)、綠色(G)和藍色(B)的值。
if uploaded_file is not None:

這個if條件語句檢查是前面創建的上傳檔案按鈕的變數 uploaded_file 是否為非空值(不是 None)。在這個上下文中,它用於確保在使用者上傳了檔案之後才執行相應的程式碼塊。

具體來說,在這個程式中,如果 uploaded_file 不是 None,代表使用者已經上傳了一個檔案,那麼下面的程式碼塊就會被執行。這通常是為了處理使用者上傳的檔案,例如讀取並顯示圖片,進行檔案的處理或分析等相應的操作。

這樣的條件語句有助於檔案上傳的情況下執行相應的邏輯,同時避免沒有檔案上傳時執行相關程式碼,防止出現錯誤或不必要的操作

    image = io.imread(uploaded_file)
if image.shape[-1] == 4: # 如果通道數為4,通常是带有alpha通道的圖像
image = image[:, :, :3] # 去除alpha通道
  1. image = io.imread(uploaded_file):使用 io.imread 函式讀取上傳的檔案,並將其資料轉換為圖片數據。這裡使用的是 skimage 库的 io 模組。
  2. if image.shape[-1] == 4::這個條件語句檢查圖片的通道數是否為4。通常,如果一張圖片具有4個通道,那麼它帶有一個 alpha 通道,表示透明度。
  3. image = image[:, :, :3]:只保留前三個通道(紅、綠、藍),將圖片轉換為一個沒有透明度信息的普通RGB圖片。

總的來說,這段程式碼確保讀取的圖片是一個三通道的RGB圖片,去除了可能存在的 alpha 通道。這樣的處理通常是為了確保後續的圖片處理和模型預測能夠正確進行。

    # 載入模型
pretrained_weights_path = './model/yolov8n.pt'
yolo = YOLO()
yolo = yolo.load(pretrained_weights_path)
  1. pretrained_weights_path = './model/yolov8n.pt':這是一個相對路徑,指向存儲了預先訓練權重的檔案。
  2. yolo = YOLO():創建一個 YOLO 模型。
  3. yolo = yolo.load(pretrained_weights_path):使用 load 方法載入預先訓練的權重。這個方法將預先訓練的權重載入到之前創建的 YOLO 模型,以便使用這些權重進行物體檢測
try:
results = yolo.predict(image) #預測指令
# 顯示結果
st.subheader("檢測結果")
colors_count = 0
result_str = []
# 顯示物件類別
print(results[0].boxes.cls)
# # print()
for i, result in enumerate(results):
annotator = Annotator(image)
boxes = result.boxes
for box in boxes:
cls = box.cls
xyxy = box.xyxy[0]
result_str_1 = yolo.names[int(cls[0])]
result_str.append(result_str_1)
annotator.box_label(xyxy,yolo.names[int(cls[0])],colors_rgb[f'{colors_count}'])
colors_count += 1
img = annotator.result()
# 顯示標註後的圖片
st.image(img, caption="檢測結果", use_column_width=True)
st.write(result_str)
  1. results = yolo.predict(image):使用載入的 YOLO 模型對上傳的圖片進行預測。results 包含了檢測結果,每個結果對應一個或多個檢測到的物件。
  2. st.subheader("檢測結果"):使用 Streamlit 的 st.subheader 函式顯示一個子標題,標題為 "檢測結果"。
  3. colors_count = 0 定義偵測框的初始值,給先前建立的顏色字典做索引的使用
  4. result_str = [] 建立result_str的list,儲存偵測到的結果用
        for i, result in enumerate(results):
annotator = Annotator(image)
boxes = result.boxes
for box in boxes:
cls = box.cls
xyxy = box.xyxy[0]
result_str_1 = yolo.names[int(cls[0])]
result_str.append(result_str_1)
annotator.box_label(xyxy,yolo.names[int(cls[0])],colors_rgb[f'{colors_count}'])
colors_count += 1

這段程式碼是一個迴圈,用於處理模型的每個檢測結果,並在圖片上標註檢測框和物件類別

  1. for i, result in enumerate(results)::這個迴圈遍歷模型的每個預測結果,enumerate(results) 同時提供了索引 i 和對應的檢測結果 result
  2. annotator = Annotator(image):為每個檢測結果創建一個 Annotator 實例,這個實例用於在圖片上添加標註。
  3. boxes = result.boxes:取得當前檢測結果中的所有檢測框。
  4. for box in boxes::這個迴圈遍歷每個檢測框。
  5. cls = box.cls:取得檢測框中物件的類別。
  6. xyxy = box.xyxy[0]:取得檢測框的四個座標點。
  7. result_str_1 = yolo.names[int(cls[0])]:根據物件的類別索引,從模型的 yolo.names 中取得物件的名稱。
  8. result_str.append(result_str_1):將檢測到的物件名稱加入到 result_str 列表中。
  9. annotator.box_label(xyxy, yolo.names[int(cls[0])], colors_rgb[f'{colors_count}']):使用 Annotator 的 box_label 方法,在圖片上標註檢測框和物件類別,同時指定標註的顏色。
  10. colors_count += 1:更新顏色計數,以便每個不同的物件標註使用不同的顏色。
  11. 迴圈結束後,img = annotator.result():取得標註後的圖片,包含了所有檢測結果的標註。

總的來說,這段程式碼的目的是遍歷模型預測的每個檢測框,為每個檢測框添加標註,包括物件類別和邊界框,然後取得標註後的圖片。這個圖片將在後續用於顯示檢測結果。

 # 顯示標註後的圖片
st.image(img, caption="檢測結果", use_column_width=True)
st.write(result_str)

這兩行程式碼用於在 Streamlit 的界面上顯示物體檢測的結果:

  1. st.image(img, caption="檢測結果", use_column_width=True):使用 st.image 函式顯示標註後的圖片。這裡的 img 是經過標註的圖片,caption 參數指定了圖片的標題,並且 use_column_width=True 使得圖片的寬度自適應列的寬度。
  2. st.write(result_str):使用 st.write 函式顯示檢測到的物件名稱。這將在應用程式的界面上顯示一個區域,其中包含了所有檢測到的物件的名稱。

謝謝大家看完了一大推廢話,希望對大家有幫助





留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
153會員
297內容數
本業是影像辨識軟體開發,閒暇時間進修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
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
透過蝦皮分潤計畫,輕鬆賺取零用金!本文分享5-6月實測心得,包含數據流程、實際收入、平臺優點及注意事項,並推薦高分潤商品,教你如何運用空閒時間創造被動收入。
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
單身的人有些會養寵物,而我養植物。畢竟寵物離世會傷心,植物沒養好再接再厲就好了~(笑)
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
不知你有沒有過這種經驗?衛生紙只剩最後一包、洗衣精倒不出來,或電池突然沒電。這次一次補貨,從電池、衛生紙到洗衣精,還順便分享使用心得。更棒的是,搭配蝦皮分潤計畫,愛用品不僅自己用得安心,分享給朋友還能賺回饋。立即使用推薦碼 X5Q344E,輕鬆上手,隨時隨地賺取分潤!
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
身為一個典型的社畜,上班時間被會議、進度、KPI 塞得滿滿,下班後只想要找一個能夠安靜喘口氣的小角落。對我來說,畫畫就是那個屬於自己的小樹洞。無論是胡亂塗鴉,還是慢慢描繪喜歡的插畫人物,那個專注在筆觸和色彩的過程,就像在幫心靈按摩一樣,讓緊繃的神經慢慢鬆開。
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
Thumbnail
學習如何使用Python連接MongoDB進行憑證監控,包括建立MongoDB docker-compose、連接MongoDB、讀取yaml並寫入MongoDB、傳入env以及domain寫入MongoDB、讀取MongoDB、修改MongoDB、刪除MongoDB。
Thumbnail
使用pytube library 下載Youtube 影片
Thumbnail
使用pytube library 下載Youtube 影片
Thumbnail
教大家如何使用 google colab 讀取雲端硬碟中的資料
Thumbnail
教大家如何使用 google colab 讀取雲端硬碟中的資料
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News