LeetCode - 52 解題紀錄
題目: LeetCode - 52. N-Queens II...
LeetCode - 51 解題紀錄
題目: LeetCode - 51. N-Queens...
YOLOv7 on Windows (四) 引用模型與自瞄實現代碼
要將訓練好的模型實現自瞄我分為以下步驟
引入模型
擷取螢幕截圖
預測物體位置並取得中心座標
取得鼠標移動 offset
微調 offset
移動鼠標並射擊
以下將以 Aimlab Gridshot 為例實作
前置準備想要引入模型須先準備一些依賴
hubconf.py 引入模型的依賴文件,可於這裡下載,似乎也可直接在線調用
models、utils 直接複製 YOLOv7 目錄中的 models、utils 兩個資料夾即可
訓練好的模型
所有檔案放入同一目錄
best.pt 為訓練好的模型,以下將解釋實現步驟
import 與設定參數根據自己的配置設定參數,延遲根據電腦配置設定,可實際執行不斷調整至合適的延遲
123456789101112131415161718192021import sysimport timeimport torchimport win32apiimport win32confrom PyQt5.QtWidgets import QApplication# data settingGAME_WIDTH = 1920GAME_HEIGHT = 1 ...
PyInstaller -D 檔案雜亂
在專案完成後為了方便部屬有時會有將專案打包的需求,以 Python 來說目前常用的工具為 PyInstaller。
PyInstaller 主要會有兩個問題,一是它會將該環境所有套件打包,造成體積龐大,這點可透過創建新的虛擬環境解決。
另一點,為了簡潔,一般會帶參數 -F 使其打包後僅為一個執行檔,但由於它會將所有套件打包在一起,造成該執行檔體積龐大,執行緩慢,所以有時會改用 -D 這個參數使其打包後為一個目錄,又由於它會將所有套件打包在一起,所以檔案看起來會很雜亂。
以目前的小專案為例,打包成一個執行檔後會長這樣
不到千行的專案卻有 60MB
若打包為一個目錄的話會長這樣
執行檔本身雖然縮小為 5MB,但整個目錄略顯雜亂,要透過設定檔調整程式時也不易直接看出。
解決方法從 Shell Script 得到靈感,在原本的目錄加一層上級目錄,用 bat 執行原本打包好的程式,使其執行時加入變數的目錄為上級目錄,如此便可將設定檔與一些產出檔案和原程式區隔開,最後將 bat 轉為 exe 檔案即可。
最終看起來會像這樣,app 內放的為打包成目錄的程式
PUPC 2022 心得
PUPC 全名是全國私立大專校院程式競賽,英文名常常換來換去比賽三人一組,每組一台電腦,入場可攜帶十張 A4 紙,可提前在單面作筆記
一組只有一台電腦,所以分工勢必為一人打 Code,另外兩人看題目,因為我英文能力極差,看題目效率很低,因此我們這組由我負責打 Code,但我前一天失眠,教室又很熱,整個人昏昏沉沉的,我也不知道我在寫什麼,想到什麼寫什麼
比賽過程和 CPE 差不多,難度我覺得比 CPE 簡單一些,可能是有隊友協助看題目,考 CPE 都得看 IO 猜題意,這次隊友把題目看得很仔細,寫起來感覺簡單不少,但有些題目還得用猜的,猜對了超開心
如果想增加一些個人經歷的話還蠻推薦參加這個比賽的,難度不會太高,我們沒有特別準備,拿到不錯的成績,若是有準備甚至有特別練習解題的人參加應該可以取得很厲害的成績
這次的台中之旅很愉快,前一天吃燒肉,一起聊天耍廢到凌晨,但我們住的旅館熱到睡不著,我們前一天只睡了兩小時左右,進了主辦學校也超熱,比賽時又熱又累不知道自己在幹嘛,結束比賽後也十分狼狽,突然下暴雨,我們都沒帶傘,又得淋雨坐車,整個人都快沒了
整體來說,很慶幸當時沒有嫌麻煩不參加,和朋友一 ...
YOLOv7 on Windows (三) AI 自瞄實現原理與危害
隨著硬體計算能力和演算法的進步,AI 自瞄漸漸浮現出來,我第一次聽到這個詞是在去年,正好前幾天看到 YOLOv7 推出的消息,就很好奇像我這種沒有自己訓練過模型,對於深度學習也沒什麼概念的人,多久時間能做出來。雖然製作過程中踩了不少坑,成果還是很令我滿意的。
外掛原理在繼續今天的主題前,先解釋一下大部分遊戲外掛運作的原理
程式在執行時都會被載入到記憶體中,遊戲也不例外,當遊戲執行時,遊戲中出現的各種數據都以二進制的方式儲存在記憶體中,包含程式碼也是因此,讀取記憶體並修改內容是大部分遊戲外掛的原理,通常會有幾個 base address,將其值加上不同的偏移量便可得到各種數據,當然,程式每次被載入時在記憶體中的位置是不固定的,但目前都是採用虛擬記憶體的技術,使得 base address 是固定的,如果遊戲沒有更新的話,基本上找到的 base address 都不會變
手法上來說,一般會挑選一些較固定可控的數據,透過其 address 往上找 base address,大部分 address 都是 base address 的值經過好幾次偏移得到的,這非常考驗能力和經驗,對於組合語言也要 ...
YOLOv7 on Windows (二) 訓練自己的資料集
準備資料集將標註好的資料集放在一個資料夾內並取名為 all,資料集需為 YOLO 的格式,YOLO 格式為一張圖片搭配一個 txt 檔,如果是用 labelImg 標註應該還會有一個 classes.txt 的檔案,裡面放的就是你標註的 class 名稱,我準備了 60 張圖片,只有一個 class,整個看起來會像這樣
在 yolov7 的資料夾內建立一個資料夾取名為 mydataset,並將資料集放到裡面,由於將資料分割的步驟比較繁雜,我寫了一隻程式來分割,下載這隻程式並放到 mydataset 的資料夾內做完這一步看起來會像這樣
需要注意的是資料夾的名稱必須為 all,並且裡面要有 classes.txt,若沒有請自行新增,並打上自己標註的 class 名稱之後直接執行並帶入要作為 validation set 的圖片數量,程式會隨機取出
以我來說我想要 10 張圖片作為 validation set
python splitFile.py 10
執行完後會像這樣
到這裡就完成資料集的準備了 (我這邊沒有準備 test set,如果想要的話按照格式新增即可)
建立配置檔我們已 ...
YOLOv7 on Windows (一) 建立環境與執行
建立環境先用 Anaconda 建立一個乾淨的新環境
conda create --name torch python=3.9
名稱及版本都可以更改,我這邊是用 3.9
接著進入環境安裝 GPU 版本的 PyTorch,也可以用 CPU 版本的,但速度慢非常多
安裝前先檢查 GPU 的驅動版本,可以在終端中使用 nvidia-smi 指令來查看驅動版本
之後到這個網站查看符合的 CUDA 版本YOLOv7 支持的 PyTorch 版本為 1.7.0 ~ 1.11.0 所以到這個網站挑選適合的安裝我安裝的是 1.11.0 + CUDA 11.3
安裝 1.12.0 也可以執行,但是在引入模型時會有問題PyTorch 比較大,需要一點時間下載安裝完後在終端直接執行 Python 檢查有沒有安裝成功
有看到自己的 GPU 就是成功了
安裝完後就可以 clone YOLOv7git clone https://github.com/WongKinYiu/yolov7.gitclone 完後進入資料夾,因為我們已經裝好 PyTorch 了,所以修改一下 requirements.txt ...
還沒想好標題
軟體架構通常要開發具有一定規模或比較複雜的軟體時,都會先根據需求或規格設計架構。以個人的角度而言,可以讓自己在開發時有更明確的方向,選擇框架時能考慮更全面,也會降低排除 BUG 的困難。以團隊的角度而言,好的架構設計可把軟體拆分成數個可獨立運作的部分,在開發上提升效率。常見的例子是有前後端的軟體,在設計架構時可先決定資料交互的形式、API 接口等等…,接著同步開發,最後花費一些時間整合即可。
設計好架構後記錄的方式有很多,架構圖加上文字說明是最詳盡,只有架構圖也可以接受,若不記錄可能會產生一些問題。
個人經驗我自己是不喜歡記錄的,一來麻煩,再者,思考單位如果是實體,思考速度會大幅下降,同時也限縮了很多可能性,就像是黏土一樣,黏土硬掉後要重新塑型比較困難,雖然可以用新的土把原本的蓋掉,但體積也會變大。
話雖如此,我最近卻深刻體會到沒有記錄帶來的後果。現在手上有一個開發週期挺長的專案,初期程式碼規模還比較小的時候沒有體會到這個問題,但到後面規模相對大的時候,突然意識到嚴重性,這個專案的需求都非常細微,因此一開始接手時無法完整的釐清所有需求及規格,都是邊開發邊修改,而我開發的時間又很間斷,一 ...
內聚性與耦合性
在做軟體開發時,常常會聽到內聚性 (Cohesion) 及耦合性 (Coupling),這兩個詞,這也是在設計軟體架構常常要考慮到的事情,該如何在這兩個特性中各自取得平衡,是非常重要的一件事。
內聚性內聚性簡單來說,就是在程式中,功能類似的東西或是相同用途的資料等等…,是否有放在相近的地方,和 OOP 中封裝的概念相似,一般會使用高內聚性、低內聚性來表示。比方說,將一些功能類似的函式打包成一個 class,就是一種高內聚性的表現。
通常會希望程式能夠有高內聚性,因為高內聚性和許多理想的軟體特性有關,包括 Robustness、Reliability、Reusability、Understandability 等等。
耦合性耦合性簡單來說,就是兩個東西之間的相依性,比如兩個 class、兩個 function 等等,兩者的關係越大,耦合性就越高,一般來說,會希望兩個東西越獨立越好,因為若兩者耦合性越高,則改變其中一個對另一個造成的影響可能就越大,所以一般來說會希望在保有相同的特性下,耦合性越低越好。
平衡與取捨通常會希望整體保持高內聚、低耦合,但有時為了程式簡潔,或是設計方便,適時地降低 ...