AIlib2/utilsK/modelEval.py

111 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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) #将异常通过管道送出