目前分類:Python AI (9)

瀏覽方式: 標題列表 簡短摘要

Anaconda 是非常好用的虛擬環境管理工具,但是GUI圖形界面Navigator無法在ubuntu開啟,只能用命令來控制虛擬環境,對於熟習視窗作業系統的使用者界面來說有點不方便

不過後來查到其實是可以開啟的,這樣在教學上就方便多了。

image

開啟其實很簡單,利用命令

source ~/anaconda3/bin/activate root
anaconda-navigator

也可以寫成.sh以後直接執行即可

1. 開啟文字編譯器,輸入以下內容


#!/bin/bash
source ~/anaconda3/bin/activate root
anaconda-navigator
chmod +x runme.sh


2. 存檔成anaconda.sh

3. 後續只要執行
bash anaconda.sh


夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

最近在開發一些文字辨識的Python程式,用了EasyOCR或是Tesseract,效果說真的都很爛,無意間看到一個套件Paddle,測試一下發現效果非常好。

但是移植到其他電腦卻發現執行錯誤:

ModuleNotFoundError: No module named 'paddle.fluid.core_noavx'

稍微搜尋一下發現是CPU規格的問題,似乎是有些低階的CPU不包含AVX核心,所以一模一樣的安裝方法有些電腦可以,有些卻會出現問題,最好的方式是直接安裝不含AVX的2.0.1核心,安裝順序及步驟如下


#with avx
pip3 install paddlepaddle==2.4.0
#without avx
#pip3 install paddlepaddle==2.0.1 -f https://paddlepaddle.org.cn/whl/stable/noavx.html 
pip3 install common dual tight data prox
pip3 install paddle==1.0.2
pip3 install paddleocr==2.6.1.1
pip3 install numpy==1.23.1

 


夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

最近有一個案子使用到RPI,程式用Python寫的,不過如果RPI意外被關機,或者停電,那麼就要重新啟動我寫的程式,如果希望系統啟動時,能順便把Python程式執行就更好了,在Windows時代,我們可以找到一個「C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp」,把程式放到裡面就可以隨著Windows開機自動執行,那麼RPI有沒有呢?

一個朋友剛好也問我這個問題,我說我研究看看,但是過幾天他說他找到資料,並且傳網址給我,感謝您

網址:https://forums.raspberrypi.com/viewtopic.php?t=294014

上面網址有列出四個方法,我用的是「System Method」,也就是說,任何使用者登入,都會啟動。

步驟:

1. 開啟自動程式程式:
sudo nano /etc/xdg/lxsession/LXDE-pi/autostart
image
內容是:
@lxpanel --profile LXDE-pi
@pcmanfm --desktop --profile LXDE-pi
@xscreensaver -no-splash

2.將要執行的程式加到最後,例如我要執行的是Python程式,那麼加上完整路徑的Python
  2.1有Terminal視窗
    @lxterminal -e python3  /home/pi/Python/hello.py 
  2.2 如果不希望有視窗的話就
    @python3  /home/pi/Python/hello.py 

image

3.存檔:Ctrl+X、Y、Enter即可。

 

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

最近寫(抄)了一支利用dlib做臉部辨識的工具,但是效能不佳,程式執行需要大約一分鐘的準備時間,然後FPS也是沒辦法超過1,我用VSCode的F5 debug工具,從第一行逐行執行,發現是卡在cap = cv2.VideoCapture(0)這句,竟然可以卡40秒,後來查詢網路說可以加上cv2.CAP_DSHOW,但是只能用在Windows系統,樹莓派沒辦法使用,不過畢竟是開啟時一次的執行時間,影響不大所以就暫時先不處理。

另外一個比較嚴重的問題是fps,640x480解析度下的fps大約0.5-0.9之間,如果改成320x240可以超過1,實在是慢的離譜,實在很想了解問題出在什麼地方,是哪一行造成的瓶頸,雖然我還是可以用debug逐行執行來"感受"一下時間,但是像這種無限迴圈,要自己一直按F10想想實在算了。

想起我以前在VS.net開發工具時,在debug時會計算每行的執行時間,例如下圖,當從上一行執行到這行時,一共花費了0.979秒,如果我們一步一步Step就可以了解每行的狀況,知道瓶頸出在哪裡,不過這也太累了。

