wangjin0928 10 месяцев назад
Родитель
Сommit
08bd78ebbf
4 измененных файлов: 168 добавлений и 26 удалений
  1. +64
    -16
      demo.py
  2. +101
    -10
      demo3.0.py
  3. Двоичные данные
      images/crackMeasurement/DJI_20221026093456_0010_Z.jpg
  4. +3
    -0
      readme.md

+ 64
- 16
demo.py Просмотреть файл

@@ -30,6 +30,7 @@ from scipy import interpolate
#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 view_bar(num, total,time1,prefix='prefix'):
rate = num / total
time_n=time.time()
@@ -441,7 +442,7 @@ def detSeg_demo(opt):
process_video(video,par0)
print(' ')
def detSeg_demo2(opt):
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]]
if opt['business'] == 'cityMangement3':
from DMPR import DMPRModel
from DMPRUtils.jointUtil import dmpr_yolo_stdc
@@ -496,26 +497,76 @@ def detSeg_demo2(opt):
'testOutPath':'images/results/',###输出测试图像位置
}
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)
ret,timeInfos = AI_process_N([img],modelList,par['postProcess'])
if opt['business'] == 'crackMeasurement':
ret,timeInfos = AI_process_C([img],modelList,par['postProcess'])
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] ) )
else:
ret,timeInfos = AI_process_N([img],modelList,par['postProcess'])
timeInfos=bname+':'+timeInfos
print(timeInfos )
if len(ret)>0:
@@ -523,6 +574,7 @@ def detSeg_demo2(opt):
else: img0= img
cv2.imwrite(os.path.join('images/results/',bname ) ,img0)
@@ -1075,11 +1127,7 @@ def crowd_demo(opt):
# [ [ [ (x0,y0),(x1,y1),(x2,y2),(x3,y3) ],score, cls ], [ [ (x0,y0),(x1,y1),(x2,y2),(x3,y3) ],score ,cls ],........ ]
prets, infos = cmodel.eval(img_raw)
print(file,infos,' 人数:',len(prets[1]))
img_to_draw = cv2.cvtColor(np.array(img_raw), cv2.COLOR_RGB2BGR)
# 打印预测图像中人头的个数
for p in prets[1]:
@@ -1091,12 +1139,13 @@ def crowd_demo(opt):
# 保存预测图片
cv2.imwrite(os.path.join(par['testOutPath'], file), img_to_draw)
if __name__=="__main__":
#jkm_demo()
businessAll=['river2','AnglerSwimmer', 'countryRoad','forest2', 'pedestrian' , 'smogfire' , 'vehicle','ship2',"highWay2","channelEmergency","cityMangement","drowning","noParking","illParking",'cityMangement2',"cityRoad","crowdCounting",'cityMangement3']
businessAll = ['cityMangement3']
businessAll = ['crackMeasurement']
# forest 、 ocr2 、ocr_en 、 river 、 road 、 ship ,目前都没有在用
@@ -1105,18 +1154,17 @@ if __name__=="__main__":
opt={'gpu':'2080Ti','business':busi}
if opt['business'] in ['highWay2','river2','drowning','noParking','river',"illParking","cityMangement2"]:
detSeg_demo(opt)
elif opt['business'] in ['cityMangement3'] :
elif opt['business'] in ['cityMangement3','crackMeasurement'] :
detSeg_demo2(opt)
elif opt['business'] in ['crowdCounting'] :
crowd_demo(opt)
elif opt['business'] in ['ship2']:
OBB_demo(opt)
OBB_demo(opt)
elif opt['business'] in ['ocr']:
OCR_demo(opt)
elif opt['business'] in ['ocr2']:
OCR_demo2(opt)
elif opt['business'] in ['riverTrack','highWay2Track']:
det_track_demo(opt )
else:
det_demo( opt )

+ 101
- 10
demo3.0.py Просмотреть файл

@@ -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 )

Двоичные данные
images/crackMeasurement/DJI_20221026093456_0010_Z.jpg Просмотреть файл

Before After
Width: 5184  |  Height: 2916  |  Size: 6.5MB

+ 3
- 0
readme.md Просмотреть файл

@@ -3,3 +3,6 @@

2023.11.06
1.所有demo3.0.py 采用新的架构,模型作为一个输入参数组传入。

2023.11.17
1.demo,demo3.0,同步增加creakMeasurement模型

Загрузка…
Отмена
Сохранить