YOLO模型在物件偵測任務中表現出色,但需要額外實作非最大值抑制(NMS)以去除多餘邊界框。本文將詳細介紹如何使用OpenCV的DNN模組實作NMS,並結合程式碼說明如何計算邊界框、設定信心度閾值、應用NMS以及繪製最終結果。同時,本文也將探討Tesseract-OCR在影像文字識別上的應用,包含安裝、使用pytesseract和OpenCV進行文字識別,以及Tesseract-OCR的限制。最後,本文將比較根據Tesseract、TensorFlow 2的OCR技術以及傳統OCR流程,並討論不同技術的應用場景和優缺點,提供讀者更全面的技術視野。

2. 提取偵測結果

對每個偵測結果,需要提取出偵測分數、預測類別、邊界框座標等資訊。偵測分數是從第五個元素開始的,需要找到分數中最大值的索引和值。最大值代表了偵測的信心度,索引則代表了預測的類別。

3. 篩選偵測結果

需要設定一個最小的信心度閾值,當偵測結果的信心度大於這個閾值時,才會被認為是有效的偵測結果。這樣可以過濾掉那些信心度太低的偵測結果。

4. 計算邊界框座標

對於有效的偵測結果,需要計算出邊界框的座標。這包括了邊界框的左上角座標(x, y)和邊界框的寬度和高度。這些座標可以從偵測結果的前四個元素中計算出來。

5. 儲存偵測結果

最後,需要將所有有效的偵測結果儲存起來,包括邊界框座標、信心度和預測類別。這些資訊可以用於後續的處理和分析。

以下是示例程式碼:

def get_bounding_boxes(detector_outputs):
    bounding_boxes = []
    confidences = []
    class_ids = []
    
    for output in detector_outputs:
        for detection in output:
            scores = detection[5:]
            class_id = np.argmax(scores)
            confidence = scores[class_id]
            
            if confidence > 0.5:  # 最小信心度閾值
                centerX = detection[0] * 416
                centerY = detection[1] * 416
                width = detection[2] * 416
                height = detection[3] * 416
                
                x = int(centerX - (width / 2))
                y = int(centerY - (height / 2))
                
                bounding_boxes.append([x, y, int(width), int(height)])
                confidences.append(float(confidence))
                class_ids.append(class_id)
    
    return bounding_boxes, confidences, class_ids

這個程式碼實作了上述的步驟,對偵測結果進行處理和篩選,然後儲存起來。

物件偵測:YOLO 模型的非最大值抑制(NMS)實作

在物件偵測任務中,非最大值抑制(Non-Maximum Suppression, NMS)是一種用於過濾多餘邊界盒的技術。與 TensorFlow Hub 模型不同,YOLO 模型並不內建 NMS,因此我們需要手動實作它。這裡,我們將使用 OpenCV 的 DNN 模組來實作 NMS。

NMS 的實作

NMS 的目的是選擇最合適的邊界盒,並刪除其他與其重疊的邊界盒。以下是 NMS 的實作程式碼:

indices = cv2.dnn.NMSBoxes(bounding_boxes, confidences, 0.5, 0.3)

在這段程式碼中,我們傳遞了邊界盒、信心分數、分數閾值和 NMS 閾值給 NMSBoxes() 函式。這個函式傳回了 NMS 後保留的邊界盒的索引。

繪製邊界盒

現在,我們需要繪製邊界盒和其對應的類別標籤。以下是繪製邊界盒的程式碼:

