source:Greatway9999

0.前言

本文主要是記錄在Windows10 系統中安裝 Anaconda,並在 TensorFlow2的框架下,運行YOLOv4。本文章乃筆者參考 <Github:hunglc007/tensorflow-yolov4-tflite> 與  <YOLOv4+tensorflow2.0訓練自己的數據> 進行的實作紀錄。


1.環境建置

1.1 Anaconda安裝教學

Anaconda安裝教學,請參考< Anaconda安裝不求人 : 超簡單的8個步驟,一次就成功 !! >


1.2.在Anaconda中建立虛擬環境與安裝TensorFlow2.x

Step0. 列出系統中所有虛擬環境 

使用 conda env list 指令。

source:Greatway9999


Step1. 建立指定Python版本的虛擬環境

使用 conda create --name [虛擬環境命名] python=[版本號] 指令。

例如建立名為 myenvtf2 且 Python 版本為 3.6 的虛擬環境,指令如下:

conda create --name myenvtf2 python=3.6

source:Greatway9999


Step2. 安裝TensorFlow2.x套件與相依套件

安裝TensorFlow2.X後也要安裝相依套件(cudnn與cudatoolkit),TensorFlow2.X才能順利運行。關於TensorFlow2.X對應的cudnn與cudatoolkit版本,可參考 TensorFlow官網

此處以安裝TensorFlow2.5版為例,記得先啟動剛建的虛擬環境( activate myenvtf2 ),在你啟動的虛擬環境中,依序輸入以下指令。

pip install tensorflow-gpu==2.5.0

conda install cudnn==8.2.1

conda install cudatoolkit==11.3.1

備註:

  1. 筆者使用pip指令安裝cudnn和cudatoolkit未成功安裝,改用conda指令才順利安裝cudnn和cudatoolkit。建議讀者可依據實際遇到的情形,彈性使用pip或conda指令進行套件安裝。
  2. 搜尋指定套件的所有版本號,指令為conda search 套件名稱 ,例如 conda search cuda
  3. 若不小心裝錯套件,移除套件的指令為 pip uninstall 套件名稱==版本號,例如pip uninstall tensorflow==2.5.0
  4. 若要刪除指定虛擬環境,指令為conda env remove --name 虛擬環境名稱,例如conda env remove --name myenvtf2


Step3. 檢查套件是否成功安裝

使用 conda list 指令檢查 TensorFlow2.5、cudnn與cudatoolkit是否成功安裝。指令輸入後,系統中安裝的套件名稱、版號等資訊就會被列出。

source:Greatway9999


2.部署YOLOv4

2.1. 下載權重文件並放置指定位置

下載來源:

https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights

下載後的權重請放置於tensorflow-yolov4-tflite-master\data 的資料夾中。


2.2.權重檔轉換

權重檔yolov4.weights需轉換成在tensorflow環境下使用的檔案類型。轉換步驟如下:


Step1.進入指定路徑

從anaconda prompt中利用 "cd" 指令進入到tensorflow-yolov4-tflite-master路徑中。

ex. cd C:\Users\OOO\OOOOO\tensorflow-yolov4-tflite-master


Step2.輸入轉換指令

進到指定位置後輸入以下指令:

python save_model.py --weights ./data/yolov4.weights --output ./checkpoints/yolov4-416 --input_size 416 --model yolov4

source:Greatway9999

在tensorflow-yolov4-tflite-master\checkpoints路徑下產生一個名為yolov4-416的資料夾。

source:Greatway9999

yolov4-416的資料夾中有個名為saved_model.pb檔,為測試時需使用的文件。

source:Greatway9999

到這個步驟即可進行YOLOv4的測試。

2.3.測試與問題排除指引

2.3.1 圖片測試

請在tensorflow-yolov4-tflite-master路徑下,輸入以下指令:

python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/kite.jpg --output ./data/kite_d.jpg

source:Greatway9999

該指令是對/data路徑下的 kite.jpg進行偵測,並在/data路徑下,將偵測的結果存成kite_d.jpg。

若程式運行正常的話,會得到以下測試結果。

source:Greatway9999

倘若出現以下錯誤:

After saving the model, running detection with 'python detect.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --images ./data/images/kite.jpg' give me an error of:

cv2.error: OpenCV(4.5.2) :-1: error: (-5:Bad argument) in function 'rectangle' > Overload resolution failed: > - Can't parse 'pt1'. Sequence item with index 0 has a wrong type > - Can't parse 'pt1'. Sequence item with index 0 has a wrong type > - Can't parse 'rec'. Expected sequence length 4, got 2 > - Can't parse 'rec'. Expected sequence length 4, got 2

如下圖

source:Greatway9999

經查,輸入到cv2.rectangle()這個函數中兩個的座標不能是浮點數的類型, 要轉換成整數才行,於是就使用int()強制類型轉換,程式碼即可成功運行。debug說明如下:

Step1.在\tensorflow-yolov4-tflite-master\core 路徑下開啟 utils.py 這支程式

Step2.在該程式中的指定行數將程式碼修改如下,並進行存檔:

Line 152 -> c1, c2 = (int(coor[1]), int(coor[0])), (int(coor[3]), int(coor[2]))
Line 159 -> cv2.rectangle(image, c1, (int(np.float32(c3[0])), int(np.float32(c3[1]))), bbox_color, -1)
Line 161 -> cv2.putText(image, bbox_mess, (c1[0], int(np.float32(c1[1] - 2))), cv2.FONT_HERSHEY_SIMPLEX, fontScale, (0, 0, 0), bbox_thick // 2, lineType=cv2.LINE_AA)

如下圖所示:
source:Greatway9999

回到tensorflow-yolov4-tflite-master/ 路徑下,輸入以下指令,應可正常運行。

python detectvideo.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/road.mp4 --output ./data/road_d.mp4


2.3.2 影片測試

這部份就交由讀者自行試試囉。小提示如下供參:

請在tensorflow-yolov4-tflite-master路徑下,輸入以下指令:

python detectvideo.py --weights ./checkpoints/yolov4-416 --size 416 --model yolov4 --image ./data/road.mp4 --output ./data/road_d.mp4


---

參考資料:

#windows #anaconda #YOLOv4 #TensorFlow2.x

0 留言