2021年2月28日 星期日

物件偵測 (#1/5): MS COCO的資料集格式




在進行AI圖像上, 常會看到MS COCO的資料集,

COCO 的圖片資料集,提供3種標注檔:object instances(用於物件偵測), person keypoints(人的關鍵點,用於姿態識別)以及 image captions(圖像標題) , 每種標注類型都有相應的json 檔。標注檔也分好了訓練集、驗證集。


with open(annotation_file, "r") as f:
    data = json.load(f)
    annotations=data["annotations"]
    images=data["images"]
    categories=data["categories"]
    
    
    
print(f"Number of images: {len(annotations)}")
print(f"Number of images: {len(images)}")
print(f"Number of images: {len(categories)}")

The COCO dataset has been downloaded and extracted successfully.
Number of images: 36781
Number of images: 5000
Number of images: 80

images[60] => 取出index 60 這張圖的資訊

{'license': 1,
 'file_name': '000000360661.jpg',
 'coco_url': 'http://images.cocodataset.org/val2017/000000360661.jpg',
 'height': 480,
 'width': 640,
 'date_captured': '2013-11-18 21:33:43',
 'flickr_url': 'http://farm4.staticflickr.com/3670/9709793032_f9ee4f0aa2_z.jpg',
 'id': 360661}

annotations[60] => 取出index 60 annotations資訊

{'segmentation': [[267.51,
   222.31,
   292.15,
   222.31,
   291.05,
   237.02,
   265.67,
   237.02]],
 'area': 367.89710000000014,
 'iscrowd': 0,
 'image_id': 525083,
 'bbox': [265.67, 222.31, 26.48, 14.71],
 'category_id': 72,
 'id': 34096}


annotation{
    "id": int,    
    "image_id": int,
    "category_id": int,
    "segmentation": RLE or [polygon],
    "area": float,
    "bbox": [x,y,width,height],
    "iscrowd": 0 or 1,
}


每一張圖片會有一個image_id, 而一張圖可能包含一個以上的單一物件或群物件. 針對每一個物件,
不論是單一物件或群物件, 都會用一個annotation來表現物件內容.. 一張圖會有多個annotation, 即多個物件







annotation{
 "id": int, ==> 物件id
 "image_id": int, ==> 所屬的圖片
 "category_id": int, ==>此物件的類別id
 "segmentation": RLE or [polygon], ==> 單一物件或一群物件的區域描述
 "area": float, ==> 物件區域的Pixel總數
 "bbox": [x,y,width,height], ==> bounding box的座標
 "iscrowd": 0 or 1, ==> 0: 單一物件, 1: 一群物件 (如:一群觀眾) 
}


其中"segmentation": 若為單一物件, 則是以一個多邊形的座標點 [X1,Y1,X2,Y2, ....] 來描述此物件的區塊位置.
若是一群物件的區域描述, 如要描述一群蘋果,則會用Mask的方式來描述,如下圖所示。






一群物件的區域描述, 即iscrowd=1, 則segmentation的內容為

{'counts': [671, 10, 2, 2, 4, 22, 6, 31, 1, 11, 1, 10, 379, 16, 1, 25, 5, 55, 378, 43, 4, 55, 378, 44, 3, 55, 378, 44, 3, 55, 378, 44, 3, 55, 378, 44, 3, 55, 378, 44, 4, 54, 379, 29, 1, 16, 1, 54, 380, 28, 2, 15, 2, 53, 382, 23, 6, 15, 1, 8, 21, 1, 3, 3, 5, 12, 384, 20, 8, 16, 40, 12, 384, 16, 14, 15, 40, 10, 386, 10, 21, 14, 40, 8, 388, 8, 22, 15, 41, 3, 393, 3, 25, 15, 465, 15, 465, 15, 466, 14, 467, 13, 468, 12, 469, 10, 471, 8, 474, 3, 983, 7, 472, 9, 470, 11, 454, 6, 1, 20, 452, 28, 451, 30, 449, 31, 448, 33, 447, 34, 446, 35, 445, 35, 445, 35, 445, 35, 445, 36, 445, 36, 445, 35, 447, 33, 450, 30, 450, 30, 450, 12, 1, 17, 451, 10, 3, 16, 452, 8, 6, 13, 455, 4, 12, 8, 474, 3, 50865, 6, 459, 6, 8, 11, 454, 27, 452, 29, 450, 31, 448, 32, 448, 32, 448, 32, 448, 32, 448, 32, 448, 32, 448, 31, 450, 29, 452, 20, 2, 4, 456, 7, 1, 3, 1, 4, 7174, 6, 2, 6, 4, 14, 447, 34, 445, 36, 443, 38, 442, 38, 442, 38, 442, 38, 442, 38, 442, 38, 442, 38, 443, 36, 445, 34, 446, 6, 19, 6, 450, 3, 478, 1, 42714, 6, 473, 8, 471, 10, 469, 15, 465, 18, 462, 19, 461, 21, 459, 22, 458, 24, 456, 26, 455, 25, 456, 24, 458, 22, 461, 18, 463, 16, 466, 3, 5, 3, 3840, 7, 463, 20, 459, 22, 457, 27, 448, 33, 446, 35, 437, 44, 435, 46, 433, 47, 432, 48, 432, 48, 432, 48, 432, 48, 432, 30, 4, 14, 432, 29, 7, 12, 432, 29, 8, 10, 433, 29, 9, 8, 435, 13, 1, 1, 2, 10, 12, 3, 439, 12, 6, 7, 456, 10, 471, 3, 3, 2, 474, 1, 478, 2, 477, 3, 476, 4, 476, 9, 470, 11, 469, 12, 468, 13, 467, 14, 7, 1, 458, 23, 457, 23, 457, 23, 458, 22, 459, 21, 461, 19, 463, 18, 462, 19, 461, 20, 1, 9, 450, 33, 447, 34, 446, 36, 444, 37, 443, 38, 443, 38, 443, 37, 445, 35, 450, 7, 2, 21, 459, 21, 460, 20, 461, 19, 463, 3, 3, 10, 471, 8, 474, 3, 18209, 1, 479, 2, 478, 3, 477, 4, 476, 5, 475, 6, 474, 7, 474, 10, 471, 8, 474, 4, 5302, 7, 447, 4, 26, 4, 445, 6, 1, 15, 11, 3, 443, 29, 6, 3, 442, 32, 4, 2, 442, 38, 442, 38, 442, 38, 442, 38, 442, 38, 442, 37, 444, 16, 1, 18, 446, 8, 1, 3, 6, 3, 4, 8, 449, 3, 22, 4, 46076, 6, 468, 13, 466, 15, 461, 20, 459, 21, 458, 22, 457, 23, 457, 23, 457, 23, 457, 23, 457, 22, 458, 21, 459, 20, 460, 20, 461, 19, 462, 18, 463, 17, 462, 18, 461, 19, 460, 19, 461, 19, 461, 19, 461, 19, 461, 19, 461, 19, 461, 19, 461, 18, 463, 16, 465, 8, 1, 3, 470, 4, 31194, 12, 9, 6, 452, 29, 445, 36, 443, 38, 441, 39, 435, 45, 434, 46, 427, 53, 426, 54, 425, 55, 424, 55, 425, 54, 426, 53, 427, 51, 429, 25, 1, 24, 430, 22, 5, 22, 210], 'size': [480, 640]}






References:




尚有其他訓練影像的標記格式, 如PASCAL VOC 以XML格式儲存, TensorFlow Object Detection 以.csv 儲存, 而Darknet (Yolo) 以.txt 儲存

2021年2月7日 星期日

RP2040 與 Raspberry Pi Pico


Raspberry Pi 基本會也切入MCU 領域, 且還開了一個自己的晶片RP2040. 雙核的ARM Cortex-M0+ (133MHz), 內建264KB SRAM, 還外掛一個 16MB的 Flash。GPIO 輸出是 3.3V . 不過目前晶片還沒有對外銷售, 只有提供給幾家廠商,如Sparkfun開發板子. 重點是支援 TensorFlow Lite 框架, 可以開發輕量級Deep Learning 的應用


 
7 × 7 mm QFN-56 package 


RP2040的晶片架構圖



RP2040 Chip features:

  • Dual ARM Cortex-M0+ @ 133MHz
  • 264kB on-chip SRAM in six independent banks
  • Support for up to 16MB of off-chip Flash memory via dedicated QSPI bus
  • DMA controller
  • Fully-connected AHB crossbar
  • Interpolator and integer divider peripherals
  • On-chip programmable LDO to generate core voltage
  • 2 on-chip PLLs to generate USB and core clocks
  • 30 GPIO pins, 4 of which can be used as analog inputs
  • Peripherals
    • 2 UARTs
    • 2 SPI controllers
    • 2 I2C controllers
    • 16 PWM channels
    • USB 1.1 controller and PHY, with host and device support
    • 8 PIO state machines
基金會也以RP2040開發一個板子叫Raspberry Pi Pico。  Pico 內部帶有boot loader,不過沒有作業系統 (不像Pi 或Pi zero 有Linux作業系統), 但Pico有提供C/C++ SDK及MicorPython SDK供使用者快速開發.   



Pico dimensions (unassembled):  51.3mm x 21mm x 3.9mm





2020年12月14日 星期一

Windows 10 系統還原 (Windows 10、8)

 

若不想一天到晚重灌系windows系統. 那麼這個功能是一定要啓用的~

在工作列的搜尋方塊中,輸入建立還原點,然後從結果清單中選取[建立還原點]。
在[系統內容] 方塊中的[系統保護] 索引標籤上,選取[建立]。


Windows 會自動根據定期排定的時間間隔建立還原點,以及在安裝許多軟體之前建立還原點。 如果要手動建立還原點,就直接點選 [建立], 輸入還原點描述,然後選取[建立] > [確定]。 如果D磁碟機不用保護, 則不要開啓D的磁碟機的系統保護. 如此還原時就一定也只會還原系統碟而已。










2020年11月27日 星期五

TelegramBot 傳送貼圖的方法

 

TelegramBot 傳送圖片的方法


def start(update: Update, context: CallbackContext) -> None:

    update.message.reply_text('Hi!')

    update.message.reply_sticker('http://e2412fdcd657.ngrok.io/sticker.png')

而參數是圖片的URL位址


可以在windows 上利用MobaXterm 啓動HTTP Server 並把圖片(stciker.png)放在資料匣下. . 用瀏覽器存取 http://127.0.0.1/sticker.png


 sticker.png要放在C:\Users\Joseph下

但telegram Server 無法存取此網址 127.0.0.1 ? 怎麼辧呢? 我們可以利用ngrok 在電腦上打一個洞. 讓外面Telegram Server 可以連進來我們在本機(Localhost)的HTTP Sever


下載ngrok Windows版本, 並點擊執行ngrok.exe, 接著鍵入 ngrok 80 , 將會出現底下畫面


在瀏覽器上打入 http://e2412fdcd657.ngrok.io/sticker.png   , 若可以存取到. 則Telgram Server 就可以存取到了,這個網址就是貼在程式碼中的圖片位址

 





註: 免費的MobaXterm只有180秒啓動時間就會自動關閉, 可以自己架設其他的web Server. 或註冊MobaXterm


2020年10月5日 星期一

AI邊緣運算實作: TensorFlow Lite for MCU #1






   [課程簡介]


隨著物聯網與人工智慧發展,工作負載開始由雲端移轉至終端,AI也隨之進入到嵌入式系統及物聯網終端裝置中。在終端或所謂邊緣裝置這類的超低功耗微處理器上所實現的深度學習,被稱呼為微型深度學習。然而在硬體資源受限下,要如何確保AI 效能,同時兼顧低功耗、成本與縮短開發時間,都是研發人員所必須面對的挑戰。

TensorFlow Lite for MCU正是專為邊緣裝置設計的TensorFlow模型預測框架,是TensorFlow的精簡版本,讓開發者可以在物聯網與嵌入式裝置中部署微型機器學習模型。 本課程將教授AI模型如何佈署於微控制器,包含模型訓練、模型最佳化以及TensorFlow Lite框架的程式開發等。此外,在實作上以Sparkfun edge board (ARM cortex M4)為例,說明如何以TensorFlow Lite 進行微控制器上面的人工智慧開發專案,包含人臉偵測、關鍵字的字詞偵測、姿態識別、異常偵測等


[心得]


TensorFlow Lite for MCU 在實作上會涉及Deep Learning 觀念及MCU開發技術,然而這是兩個截然不同的技術領域的人, 要能有效整合必須要能理解這兩邊的技術。在AI領域, 對於輸入的資料多半是.csv檔載入, 然而在邊緣運算上, 輸入的資料是來自硬體的感測器,因此要能正確且即時的對資料預處理並且轉換成模型所須要的x輸入型狀(x input shape)才能代入模型。但資料在抓取上要如何切成一個個完整的x 來進行轉換, 就需要有一個方法,因為訊號如聲音訊號進來是連續波, 沒有切成一段完整的聲音, 就不能再往後處理。有時資料取得有雜訊可能造成模型誤判,所以通常也不能只是用一次模型的預測結果當作測試結果. 這也是要有一個處理的機制。 此外,MCU本身運算速度就不快, 記憶體空間也有限,所以AI模型也不能太大 (要進行優化), 網路的每一層要進行的運算也要盡可能的優化才能加快運算速度。


OK 先從簡單的開始, 要先去觀察感測器看到什麼. 也就是x, 不對的x, 再好的模型也無法得到好的結果.





References:

https://bit.ly/3j2fIIt

<待續....>.

2020年9月26日 星期六

教學方法分享

下載並安裝wacom driver 


https://drive.google.com/drive/folders/1fXPbY3cqNh8vPpvjJj2LdIFp2uv-_L6Z?usp=sharing


安裝Pointofix 可以寫字在螢幕上


預設是德文, 中文化方法==> 將 pointofix_translation.ini 複製到 C:\Program Files (x86)\Pointofix
即可. 







試著熟悉數位筆的使用感覺, 同時熟悉幾個常用的快速鍵,會讓你的講課流暢度不會因為數位筆的關係,而不斷停頓




更多 Pointofix 使用說明 https://briian.com/6545/



ScreenShot 分享 

若在螢幕上用Pointofix 所寫的內容很多很重要,那麼也可以按下F7 擷最畫面存成.PNG檔, 順便幫同學做個筆記. 之後再利用HFS或google drive 分享給同學.


在google drive 建立一個目錄來分享檔案, 分享的網址可以建立短網址 (https://reurl.cc/main/tw) 
, 此網址於課程的第一堂課就可以給同學, 後續若有新增其他檔案, 同學也都可以在同一個地方下載或者想回家練習仍可以再次下載. 





此分享目錄最好也能有結構的分類



|--code
|-- doucment
|-- scrrenshot
        |-- scrrenshot_20200908
|       |-- scrrenshot_20200915










使用PowerPoint的快速鍵


一定要記住 PowerPoint 在播放投影片的快速鍵. 可以增加講課的流暢度. 
可以試著按F8 ,,可以直接切換成畫筆模式, 且不斷F8 還可以更換筆的顏色


老師的用心是決定課程品質的關鍵! 我們也得換位思考, 若我們是坐在底下的學生. 我們

一定也會期待這門課能獲得什麼, 而不是坐在那裡浪費生命