ffmpeg拉流硬解碼yolov5 bytetrack 人流追蹤統(tǒng)計 硬件編碼推流直播
編程語言C++,所以環(huán)境搭建可能比較復(fù)雜,需要有耐心。
我的機(jī)器配置
CPU:I5 12490F
GPU:RTX2060 6GB
RAM:16x2 GB雙通道
我測試運(yùn)行可以25路(很極限了),20路比較穩(wěn),不會爆顯存。
多路編碼推流有個問題,就是NVIDIA對消費(fèi)級顯卡編碼有限制一般是3路吧,但是這個可以破解的,很簡單。照著readme做就好了。
https://github.com/keylase/nvidia-patch
效果
榨干顯卡
如果不推流的話3080TI可以跑60路。
環(huán)境變量大家參考一下
PS:cuda\bin 是cudnn的目錄。
重要的事情說三遍
感謝杜老
感謝杜老
感謝杜老
一:整體架構(gòu):
(1) ffmpeg拉流RTSP,RTMP,硬解碼,如果有nvidia顯卡會根據(jù)流的編碼格式選擇對應(yīng)的硬件解碼器。
(2)推理框架使用的TensorRT8,所以第一次使用的時候,程序會building 模型,因?yàn)門ensorRT的模型是一卡一模型的。
(3)ffmpeg推流,拿到推理和追蹤之后的結(jié)果,opencv畫框,然后丟給ffmpeg來找對應(yīng)的編碼器編碼推流出去。
(4)Nginx服務(wù)器配置和flv.js插件。
二:所需的環(huán)境及對應(yīng)庫的版本
(1)系統(tǒng)Windows 11,顯卡RTX 2060 6GB顯存,驅(qū)動版本 471.11 cuda版本 11.4 ,VS2022(這里其實(shí)建議安裝19,22的話nvidia的tenosrrt不支持22,所以到時候需要改一下nvidia對vs的版本判斷,都是小問題)。PS:(先裝vs再裝cuda)
(2)
OpenCV 4.6.0(這個其實(shí)問題不大)
TensorRT 8.2.4 (這個很重要 自己看著來吧)
Protobuf 3.11.4 (嚴(yán)格一致)
eigen 3.4.0 (盡量一樣)
ffmpeg 4.4 (最好保持一致。不要用5.0以上的API已經(jīng)變了)
PS:其實(shí)Protobuf ,如果你裝有Python的TensorFlow會自帶Protobuf 的庫,這個時候避免沖突你可以把Protobuf 3.11.4的庫在環(huán)境變量里面提前一點(diǎn)
四:Nginx
代碼目錄壓縮包解壓運(yùn)行即可。
推拉流的地址,但是這個地址不能用瀏覽器直接播放,可以用VLC media player,PotPlayer(這個更強(qiáng)大) 等軟件驗(yàn)證框架是否搭建成功。
rtmp://你本機(jī)的IP:1936/live/home
這里說一下為什么用1936 本來rtmp默認(rèn)是1935但是拉流也是rtmp使用1935,為避免端口堵塞,改用1936。
如果手頭沒有攝像頭流的話 安卓手機(jī)可以下載一個APP IP攝像頭可以來充當(dāng)攝像頭流測試
五:yolov5 6.0模型導(dǎo)出修改
line 55 forward function in yolov5/models/yolo.py
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
modified into:
bs, _, ny, nx = x[i].shape # x(bs,255,20,20) to x(bs,3,20,20,85)
bs = -1
ny = int(ny)
nx = int(nx)
x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous()
line 70 in yolov5/models/yolo.py
z.append(y.view(bs, -1, self.no))
modified into:
z.append(y.view(bs, self.na * ny * nx, self.no))
############# for yolov5-6.0 #####################
line 65 in yolov5/models/yolo.py
if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
modified into:
if self.grid[i].shape[2:4] != x[i].shape[2:4] or self.onnx_dynamic:
self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i)
disconnect for pytorch trace
anchor_grid = (self.anchors[i].clone() * self.stride[i]).view(1, -1, 1, 1, 2)
line 70 in yolov5/models/yolo.py
y[…, 2:4] = (y[…, 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
modified into:
y[…, 2:4] = (y[…, 2:4] * 2) ** 2 * anchor_grid # wh
line 73 in yolov5/models/yolo.py
wh = (y[…, 2:4] * 2) ** 2 * self.anchor_grid[i] # wh
modified into:
wh = (y[…, 2:4] * 2) ** 2 * anchor_grid # wh
############# for yolov5-6.0 #####################
line 52 in yolov5/export.py
torch.onnx.export(dynamic_axes={‘images’: {0: ‘batch’, 2: ‘height’, 3: ‘width’}, # shape(1,3,640,640)
‘output’: {0: ‘batch’, 1: ‘a(chǎn)nchors’} # shape(1,25200,85) 修改為
modified into:
torch.onnx.export(dynamic_axes={‘images’: {0: ‘batch’}, # shape(1,3,640,640)
‘output’: {0: ‘batch’} # shape(1,25200,85)文章來源:http://www.zghlxwxcb.cn/news/detail-630361.html
瀏覽器直接播放的插件:
https://github.com/bilibili/flv.js文章來源地址http://www.zghlxwxcb.cn/news/detail-630361.html
到了這里,關(guān)于ffmpeg tensorrt c++多拉流硬解碼yolov5 yolov7 bytetrack 人流追蹤統(tǒng)計 硬件編碼推流直播的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!