發表文章

目前顯示的是 7月, 2021的文章

熱影像物件偵測 (Object Detection on Thermal Image) - 3 使用TensorRT C++ Win10 - 寫TensorRT C++

圖片
上篇 文章 我們測試了onnx格式的model,確認這個model是可以使用的。接下來就要在 TensorRT 上寫C++ 程式執行。 一、安裝tensorRT 可以參考我之前寫 安裝tensorRT的文章 ,依照步驟安裝。 二、複製tensorRT sample 程式修改 我使用 samples\sampleOnnxMNIST 做修改,因為都是讀入onnx格式的model。 將 sampleOnnxMNIST 資料夾複製一份出來,一樣放在 samples 資料夾下,修改檔名叫做sampleOnnxThermalObjDetection,由於model input output 格式跟sample的不一樣,所以要稍微修改。 三、專案屬性加入opencv設定 我們需要讀入圖片,以及對圖片的處理。 這裡我借用openvino裡的opencv來用。 1.開啟專案的屬性頁面,在"其他 Include 目錄"裡添加 opencv include 路徑: 2.在"其他程式庫目錄"裡添加 opencv lib 路徑: 3.在"其他相依性"裡添加 opencv 使用到的 lib 檔名: 四、修改程式碼 開啟 sampleOnnxMNIST.cpp 檔案做修改 1. include opencv #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> 2.修改 model input output name: 將 initializeSampleParams() 修改成以下,之後要將model及image放在 samples/sampleOnnxThermalObjDetection/ 路徑之下。 samplesCommon::OnnxSampl

熱影像物件偵測 (Object Detection on Thermal Image)- 2 使用TensorRT C++ Win10 - 測試onnx model

圖片
上篇 文章 我們得到了onnx格式的model,先做個測試確認這個model是可以使用的,需要在onnx framework下執行這個model,這邊使用到python onnx runtime。 一、下載onnx runtime 可以在 https://www.onnxruntime.ai/ 下載你需要的版本。 我下載的是GPU版,在python環境下輸入: pip install onnxruntime-gpu 二、寫執行程式 1.import import cv2> import numpy as np import onnxruntime as ort import onnxruntime.backend 2.讀入 onnx model modelName = 'weights/export.onnx' sess = ort.InferenceSession(modelName) 3.顯示讀入model的相關資訊 print("device", ort.get_device()) print("in count", len(sess.get_inputs())) print("out count", len(sess.get_outputs())) input_name = sess.get_inputs()[0].name print("input name", input_name) input_shape = sess.get_inputs()[0].shape print("input shape", input_shape) input_type = sess.get_inputs()[0].type print("input type", input_type) output_name0 = sess.get_outputs()[0].name print("output0 name", output_name0) output_shape0 = sess.get_outputs()[0].shape pr

熱影像物件偵測 (Object Detection on Thermal Image) - 1 使用TensorRT C++ Win10 - 測試model及匯出onnx model

圖片
最近疫情的關係熱影像攝影機的應用瞬間發展很快,所以想說有能不能以熱影像畫面為基礎,作物件辨識。在網路上尋找到 這篇文章 ,使用yolov3-spp模型架構訓練,model細節及介紹請看原文,這裡主要是要說明我怎麼將他的model轉換成tensorRT可以執行的部分。想研究如果用c++執行這個model能不能更快一些。 一、clone github 1.clone  github專案 下來 2.Download pre-trained weights 我下載下來的 pre-trained weights 長這樣,根本不知道要使用哪個才對,如果有人嘗試其他的可以留言跟我說喔。 二、測試程式可以執行 專案根目錄裡有個detect.py,這是我們開始的主程式,我嘗試出以下組合是可以使用的。 類別名稱檔:data/coco.data model_config:cfg/yolov3-spp.cfg model:weights/yolov3-spp.weights 如果在data資料夾裡沒有找到 coco.data、coco.names檔案的話請解壓縮labels.zip 帶入所需的參數執行: --data <類別名稱檔> --cfg <model_config> --weights <model> --source <要辨識的圖片資料夾或影片檔> python detect.py --data data/coco.data --cfg cfg/yolov3-spp.cfg --weights weights/weights/yolov3-spp.weights --source data/samples 這是他deteset裡面的一張圖的便是結果: 三、執行速度 我使用的系統環境是: CPU:i7-10700 GPU:GTX1660 SUPER CUDA:10.2 python:3.6.8 pytorch:1.8.1 onnx:1.8.0 每一張處理時間是:0.02秒左右 四、model匯出成onnx格式 1.切換匯出onnx model模式 在models.

