2022年12月31日 星期六

佈署AI模型於Web 上


目標: 用瀏覽器上傳圖案到Web後端進行預測, 並將模型預測結果回傳至瀏覽器。


#teachable machine #Flask  #Keras 

#Install required packages
pip install flask==2.1.1
pip install Pillow==9.1.0
pip install tensorflow==2.3.1
pip install keras==2.4.3






專案目錄結構如下, 其中model 資料匣 要放置AI 模型檔及Label 文字檔。凡應用是上傳圖片,由模型預測分類結果的, 都可以套用本專案程式架構。在不想改程式碼, 就直接模型檔名改成keras_model.h5 ,類別的文字檔改成 labels.txt。 


 執行主程式 main.py 後, 會載入模型同時啓動Web Server (Flask) 



P.S. 此處 model 資料匣的所放的AI模型, 是直接使用 Teachable Machine 來建立模型。為了方便套用至其他的應用程式, 從teacbable machine 複製來的程式碼, 將其程式架構改寫為 Class 的方式,會比較好用。而且主程式會顯得很簡潔也會易於日後程式維護。aimodel.py 程式碼參考如下:



 

2022年12月1日 星期四

[Python] Python的變數僅僅只是一個tag

 

在python 世界裡, 宣告的變數僅僅只是一個tag。而tag 可以到處貼, 所以當你問 tag 的資料型態時 , 那就是在問tag 當下所貼的位置的物件資料型態為何  ?  

a=3  , 則 type(a)==> int

b=3.14  , 則 type(b)==> float

c="hello"  , 則 type(c)==> str

3, 3.14, "hello" 這都是物件, 佔有空間 ,而a, b, c 就是tag name, 只是一個名字用來存取物件而已。

python 的變數完全不同於C/C++ 變數的概念。C/C++ 變數是佔有空間的, 空間存放著資料, 而空間有多大就決定了資料的數值範圍。

int a=64;   (佔4個bytes)

char ch='A';  (佔1個bytes)





Python 有Garbage collection 的機制, 故物件10沒有任何tag參考, Python 會自己回收。
Python 中的List , 它是一個container ,即它是具有一個空間。 如 a=[3,3,1] , a[0] 這個tag 指向物件3,  a[1] 這個tag 也指向物件3, 而 a[2] 這個tag 指向物件1



你可能會問一個問題, Python 的變數用這樣搞有什麼好處?

用個例子說明好了,  a=[1,2,3] 

若要複製一份給c, 執行 c=a.copy() 就會將a的container 表格複製給c, 因為只是複製了container a 表格, 和資料物件多大沒有關係, 所以可以很快,也不用將相同的資料物件在記憶體中放兩份。若是C/C++ 則a, c 是各別的空間, 因此即使是相同的資料,在記憶體中也得各自存放一份,會比較佔空間,而且在複製資料時也得一個個byte 複製過去 ( memcpy),速度上也比較慢。






相關文章:

2022年11月5日 星期六

[Notepad ++]新增GNU ARM Assembly 語言格式

 

在Notepad ++編輯器新增GNU ARM Assembly 語言格式


1)下載  ASM for ARM GNU語言包 user defined languages


2) 在[語言]->[定義程式語言] 然後, 匯入ASM for ARM GNU 語言包



3) 匯入後可以再去修改, 例如, 原本ASM單行註解為只有 ; @ , 可再加入// (GNU GCC 是看得懂//為註解語法)

2022年11月1日 星期二

[Python] List is not what you think

 

mutable vs immutable



























相關文章: 






References: 

[1]TensorFlow Lite for MCU https://bit.ly/3j2fIIt 
[2]AI機器學習&深度學習 http://bit.ly/2KDZZz4 
[3] AIoT智能聯網運算實戰(含OpenVINO) http://bit.ly/2IlIUK8 
[4]AI自然語言與推薦系統應用 https://bit.ly/3qnO2Tg 
[5]python程式設計 https://bit.ly/359cz4m

2022年10月7日 星期五

[Python] Why do we need frozenset ?

(1) 用frozenset 才可以用集合當作Key

Example:

itemsets=[{'B','C'},{'D'}] 

count[{'B','C'}]+=1  # Error : "unhashable type: 'set'"

in this case, we can use frozenset to make 'set' as a key

count[frozenset({'B','C'})]=1   

(2) 用frozenset 才可以做集合包含集合

  S=set()

e={'A','B','C'}

S.add (e)  ==> 想要表示 S={{'A'},{'B'},{'C'}} --> TypeError: unhashable type: 'set'    

S.add (frozenset(e))  -->OK   S={frozenset({'A', 'B', 'C'})}


2022年8月29日 星期一

[Raspberry Pi ] 查詢 Software and Hardware Version of a Raspberry Pi

 

How to Check the Software and Hardware Version of a Raspberry Pi

 Type the following commands , you will get all information about Raspberry Pi
  • cat /etc/os-release
  • uname -a
  • cat /proc/cpuinfo | grep Model



 2019 年發布的Raspberry Pi 4  ,被發現有 USB-C 的充電問題,而小改款  v1.2 解決了此問題! 

2022年8月12日 星期五

[Linux 程式設計] 關於GCC

 

1. 後面的-lxxxx 如果是linux他的位置在哪裡? 

(base) ubuntu@ubuntu1804:/usr/lib$ cat  /etc/ld.so.conf.d/x86_64-linux-gnu.conf


# Multiarch support
/usr/local/lib/x86_64-linux-gnu
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
(base) ubuntu@ubuntu1804:/usr/lib$ pwd
/usr/lib

2. 標準函式庫為何不用帶-lxxx

 因為gcc 預設會連結標準函式庫 libc.so.xx

3. 如果使用opensource 專案時要使用 -lxxxx 這部分該怎使用如果他的lib名稱 不是lib<project>
 
  如果不是標準名稱就得用library全名. 主要還是要指定 -L<lib目錄>  , 指名library的位置, 如果不是放在library 的搜尋路徑上的話



(base) ubuntu@ubuntu1804:~$ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)


----------
相關課程: 
https://www.ittraining.com.tw/ittraining/it-elearning/el-linux-embedded/e-linuxsys#tab01