421 lines
16 KiB
Python
421 lines
16 KiB
Python
|
|
import numpy as np
|
|||
|
|
import time,ast,copy
|
|||
|
|
from flask import request, Flask,jsonify
|
|||
|
|
import base64,cv2,os,sys,json
|
|||
|
|
sys.path.extend(['../yolov5'])
|
|||
|
|
#from Send_tranfer import b64encode_function,JsonSend,name_dic,nameID_dic,getLogFileFp
|
|||
|
|
from segutils.segmodel import SegModel,get_largest_contours
|
|||
|
|
from models.experimental import attempt_load
|
|||
|
|
from utils.datasets import LoadStreams, LoadImages
|
|||
|
|
from utils.torch_utils import select_device, load_classifier, time_synchronized
|
|||
|
|
from queRiver import get_labelnames,get_label_arrays,post_process_,save_problem_images,time_str
|
|||
|
|
import subprocess as sp
|
|||
|
|
import matplotlib.pyplot as plt
|
|||
|
|
import torch,random,string
|
|||
|
|
import multiprocessing
|
|||
|
|
from multiprocessing import Process,Queue
|
|||
|
|
import traceback
|
|||
|
|
from kafka import KafkaProducer, KafkaConsumer,TopicPartition
|
|||
|
|
from kafka.errors import kafka_errors
|
|||
|
|
|
|||
|
|
#torch.multiprocessing.set_start_method('spawn')
|
|||
|
|
import utilsK
|
|||
|
|
from utilsK.GPUtils import *
|
|||
|
|
from utilsK.masterUtils import *
|
|||
|
|
from utilsK.sendUtils import create_status_msg,update_json
|
|||
|
|
|
|||
|
|
#from utilsK.modelEval import onlineModelProcess
|
|||
|
|
import random,string
|
|||
|
|
from Send_tranfer_oss import msg_dict_on,msg_dict_off
|
|||
|
|
|
|||
|
|
process_id=0
|
|||
|
|
|
|||
|
|
def onlineModelProcess(parIn ):
|
|||
|
|
DEBUG=False
|
|||
|
|
streamName = parIn['streamName']
|
|||
|
|
childCallback=parIn['callback']
|
|||
|
|
#try:
|
|||
|
|
for wan in ['test']:
|
|||
|
|
jsonfile=parIn['modelJson']
|
|||
|
|
with open(jsonfile,'r') as fp:
|
|||
|
|
parAll = json.load(fp)
|
|||
|
|
|
|||
|
|
Detweights=parAll['gpu_process']['det_weights']
|
|||
|
|
seg_nclass = parAll['gpu_process']['seg_nclass']
|
|||
|
|
Segweights = parAll['gpu_process']['seg_weights']
|
|||
|
|
videoSave = parAll['AI_video_save']
|
|||
|
|
imageTxtFile = parAll['imageTxtFile']
|
|||
|
|
|
|||
|
|
|
|||
|
|
inSource,outSource=parIn['inSource'],parIn['outSource']
|
|||
|
|
|
|||
|
|
kafka_par=parIn['kafka_par']
|
|||
|
|
producer = KafkaProducer(bootstrap_servers=kafka_par['server'],value_serializer=lambda v: v.encode('utf-8'),metadata_max_age_ms=120000)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
device = select_device(parIn['device'])
|
|||
|
|
half = device.type != 'cpu' # half precision only supported on CUDA
|
|||
|
|
model = attempt_load(Detweights, map_location=device) # load FP32 model
|
|||
|
|
if half: model.half()
|
|||
|
|
|
|||
|
|
#print('###line116:,',len(dataset),dataset)
|
|||
|
|
if (inSource.endswith('.MP4')) or (inSource.endswith('.mp4')):
|
|||
|
|
fps,outW,outH,totalcnt=get_fps_rtmp(inSource,video=True)[0:4]
|
|||
|
|
else:
|
|||
|
|
fps,outW,outH,totalcnt=get_fps_rtmp(inSource,video=False)[0:4]
|
|||
|
|
fps = int(fps+0.5)
|
|||
|
|
|
|||
|
|
|
|||
|
|
segmodel = SegModel(nclass=seg_nclass,weights=Segweights,device=device)
|
|||
|
|
|
|||
|
|
if outSource != 'NO':
|
|||
|
|
command=['ffmpeg','-y','-f', 'rawvideo','-vcodec','rawvideo','-pix_fmt', 'bgr24',
|
|||
|
|
'-s', "{}x{}".format(outW,outH),# 图片分辨率
|
|||
|
|
'-r', str(fps),# 视频帧率
|
|||
|
|
'-i', '-','-c:v', 'libx264','-pix_fmt', 'yuv420p',
|
|||
|
|
'-f', 'flv',outSource
|
|||
|
|
]
|
|||
|
|
video_flag = videoSave['onLine']
|
|||
|
|
logdir = parAll['logChildProcessOnline']
|
|||
|
|
#print('*'*20,'###line82',command)
|
|||
|
|
else:
|
|||
|
|
video_flag = videoSave['offLine'] ;logdir = parAll['logChildProcessOffline']
|
|||
|
|
|
|||
|
|
fp_log=create_logFile(logdir=logdir)
|
|||
|
|
# 管道配置,其中用到管道
|
|||
|
|
if outSource !='NO' :
|
|||
|
|
ppipe = sp.Popen(command, stdin=sp.PIPE)
|
|||
|
|
|
|||
|
|
|
|||
|
|
##后处理参数
|
|||
|
|
par=parAll['post_process']
|
|||
|
|
conf_thres,iou_thres,classes=par['conf_thres'],par['iou_thres'],par['classes']
|
|||
|
|
outImaDir = par['outImaDir']
|
|||
|
|
outVideoDir = par['outVideoDir']
|
|||
|
|
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)
|
|||
|
|
|
|||
|
|
|
|||
|
|
childCallback.send('####model load success####')
|
|||
|
|
if (outVideoDir!='NO') and video_flag:
|
|||
|
|
msg_id = streamName.split('-')[2]
|
|||
|
|
save_path = os.path.join(outVideoDir,msg_id+'.MP4')
|
|||
|
|
vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*'mp4v'), fps, (outW,outH))
|
|||
|
|
|
|||
|
|
iframe = 0;post_results=[];time_beg=time.time()
|
|||
|
|
|
|||
|
|
t00=time.time()
|
|||
|
|
time_kafka0=time.time()
|
|||
|
|
for path, img, im0s, vid_cap in dataset:
|
|||
|
|
|
|||
|
|
t0= time_synchronized()
|
|||
|
|
if not path:
|
|||
|
|
EndUrl='%s/%s_frame-9999-9999_type-结束_9999999999999999_s-%s_AI.jpg'%(outImaDir,time_str(),streamName)
|
|||
|
|
EndUrl = EndUrl.replace(' ','-').replace(':','-')
|
|||
|
|
img_end=np.zeros((100,100),dtype=np.uint8);cv2.imwrite(EndUrl,img_end)
|
|||
|
|
if imageTxtFile:
|
|||
|
|
EndUrl_txt = EndUrl.replace('.jpg','.txt')
|
|||
|
|
fp_t=open(EndUrl_txt,'w');fp_t.write(EndUrl+'\n');fp_t.close()
|
|||
|
|
|
|||
|
|
EndUrl='%s/%s_frame-9999-9999_type-结束_9999999999999999_s-%s_OR.jpg'%(outImaDir,time_str(),streamName)
|
|||
|
|
EndUrl = EndUrl.replace(' ','-').replace(':','-')
|
|||
|
|
ret = cv2.imwrite(EndUrl,img_end)
|
|||
|
|
if imageTxtFile:
|
|||
|
|
EndUrl_txt = EndUrl.replace('.jpg','.txt')
|
|||
|
|
fp_t=open(EndUrl_txt,'w');fp_t.write(EndUrl+'\n');fp_t.close()
|
|||
|
|
|
|||
|
|
#print(EndUrl,ret)
|
|||
|
|
childCallback.send('####strem ends####')
|
|||
|
|
if (outVideoDir!='NO') and video_flag:
|
|||
|
|
vid_writer.release()
|
|||
|
|
break###断流或者到终点
|
|||
|
|
|
|||
|
|
if outSource == 'NO':###如果不推流,则显示进度条
|
|||
|
|
view_bar(iframe,totalcnt,time_beg ,parIn['process_uid'] )
|
|||
|
|
|
|||
|
|
###直播和离线都是1分钟发一次消息。直播发
|
|||
|
|
time_kafka1 = time.time()
|
|||
|
|
if time_kafka1 - time_kafka0 >60:
|
|||
|
|
time_kafka0 = time_kafka1
|
|||
|
|
###发送状态信息waiting
|
|||
|
|
msg = copy.deepcopy(msg_dict_off);taskId,msgId = streamName.split('-')[1:3]
|
|||
|
|
msg['msg_id']= msgId; msg
|
|||
|
|
if outSource == 'NO':
|
|||
|
|
msg['progressbar']= '%.4f'%(iframe*1.0/totalcnt)
|
|||
|
|
msg['type']=1
|
|||
|
|
else:
|
|||
|
|
msg['progressbarOn']= str(iframe)
|
|||
|
|
msg['type']=2
|
|||
|
|
|
|||
|
|
msg = json.dumps(msg, ensure_ascii=False)
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
record_metadata = producer.send(kafka_par['topic'], msg).get()
|
|||
|
|
outstr='%s processing send progressbar or heartBeat to kafka: taskId:%s msgId:%s send:%s'%('-'*20,taskId, msgId,msg);
|
|||
|
|
wrtiteLog(fp_log,outstr);print( outstr);
|
|||
|
|
except Exception as e:
|
|||
|
|
outstr='#######kafka ERROR when processing sending progressbar or heartBeat:, error: %s'%(str(e))
|
|||
|
|
wrtiteLog(fp_log,outstr);print( outstr);
|
|||
|
|
try:
|
|||
|
|
producer = KafkaProducer(bootstrap_servers=par['server'], value_serializer=lambda v: v.encode('utf-8')).get()
|
|||
|
|
future = producer.send(par['topic'][2], msg).get()
|
|||
|
|
except Exception as e:
|
|||
|
|
outstr='%s re-send progressbar or heartBeat kafka,processing video or stream: taskId:%s msgId:%s send:%s'%('-'*20,taskId, msgId,msg);
|
|||
|
|
wrtiteLog(fp_log,outstr);print( outstr);
|
|||
|
|
|
|||
|
|
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
timeseg0 = time.time()
|
|||
|
|
seg_pred,segstr = segmodel.eval(im0s[0] )
|
|||
|
|
timeseg1 = time.time()
|
|||
|
|
|
|||
|
|
t1= time_synchronized()
|
|||
|
|
pred = model(img,augment=False)[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)
|
|||
|
|
t2= time_synchronized()
|
|||
|
|
|
|||
|
|
#print('###line138:',timeOut,outSource,outVideoDir)
|
|||
|
|
##每隔 fpsample帧处理一次,如果有问题就保存图片
|
|||
|
|
if (iframe % fpsample == 0) and (len(post_results)>0) :
|
|||
|
|
parImage=save_problem_images(post_results,iframe,names,streamName=streamName,outImaDir='problems/images_tmp',imageTxtFile=imageTxtFile)
|
|||
|
|
post_results=[]
|
|||
|
|
|
|||
|
|
if len(p_result[2] )>0: ##
|
|||
|
|
post_results.append(p_result)
|
|||
|
|
t3= time_synchronized()
|
|||
|
|
image_array = p_result[1]
|
|||
|
|
if outSource!='NO':
|
|||
|
|
ppipe.stdin.write(image_array.tobytes())
|
|||
|
|
|
|||
|
|
if (outVideoDir!='NO') and video_flag:
|
|||
|
|
ret = vid_writer.write(image_array)
|
|||
|
|
t4= time_synchronized()
|
|||
|
|
|
|||
|
|
timestr2 = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
|
|||
|
|
if iframe%100==0:
|
|||
|
|
outstr='%s,,read:%.1f ms,copy:%.1f, infer:%.1f ms, detinfer:%.1f ms,draw:%.1f ms, save:%.1f ms total:%.1f ms \n'%(timestr2,(t0 - t00)*1000,(timeseg0-t0)*1000, (t1 - timeseg0)*1000,(t2-t1)*1000, (t3 - t2)*1000,(t4-t3)*1000, (t4-t00)*1000)
|
|||
|
|
wrtiteLog(fp_log,outstr);
|
|||
|
|
#print(outstr)
|
|||
|
|
t00 = t4;
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
##模型加载之类的错误
|
|||
|
|
#except Exception as e:
|
|||
|
|
|
|||
|
|
# print(time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime()) ,'*'*20,'###line177 ERROR:',e)
|
|||
|
|
# childCallback.send(e) #将异常通过管道送出
|
|||
|
|
|
|||
|
|
|
|||
|
|
def lauch_process(gpuid,inSource,outSource,taskId,msgId,modelJson,kafka_par):
|
|||
|
|
|
|||
|
|
if outSource=='NO':
|
|||
|
|
streamName='off-%s-%s'%(taskId,msgId)
|
|||
|
|
else:
|
|||
|
|
streamName='live-%s-%s'%(taskId,msgId)
|
|||
|
|
dataPar ={
|
|||
|
|
'imgData':'',
|
|||
|
|
'imgName':'testW',
|
|||
|
|
'streamName':streamName,
|
|||
|
|
'taskId':taskId,
|
|||
|
|
'msgId':msgId,
|
|||
|
|
'device':str(gpuid),
|
|||
|
|
'modelJson':modelJson,
|
|||
|
|
'kafka_par':kafka_par,
|
|||
|
|
}
|
|||
|
|
#dataPar['inSource'] = 'http://images.5gai.taauav.com/video/8bc32984dd893930dabb2856eb92b4d1.mp4';dataPar['outSource'] = None
|
|||
|
|
dataPar['inSource'] = inSource;dataPar['outSource'] = outSource
|
|||
|
|
process_uid=''.join(random.sample(string.ascii_letters + string.digits, 16));dataPar['process_uid']=process_uid
|
|||
|
|
parent_conn, child_conn = multiprocessing.Pipe();dataPar['callback']=child_conn
|
|||
|
|
gpuProcess=Process(target=onlineModelProcess,name='process:%s'%( process_uid ),args=(dataPar,))
|
|||
|
|
gpuProcess.start()
|
|||
|
|
#print(dir(gpuProcess))
|
|||
|
|
child_return = parent_conn.recv()
|
|||
|
|
timestr2=time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime())
|
|||
|
|
print(timestr2,'-'*20,'progress:%s ,msgId:%s , taskId:%s return:'%(process_uid,msgId,taskId),child_return)
|
|||
|
|
|
|||
|
|
return gpuProcess
|
|||
|
|
|
|||
|
|
|
|||
|
|
msg_dict_offline = {
|
|||
|
|
|
|||
|
|
"biz_id":"hehuzhang",
|
|||
|
|
"mod_id":"ai",
|
|||
|
|
"msg_id":'bb'+''.join(random.sample(string.ascii_letters ,30) ) ,
|
|||
|
|
"offering_id":"http://vod.play.t-aaron.com/customerTrans/c49a2c620795d124f2ae4b10197b8d0e/303b7a58-17f3ef4494e-0004-f90c-f2c-7ec68.mp4",
|
|||
|
|
"offering_type":"mp4",
|
|||
|
|
"results_base_dir": "XJRW202203171535"+str(random.randint(10,99)),
|
|||
|
|
|
|||
|
|
'outSource':'NO'
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
def detector_0(par):
|
|||
|
|
####初始化信息列表
|
|||
|
|
consumer = KafkaConsumer(
|
|||
|
|
bootstrap_servers=par['server'],
|
|||
|
|
group_id=par['group_id'],
|
|||
|
|
auto_offset_reset='earliest',
|
|||
|
|
#max_poll_interval_ms = 1000*60*6,
|
|||
|
|
|
|||
|
|
#session_timeout_ms=1000*60*5,
|
|||
|
|
request_timeout_ms=15000,
|
|||
|
|
#enable_auto_commit=True
|
|||
|
|
)
|
|||
|
|
consumer.subscribe( par['topic'][0:2])
|
|||
|
|
kafka_par ={ 'server':par['server'],'topic':par['topic'][2] }
|
|||
|
|
producer = KafkaProducer(
|
|||
|
|
bootstrap_servers=par['server'],#tencent yun
|
|||
|
|
value_serializer=lambda v: v.encode('utf-8'),
|
|||
|
|
metadata_max_age_ms=120000)
|
|||
|
|
|
|||
|
|
taskStatus={}
|
|||
|
|
taskStatus['onLine'] = Queue(100)
|
|||
|
|
taskStatus['offLine']= Queue(100)
|
|||
|
|
taskStatus['pidInfos']= {}
|
|||
|
|
|
|||
|
|
fp_log=create_logFile(logdir=par['logDir'])
|
|||
|
|
wrtiteLog(fp_log,'###########masster starts in line222######\n')
|
|||
|
|
|
|||
|
|
timeSleep=1
|
|||
|
|
|
|||
|
|
#taskStatus['pidInfos'][31897]={'gpuProcess':'onlineProcess','type':'onLine'}
|
|||
|
|
|
|||
|
|
|
|||
|
|
time0=time.time()
|
|||
|
|
time0_kafQuery=time.time()
|
|||
|
|
time0_taskQuery=time.time()
|
|||
|
|
time0_sleep=time.time()
|
|||
|
|
time_interval=10; outStrList={}
|
|||
|
|
|
|||
|
|
isleep=0
|
|||
|
|
while True:###每隔timeSleep秒,轮询一次
|
|||
|
|
#for isleep in range(1):
|
|||
|
|
|
|||
|
|
##1-读取kafka,更新任务类别
|
|||
|
|
try:
|
|||
|
|
#msgs = getAllRecords(consumer,par['topic'])
|
|||
|
|
msgs=[]
|
|||
|
|
for ii,msg in enumerate(consumer):
|
|||
|
|
consumer.commit()
|
|||
|
|
msgs.append(msg)
|
|||
|
|
|
|||
|
|
except Exception as e:
|
|||
|
|
outstr='%s kafka connecting error:%s '%('#'*20,e)
|
|||
|
|
outstr=wrtiteLog(fp_log,outstr);print( outstr);
|
|||
|
|
time.sleep(timeSleep)
|
|||
|
|
continue
|
|||
|
|
#if get_whether_gpuProcess():
|
|||
|
|
|
|||
|
|
|
|||
|
|
for it in range(30):
|
|||
|
|
timestr=time.strftime("%Y-%m-%d %H:%M:%S ", time.localtime())
|
|||
|
|
print('%s i=%d sleep:%s '%(timestr,isleep,it*10))
|
|||
|
|
time.sleep(10)
|
|||
|
|
isleep+=1
|
|||
|
|
print('########Program End#####')
|
|||
|
|
|
|||
|
|
def detector(par):
|
|||
|
|
####初始化信息列表
|
|||
|
|
consumer = KafkaConsumer(
|
|||
|
|
bootstrap_servers=par['server'],
|
|||
|
|
group_id=par['group_id'],
|
|||
|
|
auto_offset_reset='earliest',
|
|||
|
|
#max_poll_interval_ms = 1000*60*6,
|
|||
|
|
|
|||
|
|
#session_timeout_ms=1000*60*5,
|
|||
|
|
#request_timeout_ms=11000,
|
|||
|
|
#enable_auto_commit=True
|
|||
|
|
)
|
|||
|
|
consumer.subscribe( par['topic'][0:2])
|
|||
|
|
kafka_par ={ 'server':par['server'],'topic':par['topic'][2] }
|
|||
|
|
producer = KafkaProducer(
|
|||
|
|
bootstrap_servers=par['server'],#tencent yun
|
|||
|
|
value_serializer=lambda v: v.encode('utf-8'),
|
|||
|
|
metadata_max_age_ms=120000)
|
|||
|
|
|
|||
|
|
taskStatus={}
|
|||
|
|
taskStatus['onLine'] = Queue(100)
|
|||
|
|
taskStatus['offLine']= Queue(100)
|
|||
|
|
taskStatus['pidInfos']= {}
|
|||
|
|
|
|||
|
|
|
|||
|
|
timeSleep=1
|
|||
|
|
|
|||
|
|
#taskStatus['pidInfos'][31897]={'gpuProcess':'onlineProcess','type':'onLine'}
|
|||
|
|
|
|||
|
|
|
|||
|
|
time0=time.time()
|
|||
|
|
time0_kafQuery=time.time()
|
|||
|
|
time0_taskQuery=time.time()
|
|||
|
|
time0_sleep=time.time()
|
|||
|
|
time_interval=10; outStrList={}
|
|||
|
|
|
|||
|
|
isleep=0
|
|||
|
|
|
|||
|
|
for ii,msg in enumerate(consumer):
|
|||
|
|
try:
|
|||
|
|
taskInfos = eval(msg.value.decode('utf-8') )
|
|||
|
|
except:
|
|||
|
|
outstr='%s msg format error,value:%s,offset:%d partition:%s topic:%s'%('#'*20,msg.value,msg.offset,msg.topic,msg.topic)
|
|||
|
|
continue
|
|||
|
|
outstr='%s value:%s,offset:%d partition:%s topic:%s'%('#'*20,msg.value,msg.offset,msg.partition,msg.topic)
|
|||
|
|
print(outstr)
|
|||
|
|
def get_file():
|
|||
|
|
print("文件名 :",__file__,sys._getframe().f_lineno)
|
|||
|
|
print("函数名: ", sys._getframe().f_code.co_name)
|
|||
|
|
print("模块名: ", sys._getframe().f_back.f_code.co_name)
|
|||
|
|
|
|||
|
|
|
|||
|
|
if __name__ == '__main__':
|
|||
|
|
par={};
|
|||
|
|
###topic0--在线,topic1--离线
|
|||
|
|
|
|||
|
|
#par['server']='212.129.223.66:9092';par['topic']=('thsw','thsw2','testReturn');par['group_id']='test';
|
|||
|
|
#101.132.127.1:19092
|
|||
|
|
|
|||
|
|
'''
|
|||
|
|
par['server']='101.132.127.1:19092 ';par['topic']=('alg-online-tasks','alg-offline-tasks','alg-task-results');par['group_id']='test';
|
|||
|
|
|
|||
|
|
par['kafka']='mintors/kafka'
|
|||
|
|
par['modelJson']='conf/model.json'
|
|||
|
|
'''
|
|||
|
|
masterFile="conf/master_ten.json"
|
|||
|
|
assert os.path.exists(masterFile)
|
|||
|
|
with open(masterFile,'r') as fp:
|
|||
|
|
data=json.load(fp)
|
|||
|
|
get_file()
|
|||
|
|
|
|||
|
|
|
|||
|
|
par=data['par']
|
|||
|
|
print(par)
|
|||
|
|
detector(par)
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|