發佈日期:

YOLOv8模型訓練:深入解析性能指標與優化策略

在物件偵測領域,YOLOv8作為最新一代的深度學習模型,以其卓越的性能和效率贏得了廣泛關注。本文將深入探討YOLOv8的模型訓練過程,解析關鍵性能指標,並分享優化策略,幫助您更好地掌握這一強大工具。

遷移學習:YOLOv8模型訓練的捷徑

在開始YOLOv8模型訓練之前,我們首先需要了解遷移學習的重要性。遷移學習允許我們利用預訓練模型的知識,大大縮短訓練時間並提高模型性能。對於YOLOv8,我們可以從官方提供的預訓練模型開始,根據自己的數據集進行微調。

from ultralytics import YOLO

# 載入預訓練的YOLOv8模型
model = YOLO('yolov8n.pt')

# 使用自定義數據集進行訓練
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640)

關鍵指標:解讀YOLOv8的性能

在物件偵測任務中,幾個關鍵指標對於評估模型性能至關重要:

  1. IoU (Intersection over Union)
    IoU衡量預測邊界框與真實邊界框的重疊程度,是評估物件偵測準確性的基礎指標。
  2. mAP (mean Average Precision)
    mAP綜合考慮了精確率和召回率,是物件偵測模型整體性能的重要指標。
  3. 精確率 (Precision) 和召回率 (Recall)
    這兩個指標分別反映了模型預測的準確性和完整性,是評估YOLOv8性能的核心指標。

Tensorboard:視覺化YOLOv8訓練過程

為了更直觀地監控YOLOv8模型的訓練過程,我們可以使用Tensorboard這一強大的視覺化工具。Tensorboard能夠實時展示訓練損失、驗證指標等關鍵數據,幫助我們及時調整訓練策略。

# 在訓練命令中添加Tensorboard支持
results = model.train(data='custom_dataset.yaml', epochs=100, imgsz=640, project='YOLOv8_training', name='experiment1')

訓練自定義的YOLOv8模型

以下為官網的一個範例程式

from ultralytics import YOLO

# Load a model
model = YOLO('yolov8n.yaml')  # build a new model from YAML
model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)
model = YOLO('yolov8n.yaml').load('yolov8n.pt')  # build from YAML and transfer weights

# Train the model
results = model.train(data='coco128.yaml', epochs=100, imgsz=640)

範例中三種載入方式的比較

  • model = YOLO(‘yolov8n.yaml’):
    這段代碼使用給定的 YAML 配置文件構建一個新的 YOLO 模型。 YAML 配置文件包含了有關模型架構、層設置、超參數等的信息。通過提供 YAML 文件的路徑,可以創建一個全新的 YOLO 模型。(yaml檔案位於: ultralytics\cfg\models\v8)
  • model = YOLO(‘yolov8n.pt’):
    這段代碼加載一個預訓練的 YOLO 模型,該模型以 PyTorch 的 .pt 文件格式保存。預訓練模型已經在某個數據集上進行了訓練,並且包含了在該數據集上學到的權重。這個過程稱為遷移學習,它可以加快在新數據集上訓練模型的收斂速度,同時保留之前任務的特徵提取能力。
  • model = YOLO(‘yolov8n.yaml’).load(‘yolov8n.pt’):
    這段代碼首先使用給定的 YAML 配置文件構建一個 YOLO 模型,然後從預訓練的 .pt 文件中加載權重,將權重遷移到新構建的模型中。這使您可以根據自己的需求創建模型結構,然後將預訓練模型的權重用於該結構。這種方法允許您根據不同的目標任務進行微調或擴展。

YOLOv8 模型的每個類別中有五個模型

YOLOv8nYOLOv8sYOLOv8mYOLOv8lYOLOv8x
YOLOv8 Nano是最快和最小的,而YOLOv8 Extra Large(YOLOv8x)是最準確但最慢的

YOLOv8 使用了以下預訓練模型:

  • 在 COCO 檢測數據集上訓練的對象檢測,圖像分辨率為 640。
  • 在 COCO 分割數據集上訓練的實例分割,圖像分辨率為 640。
  • 在 ImageNet 數據集上預訓練的圖像分類模型,圖像分辨率為 224。

訓練指標分析

Intersection over Union指標

IoU(Intersection over Union)是一個用於評估目標檢測和分割任務的常用指標。它主要用於衡量預測的目標與實際目標之間的重疊程度。在機器學習和計算機視覺領域中,IoU通常用於衡量模型的預測準確度,特別是在處理像目標檢測、物體定位和分割等任務時。

IoU的計算方式是將預測的目標區域(通常是矩形框或分割區域)與實際目標區域的交集面積除以它們的聯集面積。公式如下:

其中,交集是預測區域和實際區域的重疊部分,聯集是預測區域和實際區域的整體合併部分。

在目標檢測中,當模型預測的目標框與實際目標框之間的IoU值越高,表示模型的預測越準確。通常,當IoU超過一個預定的閾值(例如0.5或0.7)時,可以將該預測視為成功檢測。這種指標可以用於計算Precision-Recall曲線以及平均精度(Average Precision)等性能指標。

在分割任務中,IoU用於衡量模型預測的分割區域與實際分割區域之間的相似度。當分割區域的IoU越高,表示模型的分割結果越準確。

mAP50(B)

mAP50(B) 是指”Mean Average Precision at IoU 0.50 for Large Objects”,意思是在IoU(Intersection over Union,重疊度)為0.50 的情況下,針對較大目標計算的平均精度(AP)值的均值。 mAP 是模型在不同類別上的平均精度值,而 mAP50(B) 是針對較大目標計算的平均精度值。

mAP50-95(B)

mAP50-95(B) 是指 “Mean Average Precision across IoU 0.50 to 0.95 for Large Objects”,意思是在 IoU 從 0.50 到 0.95 範圍內,針對較大目標計算的平均精度值的均值。這個指標更全面地評估了模型在不同重疊度下的性能。

precision(B)

precision(B) 是針對較大目標計算的精確率,即模型在預測中有多少是正確的,相對於所有預測中的正確和錯誤。它是衡量模型預測的準確性的指標之一。

recall(B)

recall(B) 是針對較大目標計算的召回率,即模型正確預測的目標數與實際目標數之比。它表示模型能夠檢測到多少實際目標。召回率是衡量模型識別能力的指標之一。

dfl_loss(Detection Focal Loss)

dfl_loss 是一種在YOLO目標檢測中引入的特殊損失函數,它是基於焦點損失(Focal Loss)的改進。焦點損失的主要目標是應對樣本不平衡問題,即正負樣本比例嚴重失衡。在目標檢測中,負樣本(即不含目標的區域)遠遠多於正樣本(含有目標的區域)。 dfl_loss 試圖通過放大難以分類的正樣本的損失,來應對這種不平衡,從而使模型更關注難以識別的目標。

box_loss(Box Regression Loss)

