|
|
@@ -12,7 +12,7 @@ from stdc import stdcModel |
|
|
|
from segutils.trafficUtils import tracfficAccidentMixFunction
|
|
|
|
from models.experimental import attempt_load
|
|
|
|
from utils.torch_utils import select_device
|
|
|
|
from utilsK.queRiver import get_labelnames,get_label_arrays,save_problem_images,riverDetSegMixProcess
|
|
|
|
from utilsK.queRiver import get_labelnames,get_label_arrays,save_problem_images,riverDetSegMixProcess,draw_painting_joint
|
|
|
|
from ocrUtils.ocrUtils import CTCLabelConverter,AlignCollate
|
|
|
|
from trackUtils.sort import Sort,track_draw_boxAndTrace,track_draw_trace_boxes,moving_average_wang,drawBoxTraceSimplied
|
|
|
|
from trackUtils.sort_obb import OBB_Sort,obbTohbb,track_draw_all_boxes,track_draw_trace
|
|
|
@@ -29,6 +29,14 @@ from utilsK.drownUtils import mixDrowing_water_postprocess |
|
|
|
#import warnings
|
|
|
|
#warnings.filterwarnings("error")
|
|
|
|
rainbows=[ [0,0,255],[0,255,0],[255,0,0],[255,0,255],[255,255,0],[255,129,0],[255,0,127],[127,255,0],[0,255,127],[0,127,255],[127,0,255],[255,127,255],[255,255,127],[127,255,255],[0,255,255],[255,127,255],[127,255,255], [0,127,0],[0,0,127],[0,255,255]]
|
|
|
|
def drawAllBox(preds,imgDraw,label_arraylist,rainbows,font):
|
|
|
|
for box in preds:
|
|
|
|
#cls,conf,xyxy = box[0],box[5], box[1:5]
|
|
|
|
#print('#'*20,'line47',box)
|
|
|
|
cls,conf,xyxy = box[5],box[4], box[0:4] ##2023.08.03,修改了格式
|
|
|
|
#print('#####line46 demo.py:', cls,conf,xyxy, len(label_arraylist),len(rainbows) )
|
|
|
|
imgDraw = draw_painting_joint(xyxy,imgDraw,label_arraylist[int(cls)],score=conf,color=rainbows[int(cls)%20],font=font,socre_location="leftBottom")
|
|
|
|
return imgDraw
|
|
|
|
def get_drawPar(par):
|
|
|
|
labelnames = par['labelnames']
|
|
|
|
names=get_labelnames(labelnames)
|
|
|
@@ -119,7 +127,7 @@ def process_video(video,par0,mode='detSeg'): |
|
|
|
time_patch0 = time.time()
|
|
|
|
#retResults,timeInfos = AI_det_track_batch(imgarray_list, iframe_list ,par0['modelPar'],par0['processPar'],par0['sort_tracker'] ,par0['trackPar'],segPar=par0['segPar'])
|
|
|
|
retResults,timeInfos = AI_det_track_batch_N(imgarray_list, iframe_list ,par0['modelList'],par0['postProcess'],par0['sort_tracker'],par0['trackPar'])
|
|
|
|
#print('###line111:',retResults[2])
|
|
|
|
print('###line111:',retResults[2])
|
|
|
|
###需要保存成一个二维list,每一个list是一帧检测结果。
|
|
|
|
###track_det_result 内容格式:x1, y1, x2, y2, conf, cls,iframe,trackId
|
|
|
|
time_patch2 = time.time()
|
|
|
@@ -435,7 +443,7 @@ def det_track_demo_N(business ): |
|
|
|
'txtFontSize':20,###文本字符的大小
|
|
|
|
'digitFont': { 'line_thickness':2,'boxLine_thickness':1, 'fontSize':1.0,'waterLineColor':(0,255,255),'segLineShow':True,'waterLineWidth':2},###显示框、线设置
|
|
|
|
#'testImgPath':'images/%s/'%(opt['business']),
|
|
|
|
'testImgPath':'/mnt/thsw2/DSP2/weights/cityMangement3/images/debug',
|
|
|
|
'testImgPath':'/mnt/thsw2/DSP2/videos/359a5043f.mp4',
|
|
|
|
'testOutPath':'images/results/',###输出测试图像位置
|
|
|
|
}
|
|
|
|
|
|
|
@@ -722,15 +730,16 @@ def det_track_demo_N(business ): |
|
|
|
time00 = time.time()
|
|
|
|
|
|
|
|
retResults,timeOut = AI_det_track_batch_N(im0s, [i] ,modelList,par['postProcess'],sort_tracker ,trackPar)
|
|
|
|
'''
|
|
|
|
返回值retResults[2] --list,其中每一个元素为一个list,表示每一帧的检测结果,每一个结果是由多个list构成,每个list表示一个框,格式为[ x0 ,y0 ,x1 ,y1 ,conf,cls ,ifrmae,trackId ]
|
|
|
|
--etc. retResults[2][j][k]表示第j帧的第k个框。
|
|
|
|
'''
|
|
|
|
time11 = time.time()
|
|
|
|
if len(retResults[1])>0:
|
|
|
|
retResults[0][0] = drawBoxTraceSimplied(retResults[1],i, retResults[0][0],rainbows=rainbows,boxFlag=True,traceFlag=False,names=drawPar['names'])
|
|
|
|
|
|
|
|
image_array = retResults[0][0]
|
|
|
|
'''
|
|
|
|
返回值retResults[2] --list,其中每一个元素为一个list,表示每一帧的检测结果,每一个结果是由多个list构成,每个list表示一个框,格式为[ x0 ,y0 ,x1 ,y1 ,conf,cls ,ifrmae,trackId ]
|
|
|
|
--etc. retResults[2][j][k]表示第j帧的第k个框。
|
|
|
|
'''
|
|
|
|
|
|
|
|
cv2.imwrite( os.path.join( par['testOutPath'],bname ) ,image_array )
|
|
|
|
print('----image:%s, Allprocess:%s %s ,save:%s , objcnt:%d'%(bname,(time11-time00) * 1000, timeOut,(time.time() - time11) * 1000 ,len(retResults[2])) )
|
|
|
|
##第五步开始测试视频
|
|
|
@@ -807,7 +816,87 @@ def OCR_demo2(opt): |
|
|
|
finished = time.time()
|
|
|
|
print('{0}: elapsed time: {1} prd:{2} '.format( os.path.basename( img_urls[i] ), finished - started, sim_pred ))
|
|
|
|
|
|
|
|
def crackMeasurement_demo(opt):
|
|
|
|
|
|
|
|
if opt['business'] == 'crackMeasurement':
|
|
|
|
from AI import AI_process_C
|
|
|
|
from utilsK.crackUtils import Crack_measure
|
|
|
|
print( '%s 只能测试图像,不能测试视频%s'%('#'*20,'#'*20))
|
|
|
|
par={
|
|
|
|
'device':'0', ###显卡号,如果用TRT模型,只支持0(单显卡)
|
|
|
|
'labelnames':"../AIlib2/weights/conf/%s/labelnames.json"%(opt['business']), ###检测类别对照表
|
|
|
|
'max_workers':1, ###并行线程数
|
|
|
|
'postProcess':{
|
|
|
|
'function':Crack_measure,
|
|
|
|
'pars':{'dsx':(123-30)*1000/35*0.004387636 }
|
|
|
|
},
|
|
|
|
'models':[
|
|
|
|
{
|
|
|
|
#'weight':"../weights/%s/AIlib2/%s/yolov5_%s_fp16.engine"%(opt['gpu'], opt['business'] ,opt['gpu'] ),###检测模型路径
|
|
|
|
'weight':'../AIlib2/weights/conf/%s/yolov5.pt'%(opt['business'] ),
|
|
|
|
'name':'yolov5',
|
|
|
|
'model':yolov5Model,
|
|
|
|
'par':{ 'half':True,'device':'cuda:0' ,'conf_thres':0.1,'iou_thres':0.45,'allowedList':[0,1,2,3],'segRegionCnt':1, 'trtFlag_det':False,'trtFlag_seg':False, "score_byClass":{"0":0.1,"1":0.1,"2":0.1 } }
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
#'weight':"../weights/%s/AIlib2/%s/stdc_360X640_%s_fp16.engine"%(opt['gpu'], opt['business'] ,opt['gpu'] ),###检测模型路径
|
|
|
|
'weight':'../AIlib2/weights/conf/%s/stdc_360X640.pth'%(opt['business'] ),
|
|
|
|
'par':{
|
|
|
|
#'modelSize':(640,360),
|
|
|
|
'modelSize':(1920,1080),
|
|
|
|
'dynamic':True,
|
|
|
|
'mean':(0.485, 0.456, 0.406),'std' :(0.229, 0.224, 0.225),'predResize':True,'numpy':False, 'RGB_convert_first':True,'seg_nclass':2},###分割模型预处理参数
|
|
|
|
'model':stdcModel,
|
|
|
|
'name':'stdc'
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
'detModelpara':[{"id":str(x),"config":{"k1":"v1","k2":"v2"}} for x in [0,1,2,3,5,6,7,8,9] ],###控制哪些检测类别显示、输出
|
|
|
|
'postFile': '../AIlib2/weights/conf/%s/para.json'%(opt['business'] ),###后处理参数文件
|
|
|
|
'txtFontSize':20,###文本字符的大小
|
|
|
|
'digitFont': { 'line_thickness':2,'boxLine_thickness':1, 'fontSize':1.0,'waterLineColor':(0,255,255),'segLineShow':True,'waterLineWidth':2},###显示框、线设置
|
|
|
|
'testImgPath':'images/%s/'%(opt['business']),
|
|
|
|
#'testImgPath':'/mnt/thsw2/DSP2/weights/cityMangement2_1102/images/debug',
|
|
|
|
'testOutPath':'images/results/',###输出测试图像位置
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#第一步加载模型
|
|
|
|
modelList=[ modelPar['model'](weights=modelPar['weight'],par=modelPar['par']) for modelPar in par['models'] ]
|
|
|
|
print(' load moder over')
|
|
|
|
|
|
|
|
#准备画图字体
|
|
|
|
labelnames = par['labelnames'] ##对应类别表
|
|
|
|
names=get_labelnames(labelnames)
|
|
|
|
label_arraylist = get_label_arrays(names,rainbows,outfontsize=par['txtFontSize'],fontpath="../AIlib2/conf/platech.ttf")
|
|
|
|
|
|
|
|
#图像测试
|
|
|
|
imgpaths,videopaths = get_images_videos( par['testImgPath'])
|
|
|
|
|
|
|
|
#开始测试
|
|
|
|
for imgUrl in imgpaths:
|
|
|
|
img = cv2.imread(imgUrl);bname = os.path.basename(imgUrl)
|
|
|
|
if opt['business'] == 'crackMeasurement':
|
|
|
|
ret,timeInfos = AI_process_C([img],modelList,par['postProcess'])
|
|
|
|
#返回类型ret-list,[[ x0,y0,x1,y1,score,class,裂缝长度,平均宽度,最大宽度,最小宽度],[...],[...]]
|
|
|
|
for re in ret:
|
|
|
|
print('Summarized Cracklength = %.1f mm Mean crack width = %.1f mm Max crack width = %.1f mm Min crack width = %.1f mm '%( re[6], re[7],re[8],re[9] ) )
|
|
|
|
|
|
|
|
timeInfos=bname+':'+timeInfos
|
|
|
|
print(timeInfos )
|
|
|
|
if len(ret)>0:
|
|
|
|
img0 = drawAllBox(ret,img,label_arraylist,rainbows,par['digitFont'])
|
|
|
|
else: img0= img
|
|
|
|
cv2.imwrite(os.path.join('images/results/',bname ) ,img0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@@ -950,8 +1039,8 @@ def crowd_demo(opt): |
|
|
|
if __name__=="__main__":
|
|
|
|
|
|
|
|
#jkm_demo()
|
|
|
|
businessAll=['river', 'river2','highWay2','noParking','drowning','forest2','vehicle','pedestrian','smogfire' , 'AnglerSwimmer','channelEmergency', 'countryRoad','cityMangement','ship2','cityMangement2','cityRoad','illParking',"crowdCounting",'cityMangement3']
|
|
|
|
businessAll = [ 'cityMangement3' ]
|
|
|
|
businessAll=['river', 'river2','highWay2','noParking','drowning','forest2','vehicle','pedestrian','smogfire' , 'AnglerSwimmer','channelEmergency', 'countryRoad','cityMangement','ship2','cityMangement2','cityRoad','illParking',"crowdCounting",'cityMangement3','crackMeasurement']
|
|
|
|
businessAll = [ 'crackMeasurement' ]
|
|
|
|
|
|
|
|
for busi in businessAll:
|
|
|
|
print('-'*40,'beg to test:',busi,'-'*40)
|
|
|
@@ -959,7 +1048,9 @@ if __name__=="__main__": |
|
|
|
if busi in ['ship2']:
|
|
|
|
OBB_track_demo(opt)
|
|
|
|
elif opt['business'] in ['crowdCounting'] :
|
|
|
|
crowd_demo(opt)
|
|
|
|
crowd_demo(opt)
|
|
|
|
elif opt['business'] in ['crackMeasurement'] :
|
|
|
|
crackMeasurement_demo(opt)
|
|
|
|
else:
|
|
|
|
#if opt['business'] in ['river','highWay2','noParking','drowning','']:
|
|
|
|
det_track_demo_N(opt )
|