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

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

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)通常用於存儲結構化數據,這些數據具有固定的模式和結構。

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

軟件定義存儲(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解決方案可以提供高速的數據讀取和寫入性能,這對於需要快速存取大量數據的機器學習訓練是非常重要的。

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