這是用於衡量預測框位置的損失函數。在目標檢測中,模型不僅要預測目標的類別,還要預測框的位置,即邊界框的中心坐標、寬度和高度。 box_loss 的目標是使模型的位置預測更接近真實目標框的位置。這有助於確保檢測到的框與真實目標框的位置相匹配,從而提高目標定位的準確性。

cls_loss(Class Classification Loss)

cls_loss 用於分類目標的類別。在YOLO中,每個檢測框需要預測它所屬的目標類別。 cls_loss 的作用是確保模型的類別預測盡可能準確。這對於準確地將檢測框與正確的目標類別關聯非常重要,從而實現了目標分類的準確性。

我的tensorborad訓練狀況

這邊深藍色的是使用YOLOv8m.pt做預訓練模型、淺藍色的是使用YOLOv8n,深藍色的跑了2個多小時(100次),淺藍色的因為懶得跑完只做了60幾次。橘色的是別人訓練的歷程。

為什麼自己訓練的結果即使所有資料集都一樣卻有不同的狀況,需要進一步去了解。

發佈日期:

Yolov8 – 物件偵測模型

模型介紹

GitHub位置: https://github.com/ultralytics/ultralytics

官方網站: https://ultralytics.com/

YOLOv8 最初由 Ultralytics 公司的開發人員開發和發布,旨在在目標檢測任務中提供高性能和高效率的解決方案。 基於深度學習和計算機視覺領域的前沿進步而構建,在速度和準確性方面提供無與倫比的性能。其流線型設計使其適用於各種應用程序,並可輕鬆適應從邊緣設備到雲 API 的不同硬件平台。

與之前的 YOLO 版本相比,YOLOv8 引入了一些新的設計思想和技術,以提高模型的精度和速度。它在模型結構、數據增強、網絡設計等方面進行了優化,使得在目標檢測任務中取得了出色的結果。 YOLOv8 不僅可以在通用的目標檢測任務中表現良好,還可以應用於各種應用領域,如自動駕駛、工業檢測、物體識別等。

模型安裝

官方的教學提供了非常明確的指導: https://docs.ultralytics.com/quickstart/

在這邊我選擇了使用pip安裝,只需要打下這一行就可以了

pip install ultralytics

用command line執行的方式如下

yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'

用python執行偵測的方式

from ultralytics import YOLO

# Load a model
model = YOLO("yolov8n.yaml")  # build a new model from scratch
model = YOLO("yolov8n.pt")  # load a pretrained model (recommended for training)

# Use the model
model.train(data="coco128.yaml", epochs=3)  # train the model
metrics = model.val()  # evaluate model performance on the validation set
results = model("https://ultralytics.com/images/bus.jpg")  # predict on an image
path = model.export(format="onnx")  # export the model to ONNX format

官方建議使用的相關工具

建立一個物件偵測模型,需要做標註、影像增強、修改、訓練、佈署,以及將模型整合至使用端的程式。對於這些流程,Yolo提供了很完整的生態鏈去實現這些步驟

支持的任務

自己建立模型

下面是官方網站內一個包含建模、預測、輸出模型的程式碼範例

from ultralytics import YOLO

# Create a new YOLO model from scratch
model = YOLO('yolov8n.yaml')

# Load a pretrained YOLO model (recommended for training)
model = YOLO('yolov8n.pt')

# Train the model using the 'coco128.yaml' dataset for 3 epochs
results = model.train(data='coco128.yaml', epochs=3)

# Evaluate the model's performance on the validation set
results = model.val()

# Perform object detection on an image using the model
results = model('https://ultralytics.com/images/bus.jpg')

# Export the model to ONNX format
success = model.export(format='onnx')

我自己嘗試使用原有的模型訓練新的資料,在訓練過程中,會出現下面這樣的模型訊息

上面那些數值的解釋如下

  • Epoch (迭代輪數): 這是訓練過程中的迭代次數,每次迭代會處理數據集中的一批樣本。
  • GPU_mem (顯存佔用): 顯存是指圖形處理單元(GPU)上的內存,該數字顯示在當前迭代中 GPU 使用了多少顯存。
  • box_loss (框回歸損失): 這是目標檢測模型訓練中的一個損失項,用於優化檢測框的位置。
  • cls_loss (分類損失): 也是目標檢測模型訓練中的損失項之一,用於優化目標的分類預測。
  • dfl_loss (變換損失): 這可能是一種針對目標檢測中檢測框位置變換的損失。
  • Instances (實例數): 在每次迭代中,訓練過程處理的目標實例數量。
  • Size (尺寸): 可能是指輸入圖像的尺寸。
  • Class (類別): 指的是不同的目標類別。
  • Images (圖像數): 在評估模型性能時,所用圖像的數量。
  • Box (框)、P (精確率)、R (召回率): 這些是用於評估目標檢測模型性能的指標。精確率衡量模型在預測為正類的情況下有多少是正確的,召回率衡量模型在所有正類樣本中有多少被正確檢測出來。
  • mAP50、mAP50-95 (平均精確率): 這是在不同閾值下計算的平均精確率。 mAP50 表示在 50% 的 IoU 閾值下的平均精確率,而 mAP50-95 表示在 50% 到 95% 的 IoU 閾值範圍內的平均精確率。

以上圖而言,在第23輪的訓練其精度為48.4%,F1召回率為59%

處理圖片大小的不一致

YOLO原本建模時所使用的是COCO的資料集,在這個資料集裡面,圖片的長、寬皆為640px,但是實際上我們應用上所使用的圖片很可能並不是640×640的尺寸,這時候就要先對圖片做處理。

如果只是要做預測,可以直接使用resize_with_pad來對圖片做縮放,這個函數可以保持長寬比相同且不失真,將圖像大小調整為目標寬度和高度。如果目標尺寸與圖像尺寸不匹配,則會調整圖像大小,然後用零填充以匹配請求的尺寸。

但對於訓練,您還需要相應地調整邊界框的大小和填充邊界框,這並非易事。
這是如何完成此操作的示例https://nbviewer.jupyter.org/github/aleju/imgaug-doc/blob/master/notebooks/B02%20-%20Augment%20Bounding%20Boxes.ipynb

以下為幾個主要手法:

  • 調整輸入尺寸:你可以將攝像機圖像調整為與 YOLO 模型訓練時使用的正方形尺寸相匹配。這可能會導致圖像在寬度或高度上出現一些留白,但能夠與模型兼容。
  • 圖像裁剪:將攝像機圖像進行裁剪,以適應 YOLO 模型所需的正方形尺寸。你可以從圖像的中心或其他感興趣的區域進行裁剪,以確保包含重要的目標信息。
  • 填充:如果圖像的長寬比與模型所需的正方形尺寸不匹配,你可以在圖像的較短邊或較長邊添加填充,使其達到正方形尺寸。填充可以使用一些背景顏色或內容進行填充,以保持圖像比例。
  • 訓練新模型:如果你的攝像機圖像尺寸與標準的 YOLO 輸入尺寸差異較大,並且以上方法不適用,你可能需要考慮訓練一個新的 YOLO 模型,以適應你的攝像機圖像尺寸。這樣可以確保模型在不同尺寸的圖像上都有良好的性能。