訂午餐/訂飲料/團購訂單 使用excel製作 - 4 統計項目唯一值/去除重複值 使用office365 新UNIQUE函數

圖片
新的 office 365 在 excel 回傳多個數值推出了一個新功能"溢出",意思是如果公式得出多個數值,無法在一個儲存格內全部顯示,他會溢出到鄰近的空白儲存格內,但是當周遭都沒有空白儲存格時會顯示"溢出",所以要注意溢出的地方要有空白儲存格讓他溢出。 一、公式介紹 主要是用以下兩個公式: UNIQUE (array,[by_col],[exactly_once]) FILTER(array,include,[if_empty]) 1.UNIQUE (array,[by_col],[exactly_once]) 描述:傳回清單或範圍中的唯一值清單。 array - 尋找唯一值的範圍 [by_col] - TRUE:欄彼此比較 FALSE:(可省略)列彼此比較 [exactly_once] - TRUE:剛好發生一次之列或欄 FALSE:(可省略)返回所有不同的列或欄 2.FILTER(array,include,[if_empty]) 描述:根據自定義的準則來篩選資料範圍。 array - 要篩選的陣列或範圍 include - 布林陣列的高度或寬度必須與該陣列相同 [if_empty] - 若所包含陣列中的全部值均為空時要傳回的值 二、取得項目的唯一值(使用office365) 使用 FILTER 函數是因為當取唯一值範圍裡有空白儲存格時,空白儲存格會被當作一個唯一值看待,但我的資料有時量多有時量少資料長度不固定,公式每次都調整資料範圍非常麻煩所以要將空白儲存格捨去。 1.有空白儲存格的情況 A12、A13為空白儲存格,取唯一值後空白儲存格會當作0。 =UNIQUE(A2:A13) 2.解決方法 不等於的寫法: <> 空白值 ""  公式一:先移除空白再取唯一值 =UNIQUE(FILTER(A2:A13, A2:A13<>"")) 黃色為公式拆解步驟結果 拆解步驟公式

訂午餐/訂飲料/團購訂單 使用excel製作 - 3 統計項目唯一值/去除重複值 使用陣列公式

圖片
上篇 文章 統計了商品項目,但是中間會有空白的欄位,不太符合一般視覺感官,接下來我們就要將空白的部分移除掉。 作法是將抓出來的商品項目移除掉空白值,重新排序商品項目,由於要一次計算多個項目,所以我們這邊會需要用到陣列公式。 一、陣列公式簡單介紹 案例一:一次計算多個儲存格,回傳一個值 多個值相乘後再加總(A欄 * B欄)後加總,公式為下圖: 計算結果: 如果改為陣列公式計算只需要一行公式就可以解決,只佔用一格儲存格空間,省空間也美觀。 公式改為: {=SUM(A2:A4*B2:B4)} 注意:A欄的格數要與B來的格數一致 {}為陣列公式符號,不能直接輸入{},要使用 ctrl + shift + enter 輸入 步驟: 在儲存格內輸入 =SUM(A2:A4*B2:B4) ,按  ctrl + shift + enter  完成儲存格輸入 計算結果: 案例二:一次計算多個儲存格回傳多個值 判斷數值是否大於50 公式為: {=A2:A11>50} {}為陣列公式符號,不能直接輸入{},要使用  ctrl + shift + enter  輸入 步驟: 框選C2:C11,接著輸入公式 =A2:A11>50 ,按  ctrl + shift + enter  完成儲存格輸入 二、所需公式介紹 OFFSET(reference, rows, cols, [height], [width]) INDEX(array, row_num, [column_num]) SMALL(array, k) • OFFSET(reference, rows, cols, [height], [width]) 描述:傳回指定列數及欄數之儲存格或儲存格範圍 reference - 參考位置 rows, cols - 以參考位置為基準的欄列位移量 [height], [width] - 回傳儲存格範圍的寬高 範例:回傳A3到A5儲存格範圍 公式

訂午餐/訂飲料/團購訂單 使用excel製作 - 2 統計項目數量