image

使用debug工具來了解執行效能其實還有一個問題,就是也許他這次很慢,但下次就會很快,例如網路擁塞,每次需要的時間不太一樣,因此必須長期評估再"平均"計算比較合理,用debug工具做這件事情實在很沒有效率。

在論壇詢問一下,網友提供了幾個工具,最知名應該是這個
Scalene:https://github.com/plasma-umass/scalene
這款的優點是設定很簡單,只要兩個步驟

1.    安裝套件:
pip3 install scalene
2.    利用scalene來執行你的Python程式:
scalene YourCode.py
當程式執行完畢後,就會自己跳出這個執行報告,非常詳細,包括每行的執行「總」時間、使用多少GPU、記憶體等等的報告。

image

不過我發現一個問題,這個套件提供的是執行「總」時間,但假如我是一個迴圈,那麼特定幾行就可能會執行很多次,而這裡顯示’總’時間而不是’平均’時間,像我這個報告第41行看起來雖然花費時間最多,但這也是因為他被重複執行多次的總和,自然累積會比較高,就無法確認fps慢是不是這行造成的,因此這個套件並沒有解決我的問題。(不過也可能只是我不知道要怎麼使用這個套件?)

網路找一下關鍵字「profiler」,發現另外一個工具「line_profiler」
line_profiler:https://github.com/rkern/line_profiler

優點也是逐行評估,但是卻會顯示每行被執行的次數,以及總時間、平均時間等等的,不過執行上卻較為麻煩,因為line_profiler是評估副程式的,在要評估的副程式前加上「@profile」,他就會單獨評估這個副程式,但那如果我們要評估整個程式該怎麼辦?很簡單,我是把整個程式都搬到一個副程式內即可。

這裡說明一下步驟
1.    安裝套件:

文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

