本项目在YOLOv5算法上加以改进,通过独立线程处理拉流、推流、模型推理实现实时预览识别安全帽。在项目中需要用到视频播放,需要搭建一个流媒体服务器,做视频点播 直播包括视频服务器的负载,所以开始自己探索搭建视频流媒体服务器,用于存储和传输视频资源
整体流程思路:
海康威视rtsp直播流→OpenCV拉取流→YOLOv5推理识别安全帽→ffmpeg推流→EasyDarwin流媒体服务器→vlc实时播放
一、EasyDarwin下载安装
下载:EasyDarwin流媒体音视频资源汇总
我这里使用的是win版本的EasyDarwin流媒体服务器
双击start.bat

运行成功自动跳转:http://127.0.0.1:10086/#/login

用户名:admin
密码:admin
进入之后看一下自己的rtsp端口,可以在下图中修改

二、YOLOv5项目
具体YOLOv5项目数据集、训练模型已经在前边的文章介绍过了,文章链接地址
三、下载安装FFmpeg
1、进入官网Download FFmpeg
2、根据自己的电脑选择对应系统进行点击。我用到的是windows,选择下面出现的“Windows builds from gyan.dev”

3、下载完成压缩文件之后,解压文件。
4、将bin文件夹添加到Windows环境路径变量中,在搜索栏中搜索环境变量,然后单击环境变量。
5、找到自己的安装路径下的bin的路径进行新建

6、验证是否安装成功,打开命令提示符cmd窗口输入命令,如果你看到打印出 FFmpeg 版本,则表示 FFmpeg 安装成功。

四、项目实现
查看自己设备rtsp流地址,一般设备都有开发文档,我使用的是海康威视sadp,直接访问海康威视官网找设备开发文档。rtsp流地址:
rtsp://用户名:密码@ip:端口号/h264/ch1/main/av_stream
参数代码如下:
def parse_opt():
parser = argparse.ArgumentParser()
parser.add_argument('--weights', nargs='+', type=str, default='模型文件地址',
help='模型路径')
parser.add_argument('--source', type=str, default='rtsp流地址',
help='输入流地址')
# RTSP推流参数
parser.add_argument('--output-rtsp', type=str, default='rtsp://localhost:25544/output', help='RTSP输出地址')
parser.add_argument('--rtsp-fps', type=float, default=10, help='RTSP输出帧率(默认10FPS)')
parser.add_argument('--rtsp-codec', type=str, default='libx264', help='RTSP编码(如libx264)')
parser.add_argument('--rtsp-preset', type=str, default='ultrafast', help='编码速度预设')
# 推理参数
parser.add_argument('--imgsz', '--img', '--img-size', nargs='+', type=int, default=[640], help='推理分辨率')
parser.add_argument('--conf-thres', type=float, default=0.25, help='置信度阈值')
parser.add_argument('--iou-thres', type=float, default=0.45, help='NMS阈值')
parser.add_argument('--max-det', type=int, default=1000, help='单帧最大检测数')
parser.add_argument('--device', default='cpu', help='设备(0=GPU/cpu)')
# 结果保存
parser.add_argument('--view-img', action='store_true', default=False, help='显示预览(默认关闭)')
parser.add_argument('--save-txt', action='store_true', help='保存标签文件')
parser.add_argument('--save-conf', action='store_true', help='标签包含置信度')
parser.add_argument('--save-crop', action='store_true', help='保存裁剪检测框')
parser.add_argument('--nosave', action='store_true', help='不保存结果(默认保存H264)')
# 其他参数
parser.add_argument('--classes', nargs='+', type=int, help='过滤类别(如--classes 0)')
parser.add_argument('--agnostic-nms', action='store_true', help='类别无关NMS')
parser.add_argument('--augment', action='store_true', help='增强推理')
parser.add_argument('--visualize', action='store_true', help='可视化特征')
parser.add_argument('--update', action='store_true', help='更新模型')
parser.add_argument('--project', default='runs/detect', help='结果保存根目录')
parser.add_argument('--name', default='epoch_300_', help='结果子目录名')
parser.add_argument('--exist-ok', action='store_true', help='允许覆盖现有目录')
parser.add_argument('--line-thickness', default=3, type=int, help='框线厚度')
parser.add_argument('--hide-labels', default=False, action='store_true', help='隐藏标签')
parser.add_argument('--hide-conf', default=False, action='store_true', help='隐藏置信度')
parser.add_argument('--half', action='store_true', help='半精度推理')
parser.add_argument('--dnn', action='store_true', help='ONNX用DNN推理')
opt = parser.parse_args()
opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # 扩展分辨率(如[640]→[640,640])
print_args(FILE.stem, opt)
return opt
如有需要详细代码,关注私信博主白嫖
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...

