YOLOv3使用Python接口进行视频目标检测

YOLOv3使用Python接口进行视频目标检测

正因为YOLOv3检测速度快,进行对以前目标检测的速度上的优化;和上一篇博客类似,这次主要是对本地视频的加载–输入模型—结果帧中间输出—检测结果最后视频保存
目前对视频的检测的思路还是先对视频进行抽帧处理,将检测完的结果进行保存,最后通过照片合成视频(有序地)

对于darknet中.c、.h文件的修改,修改makefile再进行make clean,make的操作不再叙述。
在视频合成的时候,使用了ImagesToVideo子模块(在最开始import)


import matplotlib.image as mping
from ImagesToVideo import frameToVideo  as  f2v

这是因为在合成avi文件时候,刚开始没注意照片的尺寸:待检测照片大小[1280,720],经过opencv读取、检测输出保存的png只有[640,360],刚一开始我没太注意这里,一直在查找文件路径名、视频编码cv2.VideoWriter_fourcc的问题,还有就是python版的opencv只能合成avi格式而最开始我用的是windows下的mp4格式,最后发现是视频尺寸和源照片尺寸不一致,一个小时就那么浪费了。。。。

first_pic = mping.imread(video_temp_result+'/' + "3.png")#图片转为视频时候,注意照片的尺寸大小
size = tuple(first_pic.shape)
picvideo(video_temp_result, (size[1], size[0]))#照片合成视频

视频检测的main函数:
(读取原视频-抽帧–检测—存取检测结果png------合成avi视频文件)

    net = load_net("/home/******/******/darknet/cfg/yolov3-voc.cfg","/home/******/******/darknet/backup/yolov3-voc_final.weights", 0)
    meta = load_meta("/home/******/******/darknet/cfg/voc.data")
    out_img = "/home/******/******/darknet/test_result.jpg"
    video_tmp = "/home/******/******/darknet/data/video_tmp.jpg"
    origin_video = '/home/******/******/darknet/video/41.mp4'
    video_temp_result='/home/******/******/darknet/video_temp_result'
    video_out = r"/home/******/******/darknet/video_out" + '/' + str(int(time.time())) +".avi"  # 导出路径

    cap = cv2.VideoCapture(origin_video)
    scaling_factor = 0.5
    count = 0
    det_num = 0
    while (cap.isOpened()):
        ret, frame = cap.read()
        if ret == True:
            count = count + 1
        else:
            break
        if count == 1:# 视频抽帧成图片时候fps  count
            count = 0
            frame = cv2.resize(frame, None, fx=scaling_factor, fy=scaling_factor, interpolation=cv2.INTER_AREA)
            img_arr = Image.fromarray(frame)
            img_goal = img_arr.save(video_tmp)
            r = detect(net, meta, video_tmp)
            print r  #存取检测结果  list类型
            # display the rectangle of the objects in window
            det_num = det_num + 1#检测照片计数
            showPicResult(video_tmp,video_temp_result,det_num)#ubuntu系统显示opencv
        else:
            continue
        # wait 1ms per iteration; press Esc to jump out the loop
        c = cv2.waitKey(1)
        if (c == 27) or (0xFF == ord('q')):
            break

    print '共检测照片个数:',det_num
    cap.release()

完成测试

在这里插入图片描述在这里插入图片描述

由于YOLOv3速度在大型机器上(本人是1080)能到达40fps左右,可以实现真正的实时,所有将输入改为实时摄像头视频流的输入,能够很好的检测出结果并进行存储,使得目标检测在实际应用中的速度大大得到了提高,只是通过加载本地视频进行测试,由于针对无人机角度,无法在此设备上直接测试摄像头视频流的检测,与官方给出的速度基本一致,接下来就该研究对ubuntu 1080机器上代码在TX2等跨平台移植了,才能使其应用到实际项目中(速度会因为nvidia硬件,检测速度会下降很多,但相比SSD,还是有着将近一倍的提升,10fps左右)

程序狗的人生就是由一个个项目最后期限dll组成,且活且珍惜

猜你喜欢

转载自blog.csdn.net/NcepuKZH/article/details/89242151