river_demo/demo.py

255 lines
10 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(['..','../AIlib' ])
from AI import AI_process,AI_process_v2,AI_process_forest,get_postProcess_para
import cv2,os,time
from segutils.segmodel import SegModel
from segutils.segmodel_trt import SegModel_STDC_trt
from segutils.trtUtils import DetectMultiBackend
from models.experimental import attempt_load
from utils.torch_utils import select_device
from utilsK.queRiver import get_labelnames,get_label_arrays
import numpy as np
import torch
from utilsK.masterUtils import get_needed_objectsIndex
def river_demo_v2():
##预先设置的参数
device_='0' ##选定模型,可选 cpu,'0','1'
###注意TRT模型生成时就需要对应cuda device下面的trt文件是cuda:0生成的device只能是0
##以下参数目前不可改
gpuname='3090'###3090,2080Ti. 只能是其中之一
Detweights = "../AIlib/weights/yolov5/class8/bestcao_%s_fp16.engine"%(gpuname) ##升级后的检测模型
labelnames = "../AIlib/weights/yolov5/class8/labelnames.json" ##对应类别表
seg_nclass = 2
#Segweights = "../AIlib/weights/BiSeNet/checkpoint.pth"
Segweights = '../AIlib/weights/STDC/model_maxmIOU75_1720_0.946_360640_%s_fp16.engine'%(gpuname) ##升级的分割模型
postFile= '../AIlib/conf/para.json'
digitFont= { 'line_thickness':2,'boxLine_thickness':1, 'fontSize':1.0,'waterLineColor':(0,255,255),'waterLineWidth':3}
conf_thres,iou_thres,classes,rainbows=get_postProcess_para(postFile)
####模型选择参数用如下:
mode_paras=[
{"id":"0","config":{"k1":"v1","k2":"v2"}},
{"id":"1","config":{"k1":"v1","k2":"v2"}},
{"id":"2","config":{"k1":"v1","k2":"v2"}},
{"id":"3","config":{"k1":"v1","k2":"v2"}},
{"id":"4","config":{"k1":"v1","k2":"v2"}},
{"id":"5","config":{"k1":"v1","k2":"v2"}},
{"id":"6","config":{"k1":"v1","k2":"v2"}},
{"id":"7","config":{"k1":"v1","k2":"v2"}},
]
allowedList,allowedList_string=get_needed_objectsIndex(mode_paras)
#allowedList=[0,1,2,3]
##加载模型,准备好显示字符
device = select_device(device_)
names=get_labelnames(labelnames)
label_arraylist = get_label_arrays(names,rainbows,outfontsize=40,fontpath="../AIlib/conf/platech.ttf")
half = device.type != 'cpu' # half precision only supported on CUDA
segmodel = SegModel_STDC_trt(weights=Segweights,modelsize=(640,360),std=(0.229, 0.224, 0.225),mean=(0.485, 0.456, 0.406),device=device)
model = DetectMultiBackend(Detweights, device=device)
##图像测试
#url='images/examples/20220624_响水河_12300_1621.jpg'
impth = 'images/slope/'
outpth = 'images/results/'
folders = os.listdir(impth)
for i in range(len(folders)):
imgpath = os.path.join(impth, folders[i])
im0s=[cv2.imread(imgpath)]
H,W,C = im0s[0].shape
time00 = time.time()
p_result,timeOut = AI_process_v2(im0s,model,segmodel,names,label_arraylist,rainbows,half,device,conf_thres, iou_thres,allowedList,font=digitFont)
time11 = time.time()
image_array = p_result[1]
cv2.imwrite( os.path.join( outpth,folders[i] ) ,image_array )
print('%s,%d*%d,AI-process: %.1f, %s'%(folders[i],H,W, (time11 - time00) * 1000,timeOut))
def river_demo():
##预先设置的参数
device_='1' ##选定模型,可选 cpu,'0','1'
##以下参数目前不可改
#Detweights = "../AIlib/weights/yolov5/class5/best_5classes.pt"
#labelnames = "../AIlib/weights/yolov5/class5/labelnames.json"
Detweights = "../AIlib/weights/yolov5/class8/bestcao.pt" ##升级后的检测模型
labelnames = "../AIlib/weights/yolov5/class8/labelnames.json" ##对应类别表
seg_nclass = 2
#Segweights = "../AIlib/weights/BiSeNet/checkpoint.pth"
Segweights = '../AIlib/weights/STDC/model_maxmIOU75_1720_0.946_360640.pth' ##升级的分割模型
postFile= '../AIlib/conf/para.json'
digitFont= { 'line_thickness':2,'boxLine_thickness':1, 'fontSize':1.0,'waterLineColor':(0,255,255),'waterLineWidth':3}
conf_thres,iou_thres,classes,rainbows=get_postProcess_para(postFile)
####模型选择参数用如下:
mode_paras=[
{"id":"0","config":{"k1":"v1","k2":"v2"}},
{"id":"1","config":{"k1":"v1","k2":"v2"}},
{"id":"2","config":{"k1":"v1","k2":"v2"}},
{"id":"3","config":{"k1":"v1","k2":"v2"}},
{"id":"4","config":{"k1":"v1","k2":"v2"}},
{"id":"5","config":{"k1":"v1","k2":"v2"}},
{"id":"6","config":{"k1":"v1","k2":"v2"}},
{"id":"7","config":{"k1":"v1","k2":"v2"}},
]
allowedList,allowedList_string=get_needed_objectsIndex(mode_paras)
#allowedList=[0,1,2,3]
##加载模型,准备好显示字符
device = select_device(device_)
names=get_labelnames(labelnames)
label_arraylist = get_label_arrays(names,rainbows,outfontsize=40,fontpath="../AIlib/conf/platech.ttf")
half = device.type != 'cpu' # half precision only supported on CUDA
model = attempt_load(Detweights, map_location=device) # load FP32 model
if half: model.half()
segmodel = SegModel(nclass=seg_nclass,weights=Segweights,device=device)
##图像测试
#url='images/examples/20220624_响水河_12300_1621.jpg'
impth = 'images/slope/'
outpth = 'images/results/'
folders = os.listdir(impth)
for i in range(len(folders)):
imgpath = os.path.join(impth, folders[i])
im0s=[cv2.imread(imgpath)]
H,W,C = im0s[0].shape
time00 = time.time()
p_result,timeOut = AI_process(im0s,model,segmodel,names,label_arraylist,rainbows,half,device,conf_thres, iou_thres,allowedList,font=digitFont)
time11 = time.time()
image_array = p_result[1]
cv2.imwrite( os.path.join( outpth,folders[i] ) ,image_array )
print('%s,%d*%d,AI-process: %.1f, %s'%(folders[i],H,W, (time11 - time00) * 1000,timeOut))
def road_forest_demo(business ):
##使用森林,道路模型,business 控制['forest','road']
##预先设置的参数
device_='1' ##选定模型,可选 cpu,'0','1'
##以下参数目前不可改
#business='forest';imageW=4916 ####森林模型
#business='road';
imageW=1536 ####道路模型
digitFont= { 'line_thickness':2, 'fontSize':1.0} ###数字显示的线宽度,大小; 如果都是None则采用默认大小
Detweights="../AIlib/weights/%s/best.pt"%(business)
labelnames = "../AIlib/weights/%s/labelnames.json"%(business)
postFile= '../AIlib/conf/para.json'
print( Detweights,labelnames )
conf_thres,iou_thres,classes,rainbows=get_postProcess_para(postFile)
####模型选择参数用如下:
mode_paras=[
{
"id":"0",
"config":{
"k1":"v1",
"k2":"v2"
}
},
{
"id":"1",
"config":{
"k1":"v1",
"k2":"v2"
}
}
]
allowedList,allowedList_string=get_needed_objectsIndex(mode_paras)
#allowedList=[0,1,2,3]
print('####line108###')
##只加载检测模型,准备好显示字符
device = select_device(device_)
names=get_labelnames(labelnames)
#imageW=4915;###默认是1920在森林巡检的高清图像中是4920
outfontsize=int(imageW/1920*40);###
label_arraylist = get_label_arrays(names,rainbows,outfontsize=outfontsize,fontpath="../AIlib/conf/platech.ttf")
half = device.type != 'cpu' # half precision only supported on CUDA
model = attempt_load(Detweights, map_location=device) # load FP32 model
if half: model.half()
segmodel = None
##图像测试
#url='images/examples/20220624_响水河_12300_1621.jpg'
impth = 'images/%s/'%(business)
outpth = 'images/results/'
folders = os.listdir(impth)
folders.sort()
for i in range(len(folders)):
#for i in range(2):
imgpath = os.path.join(impth, folders[i])
im0s=[cv2.imread(imgpath)]
time00 = time.time()
#使用不同的函数。每一个领域采用一个函数
p_result,timeOut = AI_process_forest(im0s,model,segmodel,names,label_arraylist,rainbows,half,device,conf_thres, iou_thres,allowedList,font=digitFont)
time11 = time.time()
image_array = p_result[1]
cv2.imwrite( os.path.join( outpth,folders[i] ) ,image_array )
print('----image:%s, process:%s ,save:%s, %s'%(folders[i],(time11-time00) * 1000, (time.time() - time11) * 1000,timeOut) )
def jkm_demo():
from utilsK.jkmUtils import pre_process,post_process,get_return_data
img_type = 'plate' ## code,plate
par={'code':{'weights':'../AIlib/weights/jkm/health_yolov5s_v3.jit','img_type':'code','nc':10 },
'plate':{'weights':'../AIlib/weights/jkm/plate_yolov5s_v3.jit','img_type':'plate','nc':1 },
'conf_thres': 0.4,
'iou_thres':0.45,
'device':'cuda:0',
'plate_dilate':(0.5,0.1)
}
###加载模型
device = torch.device(par['device'])
jit_weights = par['code']['weights']
model = torch.jit.load(jit_weights)
jit_weights = par['plate']['weights']
model_plate = torch.jit.load(jit_weights)
imgd='images/plate'
imgpaths = os.listdir(imgd)
for imgp in imgpaths[0:]:
#imgp = 'plate_IMG_20221030_100612.jpg'
imgpath = os.path.join(imgd,imgp)
im0 = cv2.imread(imgpath) #读取数据
img ,padInfos = pre_process(im0,device) ##预处理
if img_type=='code': pred = model(img) ##模型推理
else: pred = model_plate(img)
boxes = post_process(pred,padInfos,device,conf_thres= par['conf_thres'], iou_thres= par['iou_thres'],nc=par[img_type]['nc']) #后处理
dataBack=get_return_data(im0,boxes,modelType=img_type,plate_dilate=par['plate_dilate'])
print(imgp,boxes,dataBack['type'])
for key in dataBack.keys():
if isinstance(dataBack[key],list):
cv2.imwrite( 'images/results/%s_%s.jpg'%( imgp.replace('.jpg','').replace('.png',''),key),dataBack[key][0] ) ###返回值: dataBack
if __name__=="__main__":
river_demo_v2()
#road_forest_demo('forest' )
#jkm_demo()