windows平台darknet检测视频中的目标python接口的处理

首先说一下俺搭建的环境是什么样子的: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的路径。

第五步:查看结果。

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值