Anaconda是一個Python發行版,提供大量現成套件。並能建立虛擬環境,管理多個Python版本使其共存於同一個系統上。
Android手機寫Python程式需要Anaconda環境的話,在Termux裡安裝是個可行的選項。例如下圖是Android跑Python OpenCV套件的示例。
不過Android手機大部份是aarch64 (arm64)架構,Anaconda官方支援的"ARM"架構裝置為AWS Graviton,以及armv7l (32位元) 的Raspberry Pi,精簡版的miniconda也是如此,裝了會出現各種錯誤。
所以aarch64架構的裝置要改裝"miniforge", 它跟miniconda一樣是精簡版的Anaconda,指令用法一樣,支援更多架構的Linux系統。
1. 安裝Termux與Linux環境#
初始化 Termux
接著選擇要直接在Termux環境安裝miniforge,或是建立Proot Linux?由於Termux的Python版本是滾動更新的(無法降級),我個人偏好建一個獨立的 Proot Debian環境,這樣才比較方便安裝不同版本的Python。
2. 安裝miniforge3#
- 登入Proot Debian,使用Root帳號。
proot-distro login debian
- 安裝前置依賴套件。由於Anaconda能自動下載Python,我們不需要再手動安裝其他版本的Python。
apt update
apt install wget python3 python3-pip vim
- Proot預設會使用Termux的Python,因此需要用以下指令指定系統暫時使用Proot內部的Python:
alias python=/usr/bin/python3
alias python3=/usr/bin/python3
alias pip=/usr/bin/pip
alias pip3=/usr/bin/pip
- 至 miniforge儲存庫,取得安裝指令稿網址,下載執行
wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
bash Miniforge3-Linux-aarch64.sh
執行後Enter,使用箭頭上下移動,輸入yes同意授權條款。
並將miniforge安裝至
~/root/miniforge
,待其安裝完成。安裝完成後會問要不要自動啟動環境,也就是登入Proot便進入conda。輸入
yes
登出Proot,再重新登入Proot
exit
proot-distro login debian
會發現提示符出現括號
(base)
,代表conda環境已自動啟動。輸入conda deactivate
退出conda環境。若想改成手動進入conda環境,輸入
conda config --set auto_activate_base false
停用自動進入conda環境。
3. 使用conda指令#
進入conda環境後,可直接用conda install
或pip
安裝Python套件。在conda環境裡會自動使用conda所安裝的Python版本。
conda好用的功能便是建立多重虛擬環境了。假設現在要建立舊版Python 3.6的環境,輸入以下指令:
conda create --name test1 python=3.6
進入/離開虛擬環境
conda activate test1
conda deactivate
這樣便可以安裝限定Python 3.6才能裝的套件了。
4. 寫個簡單的OpenCV程式#
這是個偵測人臉的程式,不過,我想來點好玩的:偵測動畫人物的人臉,採用 lbpcascade_animeface的專案。
例如這裡有一張少女終末旅行的圖片,我們要將她們的臉孔標記出來。
- 建立conda環境
conda create --name facedetection python=3.10.9
conda activate facedetection
- 安裝需要的套件
conda install -c conda-forge opencv
wget https://raw.githubusercontent.com/nagadomi/lbpcascade_animeface/master/lbpcascade_animeface.xml
- 用VIM新增檔案
vim detectface.py
- 參考原作者的寫法撰寫程式碼,讀取
input.jpg
,標記臉孔後輸出為output.jpg
。
import cv2
def detectFace(filename):
cascade = cv2.CascadeClassifier("./lbpcascade_animeface.xml")
image = cv2.imread(filename, cv2.IMREAD_COLOR)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.equalizeHist(gray)
color = (0, 0, 255)
faces = cascade.detectMultiScale(gray,
scaleFactor = 1.1,
minNeighbors = 5,
minSize = (24, 24))
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 20)
cv2.waitKey(0)
cv2.imwrite("output.jpg", image)
detectFace('input.jpg')
- 如果問說要怎麼把圖片放到Proot的目錄,別忘了手機內部儲存空間是掛載在Proot的
/sdcard
,將圖片移動過來即可:
mv /sdcard/Downloads/input.jpg ~/
- 執行寫好的Python程式
python detectface.py
- 欲查看結果,將圖片移動到手機內部儲存空間
mv output.jpg /sdcard/Downloads/
- 成品