圖片
上篇 文章 統計了總金額以及登記已繳錢金額,接下來就要開始訂餐了,訂餐需要統計每項商品的數量,每次一個個人工數麻煩,量多的話又容易出錯。 做法是先列出有哪些項目在去計算數量。 這裡用到兩個公式: IF(條件, 條件成立回傳值, 條件不成立回傳值) COUNTIF(範圍, 條件) IF(條件, 條件成立回傳值, 條件不成立回傳值) 定義:條件成立與不成立 基本的邏輯判斷,這公式非常常用到      =IF(C2=”Yes”,1,2)      當 C2 儲存格內的資料是 ”Yes” 傳回 1      當 C2 儲存格內的資料不是 ”Yes” 傳回 2 COUNTIF(範圍, 條件) 定義:統計範圍內有幾個儲存格符合條件 條件的設定跟IF的條件有點像 範例可參考:https://support.microsoft.com/zh-tw/office/countif-%E5%87%BD%E6%95%B8-e0de10c6-f885-4e71-abb4-1f464816df34 第一步:先列出有哪些項目 要列出項目,但是要移除重複值,所以我們要列出第一次出現的項目,第二次出現同一個項目時不能顯示。 公式:E2=IF(COUNTIF($B$2:B2,B2)=1,B2,"") 公式下拉自動填充的話會長這樣 E2=IF(COUNTIF($B$2:B2,B2)=1,B2,"") E3=IF(COUNTIF($B$2:B3,B3)=1,B3,"") E4=IF(COUNTIF($B$2:B4,B4)=1,B4,"") ... 舉例及解釋 IF(COUNTIF($B$2:B4,B4)=1,B4,"") • COUNTIF($B$2:B4,B4):      B2到B4中有幾個符合B4的內容,B4 "羊肉羹飯" • COUNTIF($B$2:B4,B4)=1:     當符合條件的儲存格只有一格,回傳true,代表B4的內容出現一次 • IF(COUNTIF($B$2:B4,B4)=1,B4,"")      B4的內容出現一次,顯示B4的內容 放上計算流程 公式: 計算的數值: 第二步:計算數量 公式 F2=IF(E2="",&

訂午餐/訂飲料/團購訂單 使用excel製作 - 1 登記繳錢

圖片
最近因為疫情的關係都訂外送,公司本來是用  dinbendon  這個網站統計,但公司上頭突然說取消公司統一訂餐,變成有些人開始揪團訂外送,我也不例外,但之後人數越來越多統計上開始有點亂了。  基本上都會先像這樣統計 之後來到要收錢的關卡,要怎麼登記呢?我之後多加一欄 再來我想一下,錢收到一半時可能要確任已收到的金額有沒有錯(對帳),還有總金額是多少,這時候就需要公式了。 總金額 總金額比較簡單,就是加總起來 公式: =SUM(範圍) 以上表為例,將 C2 到 C6 的數值加總 =SUM(C2:C6) 如果 C 這欄都是每個人訂餐的金額,不會有其他資料的話,可以把整個C欄都加總起來,以方便日後在下方多增加資料: =SUM(C:C) 已收金額 再來就是錢收到一半時要確任已收到的金額有沒有錯(對帳),主要的概念是,將有登記已繳錢的金額加總起來。 公式: =SUMIF(條件檢查範圍,條件,加總範圍) 這邊我們要先判斷 D 欄如果有填字的話就當作有登記,將D欄登記對應C欄的範圍加總      "<>" 表示條件為非空白儲存格的意思 =SUMIF(D:D,"<>",C:C) 成果: G4 =SUM(C:C)) G5 =SUMIF(D:D,"<>",C:C)

安裝 tensorRT C++ Win10

圖片
 我的作業系統環境為: windows 10 CUDA 10.2 cuDNN 8.1.0 visual studio 2019 python 3.6.8 我是安裝 TensorRT-7.2.3.4,使用zip安裝 可以參考官方的安裝流程:  https://docs.nvidia.com/deeplearning/tensorrt/archives/tensorrt-713/install-guide/index.html (直接跳到 zip安裝的部分 )  第一步:下載  TensorRT-7.2.3.4 zip 檔      在你要安裝的地方解壓縮 第二步:添加環境變數      將 TensorRT資料夾目錄下的lib資料夾路徑,加到系統的環境變數列表裡      例如:           解壓縮檔案是  D:\Program\TensorRT\TensorRT-7.2.3.4          添加的路徑是  D:\Program\TensorRT\TensorRT-7.2.3.4\lib 第三步:下載驗證用的data     使用python執行  <安裝目錄>\data\mnist\download_pgms.py      <安裝目錄>\data\mnist 目錄下會多出這些檔案 第三步:驗證您的安裝是否正常工作     使用 visual studio開啟安裝目錄下的 samples\sampleMNIST\sample_mnist.sln     確認include及 lib的檔案路徑是否正確,可能你CUDA安裝的路徑不是在系統路徑下     因為我把CUDA安裝在D槽,所以要修改檔案路徑     include 路徑     lib路徑           確認沒問題之後就可以, 重新建置(build)      執行結果: