本文章內容係以參考技術文件為基礎,經由人工智慧(AI)技術進行改寫及重整,旨在提供讀者更清晰易懂之內容呈現。如有任何技術細節上的疑義或需進一步確認,建議讀者參考原始技術文件或與相關技術人員聯繫。
你是否曾經開發了一個超酷的 Python 應用程式,尤其是在 AI 視覺領域,卻在部署到不同環境時遇到重重困難?或者,你是一位業務或 AE 同仁,希望向客戶展示我們最新的 AI 技術,但繁瑣的環境設定總是讓你頭痛不已?
別擔心!今天,就讓我們 Advantech 的專業編輯,帶你一窺我們工程師團隊的最新實驗成果:如何將一個需要「看見」外部世界的 Python AI 應用程式(這裡以 OpenVINO™ demo 為例),完美打包進輕便易攜的 Docker 容器中!這不僅是技術上的小突破,更是我們持續創新、解決客戶痛點的最佳證明。
為何需要 Docker?AI 應用部署的新潮流 #
想像一下,Docker 就像一個神奇的「貨櫃」,你可以把應用程式以及它需要的所有工具、函式庫、設定檔通通打包進去。無論你想把這個「貨櫃」運到哪台機器上(開發、測試、客戶端),裡面的東西都能完美運作,再也不用擔心「在我電腦上明明可以跑啊!」的窘境。
對於 AI 應用,尤其是需要用到像 Intel® OpenVINO™ 這種強大工具進行模型推理的應用來說,環境設定往往更複雜。Docker 化之後,不僅部署變得簡單快速,更能確保執行環境的一致性,這對於需要穩定性的工業物聯網 (IIoT) 或邊緣運算場景來說,簡直是天大的福音!
市場需求: 隨著 AIoT 應用落地,客戶越來越需要能夠快速部署、輕鬆管理、穩定運行的解決方案。將 AI 應用 Docker 化,正是滿足此需求的關鍵一步。
實驗挑戰:當 Docker 遇上「外接攝影機」 #
這次實驗的主角是一個使用 Python 和 OpenVINO™ 的物件偵測應用程式。聽起來很標準?但關鍵在於:它需要連接到電腦的「外接攝影機」來即時捕捉影像!
一般來說,Docker 容器是個相對封閉的環境,要讓它取用電腦的硬體設備(像攝影機),就需要一些特別的技巧。這正是我們工程師此次實驗想要克服的挑戰,也是展現 Advantech 技術實力的地方!
實驗開箱:跟著工程師的腳步走一遍 #
我們的工程師們秉持著實事求是的精神,一步步探索如何讓 Docker 容器順利「看到」攝影機。以下是他們精彩的實驗過程紀錄(放心,我們用最白話的方式解釋!):
實驗前的準備 (Prerequisites):
-
確認 Docker 已安裝: 這就像要搬家前,總得先有貨車吧!打開終端機輸入
docker --version看看。docker --version
-
一台攝影機: 我們的 AI 總得有「眼睛」才能看世界。
-
準備好你的 Python 應用程式: 確保你的 Python 程式碼(如下圖的
Openvino.py)和相關的模型檔案都準備好,並且可以在你的電腦上獨立執行成功。
實驗步驟 (Steps):
- Step 1: 撰寫 Dockerfile (設計藍圖)
- 在你的 Python 應用程式根目錄下,建立一個名為
Dockerfile的純文字檔案(沒有副檔名)。 - 在
Dockerfile裡,我們要告訴 Docker 如何「建造」這個容器。FROM ubuntu:22.04: 指定基礎環境,就像蓋房子要先有地基,這裡選用 Ubuntu 22.04 作業系統。WORKDIR /usr/src/app: 設定容器內的工作目錄,之後的操作都會在這裡進行。COPY . ./: 把目前目錄下所有的檔案(你的 Python 程式、模型檔等)複製到容器的工作目錄裡。CMD ["python3", "Openvino.py"]: 設定容器啟動時要執行的指令,也就是運行我們的 Python 程式。
- 在你的 Python 應用程式根目錄下,建立一個名為
- Step 2: 建構 Docker 映像檔 (依照藍圖施工)
- 在終端機,切換到包含
Dockerfile的目錄。 - 執行
docker build -t your_image_name:tag .指令來建構映像檔。your_image_name是你給這個映像檔取的名字(例如ty_sop)。tag是版本標籤(例如1.0.0)。.表示使用當前目錄的Dockerfile。
- 在終端機,切換到包含
ty_sop 的映像檔是不是成功建立出來了。
- Step 3: 安裝必要的「工具」(重頭戲:讓容器看見攝影機並安裝依賴)
- 關鍵點來了! 由於我們的程式需要 OpenVINO™、OpenCV 等函式庫,而且還要能存取外部攝影機 (
/dev/video0) 並顯示畫面,我們不能直接執行上一步的映像檔。我們需要先「進入」這個半成品容器,把所有需要的工具裝好,特別是設定好與外部硬體溝通的橋樑。
- 執行以下指令,啟動一個互動式的容器,並進行特殊設定:
docker run -it --name tycontainer --device=/dev/video0:/dev/video0 --network host -e DISPLAY=:0.0 ty_sop:1.0.0 /bin/bash-it: 讓我們可以跟容器互動(就像打開一個終端機)。--name tycontainer: 給這個暫時運行的容器取個名字。--device=/dev/video0:/dev/video0: 核心步驟! 這指令把主機 (Host) 的攝影機設備 (/dev/video0) 掛載 (mount) 到容器內部,讓容器內的程式可以存取它。--network host: 讓容器使用主機的網路,簡化某些設定。-e DISPLAY=:0.0: 允許容器將圖形介面(我們的攝影機畫面)顯示到主機的螢幕上。ty_sop:1.0.0: 我們剛剛建立的映像檔。/bin/bash: 進入容器後要執行的指令(開啟一個 shell)。
- 關鍵點來了! 由於我們的程式需要 OpenVINO™、OpenCV 等函式庫,而且還要能存取外部攝影機 (
Bash apt update apt install python3 apt install python3-pip pip install openvino apt install python3-opencv apt install xserver-xorg # 圖形介面相關 apt install xinit # 圖形介面相關 apt install x11-xserver-utils # 圖形介面相關
* 這些指令就是在容器內安裝 Python3、pip 套件管理器、OpenVINO™ 函式庫、OpenCV 函式庫,以及顯示畫面所需的 X Server 元件。
3. 試著在容器內執行 python3 Openvino.py。如果一切順利,你應該能看到攝影機畫面成功顯示出來!這表示我們成功讓容器存取攝影機並執行 AI 推理了!
4. 重要一步:儲存成果! 打開另一個主機的終端機(不是容器內的),執行以下指令,將剛剛設定好、安裝好所有工具的容器狀態,「凍結」成一個新的 Docker 映像檔。
Bash docker commit tycontainer ty_sop_packages:1.0.0
* tycontainer: 我們剛剛運行的容器名稱。
* ty_sop_packages:1.0.0: 新映像檔的名稱和標籤。這個映像檔就包含了所有安裝好的依賴套件。
Dockerfile(可以在另一個空資料夾中建立)。這次,我們直接使用剛剛 commit 產生、已經包含所有依賴套件的映像檔作為基礎。
Dockerfile FROM ty_sop_packages:1.0.0 WORKDIR /usr/src/app CMD ["python3", "Openvino.py"]
* 注意 FROM 指令變成了我們剛剛 commit 的新映像檔 ty_sop_packages:1.0.0。
* WORKDIR 和 CMD 保持不變,因為程式碼在之前的步驟已經複製進去了。
docker build 指令,建構最終的、可直接運行的映像檔。
Bash sudo docker build -t ty_runnable .
* 這次我們把最終映像檔命名為 ty_runnable。
7. 大功告成! 現在,你可以用以下指令來啟動這個最終版的容器,它應該能直接存取攝影機並執行你的 Python AI 應用程式了:
Bash # 在主機上執行,允許容器顯示畫面 export DISPLAY=0.0 xhost + # 啟動容器 docker run --name tycontainer --device=/dev/video0:/dev/video0 --network host -d -e DISPLAY=:0.0 ty_runnable
* xhost +: 允許任何使用者連接到 X server(顯示畫面)。
* -d: 讓容器在背景執行。
* 其他參數 (--device, --network host, -e DISPLAY) 和之前解釋的一樣,是為了讓容器能存取攝影機和顯示畫面。
成果亮點:可攜帶、易部署的 AI 視覺方案 #
透過這次實驗,我們成功地:
- 解決了 Docker 容器存取外部硬體(攝影機)的難題。
- 將包含複雜依賴(Python, OpenVINO™, OpenCV)的 AI 應用程式打包成一個獨立、可執行的 Docker 映像檔。
- 實現了圖形介面(攝影機畫面)從容器內部顯示到主機螢幕。
這意味著什麼?
- 對於開發者/AE: 可以快速建立標準化的 AI 展示環境,減少現場設定時間,提高效率。
- 對於銷售業務: 向客戶展示 AI 功能時更有信心,不再受環境限制,展現 Advantech 方案的易用性。
- 對於潛在客戶: 看到 Advantech 不僅提供硬體,更能解決軟體整合、部署上的實際痛點,提供完整的 AIoT 解決方案。我們的技術是經過驗證、可以落地的!
與傳統部署方式相比,Docker 化的優勢顯而易見:環境一致性、快速部署、易於管理與更新。這次實驗的成果,特別是解決了硬體存取問題,讓這些優勢在需要連接感測器、攝影機的邊緣 AI 場景中得以充分發揮。
結論與展望:Advantech 持續創新,驅動 AIoT 未來 #
這次將 Python AI 應用打包進 Docker,並成功連接外部攝影機的實驗,只是 Advantech 在 AIoT 領域持續研發與創新的一個縮影。它展現了我們工程師團隊解決複雜技術問題的能力,以及我們致力於提供客戶更易用、更高效解決方案的決心。
未來,我們將繼續探索:
- 更複雜的硬體整合(例如:多個攝影機、特殊感測器)。
- 不同 AI 模型與框架的 Docker 化最佳實踐。
- 將 Docker 技術與 Advantech 的邊緣運算平台(如 Edge AI Suite、DeviceOn)更深度整合,提供一站式的 AI 部署與管理體驗。
我們相信,透過不斷的技術探索與突破,Advantech 將持續引領 AIoT 產業發展,協助客戶克服挑戰,共創智慧未來!
附錄:映像檔的儲存與載入 (Save and Load Image)
如果你想把這個建好的 Docker 映像檔搬到另一台也安裝了 Docker 的電腦上使用,可以使用以下指令:
- 匯出映像檔 (Save): 將映像檔存成一個 tar 壓縮檔。
(將
docker save image_name -o image.tarimage_name換成你的映像檔名稱,例如ty_runnable) - 匯入映像檔 (Load): 從 tar 壓縮檔載入映像檔。
docker load -i image.tar
這讓你的 AI 應用程式可以像隨身碟一樣,輕鬆帶著走!