無論你選擇哪種方法,都需要注意到調整輸入尺寸可能會對模型性能產生影響,特別是在目標檢測任務中。你可能需要在實際場景中進行測試和調整,以找到最適合你應用的方法。

發佈日期:

PyTorch於Mac系統下的安裝教學

環境架設

相關教學文章: https://github.com/pytorch/pytorch

首先,PyTorch需要 Python 3.8.1以上的環境,先安裝Anaconda,接著設定一個虛擬環境使用py3.8.1

conda create -n aia16 python=3.8.1
conda activate aia16

切換到新創建的環境之後,就依照下面的步驟下載PyTorch

git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
# if you are updating an existing checkout
git submodule sync
git submodule update --init --recursive

編譯PyTorch

當你運行python setup.py develop來安裝PyTorch(或任何其他Python套件)時,這個命令的目的是在”開發模式”下安裝該套件。這意味著源代碼的更改會立即反映到Python環境中,無需重新安裝。

但是對於像PyTorch這樣的大型項目,這個過程可能會變得相對緩慢。如果你只是想試用PyTorch而不是開發它,那麼通常建議直接從官方渠道安裝預編譯的版本,這樣會快得多。(可以跳過此步驟)

安裝編譯所需工具

conda install cmake ninja
# Run this command from the PyTorch directory after cloning the source code using the “Get the PyTorch Source“ section below
pip install -r requirements.txt
# Add this package on intel x86 processor machines only
conda install mkl mkl-include
# Add these packages if torch.distributed is needed
conda install pkg-config libuv

開始編譯

python3 setup.py develop

直接安裝PyTorch

使用預編譯的二進制檔案安裝PyTorch是相對簡單的。以下是使用pip或conda安裝PyTorch的方法:

使用pip安裝

pip install torch torchvision

使用conda安裝

conda install pytorch torchvision -c pytorch

下載第一個測試專案

https://github.com/pytorch/ios-demo-app

首先要先安裝依賴管理套件cocoapods,安裝指令如下:

sudo gem install cocoapods

cocoapods安裝失敗解決方法

https://stackoverflow.com/questions/69460048/unable-to-install-cocoapods-in-macos-monterey-version-12-0-beta-xcode-13-013a

用homebrew安裝

brew install cocoapods

安裝依賴項

先把目錄切到有PodFile的位置,然後下指令

pod install
發佈日期:

Tensorflow.js的coco-ssd對象檢測

官方教程

教程網址: https://github.com/tensorflow/tfjs-models/tree/master/coco-ssd

目標檢測模型,旨在定位和識別單個圖像中的多個目標。

該模型是 COCO-SSD 模型的 TensorFlow.js 移植。有關 Tensorflow 對象檢測 API 的更多信息,請查看 tensorflow/object_detection中的自述文件。

該模型檢測 COCO 數據集中定義的對象,這是一個大規模的對象檢測、分割和字幕數據集。您可以在這裡找到更多信息。該模型能夠檢測80 類物體。(SSD 代表單次多盒檢測)。

此 TensorFlow.js 模型不需要您了解機器學習。它可以將輸入作為任何基於瀏覽器的圖像元素(例如<img><video><canvas> 元素),並返回帶有類名稱和置信度的邊界框數組。

<!-- Load TensorFlow.js. This is required to use coco-ssd model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
<!-- Load the coco-ssd model. -->
<script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"> </script>

<!-- Replace this with your image. Make sure CORS settings allow reading the image! -->
<img id="img" src="cat.jpg"/>

<!-- Place your code in the script tag below. You can also use an external .js file -->
<script>
  // Notice there is no 'import' statement. 'cocoSsd' and 'tf' is
  // available on the index-page because of the script tag above.

  const img = document.getElementById('img');

  // Load the model.
  cocoSsd.load().then(model => {
    // detect objects in the image.
    model.detect(img).then(predictions => {
      console.log('Predictions: ', predictions);
    });
  });
</script>

讀取攝像機

以下為一個簡單讀取攝像機並且作物件偵測的程式範例

<!doctype html>
<html>

<head>
  <meta charset="utf-8">
  <title>Test</title>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs"> </script>
  <script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/coco-ssd"> </script>
</head>

<body>
  <div class="select">
    <label for="videoSource">Video source: </label><select id="videoSource"></select>
  </div>
  <button id="showVideo">Open camera</button>
  <br />
  <!-- Video element to capture camera input -->
  <video id="video" autoplay playsinline style="position: absolute;z-index: -999;"></video><canvas id="canvas"
    width="100%"></canvas>
  <div id="message"></div>
  <script>
    const video = document.getElementById('video');
    const canvas = document.getElementById('canvas');
    const ctx = canvas.getContext('2d');
    document.querySelector('#showVideo').addEventListener('click', e => init(e));
    const videoSelect = document.querySelector('select#videoSource');
    function gotDevices(deviceInfos) {
      console.log(deviceInfos)
      deviceInfos.forEach(deviceInfo => {
        if (deviceInfo.kind == "videoinput") {
          const option = document.createElement('option');
          option.value = deviceInfo.deviceId;
          option.text = deviceInfo.label || `camera ${videoSelect.length + 1}`;
          videoSelect.appendChild(option);
        }
      });
    }
    function gotStream(stream) {
      window.stream = stream; // make stream available to console
      videoElement.srcObject = stream;
      // Refresh button list in case labels have become available
      return navigator.mediaDevices.enumerateDevices();
    }
    window.onload = () => {

      navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(handleError);
      const constraints = {
        audio: { deviceId: audioSource ? { exact: audioSource } : undefined },
        video: { deviceId: videoSource ? { exact: videoSource } : undefined }
      };
      navigator.mediaDevices.getUserMedia(constraints).then(gotStream).then(gotDevices).catch(handleError);
    }


    function getRandomColor() {
      const randomColor = Math.floor(Math.random() * 16777215).toString(16);
      return "#" + ("000000" + randomColor).slice(-6);
    }
    function handleSuccess(stream) {
      const videoTracks = stream.getVideoTracks();
      var predictions = [];
      video.srcObject = stream;
      // When the video is playing, draw it on the canvas
      video.addEventListener('play', () => {
        canvas.width = video.videoWidth;
        canvas.height = video.videoHeight;
        // Continuously draw the video frames on the canvas
        function drawFrame() {
          // Draw the video frame on the canvas
          ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
          const scaleX = canvas.width / video.videoWidth;
          const scaleY = canvas.height / video.videoHeight;

          // Draw the bounding boxes on the canvas
          predictions.forEach(prediction => {
            const x = prediction.bbox[0] * scaleX;
            const y = prediction.bbox[1] * scaleY;
            const width = prediction.bbox[2] * scaleX;
            const height = prediction.bbox[3] * scaleY;

            ctx.strokeStyle = 'blue';
            ctx.lineWidth = 2;
            ctx.strokeRect(x, y, width, height);

            ctx.fillStyle = 'blue';
            ctx.font = '18px Arial';
            ctx.fillText(prediction.class, x, y);
          });
          // Call the drawFrame function again to continuously update the canvas
          requestAnimationFrame(drawFrame);
        }

        // Start drawing video frames
        drawFrame();
        // Load the model.
        cocoSsd.load().then(model => {
          function detectFrame() {
            // detect objects in the image.
            model.detect(video).then(preds => {
              predictions = preds
              setTimeout(detectFrame, 100);
            });
          }
          detectFrame()
        });
      });
    }

    function handleError(error) {
      if (error.name === 'OverconstrainedError') {
        const v = constraints.video;
        alert(`The resolution ${v.width.exact}x${v.height.exact} px is not supported by your device.`);
      } else if (error.name === 'NotAllowedError') {
        alert('Permissions have not been granted to use your camera and ' +
          'microphone, you need to allow the page access to your devices in ' +
          'order for the demo to work.');
      }
      alert(`getUserMedia error: ${error.name}`, error);
    }

    async function init(e) {
      try {
        const stream = await navigator.mediaDevices.getUserMedia({ audio: false, video: { deviceId: videoSelect.value ? { exact: videoSelect.value } : undefined } });
        handleSuccess(stream);
        e.target.disabled = true;
      } catch (e) {
        handleError(e);
      }
    }
  </script>
