# Rai(瑞艾科技) 實習筆記
:muscle: 歡迎來到地獄,笑著走進來,跪著哭出去 :ambulance:


[TOC]
實習手冊:https://csie.hk.edu.tw/%e5%af%a6%e7%bf%92%e7%9b%b8%e9%97%9c%e8%be%a6%e6%b3%95-%e8%a1%a8%e5%96%ae-%e6%96%87%e4%bb%b6%e5%8d%80/
::: spoiler DayMission
==2023/01/16:==
認識Docker與Docker-Compose -已完成
重置網路分享器 -已完成
學習vscode connect ssh to NX -已完成
了解deepstream運作 -尚未執行
了解Nx -尚未完成
==2023/01/17:==
labelimg -已完成
==2023/01/18:==
Nx use the sdkmanager to reset-失敗
NX build the cvat-失敗
Yolo模型名詞的理解 -詳見下方
docker桌面應用程式下載及安裝 -已完成
cvat的架設
理解k8s -詳見下方
==2023/01/19==
YOlOv8的架設與研究 -已完成
嘗試架設在Docker內部運行、訓練以及熟悉程式碼運作
重灌NX-成功 #莫名成功重灌
架設CVAT在linux筆電上-失敗
==2023/01/30:==
YOLOv8的模型訓練
NumPy Json dict 的認識與學習
CVAT架設在Linux筆電-成功
==2023/01/31:==
CVAT的sdk api 使用與自動化
docker架設V8跟pytorch 寫成img
Linux 重新安裝顯示卡驅動
==2023/02/01:==
了解David寫的程式內容
Yolov8的模型訓練以及嘗試套用
成功將Yolov8架設在docker上,已知能夠套用模型拿來預測圖片人物,並印出相應座標
==2023/02/02:==
完成在NB筆電上運行yolov8模型訓練
嘗試修改David寫的程式內容達到需求
labelimg
==2023/02/03:==
labelimg
556 查 OK
557 董 OK
558 查 OK
559 倫 ok
560 倫 ok
==2023/02/04:==
labelimg
將昨天大門口的影片做影像處理,切割掉人物過度重疊的部分,重新再輸出一份並檢查處理完全
638 董OK
639 董OK
640 查OK
641 查OK
642 查OK
643 查OK
644 查OK
645 查OK
646 查OK
647 查OK
648 董OK
649 董OK
650 董OK
651 董OK
652 董OK
653 董OK
==2023/02/06:==
嘗試自動讓cvat下載下來的檔案生成yaml檔案
SSH連線免密碼處理完成
之後目標:
1.訓練自動化
2.將yolov8跑tensorRT推論引擎
labelimg
668 倫ok
669 倫ok
670 倫ok
671 倫OK
672 倫ok
673 倫ok
674 倫ok
675 倫ok
676 倫ok
677 倫ok
678 倫ok
679 倫OK
680 查OK
681 查OK
682 查OK
683 查OK
684 先不要處理
685 先不要處理
686 先不要處理
687 先不要處理
688 先不要處理
689 先不要處理
690 先不要處理
691 先不要處理
692 先不要處理
693 先不要處理
==2023/02/07:==
labelimg
694 董OK
695 董OK
696 查OK
697 查OK
698 倫ok
699 倫ok
700 查OK
701 查OK
706 倫OK
707 倫OK
==2022/02/08:==
倫:yolov8-tensorRT
查:yaml檔案的生成
董:docker檔案共通以及建構V8訓練
==2023/02/09:==
倫:cvat重裝、NX裝docker
董:重新架設yolov8
查:研究david的程式
==2023/02/10:==
倫:安裝DeepStream
董:重新架設yolov8,再次消失,重架進度到RUN TZ=Etc/UTC apt install -y tzdata,要從這裡開始
查:研究david的CVAT程式 已經可以自由下載project的圖片了
724 董ok
725 董ok
735 董ok
736 倫ing
==2023/02/13:==
倫: 架設Deepstream-yolo
董: 架設Deepstream-yolo
查: 自動下載cvat圖片以及內部的標籤存成YOLO對應格式 以及一部分防呆
==2023/02/14:==
倫: 架設Deepstream-yolo to nx - 成功
董: 架設Deepstream-yolo to nx - 成功 & 掛載分享目錄
查: 完成cvat_to_yolo的自動化程式
==2023/02/15:==
倫: 在nb上架設Deepstream-yolo的docker
董: 在nx上架設Deepstream-yolo的docker
查: cvat_to_yolo的自動化程式更新 嘗試了一下flask
新增使用者提示 完善固定驗證集功能 多執行序的狀態下防止檔案重複下載 多執行序的效率再優化 針對多執行序的進度條優化 補充註解 修正系統移植的錯誤
==2023/02/16:==
倫: Deepstream-occupancy-analytics 架設 & 設定Nx的OpenCV with Cuda yes
董: 成功在nx上架設Deepstream-yolo的docker,接著嘗試加入人流計數
查: cvat_to_yolo的自動化程式更新 多執行序鎖 flask架設
==2023/02/17:==
倫: 架設Deepstream-occupancy-analytics,排除Make問題
董: 嘗試人流計數的架設,但尚未成功
查: Flask已經可以遠端執行Auto_cvat_to_yolo了 並且也搞好下拉式選單了
==2023/02/18:==
倫: 重新安裝NB顯卡驅動、cuda、cudnn、Jetson Nx
董: 跟昨天一樣
查: 用python啟動docker 執行所需Auto_cvat_to_yolo檔案進行訓練並關閉docker
#David任務 檔案整理成兩個 1.安全帽+沒安全帽 2.背心+沒背心
==2023/02/20:==
倫: 重裝NB顯卡驅動和重灌NX
董: 人流計數成功架設在nx上,接著嘗試使用自己的模型
查: 嘗試處理David任務 xml的理解與修改成所需要的格式後上傳CVAT
由於檔案有點雜亂以及CVAT因為更新而暫時死亡 以至於延後
==2023/02/21:==
倫: 重灌設備工程師(NX、NB)、NB->Configure_Secyre_Boot:12345678
董: 嘗試查看kafka的數據,尚未成功
查: 已處理完成David安全帽上傳任務
==2023/02/22:==
倫: 修改Html檔
董: 查看kafka數據成功,接著嘗試放入自己的模型
查: David的任務做修正 內容與所需有點誤差作為更正 並且嘗試寫成副程式中有錯誤發生已修正
理解一下class 與 def的關係 期望之後能透過import class的方式完成工作 減少重複的內容
1021 倫ok
1022 查OK
1023 查OK
1024 倫ok
1025 查OK
1026 倫OK
1027 查OK
1028 查OK
1029 查OK
1030 查OK
1031 查OK
1032 查 移除
1033 查OK
1034 查OK
1035 查OK
1036 倫ok
1037
1038 倫ok
1039 董ok
1040 董ok
==2023/02/23:==
倫: 釐清Kafka to MySQL & Metabase #Metabase架設至NB、MySQL架設至NX
董: 成功將自己的模型轉換並套入deepstream中,且人流計數也可行
查: 開始寫class讓程式可讀性增加 並開始導入class中的self變數來作為程式運作內容 搞清楚class的用處
1081 倫ok
1082 查OK
1083 倫ok
1084 董ok
1085 董ok
1086 董ok
1087 董ok
1088 倫ok
==2023/02/24:==
倫: Postgresql架設
董: 發現kafka上傳的數據其實有誤,已修正,kafka的docker轉移至nb上
查: 完善class的副程式系統 並嘗試解釋內容給隊友 嘗試接出kafka的資訊並轉為json
==2023/03/01:==
倫: Postgresql + kafka 整合 & 寫成class
董: 嘗試修正kafka數據中的source_id,尚未完成。
查: 卡夫卡資料回朔 以及嘗試寫入資料庫??
==2023/03/02:==
倫: 完善Postgresql的class
董: 跟昨天一樣
查: 把下載CVATtoYOLO的內容也寫進class 並做優化
==2023/03/06:==
Everybody->嘗試裝設攝影機
倫: DeepStream-test3 run rtsp screen & how to find save video
董: 用opencv串流攝影機並擷取畫面成影片
查: 把下載CVATtoYOLO的內容寫進class 做多執行續的優化並比較速度上的優勢
==2023/03/07:==
Everybody->裝設攝影機 並把攝影機主機架設到天花板上
倫: 研究Deepstream-test3 rtsp串流
董: 研究如何用deepstream & opencv 使用rtsp串接鏡頭並擷取畫面輸出成影片檔
查: 線性函數的概念 pytorch的基本概念 其他連接層的名詞解析
==2023/03/08:==
倫: 使用OpenCV->Rtsp錄影->裁切->上傳圖片和標記檔至cvat
董: 使用OpenCV->Rtsp錄影->裁切->上傳圖片和標記檔至cvat
查: pytorch架構的理解 CVAT_Toolclass的新增內容 詳細請看python筆記
==2023/03/09:==
倫: CVAT_Tool Download ann
董: 從CVAT上取得標記檔數據並處理成需要的格式 失敗
查: pytorch神經網路的架設 訓練 存檔 資料集輸入 CVAT_Tool的教學(?
==2023/03/10:==
倫: 半自動化錄影&裁切
董: 從CVAT上取得標記檔數據並處理成需要的格式 失敗
查: Flask_API實作 成功 post_man
下周 python zip
==2023/03/13:==
倫: 錄影&裁切&上傳圖片&標記-自動化
董: 從CVAT上取得標記檔數據並處理成需要的格式 失敗
查: class新增 更正功能 Flask_api 轉移到docker上 失敗
==2023/03/14:==
倫: 錄影&裁切&上傳圖片&標記-半自動化 完成
董: 從CVAT上取得標記檔數據並處理成需要的格式 成功
查: 神經網路的損失函數修正 優化器修正 訓練出下一版模型 嘗試應用串流CV2影像+方框繪圖+神經網路推測 CV2延遲過於嚴重 暫緩
==2023/03/15:==
倫: 優化一條龍(錄影&裁切&上傳圖片&標記)
董: 優化處理標記檔資料
查: CV2影片顯示推論內容顯示方框 模型本身有嚴重問題重新訓練(出現負值) 嘗試解釋flask_api內容並修改以及flask_api調整為多筆資料進入#尚未完成
SHM 把記憶體當作硬碟的東西 能極快的把部分記憶體空間當作硬碟來使用:以下是有查到能用的
ImDisk
Dataram
RAMDisk
SoftPerfect RAM Disk。
==2023/03/16:==
倫: 研究多線程上傳、標記以及使用二微陣列作為單個或多個陣列元素上傳時判斷
董: 修理底下那位的flask要放進docker的問題
查: 完成flask_API的多筆資料來回傳輸 新數據的模型訓練 因有大量的錯誤數值而失敗 嘗試過歸一化與YOLO數值皆不理想 #尚未解決
==2023/03/17:==
倫: 將上傳圖片與標記圖片的副程式彈性化(可單可多)
董: 腸胃炎拉媽的
查: 更正推論模型(已經嘗試過 變更資料型別 變更模型複雜度 增加更多的訓練)重新訓練 仍然有負值寫限縮在flask_API上(超出範圍就限縮) 回傳資料也更改為int以便於畫框 然後滑水
==2023/03/20:==
倫: 處理下載下來的標記檔做切割後,丟回柏丞的API
董: 協助上傳數據
查: 協助隊友跟划水 稍微修正一下API的功能
==2023/03/21:==
倫: 丟一傳三的Ann,丟回CVAT_TASK,寫相同task[3:]的陣列和字典
董: 處理推論多組數據
查: timm的嘗試 滑水 flask數據似乎有問題 正在排查中
==2023/03/22:==
倫: 處理抓取cvat標記數據有空值的問題
董: 處理抓取cvat標記數據有空值的問題
查: 訓練模型狀況有問題 嘗試舊的數據後發現 現在的數據可能有問題 研究timm中 需要知道如何才能訓練
==2023/03/23:==
倫: 重新撰寫上傳空白Task與標記檔,加入了過濾方式
董: 處理抓取cvat標記數據有空值的問題,成功了,要修改成無論有幾份影片都可以使用
查: timm 學習訓練預設模型
==2023/03/24:==
倫: 撰寫影片裁切成照片時出現各資料夾檔案長度不一進行刪減成一致長度
董: 嘗試處理cvat標籤的detail,
查: 嘗試訓練timm模型 嘗試使用失敗 協助一(半)條龍 看了一下detail的組成
==2023/03/25:==
倫: 利用nb_docker上傳task&ann
董: 預計優化上傳到cvat的程式
查: 嘗試使用timm成功但還有需要優化的部分 需要設定class數量並重新訓練一下
#因為有客戶來 下午集體滑水
==2023/03/27:==
倫: 優化程式寫成class
董: 優化上傳到cvat的程式
查: 自己的推論模型訓練... 可視化模型狀況
==2023/03/28:==
倫: 優化程式寫成class
董: 優化一條龍
查: 寫可視化流程
==2023/03/29:==
倫: 滑水的一天
董: 嘗試用新的nx跑kafka推論
查: 可視化完成 確定模型推論解答沒什麼問題... 推論結果還是很糟糕
==2023/03/30:==
倫: 研究即時串流的流程
董: 用新的nx跑kafka推論 成功
查: 一推三模型欠佳先擱置 改回去熟悉timm 的使用
#全員 藥品的辨識準備
==2023/03/31:==
倫: 框初始藥品資料,先辨識為藥品再細分藥種
董: 訓練藥品模型,連假回來要試拍各種角度
查: TensorBoard的架設 尚未分資料夾 上課資料的資料前處理完成
K-Means 非監督式學習的圖像分類冬冬
==2023/04/06:==
倫: 拍照藥品、篩選照片ann資料(1-8)
董: 篩選照片、上傳cvat
查: 資料前處理寫上3090以及docker的建立 cvat-sdk的版本錯誤
#出錯-檢查套件版本
==2023/04/07:==
倫: 繼續拍照藥品(2-8)
董: 將照片放入yolov8模型後畫框上傳至CVAT,之後將CVAT上的圖片抓取下來並切割,最後進行訓練集與驗證集的分類
查: 白癡資料前處理 docker上運行timm原本失敗 重新安裝一次torch版本解決 在3090上訓練中... 還不知道要怎麼在那上面運行TensorBoard 因為網路不共通(已透過下載來解決)
==2023/04/10:==
倫: 認識Timm和模型訓練
董: 將資料分類好了,嘗試yolov8影像即時辨識
查: 確定timm模型訓練失敗 要換腳本 主影像串流 副執行序辨識用解決辨識以及延遲度的問題 成功 尚未接上Timm
==2023/04/11:==
倫: 請假一天
董: 把藥品辨識的模型放到flask中
查: Timm模型看起來還行 所以先留著使用 已經完成Timm橋接上Yolo的串流辨識了 尚還有一些問題需要解決 Yolo的信心度判斷要記得寫
==2023/04/12:==
倫: 得Timm辨識結果
董: YOLO即時影像辨識
查: 在3090架起Timm的flask Port的橋接
要寫明天去學校開會的文書資料
==2022/04/13:==
倫: 回學校開會、休假一天
董: 回學校開會、休假一天
查: 回學校開會、休假一天
==2022/04/14:==
倫: Nb重灌&顯卡驅動、CUDA、釐清藥品辨識、Yolo&Timm訓練的自動化流程、方向及未來框架
董: 將yolo即時辨識改成timm即時辨識,才能分清藥的種類,目前NB掛掉無法測試
查: 由於3090連接過完VPN後會有延遲的問題以至於有資料延遲的問題 嘗試在NB上執行內容 但NB掛了
==2022/04/17:==
倫: 研究bytetracker
董: 修正即時辨識框會疊加的問題
查: 手動架起科博館的Flask介面以及辨識的docker 修理由於資料延遲而導致的方框複數問題 多執行續的小小問題(class概念錯誤)
==2022/04/18:==
統一思想
先把科博館ID搞定
2023 董ok
2024 董ok
2025 董ok
2026 查OK
2027 查OK
2028 倫ok
2029 倫ok
2030 倫ok
2031 倫ok
2032 查OK
2033 倫ok
2034 倫ok
2035 倫ok
2036 倫ok
2037 倫ok
2038 查OK
2039 查OK
2040 查OK
2041 查OK
2042 查OK
倫: 研究bytetracker
董: 嘗試加入自動追蹤(reID)
查: 上午完成標記 下午在嘗試完成各種樣態的CVAT檔案 但因為從第一個的睡覺就有YOLO框不準的問題發生 降低信心值無果 只好回來訓練YOLO 原本想要在docker內做訓練 但因為資料並非標準格式 所以在docker內移動資料非常痛苦 爾後在自己的電腦上訓練 最後決定 明天再來錄製各種樣態的我們來做訓練資料 爾後再來做YOLO訓練
==2022/04/19:==
倫: 藥品TIMM模型訓練,找到一個較為準的模型,剩下就是再度訓練辨識資料和TIMM訓練,想採用YoloV8來訓練,之後發現訓練流程還不夠透明且清楚,打算先釐清訓練流程寫成HackMD後,再按照步驟寫成自動化用於減少動手操作重複性流程,先前寫的檔案能用,但當初沒有考慮到那麼周全,因此希望能藉由這次再練武功,還有一個想法是柏丞老大提供的,使用Yolov8的辨識看看,我會在資料前處理部分做同步訓練且比較各準度如何
董: 還是在嘗試reID
查: YOLOV8真的猛 訓練資料沒多少的情況底下+上30次的訓練 已經能把我們的樣態抓得好好的 早上完成為了資料前處理的部分 拿以前的程式稍微改一下後 丟進去訓練 然後 有結果後放在NB上做API的推論結果 然後測試模型稍微修正一下訓練集後 驗證的確準確很多 立刻上傳了睡覺的樣態資料 又把睡覺的樣態資料重新丟一次訓練 現在的V8模型對於我們有很準確的認知
==2022/04/20:==
倫: 改寫之前的自動龍,當初以為class完善了,可以直接用,但敗給經驗不足加上cvat分類的新功能,修改了好幾個小時,將程式調適成更彈性化,現在只修到可使用階段,還有一些細節需要做自動化調整,目前是先完成了自動化上傳與辨識。
董: 還是在嘗試reID
查: 開始嘗試flutter 嘗試閱讀dart
flutter 最需要搞懂的兩個東西:
StatelessWidget
StatefulWidget
==2022/04/21:==
倫: 比較yolov8內建的Track與Timm的差異
董: 嘗試reID 已經可以顯示在單張圖片上了
查: 寫了個flutter的登入介面能監聽button了 也稍微能讀懂code的邏輯了
還沒寫webview
==2022/04/24:==
倫: 查看Timm的模型辨識結果,辨識結果都為同一個藥品名稱,已經排除訓練資料問題,星期四會先採用即時串流查看問題,往不同角度突破問題
董: 嘗試將reID套用到影片上,但目前reID會跳掉,且跑第二次時會沒有辦法取得結果,尚待修正
查: WebView寫是寫好了 但某些網站被拒絕連線 尚未處理(正常 避免安全性問題) 在嘗試如何接上資料庫
==2022/04/27:==
倫: timm辨識回傳結果出現錯誤
董: reID可以套到影片上了,但有點BUG,不是會跳框就是會跳ID
查: 回去嘗試藥品跟timm 遇到的問題有點多 至少現在會顯示正常的標籤了...
==2022/04/28:==
倫: 今天完成了timm辨識藥品的影片!
董: reID成功了,套到影片上可以正常顯示,不會跳框,ID也很正常
查: 今天完成了timm辨識藥品的影片! 雖然少兩顆
結果:
https://youtube.com/shorts/Ud1R0-BUfQA?feature=share
==2022/05/02:==
倫: 科博館觀光客密碼流量真‧標記
董: 科博館的第一版模型出來了,要用接下來的資料訓練第二版,CVAT的資料修正到第16頁,明天接續
查: 科博館任務 訓練V8(很奇怪 失敗) 標記 等等
==2022/05/03:==
倫: 科博館探索恐龍與人類特徵標記大作戰
董: 嘗試新的鏡頭後發現影像可以很清晰的看見藥品上的紋路,所以想嘗試套到模型上看看辨識效果
查: 科博館探索恐龍與人類特徵標記大作戰 V8訓練 影片轉上傳CVAT
==2022/05/04:==
倫: 藥品自動龍-資料前處理全家桶套餐
董: 昨天發現辨識之後效果還行,但要重新用這顆鏡頭收集素材,再訓練一次timm的模型
查: 科博館探索恐龍與人類特徵標記大作戰 追蹤ID
==2022/05/05:==
倫: Callback研究、研究如何不怕發現正在摸魚的大魔法
董: 本來訓練完新的模型發現標籤都是錯誤的,以為是模型爛掉,結果是class_map要改順序,改完之後標籤對了,但有重新用一版,效果比較好
查: 早上 callback 訓練 下午嘗試YOLO_V8資料取出
AWS aws ec2
https://firebase.google.com/
==2022/05/08:==
倫: Deepstream安裝 & Callback研究
董: 藥品timm遷移學習
查: 早上嘗試藥品的TIMM與YOLOV8狀況 爾後決定再次訓練它讓它更強壯 標記完後做訓練
==2022/05/09:==
倫: 中午信誓旦旦把Auto龍做成API 下午在美化html說明介面
董: 藥品timm遷移學習
查: 早上回學校 YOLOV8加大解析度不一定好 實測過了 嘗試資料增強給timm
==2022/05/10:==
倫: 請假一天寫報告書
董: 想放棄訓練藥品模型的一天
查: 玩了一整天的auto gpt
==2022/05/11:==
倫: 走馬看妹仔的一天(董:耖 查:操 倫:讚
董: 一樣的timm藥品訓練
查: 終於修好TIMM的推論Flask了 不會再跟之前一樣 訓練的結果與實際測試的結果不同
==2022/05/12:==
全員上午專題比賽
倫: 上午專題比賽 下午報告書
董: 恩沒錯 搞定了
查: 搞定TIMM了
==2022/05/15:==
倫: 回學校繳報告書、教浩任cvat安裝
董: 請假
查: 藥品的YOLOV8的檔案訓練完成 來看還要來幹嘛 後面都在架服務器
藥品資料增加
==2022/05/16:==
[python-flasgger](https://allenchien-tw.github.io/blog/2018/11/29/python-flasgger)
倫: 一條龍Flask
董: 上傳藥品的資料
查: GPTplugins 嘗試
==2022/05/17:==
倫: 整理RAI筆記、研究docker 控制 docker
董: 上傳藥品的資料
查: 上午回學校拿檔案 下午寫文件
==2022/05/18:==
倫: 研究虛擬主機 & win子系統
董: 上傳藥品的資料
查: 寫文件
==2022/05/19:==
實習最後一天
倫: 最後一天還在給我寫每日任務
董: 偷感謝阿 一直沒看 謝謝嘿
查: 寫文件 混日子 謝謝David跟Adam這幾個月的照顧 也謝謝你們兩個在我不會的方面幫助我 是一段有笑有淚的日子 (倫:有笑有淚有氣的日子
:::
6140 國美V8訓練
6142 Tensorboard
::: spoiler 公司WIFI帳號密碼
### **會議室的WIFI**
> <font color="#f00">!!現在改為switch mode!!</font>
> Name:ASUS_00
> Password:csiej504
> WIFI設定
> Ip:192.168.0.1
> Account:admin
> Password:admin123
>
### **Rai公司的WIFI**
> Name:RaiServer_5G
> Password:ygtygt123
:::
### 個人筆記
> 查的公開筆記:
> https://hackmd.io/@Xw_zZNa8QfiCkE5AUvb8KQ/rJISpkG0i
> David的公開筆記:
> https://hackmd.io/@qlFF8FVPTmavVhVXj3cnFQ
> 倫的公開筆記:
> https://hackmd.io/mLC6YCnbSCCxUlke5lRrtA?view
### YOLOv8
::: spoiler YOLO模型的相關名詞解釋:
以「海關抓犯人」為例:
- **TP(True Positive,真陽性)**:海關成功攔截並抓到了真正的犯罪分子。
- **FP(False Positive,假陽性)**:海關誤以為某人是犯罪分子而攔截了無辜的旅客。
- **TN(True Negative,真陰性)**:海關正確地放行了無辜的旅客。
- **FN(False Negative,假陰性)**:海關未能識別並攔截真正的犯罪分子,讓他們通過了。
**準確率(Accuracy)**:在所有檢查的案例中,海關正確判斷的比例。計算方式為:(TP + TN) / (TP + FP + TN + FN)。
**精確率(Precision)**:海關抓到的所有人中,實際是犯罪分子的比例。計算方式為:TP / (TP + FP)。
**召回率(Recall)**:所有實際存在的犯罪分子中,海關成功抓獲的比例。計算方式為:TP / (TP + FN)。
**F-score**:精確率和召回率的調和平均數,用於綜合評估模型的性能。計算方式為:2 * (Precision * Recall) / (Precision + Recall)。
**F1-score**:當 F-score 中的 β 值設定為 1 時,表示精確率和召回率同等重要,此時的 F-score 就稱為 F1-score。
**IoU(Intersection over Union,交並比)**:
- **定義**:IoU 是衡量兩個區域重疊程度的指標,常用於評估目標檢測模型的精度,例如在圖像中定位物體。
在海關抓犯人的例子中:
- **實際犯人活動區域**:犯人真正經過的地點或路線(真實值)。
- **海關設置的監控區域**:海關根據情報預測並監控的地點或路線(預測值)。
**IoU 的計算方式**:
IoU = 海關監控區域與犯人實際活動區域的重疊部分/海關監控區域和犯人實際活動區域的總範圍(不重複計算重疊部分)
- **交集**:海關監控區域與犯人實際活動區域的重疊部分。
- **並集**:海關監控區域和犯人實際活動區域的總範圍(不重複計算重疊部分)。
**差異與用途**:
- **差異**:與 TP、FP、FN 等指標聚焦於「個體判斷」不同,IoU 著重於測量預測區域與實際區域的「空間重疊程度」。它能細緻評估預測位置的準確性,而不僅僅是判斷對錯。
- **用途**:IoU 用於評估海關監控策略的有效性。較高的 IoU 表示海關預測的監控區域與犯人實際活動區域高度重合,預測精度高,有助於有效攔截犯人。低 IoU 則表示預測區域與實際區域重疊較少,可能需要調整監控策略。
---
接下來,用最簡單的方式解釋:
海關在抓壞人:
- **真正抓到壞人(TP)**:海關成功抓到了真的壞人。
- **誤抓到好人(FP)**:海關以為某人是壞人,結果抓到好人了。
- **正確放行好人(TN)**:海關讓沒有做壞事的人順利通過。
- **放走了壞人(FN)**:海關沒有認出真壞人,讓他跑掉了。
**準確率(Accuracy)**:海關在所有檢查中,判斷正確的次數比例。
**精確率(Precision)**:海關抓到的人中,有多少真的是壞人。
**召回率(Recall)**:所有壞人中,海關抓到了多少。
**F-score**:把精確率和召回率合在一起算出的分數,分數越高,表示海關抓壞人的表現越好。
**F1-score**:當我們覺得抓到的壞人多(精確率高)和不讓壞人跑掉(召回率高)一樣重要時,用 F1-score 來表示海關的表現。
**什麼是 IoU?**
海關在抓壞人,他們想知道自己守衛的地方有多大機會碰到壞人。
- **壞人真正走的路**:壞人實際經過的地方。
- **海關守衛的地方**:海關認為壞人可能會來,於是去看守的地方。
**IoU 怎麼算?**
- **重疊的部分**:海關守衛的地方剛好也是壞人經過的地方。
- **全部的部分**:海關守衛的地方,加上壞人經過但沒有人守衛的地方。
IoU 就是用「重疊的部分」除以「全部的部分」。
IoU = 重疊的地方/(守衛的地方 + 壞人經過但沒守的地方)
**為什麼重要?**
- **IoU 高**:表示海關選對了地方,很多壞人經過的地方都有守衛,更容易抓到壞人。
- **IoU 低**:表示海關守錯了地方,壞人經過的地方沒有人抓,可能需要重新安排守衛的位置。
**用途和差異**:
- **用途**:IoU 幫助海關知道他們的守衛策略好不好,需要不需要改進,才能更有效地抓到壞人。
- **差異**:之前我們說的是「抓到幾個壞人」或「誤抓了多少好人」,而 IoU 是在看「守衛的地方」和「壞人經過的地方」有多少重疊,確保守衛的位置選得對。
---
:::
參考文件:
> GitHub:https://github.com/ultralytics/ultralytics
> Docs And Example: https://docs.ultralytics.com/
==需求:==
> 3.10>=Python Version>=3.7 #我們都用3.8
>
> Ubuntu 安裝python版本指令:
> sudo apt install python3.8
>
> python官網:
> https://www.python.org/downloads/
>
>
> yolov8安裝指令:
> pip install ultralytics
>
> CUDA:
> https://developer.nvidia.com/cuda-downloads
>
> CUDNN
> https://developer.nvidia.com/downloads
>
> PyTorch>=1.7
> https://pytorch.org/
>
> Git安裝指令:
> pip install git
==Test_只需要三行程式就可以輸出結果:==
```
from ultralytics import YOLO
model = YOLO("C:\\try\\yolov8n.pt")#模型請自行抓
#預測模式
results = model.predict(source = "C:\\try\\bus.jpg",save = True,show = True)
#追蹤模式
results = model.track(source="./xxx.mov", conf=0.7, iou=0.5, save=True)
#results = model.predict(source="0",show = True) #這個是直接調用鏡頭
#圖片請自行處理 我是下載官方的展示圖片
#範例:results = model.track(source="https://youtu.be/Zgi9g1ksQHc", show=True, tracker="bytetrack.yaml")
#辨識來源: source = "C:\\try\\bus.jpg"
#辨識結果是否存下: save = True
#辨識結果是否txt: save_txt = True
#存帶有置信度分數的結果 save_conf = True
#將圖像增強應用於預測源 augment = True
#是否秀出圖片 show = True
```
==以下是查查嘗試的範例:==
```
from ultralytics import YOLO #別人包好的
model = YOLO("C:\\try\\yolov8n.pt") #確定模型 可以去官網抓 我這邊用的是官網的範例模型
results = model.predict(source = "C:\\try\\0030.jpg",show = True,save = True)#自行放入圖片
resulte = results[0]
print(resulte.boxes.xyxy.cpu().detach().tolist())#輸出所有的座標
```
> print(resulte.boxes.xyxy.cpu().detach().tolist()) #輸出所有的座標
> 為什麼要這麼寫的原因在這: (就不會輸出帶有其他文字的結果)
> https://blog.csdn.net/qq_40478033/article/details/122352652
==訓練方法:==
```
cmd內執行
指令:
yolo detect train data=data.yaml model=yolov8s.pt epochs=100 imgsz=640 batch=8 project=medicine
```
> 詳細訓練參數看這:https://docs.ultralytics.com/modes/train/
> model=使用何種預訓練模型來做訓練
> data=訓練好的資料輸出後的.yaml檔路徑
> epochs=訓練次數
> imgsz=圖片解析度(大小)
> batch=批次數大小
> project=輸出資料夾
:::spoiler 預測指令詳細中文版
| 參數 | 預設值 | 描述 |
|----------------|---------------------------------|--------------------------------------------------------------------------------------------------------|
| source | 'ultralytics/assets' | 指定推論的資料來源。可為圖像路徑、視訊文件、目錄、URL 或實時串流的裝置 ID。支援多種格式與來源。 |
| conf | 0.25 | 設定檢測的最低信心門檻。低於此門檻的檢測物件將被忽略,有助於減少誤檢。 |
| iou | 0.7 | 用於非極大值抑制 (NMS) 的交並比 (IoU) 門檻。較低的值可透過消除重疊框來降低重複檢測。 |
| imgsz | 640 | 定義推論時的圖像尺寸,可為單一整數(例如 640 用於正方形調整)或 (高度, 寬度) 元組。 |
| half | False | 啟用半精度 (FP16) 推論,適用於支援的 GPU,可加速運算而對準確率影響甚微。 |
| device | None | 指定用於推論的裝置(例如:cpu、cuda:0 或 0),允許在 CPU、特定 GPU 或其他運算裝置間選擇。 |
| batch | 1 | 指定推論的批次大小(僅適用於來源為目錄、視訊文件或 .txt 文件),較大批次可提高吞吐量。 |
| max_det | 300 | 每張圖像允許的最大檢測數量,限制密集場景中輸出過多檢測。 |
| vid_stride | 1 | 用於視訊輸入的影格間隔,1 表示處理每一影格;較高值會跳過部分影格,加速處理但降低時序解析度。 |
| stream_buffer | False | 決定是否排隊接收視訊串流的影格,False 表示丟棄舊影格以容納新影格,True 則避免遺漏,但可能產生延遲。 |
| visualize | False | 啟動推論過程中模型特徵的視覺化,可提供對模型「觀察到」內容的洞見,有助於除錯與解釋。 |
| augment | False | 啟用推論時增強測試(TTA),可能會以速度為代價提高檢測魯棒性。 |
| agnostic_nms | False | 啟用類別無關的非極大值抑制 (NMS),將不同類別之間重疊的框合併,適合多類別重疊檢測場景。 |
| classes | None | 過濾預測結果,只返回指定類別 ID 的檢測,適用於針對特定物件需求的情境。 |
| retina_masks | False | 返回高解析度的分割遮罩,啟用後遮罩尺寸與原始圖像匹配;否則,遮罩尺寸與推論使用的圖像尺寸相同。 |
| embed | None | 指定要提取特徵向量或嵌入的層(list[int]),對後續任務(如聚類或相似性搜尋)十分有用。 |
| project | None | 設定預測輸出儲存的專案目錄名稱(若啟用儲存功能)。 |
| name | None | 指定此次預測運行的名稱,用以在專案資料夾中建立子目錄存放預測輸出(若啟用儲存功能)。 |
:::
::: spoiler 訓練指令詳細中文版
| 參數 | 預設值 | 描述 |
|-----------------|--------------|----------------------------------------------------------------------------------------|
| model | None | 指定訓練的模型檔案。接受 .pt 預訓練模型或 .yaml 配置檔案的路徑。對於定義模型結構或初始化權重至關重要。 |
| data | None | 數據集配置檔案的路徑(例如,coco8.yaml)。此檔案包含數據集特定的參數,包括訓練和驗證數據的路徑、類別名稱和類別數量。 |
| epochs | 100 | 總訓練輪數。每個輪次代表對整個數據集的完整遍歷。調整此值會影響訓練持續時間和模型性能。 |
| time | None | 最大訓練時間(以小時為單位)。如果設置,則會覆蓋 epochs 參數,允許訓練在指定的時間後自動停止。對於時間有限的訓練場景非常有用。 |
| patience | 100 | 在驗證指標未改善的情況下,等待的輪數,然後提前停止訓練。幫助防止過擬合,當性能穩定時停止訓練。 |
| batch | 16 | 批次大小,有三種模式:設置為整數(例如,batch=16)、自動模式以利用 60% 的 GPU 記憶體(batch=-1),或指定利用率的自動模式(batch=0.70)。 |
| imgsz | 640 | 訓練的目標圖像大小。所有圖像在輸入模型之前都會調整為此尺寸。影響模型的準確性和計算複雜性。 |
| save | True | 啟用保存訓練檢查點和最終模型權重。對於恢復訓練或模型部署非常有用。 |
| save_period | -1 | 保存模型檢查點的頻率,以輪數為單位指定。值為 -1 將禁用此功能。對於在長時間訓練過程中保存中間模型非常有用。 |
| cache | False | 啟用將數據集圖像緩存在內存(True/ram)、磁碟(disk)或禁用(False)。通過減少磁碟 I/O 來提高訓練速度,但會增加內存使用。 |
| device | None | 指定訓練的計算設備:單個 GPU(device=0)、多個 GPU(device=0,1)、CPU(device=cpu)或 Apple 硅的 MPS(device=mps)。 |
| workers | 8 | 數據加載的工作線程數(如果是多 GPU 訓練則按 RANK 計算)。影響數據預處理和輸入模型的速度,特別是在多 GPU 設置中非常有用。 |
| project | None | 訓練輸出保存的項目目錄名稱。允許有組織地存儲不同的實驗。 |
| name | None | 訓練運行的名稱。用於在項目文件夾中創建子目錄,存儲訓練日誌和輸出。 |
| exist_ok | False | 如果為 True,則允許覆蓋現有的項目/名稱目錄。對於不需要手動清除先前輸出的迭代實驗非常有用。 |
| pretrained | True | 決定是否從預訓練模型開始訓練。可以是布林值或特定模型的字符串路徑,以加載權重。提高訓練效率和模型性能。 |
| optimizer | 'auto' | 訓練的優化器選擇。選項包括 SGD、Adam、AdamW、NAdam、RAdam、RMSProp 等,或根據模型配置自動選擇(auto)。影響收斂速度和穩定性。 |
| verbose | False | 在訓練過程中啟用詳細輸出,提供詳細的日誌和進度更新。對於調試和密切監控訓練過程非常有用。 |
| seed | 0 | 設置訓練的隨機種子,確保在相同配置下結果的可重現性。 |
| deterministic | True | 強制使用確定性算法,確保可重現性,但可能會因限制非確定性算法而影響性能和速度。 |
| single_cls | False | 在多類數據集中將所有類別視為單一類別進行訓練。對於二元分類任務或專注於物體存在而非分類時非常有用。 |
| rect | False | 啟用矩形訓練,優化批次組合以最小化填充。可以提高效率和速度,但可能影響模型準確性。 |
| cos_lr | False | 使用餘弦學習率調度器,根據餘弦曲線調整學習率。幫助管理學習率以獲得更好的收斂。 |
| close_mosaic | 10 | 在最後 N 輪中禁用馬賽克數據增強,以穩定訓練在完成之前。設置為 0 將禁用此功能。 |
| resume | False | 從最後保存的檢查點恢復訓練。自動加載模型權重、優化器狀態和輪數,無縫繼續訓練。 |
| amp | True | 啟用自動混合精度(AMP)訓練,減少內存使用並可能加快訓練速度,對準確性影響最小。 |
| fraction | 1.0 | 指定用於訓練的數據集比例。允許在完整數據集的子集上進行訓練,對於實驗或資源有限時非常有用。 |
| profile | False | 在訓練期間啟用 ONNX 和 TensorRT 速度的分析,對於優化模型部署非常有用。 |
| freeze | None | 冻结模型的前 N 層或按索引指定的層,減少可訓練參數的數量。對於微調或轉移學習非常有用。 |
| lr0 | 0.01 | 初始學習率(即 SGD=1E-2,Adam=1E-3)。調整此值對優化過程至關重要,影響模型權重更新的速度。 |
| lrf | 0.01 | 最終學習率作為初始學習率的比例 = (lr0 * lrf),與調度器一起使用以隨時間調整學習率。 |
| momentum | 0.937 | SGD 的動量因子或 Adam 優化器的 beta1,影響當前更新中過去梯度的納入。 |
| weight_decay | 0.0005 | L2 正則化項,懲罰大權重以防止過擬合。 |
| warmup_epochs | 3.0 | 學習率預熱的輪數,逐漸將學習率從低值增加到初始學習率,以穩定早期訓練。 |
| warmup_momentum | 0.8 | 預熱階段的初始動量,在預熱期間逐漸調整到設置的動量。 |
| warmup_bias_lr | 0.1 | 預熱階段偏置參數的學習率,幫助穩定模型在初始輪數中的訓練。 |
| box | 7.5 | 損失函數中框損失組件的權重,影響準確預測邊界框坐標的重視程度。 |
| cls | 0.5 | 總損失函數中分類損失的權重,影響正確類別預測相對於其他組件的重要性。 |
| dfl | 1.5 | 分佈焦點損失的權重,用於某些 YOLO 版本的細粒度分類。 |
| pose | 12.0 | 在進行姿勢估計的模型中,姿勢損失的權重,影響準確預測姿勢關鍵點的重視程度。 |
| kobj | 2.0 | 在姿勢估計模型中,關鍵點物體性損失的權重,平衡檢測信心與姿勢準確性。 |
| label_smoothing | 0.0 | 應用標籤平滑,將硬標籤軟化為目標標籤和標籤均勻分佈的混合,有助於提高泛化能力。 |
| nbs | 64 | 用於損失標準化的名義批次大小。 |
| overlap_mask | True | 決定在訓練期間分割掩碼是否應重疊,適用於實例分割任務。 |
| mask_ratio | 4 | 分割掩碼的下採樣比例,影響訓練期間使用的掩碼解析度。 |
| dropout | 0.0 | 用於分類任務的正則化的隨機失活率,通過隨機省略單元來防止過擬合。 |
| val | True | 在訓練期間啟用驗證,允許定期評估模型在單獨數據集上的性能。 |
| plots | False | 生成並保存訓練和驗證指標的圖表,以及預測示例,提供對模型性能和學習進程的可視化洞察。 |
:::
::: spoiler 超參數(數據強化)詳細中文版
增強技術對於提升YOLO模型的穩健性和性能至關重要,通過在訓練數據中引入多樣性,幫助模型更好地泛化到未見數據。下表概述了每個增強參數的目的和效果:
| 參數 | 類型 | 預設值 | 範圍 | 描述 |
| --- | --- | --- | --- | --- |
| hsv_h | 浮點數 | 0.015 | 0.0 - 1.0 | 調整圖像的色相,通過改變色輪上的位置引入色彩多樣性,幫助模型在不同光照條件下泛化。 |
| hsv_s | 浮點數 | 0.7 | 0.0 - 1.0 | 改變圖像的飽和度,影響顏色的強度,模擬不同的環境條件。 |
| hsv_v | 浮點數 | 0.4 | 0.0 - 1.0 | 調整圖像的亮度,幫助模型在各種光照條件下表現良好。 |
| degrees | 浮點數 | 0.0 | -180 - +180 | 在指定的角度範圍內隨機旋轉圖像,提高模型識別不同方向物體的能力。 |
| translate | 浮點數 | 0.1 | 0.0 - 1.0 | 將圖像水平和垂直方向移動一定比例,幫助學習檢測部分可見的物體。 |
| scale | 浮點數 | 0.5 | >=0.0 | 按比例縮放圖像,模擬不同距離的物體。 |
| shear | 浮點數 | 0.0 | -180 - +180 | 對圖像進行一定角度的剪切,模擬從不同角度觀看物體的效果。 |
| perspective | 浮點數 | 0.0 | 0.0 - 0.001 | 對圖像應用隨機透視變換,增強模型理解三維空間中物體的能力。 |
| flipud | 浮點數 | 0.0 | 0.0 - 1.0 | 以指定概率將圖像上下翻轉,增加數據多樣性而不影響物體特徵。 |
| fliplr | 浮點數 | 0.5 | 0.0 - 1.0 | 以指定概率將圖像左右翻轉,有助於學習對稱物體並增加數據集多樣性。 |
| bgr | 浮點數 | 0.0 | 0.0 - 1.0 | 以指定概率將圖像通道從RGB翻轉為BGR,增加對錯誤通道排序的魯棒性。 |
| mosaic | 浮點數 | 1.0 | 0.0 - 1.0 | 將四張訓練圖像合併為一張,模擬不同的場景構圖和物體交互,對於複雜場景理解非常有效。 |
| mixup | 浮點數 | 0.0 | 0.0 - 1.0 | 將兩張圖像及其標籤混合,創建合成圖像。通過引入標籤噪聲和視覺多樣性增強模型的泛化能力。 |
| copy_paste | 浮點數 | 0.0 | 0.0 - 1.0 | 將一個圖像中的物體複製並粘貼到另一個圖像上,有助於增加物體實例和學習物體遮擋。 |
| copy_paste_mode | 字串 | flip | - | Copy-Paste增強方法選擇,包括"flip"和"mixup"選項。 |
| auto_augment | 字串 | randaugment | - | 自動應用預定義增強策略(randaugment, autoaugment, augmix),通過多樣化視覺特徵優化分類任務。 |
| erasing | 浮點數 | 0.4 | 0.0 - 0.9 | 在分類訓練中隨機擦除圖像的一部分,鼓勵模型專注於不太明顯的特徵進行識別。 |
| crop_fraction | 浮點數 | 1.0 | 0.1 - 1.0 | 將分類圖像裁剪到一定比例,強調中心特徵並適應物體尺度,減少背景干擾。 |
:::
### yolov8 ByteTrack
```
#Yolov8可用Trackers
BoT-SORT - botsort.yaml
ByteTrack - bytetrack.yaml
from ultralytics import YOLO
model = YOLO('1280_new_best.pt')
results = model.track(source="20230403-100000-100500_192.168.30.138-CH9.avi", tracker='bytetrack.yaml',show=True,save=True)
```
以上幾行即可輸出結果
詳細使用哪個Tracker\請詳見:
https://docs.ultralytics.com/modes/track/#available-trackers
請記得下載這些 以用來套用設定:
https://github.com/ultralytics/ultralytics/tree/main/ultralytics/tracker/cfg
==如果需要把追蹤的資料取出來:==
特別說一下<font color="#FF0000" style="font-weight:bold;;">persist=True</font>官方文件沒有提到這個東西 可以嘗試保存追蹤資料以用於下一張圖片的辨識
然後如果需要串流 可以加上<font color="#FF0000" style="font-weight:bold;;">stream=True</font>
程式就會保持運行
兩者加再一起就可以做到串流與追蹤
```
results = model.track(source=image, tracker='bytetrack.yaml',stream=True,persist=True)
for result in results:
boxes = result.boxes # Boxes object for bbox outputs
masks = result.masks # Masks object for segmentation masks outputs
probs = result.probs # Class probabilities for classification outputs
print(boxes.xyxy.cpu().detach().tolist())
print(boxes.cls.cpu().detach().tolist())
print(boxes.id.cpu().detach().tolist())
```
### yolov8 TensorRT官方文件
[官方文件](https://docs.ultralytics.com/integrations/tensorrt/)
範例code:
```python
from ultralytics import YOLO
# Load a YOLO11n PyTorch model
model = YOLO("yolo11n.pt")
# Export the model to TensorRT
model.export(format="engine") # creates 'yolo11n.engine'
# 使用的話就是這個
# Load the exported TensorRT model
trt_model = YOLO("yolo11n.engine")
# Run inference
results = trt_model("https://ultralytics.com/images/bus.jpg")
```
阿 如果要使用TensorRT的量化模型請記得 在該電腦上做量化
實際上也是先轉成onnx後才轉TensorRT
之後如果要使用這個模型的話 假設有更改imgsz
後續code 也要更改輸入的圖像尺寸
:::spoiler TensorRT指令詳細中文版
| 參數 | 預設值 | 描述 |
|------------|----------------|--------------------------------------------------------------|
| format | 'engine' | 匯出模型的目標格式,用以定義與各種部署環境的相容性 |
| imgsz | 640 | 模型輸入的期望圖像尺寸,可為整數或 (高度, 寬度) 的元組 |
| half | False | 啟用 FP16(半精度)量化,減少模型尺寸並加速推理 |
| int8 | False | 啟用 INT8 量化,進一步壓縮模型並提高推理速度 |
| dynamic | False | 允許動態輸入尺寸,增強處理不同圖像尺寸的彈性 |
| simplify | True | 使用 onnxslim 簡化模型圖,提升效能及相容性 |
| workspace | None | 設定 TensorRT 優化時的最大工作空間大小(GiB),None 表示自動配置 |
| nms | False | 加入非最大抑制(NMS),用於準確且高效的檢測後處理 |
| batch | 1 | 指定匯出模型的批次推理尺寸,或預測模式下一次處理的最大圖像數量 |
| data | 'coco8.yaml' | 資料集配置文件的路徑,對量化過程十分關鍵 |
:::
#### 範例code
```python
from ultralytics import YOLO
# Load a YOLO11n PyTorch model
model = YOLO("yolo11n-seg.pt")
# Export the model to TensorRT
model.export(format="engine",imgsz=320,half=True) # creates 'yolo11n.engine'
```
### yolov8 onnx官方文件
[官方文件連結](https://docs.ultralytics.com/integrations/onnx/#what-are-the-advantages-of-using-onnx-runtime-for-deploying-yolo11-models)
```python
from ultralytics import YOLO
# Load the YOLO11 model
model = YOLO("yolo11n.pt")
# Export the model to ONNX format
model.export(format="onnx") # creates 'yolo11n.onnx'
# Load the exported ONNX model
onnx_model = YOLO("yolo11n.onnx")
# Run inference
results = onnx_model("https://ultralytics.com/images/bus.jpg")
```
這是一個通用格式
:::spoiler onnx指令詳細中文版
參數 | 預設值 | 描述
--------------|---------------------------------|--------------------------------------------------------------------------------------------------------
format | 'onnx' | 匯出模型的目標格式,定義與各種部署環境的相容性。
imgsz | 640 | 模型輸入所需的圖片尺寸,可為正方形圖片的整數或二元組 (高度, 寬度)。
half | False | 啟用 FP16(半精度)量化,可縮小模型大小,並可能在支援硬體上加速推論。
dynamic | False | 允許動態輸入尺寸,提高處理不同圖片尺寸時的靈活性。
simplify | True | 使用 onnxslim 簡化模型圖,可能提升效能及相容性。
opset | None | 指定 ONNX opset 版本以確保與不同解析器及環境相容;若未設定則使用最新版本。
nms | False | 加入非極大值抑制(NMS),有助於精確且高效的檢測後處理。
batch | 1 | 指定批次推論大小,或預測模式下一次處理的最大圖片數量。
:::
### ByteTrack
https://github.com/kadirnar/bytetrack-pip
```
pip install bytetracker pytroch會降版本
```
### NumPy
https://blog.csdn.net/hfutdog/article/details/85713291
```
基於C的數學計算模組
NumPy 是 Python 的一個科學計算函式庫,提供多維陣列物件 (ndarray)、資料處理工具、標準數學函數等。
```
### Json
https://www.runoob.com/json/json-tutorial.html
```
https://steam.oxxostudio.tw/category/python/library/json.html
JSON: JavaScript Object Notation(JavaScript 對象表示法) JSON 是存儲和交換文本信息的語法,類似 XML。 JSON 比 XML 更小、更快,更易解析。
JSON 易於人閱讀和編寫。
JSON 具有自我描述性,更易理解。
C、Python、C++、Java、PHP、Go等編程語言都支持 JSON。
https://jsoneditoronline.org/#right=local.lajofe&left=local.fefeno
```
### k8s
(沒用到 從實習開始到結束都沒用到)
```
k8s
也叫做:Kubernetes
是一個協助我們自動化部署、擴張以及管理容器應用程式(containerized applications)的系統。
Kubernetes 可以幫我們做到以下幾件事情:
1.同時部署多個 containers 到一台機器上,甚至多台機器。
2.管理各個 container 的狀態。如果提供某個服務的 container 不小心 crash 了,Kubernetes 會偵測到並重啟這個 container,確保持續提供服務
3.將一台機器上所有的 containers 轉移到另外一台機器上。
4.提供機器高度擴張性。Kubernetes cluster 可以從一台機器,延展到多台機器共同運行。
本質是一組協同工作的pod
Kubernetes的基本排程單元稱為「pod」。通過該種抽象類別可以把更進階別的抽象內容增加到容器化組件。 //似乎也能用docker
```
### Python Flask
```
https://ithelp.ithome.com.tw/articles/10258223
```
### VOCtype and YOLOtype
```
class change:
def VOCtoYOLO(Xmin:int,Ymin:int,Xmax:int,Ymax:int,image_W:int,image_H:int):
# 就是基本的格式轉換 轉換成YOLO吃的格式 詳細如下
# X_iw_ratio= ((Xmin + Xmax) * 0.5 ) / image_W
# Y_ih_ratio= ((Ymin + Ymax) * 0.5 ) / image_H
# tw_iw_ratio = (Xmax - Xmin) / image_w
# th_ih_ratio = (Ymax - Ymin) / image_h
X_iw_ratio = round(((Xmin + Xmax) * 0.5 ) / image_W,6)
Y_ih_ratio = round(((Ymin + Ymax) * 0.5 ) / image_H,6)
tw_iw_ratio = round((Xmax - Xmin) / image_W,6)
th_ih_ratio = round((Ymax - Ymin) / image_H,6)
return X_iw_ratio,Y_ih_ratio,tw_iw_ratio,th_ih_ratio
def YOLOtoVOC(X_iw_ratio:float,Y_ih_ratio:float,tw_iw_ratio:float,th_ih_ratio:float,image_W:int,image_H:int):
# 就是基本的格式轉換 轉換成YOLO吃的格式 詳細如下
# Xmin = (X_iw_ratio - tw_iw_ratio * 0.5) * image_W
# Ymin = (Y_ih_ratio - th_ih_ratio * 0.5) * image_H
# Xmax = (X_iw_ratio + tw_iw_ratio * 0.5) * image_W
# Ymax = (Y_ih_ratio + th_ih_ratio * 0.5) * image_H
Xmin = round((X_iw_ratio - tw_iw_ratio * 0.5) * image_W)
Ymin = round((Y_ih_ratio - th_ih_ratio * 0.5) * image_H)
Xmax = round((X_iw_ratio + tw_iw_ratio * 0.5) * image_W)
Ymax = round((Y_ih_ratio + th_ih_ratio * 0.5) * image_H)
return Xmin,Ymin,Xmax,Ymax
```
### Linux指令
```
快捷鍵 Ctrl+Alt+T #開啟Terminal(終端機)
sudo:使用管理員模式執行 #通常用於安裝軟件或編輯用戶主目錄之外的文件
sudo -s :管理員模式下的CMD
ls:列出當前目錄裡的子資料夾和檔案
cd:切換目錄
* / 將當前目錄切換至根目錄
* ~ 將目錄切換至家目錄
* – 切換至「之前的目錄」
* . 當前目錄
* .. 切換至上一層目錄
pwd:顯示目前的目錄
mkdir:建立新的目錄
cp:複製文件或目錄
rm:刪除文件或目錄
* -i 刪除前確認
* -f 強制刪除
* -r刪除目錄及其內容
mv:移動文件、資料、或修改名稱
cat:查看文件內容
touch:更新指定文件的訪問和修改時間
chmod:快速更改文件的模式(權限)
* r 讀取
* w 寫
* x 執行
***直接打開權限 sudo Chmod 777 *file or folder
ifconfig:查看當前ip 通常是看eth0 的 inet
nvidia-smi 如果有成功啟動GPU 這邊會顯示相關資訊
watch -n 0.5 -d nvidia-smi 可以常駐視窗 這邊cuda是顯示支援的最高版本
nvcc-V 顯示主要的安裝版本Cuda
pwd 查詢路徑
unzip xxx 解壓縮
docker ps 查看現在所有運行中的容器
資料的來回傳輸建議使用 filezilla
```
### 如果有cuda版本不相容的問題
查看cuda版本
> 在CMD輸入python 按下Enter
> import torch
> print(torch.__version__)
> 版本沒有出現,代表torch安裝失敗,要再重裝
> 指令:
> pip uninstall torch torchvision torchaudio
> 卸載完去官網:https://pytorch.org/
> 找到相對應的版本重新安裝,應該就可以了
### Docker 和 Docker-Compose
```
docker - 從入門到絕望
打開一個新的docker之後請先更新套件,指令如下:
sudo apt-get update && upgrade
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
安装 Docker 的依赖项:
sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
添加 Docker 的官方 GPG 密钥:
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
添加 Docker 的稳定版存储库:
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker環境包:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo groupadd docker
sudo usermod -aG docker $USER
hello world
docker run hello-world
newgrp docker
重開機(一定要)
sudo reboot
Got permission denied 再不行的最後方法
sudo chmod 777 /var/run/docker.sock
如何查看Ubuntu的内核
dpkg --print-architecture
linux安裝docker:
https://linnote.com/how-to-install-docker-in-ubuntu/
docker不使用sudo執行:
https://linnote.com/docker-without-sudo/
docker 跑 yolov8
Vs code->SSH connect
Account:nx
Password:nx
版本:Docker l4t
Github:git clone *html*
導出容器docker export id
包回去容器docker commit [container_id] [new_image_name:tag]
重命名容器名稱 docker rename <old_name> <new_name>
列出镜像 docker image ls
重命名镜像名稱docker tag <old_image_name> <new_image_name>
當Docker容器啟動時,自動執行.py檔 CMD ["python", ".py"]
進入 Docker 容器 docker exec -it 容器id bash
查看Docker images -> docker images
docker run --gpus all --rm -ti --ipc=host xxx/xxx 運行Docker容器的指令
kill 1 刪除containers
docker build -t #-t (tag)
--name
可以取名
例:
docker run --gpus all -tid --name cha tast:latest
sudo systemctl restart docker
docker run --gpus all -tid --name cha -v /home/rai/timm:/workspace/timm/output -v /home/rai/TB:/workspace/timm/TB tast:latest
timm_flask
docker run --gpus all -tid --name timm_flask -p 4999:4999 -w /workspace/flask tast:latest &&screen docker exec -it timm_flask bash -c "timm_flask.py"
docker run -v *本機檔案的路徑:要放進docker的路徑* 要開啟的docker 將本機檔案掛載進docker的指令,
docker run -w */docker的路徑*
docker save xxx > xxx.tar
docker load -i xxx.tar
重啟docker服務:
sudo systemctl restart docker
錯誤:docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].
解決:sudo apt-get install -y nvidia-docker2 && sudo systemctl restart docker
nvidia-container-runtime:
vim /etc/docker/daemon.json
```
### SCP
遠端互傳
```
修改資料夾權限 sudo chmod 777 路徑
複製目錄 scp -r
資料壓縮 scp -c
# 從本地端複製到遠端
正常傳送scp xxx:/ nb@192.168.50.183:/home/nb/share
# 從遠端複製到本地端
scp xxx@x.x.x.x:/xxxx /xxxx
拷贝文件到容器:
docker cp 需要拷贝的文件路径 容器名:/文件放置路径
进入docker容器,检查文件拷贝结果:
docker exec -i -t 容器名 /bin/bash
```
### SSH
```
apt-get install openssh-server
重啟服務
sudo /etc/init.d/ssh restart
SSH的連線服務,供使用者或管理者遠端連線
### SSH免密碼步驟
1.在"自己"的cmd上打ssh-keygen,之後會獲得一組檔案,請先去找出他的路徑
ssh路徑預設值:C:\Users\[user]\.ssh\[id_xxx].pub
2.在"自己"的cmd上打scp [id_xxx].pub [ssh_username]@[ip]:/home/[username]/.ssh/[xxx_key(自取名稱)].pub,路徑要打
好,前面的[id_xxx].pub要指定一下絕對路徑,或著cmd直接切到那個檔案的資料夾,後面的[xxx_key].pub的檔名
請改成自己要的
3.在"遠端電腦"的cmd上打cat /home/[user]/.ssh/[xxx_key].pub >> /home/[user]/.ssh/authorized_keys,
前面的檔名要改成剛剛自己改的檔名
4.在"遠端電腦"的cmd上打chmod 400 /home/nb/.ssh/authorized_keys
5.在"遠端電腦"的cmd上打sudo service ssh restart
6.完成
--------------------------------------------------------
在Vs code的擴充套件處尋找Remote-SSH Install
Vs code:點擊左下角此圖示
----------------------
連到nb電腦 (需同個網域)
1.知道其ip->192.168.50.183
2.打指令 ssh nb 不行就打這串nb@192.168.50.183
3.輸入密碼 nb
4.閉著眼睛打等成功
----------------------
連到nx主機
1.知道其ip->192.168.50.
2.打指令 ssh nx@
3.輸入密碼 nx
4.不成功,那就是打錯了
--------------------------------------------------------
paramiko套件 #直接遠端過去電腦執行特定命令
import paramiko
username = "nb"
password = "nb"
hostname = "192.168.50.183"
port = '22'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, port, username, password)
stdin, stdout, stderr = ssh.exec_command('nvidia-smi')
print(stdout.read().decode('utf-8'))
ssh.close()
-----------------------------------------------
os套件
os.system("ssh nb@192.168.50.183")
```
### SDK Manager
重灌nx的軟體
```
1.先將nx電源關閉。
2.用杜邦線(公對公)接上第三和第四腳位(由右數來),將其短路,之後拿出TypeC to USB 線,TypeC接上電腦、USB接上nx,完成後接上電。
3.打開Sdk manager 軟體會自動找尋硬體設備。
4.選擇手動安裝,等待系統灌入NX。
5.灌到一半要重新輸入帳號和密碼,記得拿投影機當作nx螢幕,重設SSH後,等待安裝結束,就完成了,獲得了一台如新的機機。
```
### Ubuntu : sudo 不用輸入密碼
```
首先使用 root 的權限
sudo vim /etc/sudoers
將最後一行的
%admin ALL=(ALL) ALL
改成
%admin ALL=(ALL) NOPASSWD: ALL
存檔退出,即可。
**危險**
快速指令 :
echo "root ALL=(ALL:ALL) NOPASSWD:ALL" "%admin ALL=(ALL) NOPASSWD: ALL" "%sudo ALL=(ALL:ALL) NOPASSWD: ALL"| sudo tee /etc/sudoers
```
### NB顯卡驅動
```
https://clay-atlas.com/us/blog/2022/07/29/solved-nvidia-smi-has-failed-because-it-couldnt-communicate-with-the-nvidia-driver-make-sure-that-the-latest-nvidia-driver-is-installed-and-running/
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install ubuntu-drivers-common
ubuntu-drivers devices
驗證是否正確安裝了 NVIDIA 驅動
lspci | grep -i nvidia
重新安裝驅動
sudo apt-get install --reinstall nvidia-driver-<version>
安裝推薦的驅動程序使用
sudo ubuntu-drivers autoinstall
sudo apt-get update
sudo apt install nvidia-driver<NVIDIA DRIVER VERSION>
sudo apt-get install dkms
sudo dkms install -m nvidia -v xxx
sudo apt-get install nvidia-prime
切換獨顯
sudo prime-select nvidia
sudo reboot
Operation steps in MOK screen
Set the password in the configure secure boot stage, and remember your password
If you enter the screen of Perform MOK management, please select Enroll MOK > Continue > Yes
Enter the password at the screen of Enroll the key(s)?
Select OK to reboot
After rebooting, use nvidia-smi command to check the driver is work.
Hope everyone can successfully load their drivers!
nvidia-smi No devices were found
sudo apt-get install nvidia-cuda-toolkit
卸载驱动
sudo apt-get remove --purge '^nvidia-.*' && \
sudo apt-get remove --purge '^libnvidia-.*' && \
sudo apt-get remove --purge '^cuda-.*' && \
sudo apt-get install linux-headers-$(uname -r)
sudo apt autoremove
sudo nvidia-smi -pm 1
```
### Nano
```
查詢jetpack版本:
sudo apt-cache show nvidia-jetpack
查詢jtop
sudo apt-get install python3-pip
sudo pip3 install jetson-stats
執行指令:sudo jtop
```
### Lambda Stack
安装深度学习框架全家桶
```
LAMBDA_REPO=$(mktemp) && \
wget -O${LAMBDA_REPO} https://lambdalabs.com/static/misc/lambda-stack-repo.deb && \
sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
sudo apt-get update && sudo apt-get install -y lambda-stack-cuda
sudo reboot
倫:沒有體會到什麼叫做全家桶
```
### DeepStream to NANO
查看Jetpack與Deepstream相匹配的版本
https://docs.nvidia.com/metropolis/deepstream/dev-guide/text/DS_Quickstart.html#platform-and-os-compatibility

```
Deepstream版本:DS 6.0.1
sudo docker pull nvcr.io/nvidia/deepstream-l4t:6.0.1-triton
docker:failed to connect is docker running
1.sudo usermod -aG docker ${USER}
2.sudo service docker restart
```
### DeepStream to NX
[Jetson Xavier NX中CPU为OFF状态——开启方法
](https://blog.csdn.net/weixin_40847138/article/details/108104226)
[kafka Confluent Documentation](https://docs.confluent.io/platform/current/control-center/index.html#c3-short-pages)
```
sudo -s
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
echo 1 > /sys/devices/system/cpu/cpu4/online
echo 1 > /sys/devices/system/cpu/cpu5/online
echo 1 > /sys/devices/system/cpu/cpu6/online
查詢:Display變數值->echo $DISPLAY
xhost +
改變Display變數值->export DISPLAY=&DISPLAY
本次deepstream使用版本為6.0-triton
拉image:docker pull nvcr.io/nvidia/deepstream-l4t:6.0-triton
啟動:docker run -itd --rm --net=host --runtime nvidia --name deepsteam-python -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/nx/rainxinf/rainxinf/deepstream-python:/deepstream-python nvcr.io/nvidia/deepstream-l4t:6.2-samples && docker exec -it deepsteam-python /bin/bash
yolov8: docker run -itd --rm --net=host --name yolov8 -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/nx/medicine:/medicine arm64v8/ubuntu:rolling
啟動之後理論上能直接跑範例
cd /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app
deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
在DeepStream中加上人流計數:
安裝kafka[https://kafka.apache.org/quickstart](版本使用kafka_2.13-2.6.0.tgz)
tar -xzf kafka_2.13-2.6.0.tgz
cd kafka_2.13-2.6.0
啟動kafka:
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
bin/kafka-topics.sh --create --topic quickstart-events --bootstrap-server localhost:9092
kafka要正確上傳數據需要調整檔案內容,詳情參考DAVID的筆記
https://hackmd.io/@qlFF8FVPTmavVhVXj3cnFQ/SylTIBeFo
kafka的網站:http://192.168.50.183:9021/
切換至/opt/nvidia/deepstream/deepstream-6.0/sources/apps/sample_apps/
git clone https://github.com/NVIDIA-AI-IOT/deepstream-occupancy-analytics
cd deepstream-occupancy-analytics/config && ./model.sh
(此時model.sh可能報錯,報錯則須進入mode.sh並修改wget --content-disposition https://api.ngc.nvidia.com/v2/models/nvidia/tao/peoplenet/versions/pruned_v2.0/zip -O peoplenet.zip)
修改 /opt/nvidia/deepstream/deepstream/sources/includes/nvdsmeta_schema.h
guint source_id;
guint occupancy;
guint lccum_cnt_entry;
guint lccum_cnt_exit;
} NvDsEventMsgMeta;
修改Makefile,將版本不對的全改成正確的,CUDA_VER要記得確認版本,確認後可直接export
cd deepstream-occupancy-analytics && make
./deepstream-test5-analytics -c config/test5_config_file_src_infer_tlt.txt
(如果這裡報錯了說沒有mp4檔案,記得去test5_config_file_src_infer_tlt.txt修改檔案位置以及版本)
人流綠線修改:/opt/nvidia/deepstream/deepstream-6.0/sources/apps/sample_apps/deepstream-occupancy-analytics/config/config_nvdsanalytics.txt
修改
line-crossing-Exit=960;600;960;500;640;500;1280;500;
line-crossing-Entry=960;332;960;432;640;432;1280;432
目前成功有deepstream以及人流計數的image啟動指令為:
docker run -itd --rm --net=host --runtime nvidia -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/nx/Backup/test:/test -e DISPLAY=:0 nvidia:6.0-new
No module named 'skbuild'
python pip更新
pip3 install --upgrade pip
python 版本切換
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.8 1
```
### DeepStream to NB
[笔记--Ubuntu18.04安装Deepstream 6.0
](https://blog.csdn.net/weixin_43863869/article/details/125388058)
```
DeepStream 6.0.1 / 6.0 on x86 platform
Ubuntu 18.04
CUDA 11.4 Update 1 驗證版本:nvidia-smi
cuda-toolkit 驗證版本:nvcc -V
TensorRT 8.0 GA (8.0.1) 驗證版本:dpkg -l | grep TensorRT
Cudnn 驗證版本:
cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2
or
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
NVIDIA Driver >= 470.63.01
NVIDIA DeepStream SDK 6.0.1 / 6.0
GStreamer 1.14.5 驗證版本:dpkg -l | grep gstreamer
DeepStream-Yolo
dpkg -r --force-depends xxx #強制移除相依性問題
run:docker run --gpus all -tid -v /home/nb/share/test:/yoloF --rm --net=host --runtime nvidia -e DISPLAY=$DISPLAY -w /opt/nvidia/deepstream/deepstream-6.2 -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/deepstream:6.0-devel
deepstream-app --version-all
apt-get update --fix-missing
```
### DeepStream
<font color="#ff0000">For YoloV8 docs</font>
https://hackmd.io/@osense-rd-public/HkTmKeA_t
```
xhost +
export DISPLAY=:0
test->https://zhuanlan.zhihu.com/p/460637017
https://github.com/marcoslucianops/DeepStream-Yolo
1.docker pull nvcr.io/nvidia/deepstream:6.0-devel
2.nb->docker run --gpus all -tid --name 123 -v /home/nb/share/test:/yoloF -w /yoloF -v /tmp/.X11-unix:/tmp/.X11-unix -e GDK_SCALE -e GDK_DPI_SCALE -e DISPLAY=:0 nvcr.io/nvidia/deepstream:6.0-devel
nx->docker run -it --rm --net=host --runtime nvidia -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/nx/DeepStream-Yolo:/DeepStream-Yolo -w/DeepStream-Yolo --name 0216 -e DISPLAY=:1 nvidia:6.2triton && screen docker exec -it 0216 bash
打開後要打:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/aarch64-linux-gnu/tegra/
deepstream測試:
cd /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app
deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
x11-apps <---套件包 #視窗
```
### Python Kafka
```
使用python-kafka從自行架設的kafka中發送與接收消息
首先pip install kafka-python
發送消息(此處連接的為David架設好的kafka):
producer = KafkaProducer(bootstrap_servers=['192.168.50.171:9092'])
producer.send('system_config_v1',json.dumps(msg_addmodel).encode('utf-8') )
producer.close()
接收消息(訂閱):
from kafka import *
consumer = KafkaConsumer('model_data',bootstrap_servers=['192.168.50.171:9092'])
for message in consumer:
print((message.topic, message.partition,message.offset, message.key,message.value))
以上是如何使用kafka-python接收與發送消息的程式
```
備註:有關自定義模型配置(batch-size、network-mode等)的更多信息,請查看[docs/customModels.md](https://github.com/marcoslucianops/DeepStream-Yolo/blob/master/docs/customModels.md)文件。
### DeepStream-Yolo
[YOLOv8->TensorRT用法](https://github.com/marcoslucianops/DeepStream-Yolo/blob/master/docs/YOLOv8.md)
```
先抓資料下來
git clone https://github.com/marcoslucianops/DeepStream-Yolo.git
抓Yolov8:
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics
pip3 install -r requirements.txt
轉換模型,生成cfg,wts和labels.txt:
將gen_wts_yoloV8.py文件從DeepStream-Yolo/utils目錄複製到文件ultralytics夾。
cd /yoloF/DeepStream-Yolo/utils
cd ultralytics
cp yolov8n.pt /yoloF/ultralytics
cp gen_wts_yoloV8.py /yoloF/ultralytics
cd ultralytics
python3 gen_wts_yoloV8.py -w yolov8x.pt #此pt檔可更改為自己訓練出的模型pt檔
#轉換必須要有pytorch,請注意使用的docker有沒有pytorch,最保險的是用yolov8的docker
注意:要更改推理大小(默認值:640)
-s SIZE
--size SIZE
-s HEIGHT WIDTH
--size HEIGHT WIDTH
將生成cfg的wts和labels.txt文件複製到DeepStream-Yolo文件夾。
cp yolov8n.cfg yolov8n.wts /yoloF/DeepStream-Yolo
進入DeepStream-Yolo文件夾並編譯lib
指令:
cd DeepStream-Yolo
CUDA_VER=11.4 make -C nvdsinfer_custom_impl_Yolo #CUDA版本要注意,請更改為docker或本機的CUDA版本
理解和編輯 deepstream_app_config 文件
[primary-gie]
enable=1
gpu-id=0
gie-unique-id=1
nvbuf-memory-type=0
config-file=config_infer_primary.txt
#主要是config-file要改成自己使用的檔案
理解和編輯 config_infer_primary 文件
custom-network-config=yolov8n.cfg
model-file=yolov8n.wts
#以上兩項要使用前面轉換出來的檔案
測試模型
cd DeepStream-Yolo
deepstream-app -c deepstream_app_config.txt
#此步驟執行完會生成engine檔
#編輯文件指令:vi xxxx
修改目錄或文件權限chmod 777 config_infer_primary_yoloV8 config_infer_primary_yoloV8
快速測試DeepStream有沒有裝好
cd /opt/nvidia/deepstream/deepstream/samples/configs/deepstream-app
deepstream-app -c source4_1080p_dec_infer-resnet_tracker_sgie_tiled_display_int8.txt
參考網址:https://github.com/marcoslucianops/DeepStream-Yolo/blob/master/docs/customModels.md
```
### Cvat
[Cvat官方Documentation
](https://opencv.github.io/cvat/docs/)
dvaid的備份筆記:https://hackmd.io/@qlFF8FVPTmavVhVXj3cnFQ/H1YGWlW0i
```
注意事項:創一個task不是按照你傳入的list順序,而是按照檔名順序,所以檔名要取六位數的,前面要補上0
補0的方法:使用zfill,使用方式為a="123",a = a.zfill(填入你要幾位數的數字)
例如:a = a.zfill(6),a就會變成000123
#要使用公司的cvat
需要連網到RaiServer_5G or RaiServer
IP:http://192.168.50.100:8080
#測試與訓練集網頁
http://10.8.0.6:6140
#看 TensorBoard
http://10.8.0.6:6142
#Cvat的開啟方式
1.cd cvat #進到Cvat資料夾
2.docker compose up -d #-開啟 "-d"是背景執行
3.docker compose down #-關閉
#Cvat的管理員後台網址
http://xxx.xxx.xxx.xxx:8080/admin/login/?next=/admin/
#Nb to cvat管理員後台網址
http://192.168.50.183:8080/admin/login/?next=/admin/
SuperUser:
nb
Nb
#Nb to cvat
http://192.168.50.183:8080
Account:
查:hk
董:hk1
倫:hk2
Password:hk123123
pip install cvat-sdk時要注意版本,目前david的cvat版本是2.3.0,直接pip會裝到最新的2.4.0,要手動降版pip install cvat-sdk==2.3.0
```
### Cvat to Docker桌面版
如何在win10 docker桌面版 架設cvat
```
wsl --set-version Ubuntu-18.04 2
1.先裝docker桌面版
2.在cmd搜尋要裝的Linux版本(必須裝,建議是ubuntu18.04,指令:wsl --list --online
3.安裝Linux子系統,指令:wsl --install -d <Distribution Name>
4.打開docker桌面版去Setting>>resources>>WSL_Integration把Ubuntu啟用 (若沒有跑出來,則是wsl版本不對,需先確認ubuntu的wsl版本,若是1版,升級wsl2 指令為wsl --set-version <distro name> 2)。
5.下載GIT(需要用GIT下載cvat to ubuntu),在Ubuntu系統終端機打上git clone https://github.com/opencv/cvat,cvat就會自動下載。
6.切換cvat目錄,指令cd cvat;啟動cvat,指令:docker compose up -d 不行執行就是權限太低。
7.創建超級使用者
7.1.sudo docker exec -it cvat_server bash -ic 'python3 ~/manage.py createsuperuser'
7.2.輸入使用者帳號 電子信箱 密碼(大寫)
備註:啟動cvat之後如果要讓其他人也連接的話,要打這串export CVAT_HOST=your-ip-address
再不行就修改docker-compose.yml的檔案,將cvat_server底下的label裡的host後面的localhost改成自己電腦的IPv4網路位址,cvat_ui的localhost也要改,完成後再開啟docker-compose就可以讓別人輸入"自己設定的位址:8080"來連接cvat。
```
### JetSon Nx to openCV
```
OpenCV with CUDA NO 解決方法
下載OpenCV4.5.5 & opencv_contrib-4.5.5 #不要太高版本 極限就是4.5.5
看這篇->https://learningsky.io/install-opencv-on-nvidia-jetson-agx-xavier/
```
### Metabase
[Running Metabase on Docker
](https://www.metabase.com/docs/latest/installation-and-operation/running-metabase-on-docker)
```
IP:192.168.50.183:3000
帳號:hkhk123@gmail.com
密碼:csiej504
如何建立Metabase:
1.docker pull metabase/metabase:latest
2.docker run -itd -p 3000:3000 --name metabase metabase/metabase #預設port為3000
#初始化時查看logs
docker logs -f metabase
##Amd64
--platform linux/amd64
```
### PostgreSQL 資料庫
[postgres_Dokcer](https://hub.docker.com/_/postgres)
[postgres_python教學](https://www.tutorialspoint.com/python_data_access/python_postgresql_create_table.htm)
```
介面化程式:pgAdmin 7.0
PostgreSQL---正在使用,NB電腦
docker run :
docker run --name nb-postgres -p 5432:5432 -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin -d postgres
connect->192.168.50.81
account:admin
password:admin
一路Enter
```
### 網路攝影機
```
主攝像頭:102
ip:192.168.50.129
account:admin
password:ms123456
rtsp://admin:ms123456@192.168.50.129:554/ch_10x
```
### nb docker-run
```
27
docker run --gpus all -tid --rm --net=host --runtime nvidia --name yolov8_27 -v /home/nb/share/testtt:/testtt -e DISPLAY=$DISPLAY -w /testtt -v /tmp/.X11-unix/:/tmp/.X11-unix yolov8:latest &&screen docker exec -it yolov8_27 /bin/bash -c "python image_cell_yoloR_27.py"
28
docker run --gpus all -tid --rm --net=host --runtime nvidia --name yolov8_28 -v /home/nb/share/testtt:/testtt -e DISPLAY=$DISPLAY -w /testtt -v /tmp/.X11-unix/:/tmp/.X11-unix hkyolov8:latest &&screen docker exec -it yolov8_28 /bin/bash -c "python image_cell_yoloR_28.py"
```
### 藥品
```
docker run --gpus all -tid --name medicine -v /home/rai/timm_medicine:/workspace/timm/output -v /home/rai/TB_medicine:/workspace/timm/TB tast:latest &&docker exec -it medicine /bin/bash
python train.py ./data/ --model rexnet_200 --sched cosine --epochs 500 --warmup-epochs 5 --lr 0.4 --reprob 0.5 --remode pixel --num-classes 8 --class-map classmap.txt --batch-size 16 --amp -j 4
tensorboard
```
### 科博館
rai_timm_train_inference
```
docker run --gpus all -tid --name rai_timm_predict -w /workspace/rai_timm_train_inference --net=host -p 4888:4888 rai_timm_train_inference:latest
```
rai_timm_train_per
```
docker run --gpus all -tid --name rai_timm_predict -w /workspace/rai_timm_train_inference --net=host -p 4889:4889 rai_timm_train_inference:latest
```
### 遠端桌面VNC服務
```
1.安裝Vino VNC
sudo apt install vino
2.設定螢幕分享
設定的Screen Sharing
3.安裝VNC Client
自己電腦安裝
4.連線
輸入IP後按Enter就可以連線,不用做特別設定。
問題:
A.連線出現Unable to connect to VNC Server using your chosen security setting. Either upgrade VNC Server to a more recent version from RealVNC, or select a weaker level of encryption錯誤訊息
Ans:將加密關掉,要在桌面的Terminal輸入下面指令後,重新連線應該就成功了。
宿主機:gsettings set org.gnome.Vino require-encryption false
ssh:bus-launch gsettings set org.gnome.Vino require-encryption false
B.連入後遇到黑螢幕Black screen
Ans:dbus-launch gsettings set org.gnome.Vino prompt-enabled false
簡單Debug
netstat -tlnp | grep vino
```
### Screen
```
Screen 讓CMD(終端機)常駐
安裝指令:
apt install screen
use:screen or screen
1.首先使用screen -d id,先退出。
ex:screen -d 74308
#不知道id 可以輸入screen -ls 查詢
2.screen -r id重新连接
ex screen -r 74308
3.按下Ctrl+D終端接就關閉,跟它說掰掰
777.超級合併使用大法 screen -d -r your_screen_name/id # 解释:-d -r 先踢掉前一用户,再登陆
參考來源:https://blog.csdn.net/wyf2017/article/details/119776928
```
### Vscode tensorboard
```
vscode有自帶tensorboard
可以在Quict Open(shift+ctrl+p)
輸入"launch tensorboard"
http://localhost:6006/
就可以在網頁上瀏覽到
```
### NB
```
timm:
docker run --gpus all -tid --name medicine -p 9999:9999 -w /workspace/flask -v /home/rai/timm_medicine:/workspace/timm/output -v /home/rai/TB_medicine:/workspace/timm/TB medicine_timm:latest &&docker exec -it medicine /bin/bash
m_flask_api:
docker run --gpus all -it -d --name dong --net=host -v /home/nb/share/yolo_flask:/flask -w /flask -p 1231:1231 yolo_api:latest && docker exec -it dong /bin/bash -c "python yolo_api.py"
m_D_flask_api
docker run --gpus all -it -d --name dong -v /home/nb/share/yolo_flask:/flask -w /flask -p 9780:9780 yolo_api:latest && docker exec -it dong /bin/bash -c "python yolo_api.py"
nb anydesk密碼:Nb123321
```
### Dart and Flutter
```
1.安裝的部分:
flutter:https://docs.flutter.dev/get-started/install
dart:https://dart.dev/get-dart/archive
2.建議都用下載zip的方法,因為兩者的path設定一模一樣。
3.下載好,進行解壓縮,放到C槽的自己建立的資料夾(官方建議:"C:\src")
4.電腦搜尋 "env啟動" or "編輯系統環境變數"
開啟後,按下"環境變數" 進入上框的變數"Path"選擇編輯
5.新增以下內容:
C:\src\flutter\bin
C:\src\dart-sdk\bin
Note:如果你路徑有不同 請改成你的路徑
6.完成後,打開cmd,輸入"flutter doctor",就會開始檢驗你的環境是否正常,沒報錯,基本上就安裝完畢了。
```
### VScode 開發Web環境設定:
```
1.延伸模組安裝:flutter,dart
2.上方工作列 右鍵啟動Quict Open功能(快捷鍵shift+ctrl+p)
3.輸入"flutter"
可以快速建立flutter與預設裝置等等的
*記得去下載有關flutter的相關插件才能編譯
4.由於我們只是要開發Web:
可以在Quict Open(shift+ctrl+p)
輸入"flutter select device"
選擇 Chrome 作為編譯工具
5.創建新專案:
可以在Quict Open(shift+ctrl+p)
輸入"flutter New project"
會跳出一個方框是要你輸入專案的名稱,輸入完畢後,就能完整的建立專案了
6.生成完main.dart後,會有helloworld的程式碼,可以按下F5編譯,等待他跑一下,之後會跳出一個chrome的helloworld頁面,這樣就算是完成helloworld了。
```
## 子系統(wsl)
## wsl to Linux
https://ithelp.ithome.com.tw/articles/10255920
> 啟用安裝WSL必要元件
1. Windows子系统Linux版
2. 虛擬機器平台
> 去控制台 — ->程式和功能 — ->開啟或關Windows功能 →勾選(1)、(2)
>勾選完後,重啟電腦
--------------------------------------------------------------
https://ithelp.ithome.com.tw/articles/10255920
1. 將WSL預設版本調成WSL2,如果已經是WSL2就不需要囉!
>指令:
`wsl --set-default-version 2`
-----------------------
<font size=6px color=red >強烈建議觀看</font>
<font size=4px>**喜歡玩踩地雷的朋友可以錯過,可以不要安裝Windows子系统Linux版**</font>
>安裝Windows子系统Linux版,才能將Debain 的 init 系統 從Sysvinit 自動變為 Systemd
Sysvinit系統只能使用 service Ex.sudo service docker start
不能使用 systemct Ex.sudo systemctl status docker 連Docker也跑不動
會出現這串提示字:<font color=red >
System has not been booted with systemd as init system (PID 1). Can't operate</font>
變為Systemd系統,系統就可兼容兩種語法 service & systemctl
查詢指令:
`ps --no-headers -o comm 1`
> 如果命令返回的是init说明systemd未启用,如果是systemd那么你的systemd已启用成功了。
-------------------------------------------------------------------------
2. 安裝Windows子系统Linux版
>指令
`wsl --update `
3. 安裝Linux 發行版本
>指令:
`wsl --install -d <Distribution Name> `
>查詢 <Distribution Name> 指令:wsl --list --online #選擇想要安裝的版本
>Ex.Ubuntu-22.04
>指令:
`wsl --install -d Ubuntu-22.04`
3. 進入wsl init系統 更改為 Systemd
>3.1輸入 echo -e "[boot]\nsystemd=true" | sudo tee -a /etc/wsl.conf
>3.2重開 wsl --terminate Ubuntu-xx.04
> ***Linux系統預設硬碟為C:\***
> 從C:\更變D:\
> **查看現有的子系統**
> 指令:
`wsl -l
> **匯出**
> wsl --export <DistroName> <ExportPath><ExportFileName.tar>
> ex1.
`wsl --export Ubuntu-22.04 D:\wsl\ubuntu22.04-wsl.tar`
> ex2.
`wsl --export Ubuntu-22.04-InDiskD D:\wsl\ubuntu22.04-wsl.tar`
> **匯入**
> wsl --import <NewDistroName> <ImportPath> <ExportFilePath>
> ex.
`wsl --import Ubuntu-22.04-InDiskD d:\wsl\ubuntu-InDiskD D:\wsl\ubuntu22.04-wsl.tar`
> **變更 wsl 的發行版預設**
> wsl --setdefault <DistroName>
> ex.
`wsl --setdefault Ubuntu-22.04-InDiskD`
https://blog.miniasp.com/post/2020/07/26/Multiple-Linux-Dev-Environment-build-on-WSL-2
>注意:更變位置之後#Win10 WSL 子系统會默认root登入
解決辦法在 /etc/wsl.conf 設定檔(將預設登入帳戶設定為 xxxx 帳號)
將以下兩行加入到 /etc/wsl.conf 設定檔最後面:
[user]
default=xxxx
更改完後 就不用以指定的使用者執行特定發行版本 下面就可以跳過了
每次打開CMD 只要輸入: wsl
即可開啟WSL
> **以指定的使用者執行特定發行版本**
> wsl -d <DistroName> -u <wslUserName>
> ex.
`wsl -d Ubuntu-22.04-InDiskD -u aron `
***有趣的發現***
1.vscode 先載入資料夾
2.vscode 的 終端機 輸入 `wsl -d Ubuntu-22.04-InDiskD -u aron`
3.在vscode 的 終端機 輸入 code .
檔案總管將會被載入到wsl裡
>
> **移除舊的版本**
> wsl --unregister <DistroName>
> ex.
`wsl --unregister Ubuntu-22.04`
---------------------------------------------------------------------------
## 子系統相關指令:
> 查看現有的子系統
> 指令:
`wsl -l
> 查看正在運作的子系統
> 指令:
`wsl -l -v
> 關閉子系統
指令:
`wsl --shutdown`
>
> 更新子系統
>指令:
` wsl --update`
> 卸載wsl linux版本
>指令:
> wsl --unregister <DistroName>
>Ex1.
`wsl --unregister Ubuntu-22.04`
>Ex2.
`wsl --unregister Ubuntu-22.04-InDiskD`
>
> 重啟 wsl
指令:
> wsl --terminate <DistroName> Ubuntu-18.04
> Ex1.
`wsl --terminate Ubuntu-22.04`
> Ex2.
`wsl --terminate Ubuntu-22.04-InDiskD`
--------------------------------------------------------
## 必裝套件
### ssh
> 指令:
`sudo apt-get install openssh-server`
### ifconfig
> 指令:
`sudo apt-get install net-tools`
-------------------------------------------------
## 系統聲音
> 关闭tab提示音
> sudo vim /etc/inputrc
> 1.find "#set bell-style none"
> 2.change "set bell-style none"
> 3. 重启 wsl
> 关闭vim提示音
> sudo vim /etc/vim/vimrc
> 在最后一行添加set vb t_vb=
--------------------------------------------------------
## 遠端
> Hyper V虛擬機xorg登錄卡在藍屏or黑屏
> 藍屏:
> systemctl -l status xorg
> -> unit xorg.service could not be found.
> 解決:
> 1 sudo apt remove xserver-xorg-core
> 2 sudo apt install xserver-xorg-core
> 3 sudo apt install xorgxrdp
> 黑屏:
> 設定->整合服務->"客體服務"打勾 #Hyper v
> ###本地和遠程不能同時用同隻帳號登錄
-------------------------------------------------
## 裝docker
> Ubuntu version:22
> https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04
```
1.
sudo apt update
2.
sudo apt install apt-transport-https ca-certificates curl software-properties-common
3.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
4.
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5.
sudo apt update
6.
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7.測試
sudo systemctl status docker
8.
sudo groupadd docker
9.
sudo usermod -aG docker $USER
10.重開ubuntu
11.
docker run hello-world
```