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

Modern data architecture on AWS

為什麼會需要現代資料架構

數據量正以前所未有的速度增長,從 TB 級激增到 PB 級,有時甚至達到 EB 級。傳統的本地數據分析方法無法處理這些數據量,因為它們的擴展性不夠好並且成本太高。許多公司正在從各個孤島獲取所有數據,並將所有數據聚合到一個位置(許多人稱之為數據湖),以便直接在這些數據之上進行分析和機器學習。有時,這些公司將其他數據存儲在專門構建的數據存儲中,以分析結構化和非結構化數據并快速獲得見解。這種數據移動可以是“由內而外”、“由外而內”、“圍繞周邊”或“跨區域共享”,因為數據具有重力。

什麼是數據湖?

數據湖是一個集中式存儲庫,允許您存儲任意規模的所有結構化和非結構化數據。您可以按原樣存儲數據,而無需首先構建數據,並運行不同類型的分析 – 從儀表板和可視化到大數據處理、實時分析和機器學習,以指導更好的決策。

含括各種不同類型的存儲

在數據湖架構中,資料庫通常用於存儲結構化數據或半結構化數據,這些數據可能來自企業應用系統、交易數據、用戶資訊等。資料庫提供了結構化的數據儲存和查詢功能,並且支援事務處理,這使得它適合存儲需要高度結構化的數據。

除了資料庫,數據湖還可以包括其他類型的存儲,如:

  1. 物件存儲:用於存儲非結構化或半結構化的數據,如影片、音頻、圖像、日誌文件等。物件存儲通常以對象的形式存儲數據,每個對象都有一個唯一的鍵(Key)標識。
  2. 分佈式文件系統:用於存儲大型文件和文件集,如文檔、報告、配置文件等。分佈式文件系統可以提供高可用性和可擴展性的存儲。
  3. 流式數據存儲:用於存儲即時生成的數據流,如傳感器數據、日誌數據等。流式數據存儲通常支援高吞吐量和低延遲的數據寫入和讀取。
  4. 其他存儲服務:根據需求,數據湖還可以包括其他存儲服務,如物聯網(IoT)數據庫、時序數據庫等。

總的來說,數據湖是一個集中式的、可擴展的數據存儲和管理架構,它可以包括多種不同類型的存儲,以容納不同格式和來源的數據。資料庫是數據湖中的一種重要存儲形式,但不是唯一的選擇,而根據應用需求,可以根據需要選擇不同的存儲技術和服務。

AWS 數據湖的基本支柱

數據湖基礎:Amazon S3、AWS Lake Formation、Amazon Athena、Amazon EMR 和 AWS Glue

數據湖通常用於存儲非結構化和半結構化數據,例如影片、音頻、圖像、日誌文件等。而關聯型數據庫(包括Amazon RDS和Amazon Aurora)通常用於存儲結構化數據,這些數據具有固定的模式和結構。

由於數據湖和關聯型數據庫的用途和數據類型有所不同,所以在數據湖架構圖中通常不會將關聯型數據庫包含在內。在數據湖架構中,關聯型數據庫通常用於存儲和管理已經轉換成結構化數據的部分,例如從數據湖中提取的特定數據子集,這些數據可以被用於更嚴格的查詢和分析需求。

Posted on

軟件定義存儲(Software Defined Storage,SDS)介紹

甚麼是SDS

軟件定義存儲(Software Defined Storage,SDS)是一種存儲技術的方法論,它通過軟件層面的控制和管理來處理存儲資源,使得存儲系統更加靈活、可擴展和易於管理。傳統的存儲系統通常使用專用的硬體設備和控制器來管理數據存儲,而軟件定義存儲採用軟件定義的方法,將存儲處理功能抽象出來,從而使得存儲資源可以根據需要進行分配和管理。

SDS的主要特色

  1. 抽象化:軟件定義存儲將存儲資源的物理特性與控制功能進行解耦,使得存儲資源的管理和配置可以在軟件層面完成,而不依賴於特定的硬體設備。
  2. 集中管理:軟件定義存儲可以通過集中式的管理界面來控制和監控存儲系統,這使得管理人員可以更方便地進行配置、擴展和故障排除。
  3. 彈性擴展:由於軟件定義存儲可以根據需要進行動態配置和管理,因此可以輕鬆地擴展存儲容量和性能,以適應不斷增長的數據需求。
  4. 自動優化:軟件定義存儲通常具有自我優化的功能,它可以根據數據使用情況和需求來自動調整存儲策略,以提供最佳的性能和效率。
  5. 開放性:軟件定義存儲通常基於開放標準和API,這使得它可以與多種硬體設備和存儲平台兼容,並且支援多種存儲協議。

SDS的工作原理

借助軟件定義的存儲,應用程序可以動態配置所需的容量、性能和保護的精確組合——不多也不少。SDS 為存儲帶來了服務器虛擬化為計算帶來的簡單性、效率和成本節約。它允許您消除低效的專用硬件,並使用更靈活、透明和自動化的系統。此外,該存儲解決方案可與現有存儲解決方案和雲配合使用。

SDS軟件通過虛擬數據平面對底層存儲進行抽象;這使得虛擬機(和應用程序)成為存儲配置和管理的基本單元。

通過在應用程序和可用資源之間創建靈活的分離,普及的虛擬機 管理程序 可以平衡應用程序所需的所有 IT 資源(計算、內存、存儲和網絡)。

SDS與Persistent Volumes

SDS(軟件定義存儲)和Kubernetes中的Persistent Volumes(持久化存儲卷)是相關的概念,它們都涉及到在容器化環境中對存儲資源的管理。

Kubernetes是一個用於容器化應用程序管理和部署的開源平台,而Persistent Volumes(PV)是Kubernetes中用於持久化存儲的抽象層。PV允許將持久化存儲資源(例如Amazon EBS、Google Persistent Disk、NFS、Ceph等)與Kubernetes集群中的Pod相關聯,從而實現容器應用程序的持久化數據存儲。

Kubernetes的Persistent Volumes(PV)提供了對多種存儲技術的抽象,因此你可以使用多種技術來實現PV。以下是一些常見的PV實現技術:

  1. 主機路徑(HostPath):這是一種簡單的PV實現方式,將宿主機上的目錄掛載為PV。但需要注意的是,這種方式只適合單節點集群,而且缺乏高可用性和故障恢復機制。
  2. NFS(Network File System):NFS是一種分佈式文件系統,可以在多個節點之間共享文件。你可以使用NFS伺服器提供持久化存儲,並將其掛載為Kubernetes中的PV。
  3. iSCSI:iSCSI是一種塊存儲協議,它可以通過網絡將存儲設備映射為本地塊設備。你可以使用iSCSI裝置提供持久化存儲,並將其作為PV掛載到Kubernetes中的Pod中。
  4. Ceph:Ceph是一種分佈式存儲解決方案,它提供對象存儲、塊存儲和文件系統的支持。你可以使用Ceph作為PV提供持久化存儲,這樣可以實現高可用性和可擴展性。
  5. GlusterFS:GlusterFS是一種分佈式文件系統,可以提供高可用性和可擴展性的存儲。你可以使用GlusterFS作為PV,讓Kubernetes中的Pod使用這種分佈式文件系統。
  6. 雲端提供商的持久化存儲服務:如果你在公有雲上運行Kubernetes,大多數雲提供商都提供了專門的持久化存儲服務,例如Amazon EBS(Elastic Block Store)或Google Persistent Disk。你可以使用這些服務來實現PV。

SDS則是一種更廣泛的存儲技術,它可以用來管理和處理各種存儲資源,並提供更高級別的抽象和自動化。在Kubernetes中,PV可以使用SDS技術來實現,例如使用Ceph、GlusterFS等SDS解決方案作為Kubernetes Persistent Volumes的後端存儲。

SDS不一定要是物件存儲服務才算。SDS可以涵蓋多種存儲技術,包括塊存儲、文件存儲和物件存儲等。重要的是,SDS是通過軟件進行存儲管理和控制,而不依賴於特定硬體或供應商

SDS是一種以軟件為基礎的存儲管理方法

SDS(軟件定義存儲)是一種存儲技術的方法論,它通過軟件層面的控制和管理來處理存儲資源,而不是依賴於特定的硬體設備或供應商。這意味著SDS可以在不同的硬體平台上運行,並且可以支援多種存儲技術,如塊存儲、文件存儲和物件存儲等。SDS的目標是提供一個統一的、抽象的存儲管理接口,使得存儲資源的配置、管理和控制可以在軟件層面進行,而不需要直接依賴於特定的硬體或供應商的API。

當談到儲存圖片和影片等數據時,最終這些數據是需要存儲在硬碟上的,而硬碟是物理媒體。SDS並不是指數據直接存在於軟件中,而是指存儲管理和控制的功能在軟件層面進行。

SDS可以使用不同的硬體設備來實現存儲,比如使用傳統硬碟(HDD)、固態硬碟(SSD)、雲端存儲、存儲區域網絡(SAN)等。這些硬體設備提供實際的數據存儲介質,而SDS則通過軟件抽象出這些硬體設備的管理和控制功能。

總的來說,SDS是一種以軟件為基礎的存儲管理方法,它可以在不同的硬體平台上運行,並且可以支援多種存儲技術,但最終數據仍然需要存儲在實際的硬碟或媒體上。

使用SDS來蒐集ML資料的優勢

使用SDS(軟件定義存儲)可以幫助蒐集機器學習(Machine Learning,ML)所需的資料,並且相對於傳統的數據存儲方式,它可能更有利於處理大量數據並提供更好的可擴展性和彈性。

以下是幾個使用SDS來蒐集ML資料的優勢:

  1. 彈性和可擴展性:SDS可以基於軟件進行存儲管理和控制,這意味著你可以方便地擴展存儲容量,並根據需要增加或減少資料存儲的規模。這對於處理大量數據和快速增長的需求是非常有利的。
  2. 多種存儲技術支援:SDS可以支援多種存儲技術,包括物件存儲、塊存儲和文件存儲等。這使得你可以根據不同的數據類型和用途,選擇最合適的存儲技術,而不必局限於單一的存儲方式。
  3. 數據複製和冗余:SDS通常提供數據複製和冗余功能,這可以確保數據的高可用性和持久性。這對於在ML訓練過程中保證數據完整性和可靠性是非常重要的。通常,SDS或存儲系統會提供一些配置選項來控制數據的冗余程度,如副本數量或冗余策略。你可以根據應用的需求,選擇適當的冗余程度,以平衡數據可用性和資源消耗。
  4. 異地備份:SDS還可以支援異地備份,將數據備份到不同的地理位置。這樣即使出現故障或災害,你的數據仍然可以安全地恢復。
  5. 快速數據存取:某些SDS解決方案可以提供高速的數據讀取和寫入性能,這對於需要快速存取大量數據的機器學習訓練是非常重要的。
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技術提供了更高的帶寬、更低的延遲和更多的連接數,為邊緣設備提供了更好的網絡基礎設施。物聯網則提供了大量的感測器和設備,產生了大量的數據,需要在邊緣進行處理和分析。