</body>

</html>

執行成果

以下為範例執行程式: https://claire-chang.com/wp-content/uploads/2023/08/sample.html

要開啟鏡頭權限需要至網站設定開啟權限

發佈日期:

TensorFlow目標檢測API – 訓練自己的資料

安裝labelImg來標記物件

到GitHub官網上面可以下載release的版本

下載網址labelImg

labelImg操作介面

準備訓練用資料集

以下是一個基本步驟:

  1. 資料準備:準備你的圖像和標籤,並將其轉換成適合 TensorFlow 模型訓練的格式。這通常是使用 TensorFlow 的 TFRecord 格式。如果你的資料不是這種格式,你可以使用 TensorFlow 的 tf.Example 類別來轉換它。你需要為每個圖像創建一個 tf.Example,該例包含圖像數據以及每個目標的邊界框和類別。
  2. 下載並選擇模型:從 TensorFlow Object Detection API 的 模型 zoo 下載 SSD MobileNet V2 FPNLite 640×640。這是一個已經在 COCO 數據集上預訓練的模型,可以用來微調。
  3. 修改配置文件:每個模型都附帶一個配置文件(pipeline.config),它定義了訓練過程中使用的各種參數。例如,它指定了模型架構,輸入尺寸,訓練策略等等。你需要修改這個配置文件以適應你的資料。例如,你需要更改 num_classes 參數以反映你的資料中的類別數量,並且需要更改 input_pathlabel_map_path 參數以指向你的訓練和驗證數據。
  4. 訓練模型:然後,你可以使用 TensorFlow Object Detection API 的 model_main_tf2.py 腳本來訓練你的模型。你需要將 pipeline_config_path 參數設置為你的配置文件的位置,並將 model_dir 參數設置為你希望保存訓練模型的位置。
  5. 評估模型:在訓練過程中和訓練完成後,你應評估模型的性能。這也可以使用 model_main_tf2.py 腳本來完成,只需將 checkpoint_dir 參數設置為包含你的訓練模型檢查點的目錄。
  6. 導出模型:一旦你對模型的性能滿意,你可以使用 exporter_main_v2.py 腳本將其導出為用於推理的圖模型。

將圖片和標籤轉換成TFRecord格式

以下為一個範例程式

import os
import tensorflow as tf
from object_detection.utils import dataset_util, label_map_util

# 適應你的標籤。標籤字典應該映射類別名稱到整數ID。
labels_path = 'path_to_your_labels.pbtxt'
label_map = label_map_util.load_labelmap(labels_path)
categories = label_map_util.convert_label_map_to_categories(label_map, max_num_classes=90)
category_index = label_map_util.create_category_index(categories)

def create_tf_example(image_path, annotations_list):
    # 從圖像檔案讀取數據並將其轉換為tf.Example。

    img_data = tf.io.gfile.GFile(image_path, 'rb').read()
    img = Image.open(image_path)
    width, height = img.size

    filename = image_path.encode('utf8')
    image_format = b'jpeg'  # or b'png'

    xmins = []  # List of normalized left x coordinates in bounding box (1 per box)
    xmaxs = []  # List of normalized right x coordinates in bounding box (1 per box)
    ymins = []  # List of normalized top y coordinates in bounding box (1 per box)
    ymaxs = []  # List of normalized bottom y coordinates in bounding box (1 per box)
    classes_text = []  # List of string class name of bounding box (1 per box)
    classes = []  # List of integer class id of bounding box (1 per box)

    for ann in annotations_list:
        xmins.append(float(ann['xmin']) / width)
        xmaxs.append(float(ann['xmax']) / width)
        ymins.append(float(ann['ymin']) / height)
        ymaxs.append(float(ann['ymax']) / height)
        classes_text.append(ann['class'].encode('utf8'))
        classes.append(category_index[ann['class']]['id'])

    tf_example = tf.train.Example(features=tf.train.Features(feature={
        'image/height': dataset_util.int64_feature(height),
        'image/width': dataset_util.int64_feature(width),
        'image/filename': dataset_util.bytes_feature(filename),
        'image/source_id': dataset_util.bytes_feature(filename),
        'image/encoded': dataset_util.bytes_feature(img_data),
        'image/format': dataset_util.bytes_feature(image_format),
        'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
        'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
        'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
        'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
        'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
        'image/object/class/label': dataset_util.int64_list_feature(classes),
    }))
    return tf_example

writer = tf.io.TFRecordWriter('path_to_output.tfrecord')

# 適應你的圖像路徑和標籤。
images_path = 'path_to_your_images'
annotations_path = 'path_to_your_annotations'

for image_file in os.listdir(images_path):
    image_path = os.path.join(images_path, image_file)
    annotation_path = os.path.join(annotations_path, image_file.replace('.jpg', '.xml'))

    # 讀取標籤檔案並解析標籤。你可能需要根據你的標籤格式調整這個。
    with open(annotation_path) as f:
        annotation_xml = f.read()
    annotations = parse_annotations(annotation_xml)  # 這個函數根據你的標籤格式。

    tf_example = create_tf_example(image_path, annotations)
    writer.write(tf_example.SerializeToString())

writer.close()

準備分類設定檔案*.pbtxt

接著上面會產出path_to_output.tfrecord這個檔案,到object detection裡新建一個資料夾,把path_to_output.tfrecord丟進去。

