Posted on

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 模型,以適應你的攝像機圖像尺寸。這樣可以確保模型在不同尺寸的圖像上都有良好的性能。

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

Posted on

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
Posted on

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

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

Posted on

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
Posted on

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去取分類名稱

Posted on

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)

Posted on

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環境和套件之間版本不合,重新檢查套件版本是否符合官網要求

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

Posted on

人工智慧之於微軟的想法

對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 助手

看到真的是瞠目結舌….

Posted on

人工智慧概論

人工智慧的演進

  • 符號邏輯(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. 模型部署:在這一步中,我們將開發好的模型應用到實際環境中,以解決問題或提供服務。這可能包括將模型集成到軟體系統或應用程式中,進行系統測試和驗證,並確保模型在實際場景中的效能和可靠性。模型部署的目標是使模型能夠實際運行並發揮其應用價值
Posted on

AI現況的概觀

人工智慧是第四次的工業革命

Mobile computing, inexpensive sensors collecting terabytes of data, and the rise of machine learning that can use that data will fundamentally change the way the global economy is organized.

Fortune, “CEOs: The Revolution is Coming,” March 2016

移動計算、廉價感測器收集的大量數據以及機器學習的興起將從根本上改變全球經濟的組織方式

移動計算指的是人們使用移動設備(如智能手機、平板電腦)進行計算和資訊處理的能力。隨著移動設備的普及和技術的發展,人們能夠隨時隨地存取資訊和進行各種計算任務,不再受限於固定的位置或時間。這使得商業活動和經濟交易可以更靈活地進行,並且在不同的地點和時間進行交流和合作。

同時,廉價的感測器技術讓我們能夠收集大量的數據。感測器可以應用於各種物理環境,例如工業設備、城市基礎設施、交通系統、健康監測等。這些感測器可以收集和傳輸各種類型的數據,例如溫度、壓力、位置、運動、光線等。由於感測器成本的下降,人們可以以更低的成本部署大量的感測器網絡,從而收集和分析大量的數據。這些數據提供了對於各種系統和環境的詳細洞察,並且為企業和政府制定更有效的決策提供了依據。

同時,機器學習的快速發展使得我們能夠有效地處理和分析這些大量的數據。機器學習是一種人工智慧的分支,它利用數據和算法來使計算機自動學習並提高性能。通過機器學習,我們能夠從數據中發現模式、趨勢和關聯性,並且能夠預測和做出更準確的決策。這對於企業的營銷、客戶服務、生產優化、預測分析等各個領域都具有重要意義。

AI會造成那些變革呢?

在軟體開發中的應用:AI被應用於軟體開發的各個階段和領域。例如,AI可以用於自動化測試和驗證、代碼生成和自動化編程、缺陷檢測和修復、軟體需求分析和優化等。AI的應用可以提高開發效率、減少錯誤和提供更好的軟體品質。

軟體開發人員可以利用現有的AI工具和平台來開發具有智能功能的軟體應用。AI工具和框架的開放性和可用性不斷提高,使得開發人員能夠更容易地整合AI技術到他們的軟體項目中。

軟體定義硬體(Software-Defined Hardware)指的就是利用軟體控制和編程來定義和配置硬體資源。AI的發展促使軟體定義硬體的興起,因為AI需要大量的計算資源和專用硬體來實現高效的運算。軟體定義硬體技術可以通過軟體來定義和配置硬體資源,以適應不同的AI工作負載和需求。

對於不同的應用場景,可以選擇不同的AI算法和技術。例如,時間序列分析可以使用統計方法、機器學習模型或深度學習模型等不同的技術來處理。對於每個應用領域,了解和理解相關的AI技術,並選擇合適的方法和工具是非常重要的。

AI取代的是職能不是產業

晶片技術的進步和創新為人工智慧的發展提供了強大的計算能力和效能提升。

AI將重新定義產業

  • 重新定義員工的技能: 核心技能的重新訓練提升
  • 重新定義部門的功能: 把智能化當成再進化的機會
  • 重新定義組織的效能: 創造進入的門檻與護城河

Al核心技術

機器學習

  • 監督式學習
  • 非監督式學習
  • 模型參數優化

深度學習

  • 卷積神經網路(CNN)
  • 深度神經網路(DNN)
  • 循環神經網路(RNN)
  • 神經網路與網路參數優化

進階學習技術

  • 強化學習(Reinforcement Learning)是一種機器學習的方法,旨在使智能體(agent)通過與環境的交互行為學習最佳的行動策略,以最大化預期的回報(reward)。
  • 遷移式學習(Transfer Learning)旨在將在一個任務或領域上學習到的知識和經驗應用於另一個相關或相似的任務或領域中。它假設前一個任務的學習可以為後續的學習提供有用的信息和特徵。
  • 對抗式學習
  • 聯邦式學習(Federated Learning)通常涉及在多個參與方的本地數據上進行分散訓練,每個參與方使用本地數據訓練局部模型,然後將模型的更新參數聚合到全局模型中。每個參與方可以具有不同的數據分布和特徵,而原始數據通常不共享。

工具框架

  • Al應用開發工具,如: C、Python、JavaScript
  • Al模型開發框架,如: TensorFlow、PyTorch、Keras(可以運行在TensorFlow、PyTorch等後端上)、Scikit-learn
  • Al部署工具與平台: 與傳統程式開發的CI/CD不同之處在於這邊是對AI模型進行版本管理,以便追蹤和管理不同版本的模型,因為模型的更新和改進是一個持續的過程。相比之下,傳統程式開發中的版本管理更偏向於代碼和軟體功能的版本控制。
  • Al系統整合與開發: 將人工智能(AI)技術和解決方案集成到現有的系統或應用程序中,以實現更智能化、自動化或增強的功能

資料治理

  • 資料管理架構
  • 特徵工程
  • 資料品質

AI應用技術

電腦視覺

自然語言處理

  • 情緒分析
  • 語言翻譯
  • 文本分析與生成
  • 社群媒體與社交網路分析
  • 聊天機器人

數據分析與預測

  • 資料建模與調校
  • 數據分析與預測
  • 時間序列分析與預測

語音處理

  • 語音辨識
  • 語音合成
  • 情感分析
  • 語音索引

推薦系統

  • 關聯式推薦(Association-based Recommendation):基於物品之間的關聯性進行推薦。它假設物品之間的關聯性可以用共現或相似性來衡量。例如,如果用戶購買了商品A,則可以通過關聯分析推薦與商品A相關的商品B。
  • 內容推薦(Content-based Recommendation):根據用戶過去的行為和對物品的偏好,推薦與用戶喜好相似的物品。它使用物品的屬性和特徵來建模和描述物品,並基於這些特徵計算用戶的興趣相似度。常見的方法是使用機器學習算法,如TF-IDF(Term Frequency-Inverse Document Frequency)和餘弦相似度來計算相似度並進行推薦。例如,如果用戶喜歡觀看某部電影,則可以根據該電影的特徵和用戶的偏好,推薦與該電影相似的其他電影。
  • 協同過濾推薦(Collaborative Filtering Recommendation):根據用戶的歷史行為和與其他用戶的相似性來進行推薦。它假設具有相似行為模式的用戶會有相似的偏好,並根據這種相似性來推薦物品。協同過濾可以分為基於用戶(User-based)和基於物品(Item-based)的方法。基於用戶的協同過濾將根據其他用戶對物品的評價來推薦物品給目標用戶,而基於物品的協同過濾則根據物品之間的相似度來推薦。
  • 深廣學習推薦系統(Deep Learning Recommendation Systems):深廣學習推薦系統使用深度神經網絡模型來捕捉用戶和物品之間的複雜關係,以提供個性化的推薦。這些模型可以學習到高維度的嵌入式表示,並進一步進行用戶興趣建模和物品推薦。協同過濾推薦系統需要大量的用戶行為數據(如評分或點擊數據),而內容推薦系統需要豐富的物品特徵數據。深廣學習推薦系統則需要用戶行為和物品特徵的結合數據。

新興應用技術

  • Meta 元宇宙涉及虛擬現實技術、3D 建模、社交媒體和區塊鏈等多種技術,AI 在其中扮演著一個重要的角色,用於實現虛擬世界的智能化、自動化和個性化。
  • Web 3.0中包括去中心化、區塊鏈和加密貨幣等技術的應用。AI 在 Web 3.0 中也扮演著重要的角色,特別是在區塊鏈智能合約、數據分析和自動化等方面的應用。AI 技術可以用於分析和處理大量的數據,提供智能合約的自動執行和驗證機制,並改進用戶的互動和體驗。

Al產業應用

智慧製造

  • 產品檢測/瑕疵檢測
  • 規劃排程/自動化流程
  • 設備維護預測
  • 物流整合/庫存管理
  • 自動化機械

智慧醫療

  • 醫學影像與診斷
  • 醫療訊號分析與偵測
  • 病歷報告分析
  • 健檢與輔助醫療照護
  • 預測及風險分析

智慧零售

  • 影像辨識(顧客、商品等)
  • 智能客服
  • 智慧貨架/庫存管理
  • 倉儲與物流管理
  • 顧客分析/需求預測

智慧金融

  • 證件辨識
  • 生物辨識
  • 詐欺洗錢防制AML
  • 最佳投資組合

邊緣運算

一種在邊緣設備或邊緣網路中執行人工智能(AI)任務的計算方式。它將AI的計算和推理能力移到距離數據生成源頭更接近的地方,以減少延遲、節省頻寬並提高效能。

  • 邊緣運算強調將計算資源和AI能力移近到數據生成源頭的重要性,以應對處理大量數據和低延遲要求的應用。生態系則涉及邊緣運算相關的技術、產品和服務提供商,包括硬體設備、軟體平台、開發工具等。
  • 霧運算(Fog Computing)是指在邊緣設備和雲端之間建立的一層中介計算層。它將計算和存儲資源分佈到邊緣網路中,使數據能夠在邊緣設備和雲端之間進行處理和分析。分散式協作架構則關注在邊緣環境中實現多個設備之間的協作和溝通,以實現更複雜的任務和應用。
  • 主流的邊緣計算方案和工具庫提供了在邊緣設備上執行AI任務的技術和工具。這些方案和工具庫通常包括優化的AI模型、運行時環境、軟體開發工具和部署工具等。它們使開發人員能夠將AI能力整合到邊緣設備中,實現本地化的AI處理。
  • 5G和物聯網是邊緣運算的重要驅動力之一。5G技術提供了更高的帶寬、更低的延遲和更多的連接數,為邊緣設備提供了更好的網絡基礎設施。物聯網則提供了大量的感測器和設備,產生了大量的數據,需要在邊緣進行處理和分析。