使用darkflow結合yolo影像辨識

darkflow將darknet(yolo)轉換成tensorflow方式執行,就可以使用tensorflow讀取yolo的設定檔與權重進行圖片與影片辨識。

Step1)安裝虛擬環境

#conda create -n darkflow python=3.7

#conda activate darkflow

Step2)安裝所需套件,tensorflow不能使用2以上的版本。

#pip install opencv-contrib-python

#pip install tensorflow==1.15

#pip install tensorflow-gpu=1.15

#pip install Cython

Step3)下載與安裝darkflow,切換到指定的資料夾

#git clone https://github.com/thtrieu/darkflow

#cd darkflow

#pip install -e .

Step4)重新安裝protobuf,需要3.20以前的版本

#pip uninstall protobuf

#pip install protobuf==3.20

Step5)下載yolo設定檔、權重檔與label.txt

使用yello(https://github.com/adriacabeza/Yello)的darkflow設定檔、權重檔與label.txt,將label.txt取代darkflow程式碼資料夾下的label.txt

(1)設定檔:https://github.com/pjreddie/darknet/blob/master/cfg/yolov2-tiny-voc.cfg,放置於darkflow程式碼資料夾下的cfg資料夾下。

(2)權重檔:https://pjreddie.com/media/files/yolov2-tiny-voc.weights,放置於darkflow程式碼資料夾下的cfg資料夾下。

(3)label.txthttps://github.com/adriacabeza/Yello/blob/master/labels.txt


Step6)在darkflow程式碼資料夾下,執行以下命令,辨識資料夾sample_img下所有圖片,並將辨識結果放置於out資料夾。

#python flow --model cfg\yolov2-tiny-voc.cfg --load cfg\yolov2-tiny-voc.weights --imgdir sample_img\

辨識結果如下。

Step6)啟用內建攝影機(/dev/camera0),

#python flow --model cfg\yolov2-tiny-voc.cfg --load cfg\yolov2-tiny-voc.weights --demo camera

出現以下錯誤

Traceback (most recent call last):

File "..\darkflow\flow", line 6, in <module>

cliHandler(sys.argv)

File "C:\darkflow\darkflow\darkflow\cli.py", line 29, in cliHandler

tfnet.camera()

File "C:\darkflow\darkflow\darkflow\net\help.py", line 87, in camera

cv2.namedWindow('', 0)

cv2.error: OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:447: error: (-215:Assertion failed) !winname.empty() in function 'cv::namedWindow'


修改darkflow\net\help.py

第87行:cv2.namedWindow('camera', 0) #新增視窗的標題camera

90行:cv2.resizeWindow('camera', width, height) #新增視窗的標題camera

134行:cv2.imshow('camera', postprocessed) #新增視窗的標題camera

Step7)辨識影片,在darkflow資料夾下新增影片night.mp4,執行以下指令,會儲存辨識結果到檔案video.avi。

#python flow --model cfg\yolov2-tiny-voc.cfg --load cfg\yolov2-tiny-voc.weights --demo night.mp4 --saveVideo true

Step8)以下需要Nvidia GPU(筆者使用NVIDIA GeForce GTX 1660 Ti)的電腦,下載cuda10.0cuDNN v7.6.4,並安裝tensorflow-gpu 1.15.0

解壓縮cuDNN v7.6.4,將資料夾bin、include、lib拷貝到cuda10.0資料夾下,請參考Windows10上安裝TensorFlow GPU套件

安裝tensorflow-gpu 1.15.0

#pip install tensorflow-gpu==1.15.0

新增指令「--gpu 1.0」表示使用GPU進行辨識。

#python flow --model cfg\yolov2-tiny-voc.cfg --load cfg\yolov2-tiny-voc.weights --demo night.mp4 --saveVideo true --gpu 1.0

出現以下訊息表示成功啟用GPU。

2022-06-29 10:46:35.078005: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library nvcuda.dll

2022-06-29 10:46:35.621500: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:

name: NVIDIA GeForce GTX 1660 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.59

pciBusID: 0000:01:00.0

2022-06-29 10:46:35.621759: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudart64_100.dll

2022-06-29 10:46:35.642083: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_100.dll

2022-06-29 10:46:35.658661: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cufft64_100.dll

2022-06-29 10:46:35.668024: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library curand64_100.dll

2022-06-29 10:46:35.693681: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusolver64_100.dll

2022-06-29 10:46:35.710151: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cusparse64_100.dll

2022-06-29 10:46:35.758278: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cudnn64_7.dll

2022-06-29 10:46:35.758720: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0

2022-06-29 10:46:37.345658: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:

2022-06-29 10:46:37.345803: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0

2022-06-29 10:46:37.346780: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N

2022-06-29 10:46:37.351854: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 6144 MB memory) -> physical GPU (device: 0, name: NVIDIA GeForce GTX 1660 Ti, pci bus id: 0000:01:00.0, compute capability: 7.5)