接著,修改mscoco_label_map.pbtxt(可在\models\research\object_detection\data找到此檔案),檔案內容如下:

item {
  name: "/m/01g317"
  id: 1
  display_name: "person"
}
item {
  name: "/m/0199g"
  id: 2
  display_name: "bicycle"
}
item {
  name: "/m/0k4j"
  id: 3
  display_name: "car"
}
...

這邊的/m/01g317是一個在Google Knowledge Graph中的專屬識別碼(獨特的標籤),用來代表特定的實體或概念。在這裡,/m/01g317是代表”person”(人)這個概念的識別碼。

Google Knowledge Graph是一個大型的知識庫,由Google建立和維護,用來增強其搜索引擎的搜索結果,提供更準確和詳細的資訊。它儲存了數以億計的物件和實體以及他們之間的連結。每個物件或實體都被分配一個獨特的ID,這就是這裡提到的/m/01g317

在訓練物體檢測模型時,這些識別碼會被用於表示各種可以識別的物體或實體。例如,在你給出的配置中,/m/01g317被指定為表示”person”。

如果你是在自己的專案中,並且與Google Knowledge Graph無關,那麼可以自由地創建你自己的類別標籤或ID。例如,你可以簡單地使用數字(如1,2,3等)或有意義的名稱作為你的類別標籤。在你給出的配置項中,只需要確保每個類別的nameid是唯一的,並且display_name清楚地表示了該類別的含義。

於pipeline.config指定資料集的位置

pipeline.config檔案中,你將會找到兩個主要的部分,分別代表訓練和驗證數據集,它們的名稱通常為 train_input_readereval_input_reader

例如

model {
  // Model settings go here
  ...
}

train_config {
  // Training settings go here
  ...
}

train_input_reader: {
  tf_record_input_reader {
    input_path: "path_to_train.tfrecord"
  }
  label_map_path: "path_to_label_map.pbtxt"
}

eval_config {
  // Evaluation settings go here
  ...
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "path_to_eval.tfrecord"
  }
  label_map_path: "path_to_label_map.pbtxt"
}

在這個配置檔案中,path_to_train.tfrecordpath_to_eval.tfrecord 是你的訓練和驗證TFRecord檔案的路徑。你需要將這些路徑換成你的TFRecord檔案的實際路徑。

路徑path_to_train.tfrecordpath_to_label_map.pbtxt通常是指向文件系统上的絕對路徑,不是相對於pipeline.config文件的相對路徑。

例如,如果你的訓練TFRecord文件位於/home/user/dataset/train.tfrecord,你應該這樣設置:

train_input_reader: {
  tf_record_input_reader {
    input_path: "/home/user/dataset/train.tfrecord"
  }
  label_map_path: "/path_to/your_label_map.pbtxt"
}

train_input_readereval_input_reader分別用於指定訓練數據和評估數據的路徑。這些數據通常是標註過的圖像,已經被轉化為TFRecord格式。

使用自訂資料集進行訓練

訓練模型的指令:

python models/research/object_detection/model_main_tf2.py \
    --pipeline_config_path=path_to_your_pipeline.config \
    --model_dir=path_to_output_model_dir \
    --alsologtostderr
發佈日期:

TensorFlow目標檢測API – 程式使用範例

事前作業

先在這一篇選定想要使用的模型,然後下載後解壓縮在專案的資料夾內,然後參考這篇文章設定環境: TensorFlow 的目標檢測API – 設定環境

程式實作範例

這個範例需要一個攝影機,使用的是SSD MobileNet V2 FPNLite 640×640的預設資料集

import numpy as np
import tensorflow as tf
import VideoStream
import cv2

from object_detection.utils import label_map_util

# 載入模型
PATH_TO_SAVED_MODEL = "./ssd_mobilenet/saved_model"
# 載入模型
detect_fn = tf.saved_model.load(PATH_TO_SAVED_MODEL)

# 載入標籤
PATH_TO_LABELS = './models/research/object_detection/data/mscoco_label_map.pbtxt'
category_index = label_map_util.create_category_index_from_labelmap(PATH_TO_LABELS, use_display_name=True)

import time

