|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- import sys
- sys.path.extend(['/home/thsw2/WJ/src/yolov5'])
- import utils,json,time,torch
- import numpy as np
- from segutils.segmodel import SegModel,get_largest_contours
- from models.experimental import attempt_load
- from utils.torch_utils import select_device, load_classifier, time_synchronized
- import subprocess as sp
- import cv2
- from utils.datasets import LoadStreams, LoadImages
- from queRiver import get_labelnames,get_label_arrays,post_process_,save_problem_images,time_str
- def get_total_cnt(inSource):
- cap=cv2.VideoCapture(inSource)
- cnt=cap.get(7)
- cap.release()
- return cnt
- def onlineModelProcess(parIn ):
- streamName = parIn['streamName']
- childCallback=parIn['callback']
- try:
-
- inSource,outSource=parIn['inSource'],parIn['outSource']
- weights='../yolov5/weights/1230_last.pt'
- device = select_device('0')
- half = device.type != 'cpu' # half precision only supported on CUDA
- model = attempt_load(weights, map_location=device) # load FP32 model
- if half: model.half()
- seg_nclass = 2
- weights = '../yolov5/weights/segmentation/BiSeNet/checkpoint.pth'
- segmodel = SegModel(nclass=seg_nclass,weights=weights,device=device)
- jsonfile='../yolov5/config/queRiver.json'
- with open(jsonfile,'r') as fp:
- parAll = json.load(fp)
-
-
- resource=parAll['prep_process']['source']
- if outSource:
- command=['ffmpeg','-y','-f', 'rawvideo','-vcodec','rawvideo','-pix_fmt', 'bgr24',
- '-s', "{}x{}".format(parAll["push_process"]['OutVideoW'],parAll["push_process"]['OutVideoH']),# 图片分辨率
- '-r', str(30),# 视频帧率
- '-i', '-','-c:v', 'libx264','-pix_fmt', 'yuv420p',
- '-f', 'flv',outSource
- ]
- txtname='mintors/%s.txt'%( time.strftime("%Y-%m-%d", time.localtime()) )
- fp_out = open( txtname,'a+' )
- outstr='%s stream:%s starts \n'%( time_str(),parAll['push_process']['rtmpUrl'])
- fp_out.write(outstr);fp_out.flush()
-
-
-
-
- # 管道配置,其中用到管道
- if outSource:
- ppipe = sp.Popen(command, stdin=sp.PIPE)
-
- ##后处理参数
- par=parAll['post_process']
- conf_thres,iou_thres,classes=par['conf_thres'],par['iou_thres'],par['classes']
- labelnames=par['labelnames']
- rainbows=par['rainbows']
- fpsample = par['fpsample']
- names=get_labelnames(labelnames)
- label_arraylist = get_label_arrays(names,rainbows,outfontsize=40)
-
- dataset = LoadStreams(inSource, img_size=640, stride=32)
- if (inSource.endswith('.MP4')) or (inSource.endswith('.mp4')):
- totalcnt=get_total_cnt(inSource)
- childCallback.send('####model load success####')
- iframe = 0;post_results=[];time_beg=time.time()
- print('###line71 modelEval.py',totalcnt,len(dataset), inSource)
- for path, img, im0s, vid_cap in dataset:
- print(path)
- if not path:childCallback.send('####strem ends####'); break###断流或者到终点
- if not outSource:###如果不推流,则显示进度条
- view_bar(iframe,totalcnt,time_beg )
- time0=time.time()
- iframe +=1
- time1=time.time()
- img = torch.from_numpy(img).to(device)
- img = img.half() if half else img.float() # uint8 to fp16/32
- img /= 255.0 # 0 - 255 to 0.0 - 1.0
- time2 = time.time()
- pred = model(img,augment=False)[0]
- time3 = time.time()
- seg_pred,segstr = segmodel.eval(im0s[0] )
-
- time4 = time.time()
- datas = [path, img, im0s, vid_cap,pred,seg_pred,iframe]
-
- p_result,timeOut = post_process_(datas,conf_thres, iou_thres,names,label_arraylist,rainbows,iframe)
- ##每隔 fpsample帧处理一次,如果有问题就保存图片
- if (iframe % fpsample == 0) and (len(post_results)>0) :
- parImage=save_problem_images(post_results,iframe,names,streamName=streamName)
-
- #parOut = {}; parOut['imgOR'] = img_send; parOut['imgAR'] = img_send; parOut['uid']=uid
- #parOut['imgORname']=os.path.basename(outnameOR);parOut['imgARname']=os.path.basename(outnameAR);
- #parOut['time_str'] = time_str;parOut['type'] = names[cls_max]
-
-
-
- post_results=[]
-
- if len(p_result[2] )>0: ##
- post_results.append(p_result)
-
- image_array = p_result[1]
- if outSource:
- ppipe.stdin.write(image_array.tostring())
- except Exception as e:
- childCallback.send(e) #将异常通过管道送出
|