YOLOv4是目前非常受到歡迎的物件偵測工具,他本身後端使用的類神經框架是Darknet(https://github.com/pjreddie/darknet),而今天則是要把他轉換成Tensorflow框架,這樣做有什麼好處呢?

<<教學影片更新中>>

1. 一般我們在學習AI演算法的過程,多數已TF框架為入門,而Darknet一般只用來實做YOLO辨識,學生在學習上很難從TF很忽然跳到Darknet上,而轉換後TF語法都可以使用,學習上沒有斷層。

2. Darknet在Windows上編譯GPU版本太過瑣碎,而直接使用OpenCV的DNN模型則無法作到GPU加速,但轉換成TF後,就可以直接使用原本TF GPU加速的設定。經過測試,在1024x768的解析度下,OpenCV(非Cuda加速版)FPS=0.2X,而TF版的FPS可達到2-5,差異大概十倍。

我們使用的轉換工具是tf-yolov4(https://github.com/sicara/tf2-yolov4),根據官方說明,目前沒有Train功能,只能做Inference,所以訓練還是得到Colab(誤)。

以下將過程簡要的說明

1. 使用Anaconda建立Python3.9的虛擬環境:由於轉換過程提示建議使用TF2.6以上,因此以Python3.9 版本來建議虛擬環境,因為依據經驗TF-GPU 2.6 搭配的是Py39,所以才需要建立Python3.9的虛擬環境。若您不使用GPU加速,則不限制Python3.9。

image

2. 開啟命令視窗

    2.1 安裝Tensorflow-gpu:conda install tensorflow-gpu==2.6

    2.2 安裝轉換工具:pip install tf2-yolov4

3. 下載YOLOv4權重檔:https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights,並放置到資料夾內。

4. 執行轉換命令,請注意yolov4.weights的路徑是否正確:convert-darknet-weights yolov4.weights -o yolov4.h5

若要轉換成其他種類格式,例如tflite請參閱作者的github說明

5. 完成後就可以得到yolov4的TF的H5權重檔:yolov4.h5

接下來就可以直接使用我寫好的程式來執行


import tensorflow as tf
from tf2_yolov4.anchors import YOLOV4_ANCHORS #pip install tf2-yolov4
from tf2_yolov4.model import YOLOv4
import time

夜市 小霸王 發表在 痞客邦 留言(4) 人氣()

<<研華版Jetson nano 4G開箱>>
在開箱之前先說一個老笑話
在一次非常重要的太空任務中,分別派遣了英國人、日本人、台灣人參加,這次太空任務需要執行一整年,避免太空人太無聊,可以帶50公斤的私人物品。
英國人因為愛喝下午茶,所以帶了50公斤的茶
日本人帶了50公斤的A片,台灣人則帶了50公斤的Marlboro
---------------------------------
一年後,任務結束,太空船返回地球,記者們在停機坪等候採訪,第一個出來的是英國人,記者圍上去訪問
記者問:「這一年太空任務,有什麼重要收穫?」
英國人看起來英氣煥發說:「這一年我終於了解泡茶的精妙之處」
.
第二個出來的是骨瘦如柴、無精打采的日本人
記者問:「這一年太空任務,有什麼重要收穫?」
日本人說:「這一年我體會了嚕槍的極限」
.
第三個出來的是滿臉怒氣的台灣人
記者問:「這一年太空任務,有什麼重要收穫?」
台灣人說:「幹,忘記帶賴打」
----------------------------------
這個笑話相信老一輩的你們都有聽說過
好了,這個笑話跟我開箱有什麼關係呢?

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

今天把剛買的nVidia 3060 12G安裝好,然後開啟ubuntu系統,發現啟動gpu時會卡在
「Successfully opened dynamic library libcublas.so.10.0」,每次都會卡住約5-8分鐘,記得windows也會卡,但是只會卡第一次,搜尋網路上的解決方案是cuda在做cache,而且顯示卡記憶體越大會卡越久,網路有提供windows方案,就是設定最大cache,速度就會加快了。

image

那麼ubuntu似乎沒這個選項,搜尋其他方案,發現說如果nvidia 3x開頭的請使用tf 2.5以上版本,嘗試了一下發現確實就沒問題了,只是要安裝tf2.5稍微麻煩,以py38來說,如果不指定tf版本一般會安裝tf2.4,所以這裡紀錄一下

$ nvidia-smi #檢查nvidia驅動程式安裝狀況
$ conda create -n Python38 python=3.8  #建立py38環境
$ conda activate Python38 #啟動環境
$ pip install tensorflow-gpu==2.5.0  #安裝TF2.5 for nvidia 3x以上
此時測試tf GPU(tf.test.gpu_device_name())時會發現 dlerror: libcudnn.so.8代表cudnn有問題
$ conda install -c anaconda cudnn  #安裝cudnn
此時測試GPU時一樣會發現問題dlerror: libcudnn.so.8
$ conda update --all #更新所有套件,即可更新cudnn
測試正常

Screenshot from 2022-02-26 02-45-28.jpg
 


夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

根據我個人經驗,提供關於使用卷積時的倆三個建議作為參考

1.    建議都採用3x3卷積,但增加卷積層數,根據計算2層3x3=1層5x5

原理:5x5卷積核的參數有25個,3x3卷積核的參數有9個,前者是後者的25/9=2.78倍。因此,GoogLeNet團隊提出可以用2個連續的3x3卷積層組成的小網絡來代替單個的5x5卷積層,即在保持感受野範圍的同時又減少了參數量

2.    盡可能的使用最多"卷積核",只要能在記憶體可用範圍內
3.    盡可能的使用較多的"卷積層",但要注意池化後圖形大小是否足夠
3.    平面層(傳統層)一定要使用Dropout,卷積可以不用,卷積層建議使用Batch Normalization(參考:http://t.ly/Zyof)
4.    建議使用image Generate,否則會在實際使用上造成問題(實際環境變化多)
5.    批次量的影響:批次數量大收斂慢但較為穩定,數量小則收斂快但跳動會比較大,不過批次量大時,可能會有OOM問題,建議批次量最大不要超過256,最小不要低於32,不過還是根據您手上的樣本量來決定。
6.    輸入層使用較多卷積時收斂慢,但會較為準確


文章標籤

夜市 小霸王 發表在 痞客邦 留言(0) 人氣()

ImageDataGenerator是一個非常好用的工具,尤其在樣本數量很少的時候,可以利用它來微調圖片內容,進而產生新的樣本

本次主題會用CNN作為影像辨識基礎,比較加入ImageDataGenerator前後的辨識效果,另外就是flow_from_directory經常與ImageDataGenerator搭配來快速產生樣本圖形,本次一併說明。

 

一、flow_from_directory 圖片資料流
flow_from_directory通常會與ImageDataGenerator一起使用,以往我們做建模時,會把檔案轉成數字陣列後,全部存入記憶體內,例如MNIST就是60000張x28長x28寬x1(灰階)的記憶體大小,但是未來我們的圖片會越來越大,樣本也會越來越多,舉例來說一個10000張x224長x224寬x3(RGB)的樣本,所耗費的記憶體就是MNIST的32倍,而flow_from_directory可以大幅減少記憶體用量,避免OOM產生,以下列出flow_from_directory的三大功能。

1. 依照資料夾讀取為Y變數:當我們在做分類器學習時,採用的是監督式學習,也就是說除了樣本之外,還需要指定一個Y變數,而flow_from_directory會直接把資料夾名稱當作Y變數,我們就可以省去設定Y變數,先將要辨識的類別新增為資料夾,並將樣本圖片放到該資料夾內。例如本例我們要辨識的一共有5類,分別為C:Cat、D:Dog、L:Lacoste、N:尚未放置商品、P:Pudding布丁狗,因此建好此5類的資料夾,並把收集到的照片放入即可。

image

2. 自動轉陣列:以往將圖片讀入類神經時,要先轉換成數值陣列,而flow_from_directory可以直接進行轉換,此部份不須另外寫程式處理。

3. 一次只讀取一批次量的圖片:避免一次把樣本圖片全部讀入記憶體造成記憶體不足,使用flow_from_directory一次僅須讀入一個batchSize批次量,該批次訓練完畢後,再到資料夾內讀取一個批次量,因此可以大幅降低記憶體的用量。
 

二、ImageDataGenerator 圖片產生器

圖片產生器是位在tf.keras.preprocessing.image.ImageDataGenerator下,主要功能是對原始樣本圖片進行微調改變,進而產生出新的訓練樣本,當原始樣本不足訓練時就非常有幫助,而訓練出來的模型也可以用來面對實際使用時不同的環境所造成的影響,舉例來說,當我們製作商品辨識器,使用者可能不會把商品就放在鏡頭畫面的正中央,也可能有點歪斜,甚至可能因為太陽光線不同造成的顏色變化等等,都可以透過這功能來解決。這裡選幾個我在影片範例中所採用的圖片微調功能來說明

1. rotation_range(x):隨機旋轉X度(範圍0-360)
此功能就是將樣本圖片隨機旋轉X度,這裡的隨機意思是當我們設定X度,則產生器會隨機旋轉[-X:+X]度之間,而不是固定X度,因此一張樣本圖片就可以產生出多張不同角度的樣本,而這樣就可以避免未來物件放置在鏡頭下角度不對時,而辨識不了的問題。

下圖可以說明使用rotation_range(30)後的結果,有的順時針,有的可能逆時針,有的也可能剛好沒變

image

2. width( or height)_shift_range=x:隨機水平或垂直平移x
此處的x有兩種值,若x<1,則代表位移比例,例如0.3代表位移量是[-30:+30]「百分比」,另一個狀況若是x>1,例如x=30,則代表位移量是[-30:30]個「畫素」,一般選用x<1的百分比較為常用,此處要注意選擇的偏移量若太大,可能會造成要辨識的物件幾乎完全消失,成為無效樣本。

讀者會有疑問的是,當物件偏移後,剩餘的空間要填入什麼內容,這部份則是由另外一個參數fill_mode來設定(下面第6點會說明),根據keras預設fill_mode的選項則是'nearest',意思是最邊邊那個像素來填滿多出來的空間。這個功能的可以解決物件如果沒有剛好放在中間時,而辨識不了的問題。

文章標籤

夜市 小霸王 發表在 痞客邦 留言(1) 人氣()