首先说一下俺搭建的环境是什么样子的:win10+anaconda+python3.6+VS2015+GTX960+运行CUDA版本10.1+驱动版本CUDA11.1+opencv3.4+C语言版本darknet AlexeyAB
简单说明一下,这里用的方法类似于我上一篇文章中提到的第二种方法,将darknet从github上面拉下来之后用VS2015编译生成yolo_cpp_dll.dll这个链接库,可以生成不包含GPU的dll,但是不包含gpu的dll速度就很慢,10s的视频要跑1分多钟,很是心累,而gpu版本的dll速度就快了很多,我电脑上的显卡很垃圾,主要是我来实验室来得晚没配到好设备,但相对cpu版本的dll已经可以了。但gpu版本的dll生成之后如果要被python调用就需要配置好CUDA的版本,这一段过程也很心累。
第一步:配置AlexeyAB版本的darknet,并成功生成darknet.exe,之后可以标注自己的数据集,训练得到自己的模型,总共有三个文件下面要用到,分别是:yolov3-obj.cfg、yolov3-obj_2000.weights、obj.data,这一步可以参考我的上上篇文章。
第二步:生成yolo_cpp_dll.dll,下面这样就算生成成功了,并记得把这个dll和你前面生成的darknet.exe放在一个目录下,一般默认在x64目录下不要动就行。
第三步:生成dll之后不算完事,还要查看你的GPU的版本,一个是驱动版本一个是运行版本,驱动版本是跟你的英伟达控制面板上一致的,通过nvidia-smi查看得到的(如下图1),运行版本是安装在你的anaconda虚拟环境中的,通过nvcc -V或者conda list查看得到的(如下图2).
第四步:直接在darknet_video.py上面修改就可以,但是AlexeyAB版本的这个文件用到了queue和Thread,我直接运行的时候有点问题,修改起来我觉得太繁琐了,自己简单写了一个不用queue和Thread的脚本如下所示:
# -*- coding: utf-8 -*-
"""
Created on Thu Jan 7 15:58:33 2021
@author: SS
"""
import sys
sys.path.append('E:\\darknet\\darknet-master\\build\\darknet\\x64')
import os
from ctypes import *
import random
import cv2
import time
import darknet
import argparse
#%%
#net = darknet.load_net("E:\\darknet\\darknet-master\\build\\darknet\\x64\\cfg\\yolov3-obj.cfg", "E:\\darknet\\darknet-master\\build\\darknet\\x64\\yolov3-obj_2000.weights", 0)
#meta = darknet.load_meta("E:\\darknet\\darknet-master\\build\\darknet\\x64\\obj.data")
net, meta, class_colors = darknet.load_network(
"E:\\darknet\\darknet-master\\build\\darknet\\x64\\cfg\\yolov3-obj.cfg",
"E:\\darknet\\darknet-master\\build\\darknet\\x64\\obj.data",
"E:\\darknet\\darknet-master\\build\\darknet\\x64\\yolov3-obj_2000.weights",
batch_size=1
)
vid = cv2.VideoCapture('E:\\darknet\\darknet-master\\build\\darknet\\x64\\test5.mp4')
#fourcc = cv2.VideoWriter_fourcc('M','P','4','2') #opencv3.0
#videoWriter = cv2.VideoWriter('../video/output2.avi', fourcc, 25, (1920,1080))
#%%
width = 960#darknet.network_width(net)
height = 544#darknet.network_height(net)
darknet_image = darknet.make_image(width, height, 3)
while True:
return_value,arr=vid.read()
#print(arr.shape)
if not return_value:
break
frame_rgb = cv2.cvtColor(arr, cv2.COLOR_BGR2RGB)
frame_resized = cv2.resize(frame_rgb, (width, height),
interpolation=cv2.INTER_LINEAR)
darknet.copy_image_from_bytes(darknet_image, frame_resized.tobytes())
detections= darknet.detect_image(net, meta, darknet_image)#detections=boxes
image = darknet.draw_boxes(detections, frame_resized, class_colors)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow('Inference', image)
key=cv2.waitKey(1)
if(key==27): break
cv2.destroyAllWindows()
注意这里import了darknet,所以要在前两行添加darknet.py的路径。
第五步:查看结果。