# 設定攝影機
videostream = VideoStream.VideoStream((1920, 1080), 30, 0).start()
cam_quit = 0
while cam_quit == 0:
    imageSource = videostream.read()
    smallImg = cv2.resize(imageSource, (1920//5, 1080//5))
    input_tensor = np.expand_dims(smallImg, 0)
    start_time = time.time()
    detections = detect_fn(input_tensor)
    end_time = time.time()
    num_detections = int(detections.pop('num_detections'))
    elapsed_time = end_time - start_time
    print('Done! Took {} seconds'.format(elapsed_time))
    detections = {key: value[0, :num_detections].numpy()
                  for key, value in detections.items()}
    for detection_boxes, detection_classes, detection_scores in \
            zip(detections['detection_boxes'], detections['detection_classes'], detections['detection_scores']):
        if detection_scores > 0.3:
            y_min_pixel = int(detection_boxes[0] * 1080)
            x_min_pixel = int(detection_boxes[1] * 1920)
            y_max_pixel = int(detection_boxes[2] * 1080)
            x_max_pixel = int(detection_boxes[3] * 1920)
            cv2.rectangle(imageSource, (x_min_pixel, y_min_pixel), (x_max_pixel, y_max_pixel), (255, 0, 0), 2)
    cv2.imshow('frame', imageSource)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        cam_quit = 1

cv2.destroyAllWindows()
videostream.stop()

執行的速度很不錯,一秒可以有25FPS,適合用於實時串流

執行的畫面如下,因為懶惰所以還沒有把標記的label標上去,若想要標記,可直接使用detections['detection_classes']作為分類的index,從category_index去取分類名稱

發佈日期:

TensorFlow目標檢測API – 功能介紹

YOLO並沒有含在TF2內建的Object Detection API

TensorFlow Object Detection API 提供了在COCO 2017 數據集上預訓練的檢測模型集合 。有多種類型的模型,包括 CenterNet,EfficientDet,SSD,Faster R-CNN 和 Mask R-CNN 等。

每個模型都有其特點:

  • CenterNet:是一種基於關鍵點檢測的目標檢測算法,它使用特定的關鍵點(例如物體的中心點)進行檢測,可以用於處理各種大小的物體,並且可以輸出更豐富的目標信息(如姿態,關鍵點等)。
  • EfficientDet:是一種基於 EfficientNet 和 BiFPN 的目標檢測算法,其優點在於精度高並且效率也相當高,模型大小和計算量都相對較小。
  • SSD (Single Shot MultiBox Detector):是一種用於實時目標檢測的算法,其特點是速度快,適用於需要實時響應的情況。
  • Faster R-CNN:是一種基於區域提議網絡(RPN)的目標檢測算法,其精度很高,但速度相對較慢。
  • Mask R-CNN:是一種擴展了 Faster R-CNN,能進行實例分割(Instance Segmentation)的算法,即除了檢測目標之外,還可以輸出目標的像素級別的掩碼。

然而,YOLO (You Only Look Once) 並沒有在這個列表中。 YOLO 是一種非常流行的實時目標檢測系統,以其快速和精確而著名。 YOLO 的預訓練模型並不在 TensorFlow Hub 提供,但你可以在 YOLO 的官方網站或者 Github 倉庫找到相關的預訓練模型和代碼(https://github.com/yyccR/yolov5_in_tf2_keras)。

如果你有特定的需求,例如對速度,精度,或者是特定類型的任務(例如實例分割或者姿態估計)有特殊的需求,可根據這些需求來選擇合適的模型。目前YOLO在PyTorch的支持進度比較快,到筆者這篇文章時,TF2對YOLO的支持只到yolov5。

包含的物件檢測模型列表

在這邊Speed越低代表速度越快,因為目標網址的CORSS DOMAIN的問題,要下載會需要按右鍵儲存網址然後到新視窗貼上才可以下載

Model nameSpeed (ms)COCO mAPOutputs
CenterNet HourGlass104 512×5127041.9Boxes
CenterNet HourGlass104 Keypoints 512×5127640.0/61.4Boxes/Keypoints
CenterNet HourGlass104 1024×102419744.5Boxes
CenterNet HourGlass104 Keypoints 1024×102421142.8/64.5Boxes/Keypoints
CenterNet Resnet50 V1 FPN 512×5122731.2Boxes
CenterNet Resnet50 V1 FPN Keypoints 512×5123029.3/50.7Boxes/Keypoints
CenterNet Resnet101 V1 FPN 512×5123434.2Boxes
CenterNet Resnet50 V2 512×5122729.5Boxes
CenterNet Resnet50 V2 Keypoints 512×5123027.6/48.2Boxes/Keypoints
CenterNet MobileNetV2 FPN 512×512623.4Boxes
CenterNet MobileNetV2 FPN Keypoints 512×512641.7Keypoints
EfficientDet D0 512×5123933.6Boxes
EfficientDet D1 640×6405438.4Boxes
EfficientDet D2 768×7686741.8Boxes
EfficientDet D3 896×8969545.4Boxes
EfficientDet D4 1024×102413348.5Boxes
EfficientDet D5 1280×128022249.7Boxes
EfficientDet D6 1280×128026850.5Boxes
EfficientDet D7 1536×153632551.2Boxes
SSD MobileNet v2 320×3201920.2Boxes
SSD MobileNet V1 FPN 640×6404829.1Boxes
SSD MobileNet V2 FPNLite 320×3202222.2Boxes
SSD MobileNet V2 FPNLite 640×6403928.2Boxes
SSD ResNet50 V1 FPN 640×640 (RetinaNet50)4634.3Boxes
SSD ResNet50 V1 FPN 1024×1024 (RetinaNet50)8738.3Boxes
SSD ResNet101 V1 FPN 640×640 (RetinaNet101)5735.6Boxes
SSD ResNet101 V1 FPN 1024×1024 (RetinaNet101)10439.5Boxes
SSD ResNet152 V1 FPN 640×640 (RetinaNet152)8035.4Boxes
SSD ResNet152 V1 FPN 1024×1024 (RetinaNet152)11139.6Boxes
Faster R-CNN ResNet50 V1 640×6405329.3Boxes
Faster R-CNN ResNet50 V1 1024×10246531.0Boxes
Faster R-CNN ResNet50 V1 800×13336531.6Boxes
Faster R-CNN ResNet101 V1 640×6405531.8Boxes
Faster R-CNN ResNet101 V1 1024×10247237.1Boxes
Faster R-CNN ResNet101 V1 800×13337736.6Boxes
Faster R-CNN ResNet152 V1 640×6406432.4Boxes
Faster R-CNN ResNet152 V1 1024×10248537.6Boxes
Faster R-CNN ResNet152 V1 800×133310137.4Boxes
Faster R-CNN Inception ResNet V2 640×64020637.7Boxes
Faster R-CNN Inception ResNet V2 1024×102423638.7Boxes
Mask R-CNN Inception ResNet V2 1024×102430139.0/34.6Boxes/Masks
ExtremeNet (deprecated)Boxes
ExtremeNetBoxes

我所選擇的模型

以我的需求而言,我會需要偵測即時串流內的物件,因此需要高速的演算法,我選擇了SSD,官方API內也包含了多個不同的SSD變種和不同的基礎模型(例如 MobileNet 和 ResNet)。這些模型的主要區別在於其複雜性、精度和運行速度:

  1. MobileNet 是一種針對移動和嵌入式設備設計的輕量級深度卷積神經網絡。相比於 ResNet,MobileNet 通常具有更少的參數和計算量,從而在設備上運行速度更快,但可能在精度上稍遜一籌。 MobileNet 的版本 V1 和 V2 是其結構上的不同版本,V2 通常在性能上優於 V1。
  2. FPN (Feature Pyramid Network) 是一種目標檢測模型中常用的模塊,它能幫助模型更好地處理不同尺度的物體。使用了 FPN 的模型通常在處理小物體上有更好的表現。 FPNlite 是 FPN 的一個更輕量級的版本。
  3. ResNet (Residual Network) 是一種深度卷積神經網絡,相比於 MobileNet,ResNet 的模型更深,參數和計算量更大,但在精度上通常更好。 ResNet 的版本(例如 ResNet50, ResNet101, ResNet152)指的是網絡的深度,數字越大,模型越深,通常精度越高,但計算量也越大。
  4. RetinaNet 是一種目標檢測模型,它是基於 FPN 和 ResNet 的一種網絡,其特點是使用了一種新的損失函數(Focal Loss)來解決類別不平衡的問題,對於包含大量背景和少量物體的圖像有很好的性能。

最後我決定使用SSD MobileNet V2 FPNLite 640x640

使用預訓練的物件偵測模型

SSD MobileNet V2 FPNLite 640x640在這邊下載: http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_fpnlite_640x640_coco17_tpu-8.tar.gz

解壓縮後可以看到以下檔案

  1. pipeline.config: 此文件包含了模型訓練過程中所有的配置參數,包括使用的模型類型(例如 Faster R-CNN,SSD 等),輸入圖像的大小,學習率,批量大小等。當您選擇一個預訓練模型進行微調(fine-tuning)時,這個 pipeline.config 文件通常會包含在下載的模型文件夾中。
  2. checkpoint: 此文件(或者一組文件)保存了模型的權重。在訓練過程中,TensorFlow 會定期保存模型的權重到 checkpoint 文件中,以便在訓練中斷後可以恢復訓練,或者在訓練結束後使用訓練好的模型進行預測。
  3. saved_model裡面是saved_model.pb 文件,這個文件包含了模型的結構和參數。

下面的方法可以用saved_model.pb產生checkpoint

import tensorflow as tf
from tensorflow.python.framework import graph_io
from tensorflow.python.tools import freeze_graph
from tensorflow.tools.graph_transforms import TransformGraph

# 載入模型
loaded = tf.saved_model.load(PATH_TO_SAVED_MODEL)

# 將模型的權重保存為 checkpoint
ckpt = tf.train.Checkpoint(model=loaded)
ckpt.save(PATH_TO_CKPT)

發佈日期:

TensorFlow 目標檢測API – 設定環境

相關教學資源

在Python安裝object_detection

我是在Windows的環境做開發,而官網的教學的環境是Linux,所以相關工具的安裝有花了一些時間,在這邊分享一下我的安裝方式

以下為Linux環境的工具安裝指令

sudo apt install -y protobuf-compiler
cd models/research/
protoc object_detection/protos/*.proto --python_out=.
cp object_detection/packages/tf2/setup.py .
python -m pip install .

大概就是要安裝protobuf,接著下載TensorFlows Model,然後把model放到你要呼叫Object Detection的程式目錄的下方 ,在這邊我執行python -m pip install .時,會一直出現如下錯誤

ERROR: Could not build wheels for opencv-python, which is required to install pyproject.toml-based projects

查了一下網路文章,大概猜到是python版本和opencv版本還有tensorflow版本有所不合,所以到官方網站看一下安裝所需要的環境需求如下,不同版本的Tensorflow所要搭配使用的OpenCV、Python的版本都不同:

最後我是使用python3.7的環境,才成功的安裝好object_detection

conda create -n object_detection python=3.7.16
conda activate object_detection
cd models/research/
python -m pip install .

安裝protobuf工具

在 Windows 上,可以通過以下步驟安裝 protobuf 編譯器:

  • 下載安裝包: 訪問 protobuf 的 GitHub Release 頁面(https://github.com/protocolbuffers/protobuf/releases),找到適用於 Windows 的預編譯二進製文件(例如 protoc-3.x.x-win64.zip)並下載到本地。
  • 解壓縮文件: 將下載的 zip 文件解壓縮到你想要安裝的位置,例如解壓縮到 C:\protobuf 文件夾。
  • 設置環境變量: 將解壓縮後的 bin 文件夾路徑添加到系統的環境變量中,這樣系統就能在任意位置找到 protoc 命令。
  • 驗證安裝: 打開命令提示符視窗,運行protoc --version,檢查 protoc 是否成功安裝。

安裝完成之後,就可以在./models/research下面執行

protoc object_detection/protos/*.proto --python_out=.

接著就可以用下面指令進行測試

python object_detection/builders/model_builder_tf2_test.py

如果沒有把*.proto編譯成.py,在執行物件偵測的程式碼時會出現以下錯誤

from object_detection.protos import string_int_label_map_pb2

ImportError: cannot import name ‘string_int_label_map_pb2

其他遇到的錯誤

DLL載入錯誤

import _ssl # if we can’t import it, let the error propagate

ImportError: DLL load failed: The specified module could not be found.

討論串: Python 3.7 anaconda environment – import _ssl DLL load fail error

解法: From anaconda3\Library\bin copy below files and paste them in anaconda3/DLLs:

setup.cfg指令過期錯誤

site-packages\setuptools\config\setupcfg.py:293: _DeprecatedConfig: Deprecated config in `setup.cfg`

AttributeError: module ‘os’ has no attribute ‘add_dll_directory’

解法: python環境和套件之間版本不合,重新檢查套件版本是否符合官網要求

以下為我最終使用的環境的套件版本清單:

發佈日期:

人工智慧之於微軟的想法

對AI產業趨勢的觀查

微軟台灣區總經理卞志祥是財務工程和電腦工程的跨界,從新創到外商這樣走,因此他就是擅長電腦工程和產業的分析。他說『很少看到一個科技,是短短三到六個月之間從談論到變成每一個公司廣泛被討論的一個課題,尤其是在企業高層的廣泛討論』

產業的領導者很專注於這一個產業的變革,討論的主題不是技術而是商業模式,所以過去六個月就是不斷的和產業先進去學習一些DOMAIN KNOW HOW

2023年是一個高度不確定性的年代,也就是在這樣的年代之中,危機同時也就會帶有轉機,因為在每一次在全球地緣邊境的變動,會創造出很多變動中產出的WINNER和LOSER。例如:賽車時,要在大晴天之中想要在落後的前提下,超越很多專業車手,是非常困難的,而在大雨天才很有可能有這樣的機會。

產業改變得非常非常的快,並且驅動這個轉型的原因變得非常非常的多元,適應改變的速度會是未來決定一切非常重要的關鍵點

AI核心能力

  1. 摘要生成(Summary Generation):AI能夠通過自然語言處理和機器學習技術,從文本中提取關鍵信息並生成簡潔的摘要。這項技術對於處理大量文本數據、提供快速概覽和自動化報告具有重要意義。
  2. 網絡聲量的正負評判斷(Sentiment Analysis of Web Volumes):AI能夠分析網絡上的大量文本數據,並判斷其中的情感傾向,例如正向、負向或中性。這對於企業監測品牌聲譽、分析消費者反饋等具有價值。
  3. 文章意圖情緒判斷(Intent and Emotion Analysis of Articles):AI可以分析文章的內容,並判斷其中的意圖和情緒。這有助於理解作者的目的和觀點,以及文章所傳達的情感色彩,從而提供更深入的理解和洞察。

高度賦能員工,改變與客戶互動的方式,優化流程。做的到這三件事情就有可能去實現你產品的新的機會

BING和CHATGPT的不同

CHATGPT是一個已建模完成的模型,且其資料停在2021年

BING會有一個關鍵字前處理的狀況,會先去網路找相關資料,然後會把資料輸入模型去產生結果,也因為這樣,Bing會有較高的正確性,因為在前處理的部份的搜尋動作,可以增加回應的正確性。

ChatGPT模型架構

CHATGPT在其內部架構中使用了Embedding model。Embedding model在CHATGPT中用於將輸入文本轉換為連續向量表示,以便進一步處理和生成回應。

在CHATGPT中,文本序列首先被轉換為一系列的詞嵌入(Word Embeddings),詞嵌入是將單詞映射為連續向量表示的技術。這些詞嵌入向量在模型內部被用作輸入特徵,以捕捉單詞的語義和上下文信息。通過使用詞嵌入,CHATGPT可以將輸入文本轉換為數字化的連續向量表示,以供模型進一步處理。

Embedding model在CHATGPT中的使用有助於提取和表示輸入文本的含義和特徵,並為模型提供適當的表徵。這樣,模型可以更好地理解和生成合適的回應。

不過CHATGPT不僅僅依賴於Embedding model,它是基於Transformer架構的深度學習模型。Transformer模型的主要組件包括多層的自注意力機制和前饋神經網絡,以實現高效的序列建模和生成。

Embedding model的後續能力很強,因為這些連續向量表示可以應用於多種機器學習和深度學習任務中,提供了強大的特徵表達能力。

Embedding model的後續能力包括:

  1. 特徵提取:Embedding model可以將複雜的原始數據轉換為低維度的連續向量表示,這些向量表示可以作為特徵用於後續的機器學習任務,如分類、回歸、聚類等。
  2. 相似性計算:Embedding model可以捕捉數據之間的相似性和關聯性,從而可以應用於計算數據之間的相似度或距離。這對於搜索引擎、推薦系統和相似度匹配等應用非常有用。
  3. 聚類和分群:Embedding model可以將數據映射到連續向量空間中,從而使得相似的數據點在向量空間中更加接近。這使得聚類和分群變得更加容易,可以幫助我們識別和組織數據的結構。
  4. 可視化和理解:Embedding model可以將高維度的數據轉換為低維度的連續向量表示,這使得數據可以在二維或三維空間中可視化。這有助於我們理解數據之間的關係和結構。

強大的後續可能性

插件(Plugin)對AI系統可以產生後續更重大的影響力,並擴展其功能和應用領域。插件可以添加到AI系統中,以提供額外的功能、數據源或服務,從而影響整個AI生態系統。

在AI生成和對話方面,外掛插件可以引入特定領域的知識、資源或服務,從而使AI系統能夠處理更廣泛的任務和應用場景。舉例來說,對於旅行規劃,像AGADA這樣的插件可以提供訂房服務,使AI能夠直接與酒店預訂業務進行對話和交互。這樣的插件擴展了AI系統的能力,使其能夠在旅遊領域提供更全面的服務。

對於像CHATGPT或Copilot這樣的AI系統,外掛的成熟度對其功能和效能起著重要作用。成熟的外掛插件可以提供更多的選項和集成,使AI系統能夠與更多的業務單位或服務進行交互,從而增強其應用價值和實用性。

插件的開發和整合需要技術和商業合作,以確保外掛能夠無縫地集成到AI系統中。對於外掛插件的成熟度和支持,開發者和業務單位可以根據其需求和目標來選擇適合的外掛,以擴展AI系統的能力和功能。

 Microsoft 365 Copilot即為一種後續應用

相關資訊: 重塑未來工作樣貌:微軟推出 Microsoft 365 Copilot,工作上的最佳 AI 助手

看到真的是瞠目結舌….

發佈日期:

人工智慧概論

人工智慧的演進

  • 符號邏輯(1950-1960): 一種基於數學邏輯的形式化推理方法。符號邏輯可以用於推理、定理證明和形式化知識表示等領域。然而,符號邏輯在處理不確定性和模糊性方面存在困難,並且對於現實世界中複雜的問題可能不夠靈活。
  • 專家系統(1980-1990): 一種基於知識表示和推理的AI系統。它借助專家的知識和經驗來解決特定領域的問題。專家系統將專家知識編碼為規則、條件和結論的形式,並使用推理引擎來解釋和應用這些規則。專家系統在早期的AI研究中得到了廣泛應用,特別是在診斷、監控和決策支持等領域。然而,專家系統的主要限制在於對知識的表達和推理能力受限,且對於知識的獲取和維護需要大量的專家參與。
  • 機器學習(2010-Present): 隨著AI的發展,新的技術和方法不斷涌現,如機器學習、深度學習和統計方法,這些方法更加強調從數據中學習和模式識別,並能夠處理現實世界中的複雜問題。

讓機器自己從圖片中尋找差異

博藍尼悖論(Polanyi’s Paradox)認為人類能表達的,遠比人類所知道的少

莫拉維克悖論(Moravec’s Paradox): 對於機器而言,人類的直覺,遠比人類的推理來的複雜 (更多運算資源)

讓電腦自己學習

從規則驅動變成資料驅動,只是原本是人從資料去定義規則,現在則是由電腦來找到規則

為了讓電腦更有效率地找到規則並在提取特徵之後辨識物體,可以採取以下方法:

  1. 架構化資料:確保找到的東西具有一定的結構和組織。這包括在數據中添加元數據、標籤或層次結構,以便電腦能夠更容易地理解和處理這些資料。例如,在圖像識別中,可以添加標籤、分類和層次結構,以區分不同的物體和屬性。
  2. 特徵提取和描述:利用機器學習和計算機視覺技術來提取物體的特徵。CNN(卷積神經網絡)是一種常用的技術,可以從圖像中提取特徵。這些特徵可以包括顏色、紋理、形狀、邊緣等。通過提取特徵,電腦可以將複雜的資料轉化為可計算的形式,並進一步進行辨識和分類。
  3. 模式識別和機器學習:利用模式識別和機器學習算法,讓電腦能夠學習從提取的特徵中辨識物體。這包括監督式學習和無監督式學習等方法。透過建立模型並訓練它們使用大量的樣本資料,電腦可以學習如何從特徵中識別和分類物體。
  4. 多模態學習:結合不同模態的資訊,例如視覺、聲音、質地等,以提高辨識的準確性和鮮度。這涉及到整合不同感測器或多種資料源的資訊,並設計適當的模型和算法來處理這些多模態資訊。

應用範例

糖尿病的視網膜病變

https://www.kaggle.com/datasets/eishkaran/diabetes-using-retinopathy-prediction

魔術橡皮擦,可以自動去把相片的很多背景雜物移除

https://www.kaggle.com/datasets/utkarshsaxenadn/human-body-background-remover

利用Diffusion實現圖像生成

https://www.kaggle.com/datasets/dschettler8845/diffusiondb-2m-part-0001-to-0100-of-2000

機器學習的流程

4D Process包括Define Problem, Data Collect, Develop Model, Deploy Model

  1. 定義問題:這是解決問題的起點。在這一步中,我們明確定義問題的目標和範圍,確定我們想要解決的具體問題。這包括確定問題的背景、目標、限制條件和預期的結果。在這個階段,我們也需要了解問題的相關方面,與利益相關者進行溝通,以明確問題的需求和期望。
  2. 數據收集:在這一步中,我們收集和整理與問題相關的數據。數據可能來自不同的來源,如數據庫、日誌文件、傳感器、網絡等。收集到的數據應該具有代表性,且能夠支持模型開發和解決問題的需求。在這個階段,我們也需要進行數據清理和預處理,以確保數據的質量和一致性。
  3. 模型開發:在這一步中,我們根據問題的要求和數據的特性開發相應的模型。這可能涉及選擇和應用適當的機器學習或統計方法,進行模型設計和訓練,並進行評估和優化。模型開發的目標是利用數據來建立一個能夠解決問題、預測結果或提供洞察的模型。
  4. 模型部署:在這一步中,我們將開發好的模型應用到實際環境中,以解決問題或提供服務。這可能包括將模型集成到軟體系統或應用程式中,進行系統測試和驗證,並確保模型在實際場景中的效能和可靠性。模型部署的目標是使模型能夠實際運行並發揮其應用價值