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) 人氣()

ESP32各腳位PULLUP設定實驗結果(資料來源:葉子宏,原始網址:https://www.facebook.com/groups/esp32tw/permalink/3163691910536022/)

以下為38隻腳NodeMCU-32S我測試過的心得
GPIO35、34、39、36 只能設置為輸入模式,上下拉無軟件且要接電阻
上拉INPUT_PULLUP函數(電阻接正)(開關接負)和
下拉INPUT_PULLDOWN函數(電阻接負)(開關接正)
GPIO13、12、14、27、26、25、33、32、15、4、16、17、5、18、19、21、22、23
設置為輸入模式下拉INPUT_PULLDOWN函數(電阻接負)(開關接正)digitalRead→ LOW
GPIO13、12、14、27、26、25、33、32、15、0、4、16、17、5、18、19、21、22、23
設置為輸入模式上拉INPUT_PULLUP函數(電阻接正)(開關接負)digitalRead→ HIGH
GPIO13、12、14、27、26、25、33、32、15、2(led會亮)、4、16、17、5、18、19、21、22、23
設置為輸出模式
 


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

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

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

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


ESP32的藍芽2.0也就是BluetoothSerial真的是很方便,不過有一個小問題就是有時候距離太遠可能會連線中斷,如果斷線以後沒有任何提醒給使用者,那麼後續的工作就沒辦法進行了。

以下小程式可以建立一個callback事件,當裝置連線成功或連線中斷時,都會送出一個序列視窗的提醒(當然也可以改寫成LED燈號),給大家參考。


#include <BluetoothSerial.h>
BluetoothSerial BT; //藍芽callback事件
void callback(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) {
  //藍芽連線完成
  if (event == ESP_SPP_SRV_OPEN_EVT) Serial.println("藍芽連線完成");
  //藍芽連線中斷
  if (event == ESP_SPP_CLOSE_EVT ) Serial.println("藍芽連線中斷");
}

void setup() {
  Serial.begin(115200);
  //建立callback事件
  BT.register_callback(callback);
  BT.begin("ESP32");
}

void loop() {
  //do what you want

文章標籤

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

今天把剛買的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) 人氣()

剛剛整理好家裡的一台老電腦,順便看一下這台老電腦內有什麼設備可以拆出來利用的,開啟裝置管理員查看配備的時候,查到硬碟的品牌是HGST,感覺有可能是hitachi的產品,隨手在網路查一下,果然是hitachi的硬碟,順著文章往下看,原來hitachi竟然還併購IBM硬碟來的,看到IBM硬碟就想起我念研究所的時代,今天就來聊聊早期的硬碟品牌吧。

因為當時在電腦賣場打工的原因,偶爾都會有同學請我幫忙買電腦材料像是CD、鍵盤、滑鼠、墨水匣這些小東西,也有大一點的螢幕、機殼、Power,當然也有硬碟之類的,記得當時跟北門的「流星電腦」(應該沒記錯名字)的妹妹混得很熟,流星妹妹都穿著大紅色制服,而且都年輕漂亮,確實很吸引成大這些宅男,這些人都會被流星妹妹騙去買電腦,當時我也差點就跟流星妹妹在一起了~

老霸王不提當年勇(老婆正在後面看著呢),講回硬碟,IBM硬碟其實在台灣算是比較晚看到,他的特點就是背面有一圈白鐵造型的圓圈,看起來就很粗壯,當時代號是不是叫做大力神之類的(再請網友指正),當時實驗室買了一台伺服器電腦,就是使用IBM萬轉硬碟,那個開機時候的噪音可以比的上直升機起飛,真的不誇張。

image
▲ IBM 80G (資料來源:網路)

不過當時最受一般使用者歡迎的主要是:Maxtor、Seagate、Quamtun這三家,可能是Maxtor總是比其他品牌便宜個倆三百,所以我就變成了他的忠實顧客,每次有同學要買硬碟我都是直接幫他買Maxtor,奇怪也沒收代言廣告費。

Maxtor的代號是鑽石X代,外型上也很特別,背面就是全黑(或全白),加上放射狀的線條,好像沒有化妝、粗曠不修邊幅的老男人,這可能是我一眼就愛上的原因吧。

image
▲ Maxtor 鑽石系列硬碟(資料來源:網路)

當時Maxtor最大的競爭者應該之一就是Seagate,Seagate的外型很多變,記得有一款還穿了衣服,感覺特別嬌嫩,記得型號有捷豹、梭魚...等等,Seagate經常被人用發音來戲稱是「死雞」,好笑的是在當時在研究室內死一顆Seagate硬碟,竟然引發連鎖反應的順帶掛掉好幾顆死雞硬碟,就被戲稱為「雞瘟」發作,真的是很巧合,當然啦,最後大家被我說服都換成鑽石硬碟了。

Seagate的外觀上感覺就是嬌氣上身,所以還穿了件衣服。不過這個衣服受熱久了以後就會變大,感覺就鬆垮垮,乾脆就給他扒光....

▲ Seagate 硬碟(資料來源:網路)

再來一定要提的就是聞名遐邇的Quantum了,Quantum最知名的系列就是Fireball,然後剛好又燙又熱又吵,因此就被戲稱「火球」(等等,Fireball本來翻譯就是火球呀),火球的銷路也非常火熱,可以說是當時最受歡迎的硬碟了。

QQ鳥~ Quantum Fireball EX 4.3AT EX43A101 EX51A013 (b054) | 露天拍賣
▲ Quantum 4.3G 火球 硬碟(資料來源:網路)

火球雖然很火,壓過死雞、火過鑽石,不過能讓Quantum留名千史的倒不是這顆火球,而是另外一款讓眾人訕笑一輩子的硬碟BigFoot「大腳」,不知道誰給的勇氣,Quantum竟然會出產這種5.25吋超大硬碟,而且只有4500轉,速度慢到靠背不說,還經常壞軌,記得當時還有朋友說,主要是因為半徑過大,磁片外圍的振動幅度會更大,可能導致壞軌機率更高,所以大腳要「立著」安裝,但是誰的電腦裡面有立著安裝大腳的空間呀。

不過大腳靠著便宜取勝確實騙到很多不懂的電腦新手,尤其比較相同價位的硬碟時,大腳的容量都高出一截,如果是組裝牌電腦規格不寫清楚,只看容量確實是便宜的選項,許多人買回家覺得慢,打開電腦殼一看知道被大腳給踩了,後來大腳確實風評太差,就沒在繼續出產了。還記得當時Quantum打出的廣告手法就是說,雖然轉速慢,但是我的圓周大,所以同時間磁頭能掃過得範圍與5400轉是幾乎一樣的,效能不會差太多,但是消費者可沒那麼好騙。

image
▲ Quantum 5.25吋 大腳 硬碟(資料來源:網路)

夜市 小霸王 發表在 痞客邦 留言(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) 人氣()

有一天妮妮說初三音樂課要做期末報告,他想編歌詞來介紹世界上的一些小國家,因為大部分的人都只知道歐美這些大國,覺得小國很可憐,沒人想要了解他們,當時跟他說「好啊,去寫看看」,本來覺得應該也是三分鐘熱度,後來她開始每天都跟我討論,還完成了初稿唱給我聽,這時才知道這家伙是認真的。
聽完她那五音不全唱完的初稿,這下才發現真的厲害,以一個國中生能了解或收集這麼多國家的資訊很不容易,尤其埋了很多梗(法國投降、美國愛石油、英國殖民地)等,這些梗就算是大人可能都不知道(像我),而且還有押韻哩,那就請大家聽看看吧。
由於是影片是現場拍攝,效果普通,所以這裡就只做截圖配上簡單動畫字幕吧~請見諒
**************************
{開始囉}
斐濟共和國的 海鮮 卡哇酒
新幾內亞被德 荷蘭 佔領過
一分為二東邊先 脫離澳洲
西邊想獨立吃蕉葉烤魚(註1)
南亞的東帝汶 民主 共和國
咖啡橡膠有名的紫檀木
汶萊的社會福利令人羨慕
原油天然氣稅收不必付
少數是社會主義的寮國
糯米拉帕青木瓜沙拉
海鮮水果豐富的孟加拉
黃麻宰牲節人力三輪車

{副歌}
去你媽英國  殖民地超多 侵略你不需要任何的理由(註2)

夜市 小霸王 發表在 痞客邦 留言(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) 人氣()

我的ESP32實做書籍:https://youyouyou.pixnet.net/blog/post/121105860
博客來網址:https://www.books.com.tw/products/0010901195


ESP32CAM是以ESP32為主版具鏡頭功能的Arduino,對於玩Arduino也想玩影像處理的夥伴的確非常吸引人,套一句網路梗就是「我全都要」

我全都要

不過ESP32CAM少了USB的確很麻煩(請參考:https://youyouyou.pixnet.net/blog/post/119383183),後來有一款內建CH340 USB接口的ESP32CAM,上傳就簡單多了,但是又出現一個問題,就是這款USB接口非常脆弱,經常不小心就脫落了。

本公司目前已經有研發新款的ESP32CAM,各位可以期待一下喔。

上傳底板則是專門針對ESP32CAM的USB上傳接口,使用CH340晶片,接上ESP32CAM就可以利用USB上傳程式碼,省去接TTL線的困擾。

關於上傳底板的教學請參考影片說明

一、使用USB上傳底板步驟

1. 連接ESP32CAM及上傳底板

2. 安裝CH340驅動程式

3. 開啟Arduino IDE並開啟ESP32CAM的範例程式CameraWebServer

4. 修改相關參數
   - 修改WiFi上網設定
   - 將Model改為AIthinker

--------以上步驟請參考:https://youyouyou.pixnet.net/blog/post/119383183----------------

5. 將ESP32CAM調整成下載模式
   - 按底板的IO0+ESP32CAM的RST,這裡很奇怪,因為這個上傳底板的RST並無實際作用,因此要改用ESP32CAM內建的RST按鈕。
image

文章標籤

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