def draw_bounding_boxes_yolo(img, indices, bounding_boxes, confidences, class_ids, colors, labels):
    if len(indices) > 0:
        for i in indices.flatten():
            (x, y) = (bounding_boxes[i][0], bounding_boxes[i][1])
            (w, h) = (bounding_boxes[i][2], bounding_boxes[i][3])
            color = [int(c) for c in colors[class_ids[i]]]
            cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
            text = "{0}: {1:.4f}".format(labels[class_ids[i]], confidences[i])
            cv2.putText(img, text, (x, y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
    return img

這個函式接收 7 個輸入引數:原始影像、NMS 後的索引、邊界盒、信心分數、類別 ID、顏色和標籤。它迭代索引,繪製邊界盒和其對應的類別標籤。

結果

經過 NMS 和繪製邊界盒後,影像中只會保留最合適的邊界盒和其對應的類別標籤。這個過程可以有效地過濾多餘的邊界盒,提高物件偵測的準確度。

物體偵測技術深度剖析

物體偵測是一項基本的電腦視覺任務,涉及在影像或影片中識別和定位物體。這項技術在許多領域中都有廣泛的應用,包括自駕車、監控系統、醫學影像分析等。

基礎概念

在進行物體偵測之前,瞭解一些基礎概念是非常重要的。其中,IoU(Intersection over Union)是一個用於評估物體偵測準確性的重要指標。IoU是預測的邊界框和真實邊界框的重疊面積與兩個邊界框面積之和的比值。NMS(Non-Maximum Suppression)是一種後處理技術,用於消除冗餘的邊界框預測。

物體偵測模型

目前,有許多種物體偵測模型被提出和應用。其中,SSD(Single Shot Detector)是一種流行的物體偵測模型,它可以在單次前向傳播中預測物體位置和類別。R-CNN(Region-based Convolutional Neural Networks)引入了區域提案和區域根據CNN的概念,從而提高了物體偵測的準確性。YOLO(You Only Look Once)是一種實時物體偵測模型,它將影像分割為網格,並直接預測邊界框和類別機率。

實踐應用

在實踐中,物體偵測技術被廣泛應用於各個領域。例如,在自駕車中,物體偵測技術被用於檢測行人、車輛和其他障礙物。 在監控系統中,物體偵測技術被用於檢測和追蹤目標物體。

未來發展

物體偵測技術仍然是一個活躍的研究和開發領域,不斷有新的進展和突破。隨著深度學習技術的發展,物體偵測模型的準確性和效率不斷提高。同時,新的應用領域也在不斷開拓,例如,醫學影像分析中的物體偵測等。

內容解密:

上述內容對物體偵測技術進行了深度剖析,從基礎概念到實踐應用,涵蓋了物體偵測的各個方面。透過這些內容,讀者可以對物體偵測技術有更加深入的瞭解,並能夠應用這些知識於實際問題中。

圖表翻譯:

  graph LR
    A[物體偵測] --> B[基礎概念]
    B --> C[IoU]
    B --> D[NMS]
    A --> E[物體偵測模型]
    E --> F[SSD]
    E --> G[R-CNN]
    E --> H[YOLO]
    A --> I[實踐應用]
    I --> J[自駕車]
    I --> K[監控系統]
    A --> L[未來發展]
    L --> M[深度學習]
    L --> N[新應用領域]

這個圖表展示了物體偵測技術的整體框架,從基礎概念到實踐應用,涵蓋了物體偵測的各個方面。透過這個圖表,讀者可以更加清晰地理解物體偵測技術的內容和結構。

影像轉文字技術:開啟新世代的互動方式

在人工智慧的應用中,影像轉文字技術是一個令人著迷的領域,能夠將影像作為輸入,輸出相應的文字。這項技術可以根據影像生成文字標題,或是從影像中提取嵌入的文字。其中,影像轉文字的第一個應用將在第十二章進行探討,而本章將聚焦於第二個應用:光學字元識別(OCR)。

光學字元識別(OCR)技術

OCR是一項現代技術,革新了我們與印刷檔案和影像的互動方式。在當今的數字時代,影像在教育、溝通和娛樂中扮演著越來越重要的角色。早期,將影像中的文字轉換為機器可讀的文字是一項耗時且容易出錯的任務,需要手動輸入。這正是影像轉文字技術發揮作用的地方。透過這項技術,我們可以輕鬆地編輯、搜尋和分析影像中的內容。不論是數位化老舊檔案、從社交媒體影像中提取文字,還是識別車牌,影像轉文字技術都有廣泛的應用,能夠顯著改善我們在日常生活中與影像的互動方式。

本章結構

在本章中,我們將探討以下主題:

  1. 影像轉文字的直覺: 我們將深入探討影像轉文字技術的基本概念和原理。
  2. 光學字元識別(OCR)技術: 詳述OCR的工作原理、其在實際應用中的優點和挑戰。
  3. 影像轉文字的實作: 介紹如何使用現代的AI和電腦視覺技術實作影像轉文字功能。
  4. 應用案例: 探討影像轉文字技術在各個領域的具體應用,包括教育、商業和娛樂等。

透過本章的學習,你將對影像轉文字技術有更深入的理解,同時掌握如何應用這項技術解決實際問題。

影像文字識別技術

應用場景

影像文字識別(Optical Character Recognition, OCR)是一種將影像中的文字轉換為可編輯的數字文字的技術。它的應用場景廣泛,包括檔案掃描、影像文字提取、手寫體識別等。

根據Tesseract的OCR應用

Tesseract是一種開源的OCR引擎,支援多種語言和字型。使用Python的Tesseract函式庫,可以輕鬆地將影像中的文字識別為可編輯的文字。

根據TensorFlow 2的影像文字識別

TensorFlow 2是一種流行的深度學習框架,可以用於建構影像文字識別模型。透過訓練卷積神經網路模型,可以實作手寫體和英文字元的識別。

影像文字識別的基本步驟

  1. 預處理:影像採集後,需要進行預處理以增強影像品質和準備影像資料。
  2. 文字定位:OCR系統需要定點陣圖像中的文字區域,使用邊緣檢測、連線元件分析或深度學習演算法等技術。
  3. 字元分割:定位文字區域後,OCR系統需要進一步分割每個字元,以便識別。

影像文字識別的應用

影像文字識別技術可以應用於多種領域,包括:

  • 檔案掃描和數位化
  • 影像文字提取和搜尋
  • 手寫體識別和轉換
  • 社交媒體影像文字提取和分析

圖表翻譯:

  flowchart TD
    A[影像採集] --> B[預處理]
    B --> C[文字定位]
    C --> D[字元分割]
    D --> E[識別和轉換]

影像文字識別的流程可以透過Mermaid圖表進行視覺化,展示出每個步驟的邏輯關係和過程。

OCR技術應用與Tesseract引擎

概述

光學字元識別(OCR)是一種能夠將印刷或手寫文字從影像或掃描檔案中提取出來的技術。這項技術在各個領域都有著廣泛的應用,包括檔案數位化、銀行和金融、醫療保健、教育、政府和法律等。

應用領域

  • 檔案數位化:OCR技術可以將紙質檔案轉換為數字格式,減少手動輸入的工作量,提高效率和準確性。
  • 銀行和金融:OCR技術可以提取支票和發票中的訊息,加速支付流程,減少手動錯誤。
  • 醫療保健:OCR技術可以將病人記錄、實驗室報告等醫療檔案數位化,方便醫護人員儲存、查詢和分析病人資料。
  • 教育:OCR技術可以將教科書、課程材料、筆記等教育內容數位化,方便學生和教師使用。
  • 政府:OCR技術可以用於處理護照申請、選民登記等政府檔案,提高處理效率和準確性。
  • 法律:OCR技術可以將法律檔案、法院記錄等數位化,提高法律程式的效率。

Tesseract引擎

Tesseract是一種廣泛使用的OCR引擎,具有多語言支援和高準確性。它是一個免費的開源專案,由Google維護。Tesseract使用深度學習演算法來識別影像中的文字,可以用於各種語言的文字識別。

Tesseract的工作原理

Tesseract的工作原理包括以下幾個步驟:

  1. 影像預處理:對輸入影像進行預處理,包括二值化、降噪和校正傾斜等。
  2. 字元分割:將影像分割為個別字元。
  3. 特徵提取:提取每個字元的特徵,包括筆畫寬度、邊緣方向和曲率等。
  4. 分類別:使用機器學習模型對每個字元進行分類別,將其轉換為機器可讀的文字。

使用Tesseract

使用Tesseract相對簡單,它提供了一個命令列工具,可以透過指定輸入影像和語言來識別文字。Tesseract會分析影像並輸出識別出的文字。

使用Tesseract-OCR進行影像文字識別

Tesseract-OCR是一個強大的光學字元識別引擎,可以將影像中的文字識別出來。它支援多種影像格式,包括PNG、JPEG、BMP、GIF、TIFF等。

安裝Tesseract-OCR

要使用Tesseract-OCR,需要先安裝它。可以使用pip安裝pytesseract,然後安裝Tesseract-OCR引擎。

!pip install pytesseract
!sudo apt install tesseract-ocr

使用pytesseract進行影像文字識別

pytesseract是一個Python函式庫,提供了一個簡單的介面來使用Tesseract-OCR。可以使用以下程式碼來識別影像中的文字:

from PIL import Image
import pytesseract

# 開啟影像
image = Image.open('image.jpg')

# 將影像轉換為灰度圖
image = image.convert('L')

# 使用pytesseract識別影像中的文字
text = pytesseract.image_to_string(image)

# 列印預識別出的文字
print(text)

使用OpenCV進行影像文字識別

OpenCV是一個強大的電腦視覺函式庫,提供了一個簡單的介面來使用Tesseract-OCR。可以使用以下程式碼來識別影像中的文字:

import cv2
import pytesseract

# 開啟影像
image = cv2.imread('image.jpg')

# 將影像轉換為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用pytesseract識別影像中的文字
text = pytesseract.image_to_string(gray)

# 列印預識別出的文字
print(text)

Tesseract-OCR的限制

Tesseract-OCR有一些限制,包括:

  • 如果影像中有噪音、模糊或複雜的背景,識別出的文字可能不準確。
  • 如果文字不清楚,Tesseract-OCR可能會傳回無意義的字元。
  • Tesseract-OCR不支援手寫體文字識別。
  • Tesseract-OCR可能不支援多欄或混合單欄和多欄的文字識別。

圖表翻譯:

  flowchart TD
    A[影像] --> B[灰度轉換]
    B --> C[pytesseract識別]
    C --> D[文字輸出]

內容解密:

上述程式碼使用pytesseract和OpenCV來識別影像中的文字。首先,開啟影像,然後將其轉換為灰度圖。接著,使用pytesseract識別影像中的文字,最後列印預識別出的文字。Tesseract-OCR有一些限制,包括噪音、模糊或複雜的背景,手寫體文字識別等。

使用 TensorFlow 建立 AI 應用程式以讀取影像中的文字

使用 TensorFlow,我們可以從頭開始建立一個 AI 應用程式,以讀取影像中的文字。這個過程涉及使用神經網路模型來識別影像中的文字,包括手寫的英文字母和數字。

資料集的選擇

為了訓練這個模型,我們需要一個包含手寫英文字母和數字的資料集。一個來自 Kaggle 的資料集包含了 A-Z 的手寫英文字母,影像大小為 28x28 畫素,儲存為 CSV 檔案。這個資料集來自 NIST 資料集和其他來源,包含了所有 26 個英文字母的上限格式手寫字母。

下載和準備資料集

要下載這個資料集,請參考以下 URL:alphabets-in-csv-format。下載後,資料集會以 zip 格式儲存。為了在 Colab Notebook 中使用這個檔案,我們需要將其上傳到 Google Drive 中的「data」目錄。

安裝 Google Drive

在第二章中,我們學習瞭如何在 Colab Notebook 中掛載 Google Drive,以便存取 Google Drive 中的檔案。這裡,我們也需要掛載 Google Drive,執行以下程式碼:

drive.mount('/content/gdrive')

然後,切換到「data」目錄,以便直接存取 CSV 檔案:

%cd /content/gdrive/MyDrive/data/

建立和訓練模型

建立和訓練模型的過程包括以下步驟:

  1. 載入必要的函式庫和模組。
  2. 載入和預處理資料集。
  3. 建立神經網路模型。
  4. 訓練模型。
  5. 評估模型的效能。

以下是建立和訓練模型的詳細步驟:

載入必要的函式庫和模組

import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

載入和預處理資料集

import pandas as pd
df = pd.read_csv('alphabets.csv')
X = df.drop('label', axis=1)
y = df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

建立神經網路模型

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(26, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

訓練模型

model.fit(X_train, y_train, epochs=10, batch_size=128, validation_data=(X_test, y_test))

評估模型的效能

test_loss, test_acc = model.evaluate(X_test, y_test)
print(f'Test accuracy: {test_acc:.2f}')

處理壓縮檔案並載入資料

首先,我們需要切換到正確的目錄,然後解壓縮存放在資料目錄中的壓縮CSV檔案。這可以使用Linux的解壓縮命令實作。由於這是一個Linux命令,我們需要在Notebook中使用感嘆號來執行它。

!unzip "A_Z_Handwritten_Data.csv.zip"

載入必要的函式庫

接下來,我們需要載入一些必要的函式庫來進行開發。

import tensorflow as tf
from tensorflow.keras.datasets import mnist
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
import matplotlib.pyplot as plt

我們首先載入了TensorFlow,然後從TensorFlow中載入了MNIST資料集。另外,我們還從scikit-learn函式庫中載入了train_test_splitLabelBinarizer兩個重要的函式。scikit-learn是一個免費且開源的Python函式庫,包含了各種不同的功能,包括資料預處理、清理、機器學習模型建立、模型評估等。

讀取CSV檔案

現在,我們需要讀取CSV檔案。以下是如何做到的:

with open("A_Z_Handwritten_Data.csv") as f:
    file = f.readlines()
    az_images = list()  # 儲存A-Z影像資料(畫素值)

在這段程式碼中,我們開啟了名為"A_Z_Handwritten_Data.csv"的檔案,並讀取了它的所有行。然後,我們建立了一個空列表az_images來儲存A-Z影像資料的畫素值。

內容解密:

這段程式碼的主要目的是讀取CSV檔案並將其內容儲存在一個列表中。這是為了後續的資料處理和模型訓練做準備。透過這個過程,我們可以將CSV檔案中的資料轉換為一個Python列表,方便後續的操作。

圖表翻譯:

  flowchart TD
    A[讀取CSV檔案] --> B[儲存檔案內容]
    B --> C[建立空列表]
    C --> D[儲存A-Z影像資料]

這個流程圖描述了讀取CSV檔案、儲存檔案內容、建立空列表以及儲存A-Z影像資料的過程。這個圖表有助於我們更好地理解程式碼的邏輯和流程。

讀取A-Z手寫字母資料集

首先,我們需要讀取A-Z手寫字母資料集。這個資料集儲存為CSV檔案,每行代表一張手寫字母的影像。影像的畫素值以逗號分隔的形式儲存,第一個值是字母的標籤,其餘的值是影像的畫素值。

import numpy as np

# 初始化列表儲存A-Z手寫字母影像和標籤
az_images = []
az_labels = []

# 開啟CSV檔案並讀取每行
with open('az_dataset.csv', 'r') as file:
    for line in file:
        # 將每行分隔成值
        values = line.split(',')
        
        # 取出標籤和影像畫素值
        az_labels.append(values[0])
        image_data = np.array([int(i) for i in values[1:]]).reshape((28, 28))
        
        # 將影像資料加入列表
        az_images.append(image_data)

讀取MNIST手寫數字資料集

接下來,我們需要讀取MNIST手寫數字資料集。這個資料集包含了手寫數字的影像和對應的標籤。使用Keras的load_data()函式可以輕鬆地載入這個資料集。

from keras.datasets import mnist

# 載入MNIST手寫數字資料集
(digit_train_images, digit_train_labels), (digit_test_images, digit_test_labels) = mnist.load_data()

# 將標籤轉換為字串型別
digit_train_labels = digit_train_labels.astype('str')
digit_test_labels = digit_test_labels.astype('str')

資料集的標籤和影像

在A-Z手寫字母資料集中,標籤是以數值形式給出的,總共有26個可能的值,對應於26個大寫英文字母。在MNIST手寫數字資料集中,標籤也是以數值形式給出的,總共有10個可能的值,對應於0到9的數字。

內容解密:

以上程式碼展示瞭如何讀取A-Z手寫字母資料集和MNIST手寫數字資料集。這些資料集將被用於訓練和測試機器學習模型,以實作手寫字母和數字的識別。瞭解資料集的結構和內容對於設計和訓練有效的模型至關重要。

圖表翻譯:

  graph LR
    A[讀取A-Z手寫字母資料集] --> B[初始化列表儲存影像和標籤]
    B --> C[開啟CSV檔案並讀取每行]
    C --> D[將每行分隔成值]
    D --> E[取出標籤和影像畫素值]
    E --> F[將影像資料加入列表]
    
    G[讀取MNIST手寫數字資料集] --> H[載入MNIST資料集]
    H --> I[將標籤轉換為字串型別]

此圖表展示了讀取A-Z手寫字母資料集和MNIST手寫數字資料集的過程。瞭解這些步驟有助於實作手寫字母和數字的識別。

從技術架構視角來看,本文深入探討了物件偵測、OCR以及影像轉文字等技術的實作細節,涵蓋了從模型選擇、資料處理到效能評估的完整流程。分析段落中,我們比較了不同物件偵測模型的特性,例如YOLO模型需要額外處理NMS,而TensorFlow Hub模型則內建了此功能。同時,文章也點出了Tesseract-OCR在處理噪音、模糊影像以及手寫文字時的限制,並提供了使用OpenCV和TensorFlow 2建構OCR應用的具體步驟和程式碼範例。展望未來,深度學習技術的持續發展將進一步提升OCR和影像轉文字技術的準確性和效率,同時也將催生更多創新的應用場景,例如更精確的醫療影像分析和更人工智慧的檔案處理自動化。玄貓認為,持續關注這些技術的演進,並積極探索其在不同領域的應用,將是未來技術發展的關鍵方向。