加入多个新算法

This commit is contained in:
caoqianming 2022-10-26 18:10:25 +08:00
parent fe2ae8cd35
commit 2549adc08a
6 changed files with 186 additions and 31 deletions

View File

@ -14,6 +14,9 @@ service Fire_Reg {
rpc sendFire_Info(JinYu_Request) returns (BHFire_Response){}
}
service FA_Reg {
rpc sendFA_Info(JinYu_Request) returns (BHFA_Response){}
}
message JinYu_Request {
int64 zzid = 1; //ID
@ -28,9 +31,13 @@ message BHhelmet_Response {
message BHFire_Response {
int64 zzid = 1; //ID
repeated FireInfo FireinfoList = 2; //0: 1
repeated FireInfo FireinfoList = 2; //0: 1 2: 3. 4.
}
message BHFA_Response {
int64 zzid = 1; //ID
bool FAinfo = 2; //穿 False:穿 True:
}
message Point {
@ -50,7 +57,8 @@ message HelmetInfo {
}
message FireInfo {
int64 fire = 1; //0 1
int64 fire = 1; //0: 1 2: 3. 4.
double conf = 2; //
Rectangle coord = 3; //
}
}

View File

@ -14,13 +14,14 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x42\x65iHangGrpc.proto\"A\n\rJinYu_Request\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x12\n\nimgsbase64\x18\x02 \x01(\t\x12\x0e\n\x06imgUrl\x18\x03 \x01(\t\"F\n\x11\x42Hhelmet_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12#\n\x0ehelmetinfoList\x18\x02 \x03(\x0b\x32\x0b.HelmetInfo\"@\n\x0f\x42HFire_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x1f\n\x0c\x46ireinfoList\x18\x02 \x03(\x0b\x32\t.FireInfo\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\":\n\tRectangle\x12\x15\n\x05uleft\x18\x01 \x01(\x0b\x32\x06.Point\x12\x16\n\x06lright\x18\x02 \x01(\x0b\x32\x06.Point\"J\n\nHelmetInfo\x12\x13\n\x0bhead_helmet\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle\"A\n\x08\x46ireInfo\x12\x0c\n\x04\x66ire\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle2E\n\nHelmet_Reg\x12\x37\n\x0fsendHelmet_Info\x12\x0e.JinYu_Request\x1a\x12.BHhelmet_Response\"\x00\x32?\n\x08\x46ire_Reg\x12\x33\n\rsendFire_Info\x12\x0e.JinYu_Request\x1a\x10.BHFire_Response\"\x00\x42,\n\x17\x63om.lyzh.aiservice.grpcB\x0c\x42\x65iHangProtoP\x01\x88\x01\x01\x62\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x11\x42\x65iHangGrpc.proto\"A\n\rJinYu_Request\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x12\n\nimgsbase64\x18\x02 \x01(\t\x12\x0e\n\x06imgUrl\x18\x03 \x01(\t\"F\n\x11\x42Hhelmet_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12#\n\x0ehelmetinfoList\x18\x02 \x03(\x0b\x32\x0b.HelmetInfo\"@\n\x0f\x42HFire_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x1f\n\x0c\x46ireinfoList\x18\x02 \x03(\x0b\x32\t.FireInfo\"-\n\rBHFA_Response\x12\x0c\n\x04zzid\x18\x01 \x01(\x03\x12\x0e\n\x06\x46\x41info\x18\x02 \x01(\x08\"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x01\x12\t\n\x01y\x18\x02 \x01(\x01\":\n\tRectangle\x12\x15\n\x05uleft\x18\x01 \x01(\x0b\x32\x06.Point\x12\x16\n\x06lright\x18\x02 \x01(\x0b\x32\x06.Point\"J\n\nHelmetInfo\x12\x13\n\x0bhead_helmet\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle\"A\n\x08\x46ireInfo\x12\x0c\n\x04\x66ire\x18\x01 \x01(\x03\x12\x0c\n\x04\x63onf\x18\x02 \x01(\x01\x12\x19\n\x05\x63oord\x18\x03 \x01(\x0b\x32\n.Rectangle2E\n\nHelmet_Reg\x12\x37\n\x0fsendHelmet_Info\x12\x0e.JinYu_Request\x1a\x12.BHhelmet_Response\"\x00\x32?\n\x08\x46ire_Reg\x12\x33\n\rsendFire_Info\x12\x0e.JinYu_Request\x1a\x10.BHFire_Response\"\x00\x32\x39\n\x06\x46\x41_Reg\x12/\n\x0bsendFA_Info\x12\x0e.JinYu_Request\x1a\x0e.BHFA_Response\"\x00\x42,\n\x17\x63om.lyzh.aiservice.grpcB\x0c\x42\x65iHangProtoP\x01\x88\x01\x01\x62\x06proto3')
_JINYU_REQUEST = DESCRIPTOR.message_types_by_name['JinYu_Request']
_BHHELMET_RESPONSE = DESCRIPTOR.message_types_by_name['BHhelmet_Response']
_BHFIRE_RESPONSE = DESCRIPTOR.message_types_by_name['BHFire_Response']
_BHFA_RESPONSE = DESCRIPTOR.message_types_by_name['BHFA_Response']
_POINT = DESCRIPTOR.message_types_by_name['Point']
_RECTANGLE = DESCRIPTOR.message_types_by_name['Rectangle']
_HELMETINFO = DESCRIPTOR.message_types_by_name['HelmetInfo']
@ -46,6 +47,13 @@ BHFire_Response = _reflection.GeneratedProtocolMessageType('BHFire_Response', (_
})
_sym_db.RegisterMessage(BHFire_Response)
BHFA_Response = _reflection.GeneratedProtocolMessageType('BHFA_Response', (_message.Message,), {
'DESCRIPTOR' : _BHFA_RESPONSE,
'__module__' : 'BeiHangGrpc_pb2'
# @@protoc_insertion_point(class_scope:BHFA_Response)
})
_sym_db.RegisterMessage(BHFA_Response)
Point = _reflection.GeneratedProtocolMessageType('Point', (_message.Message,), {
'DESCRIPTOR' : _POINT,
'__module__' : 'BeiHangGrpc_pb2'
@ -76,6 +84,7 @@ _sym_db.RegisterMessage(FireInfo)
_HELMET_REG = DESCRIPTOR.services_by_name['Helmet_Reg']
_FIRE_REG = DESCRIPTOR.services_by_name['Fire_Reg']
_FA_REG = DESCRIPTOR.services_by_name['FA_Reg']
if _descriptor._USE_C_DESCRIPTORS == False:
DESCRIPTOR._options = None
@ -86,16 +95,20 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_BHHELMET_RESPONSE._serialized_end=158
_BHFIRE_RESPONSE._serialized_start=160
_BHFIRE_RESPONSE._serialized_end=224
_POINT._serialized_start=226
_POINT._serialized_end=255
_RECTANGLE._serialized_start=257
_RECTANGLE._serialized_end=315
_HELMETINFO._serialized_start=317
_HELMETINFO._serialized_end=391
_FIREINFO._serialized_start=393
_FIREINFO._serialized_end=458
_HELMET_REG._serialized_start=460
_HELMET_REG._serialized_end=529
_FIRE_REG._serialized_start=531
_FIRE_REG._serialized_end=594
_BHFA_RESPONSE._serialized_start=226
_BHFA_RESPONSE._serialized_end=271
_POINT._serialized_start=273
_POINT._serialized_end=302
_RECTANGLE._serialized_start=304
_RECTANGLE._serialized_end=362
_HELMETINFO._serialized_start=364
_HELMETINFO._serialized_end=438
_FIREINFO._serialized_start=440
_FIREINFO._serialized_end=505
_HELMET_REG._serialized_start=507
_HELMET_REG._serialized_end=576
_FIRE_REG._serialized_start=578
_FIRE_REG._serialized_end=641
_FA_REG._serialized_start=643
_FA_REG._serialized_end=700
# @@protoc_insertion_point(module_scope)

View File

@ -125,3 +125,64 @@ class Fire_Reg(object):
BeiHangGrpc__pb2.BHFire_Response.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
class FA_RegStub(object):
"""Missing associated documentation comment in .proto file."""
def __init__(self, channel):
"""Constructor.
Args:
channel: A grpc.Channel.
"""
self.sendFA_Info = channel.unary_unary(
'/FA_Reg/sendFA_Info',
request_serializer=BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
response_deserializer=BeiHangGrpc__pb2.BHFA_Response.FromString,
)
class FA_RegServicer(object):
"""Missing associated documentation comment in .proto file."""
def sendFA_Info(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_FA_RegServicer_to_server(servicer, server):
rpc_method_handlers = {
'sendFA_Info': grpc.unary_unary_rpc_method_handler(
servicer.sendFA_Info,
request_deserializer=BeiHangGrpc__pb2.JinYu_Request.FromString,
response_serializer=BeiHangGrpc__pb2.BHFA_Response.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'FA_Reg', rpc_method_handlers)
server.add_generic_rpc_handlers((generic_handler,))
# This class is part of an EXPERIMENTAL API.
class FA_Reg(object):
"""Missing associated documentation comment in .proto file."""
@staticmethod
def sendFA_Info(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(request, target, '/FA_Reg/sendFA_Info',
BeiHangGrpc__pb2.JinYu_Request.SerializeToString,
BeiHangGrpc__pb2.BHFA_Response.FromString,
options, channel_credentials,
insecure, call_credentials, compression, wait_for_ready, timeout, metadata)

View File

@ -33,10 +33,12 @@ def helmet(ip: str, pic_url: str):
pic_url (_type_): _description_
"""
channel = grpc.insecure_channel(ip+':2000') # 监听频道
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 3
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(
channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 1
img_path = save_dahua_pic(pic_url)
request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendHelmet_Info(request)
if response.helmetinfoList:
for i in response.helmetinfoList:
@ -53,10 +55,12 @@ def helmet2(ip: str, pic_url: str):
pic_url (_type_): _description_
"""
channel = grpc.insecure_channel(ip+':2002') # 监听频道
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 3
stub = BeiHangGrpc_pb2_grpc.Helmet_RegStub(
channel) # 客户端使用Stub类发送请求,参数为频道,为了绑定链接
image_id = 2
img_path = save_dahua_pic(pic_url)
request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendHelmet_Info(request)
os.remove(settings.BASE_DIR + img_path)
if response.helmetinfoList:
@ -76,7 +80,8 @@ def fire1(ip: str, pic_url: str):
# resized_img = cv2.resize(img, None, fx=0.25, fy=0.25)
# resized_img = cv2.imencode('.png', resized_img)[1]
# image_base64 = str(base64.b64encode(resized_img))[2:-1]
request = BeiHangGrpc_pb2.JinYu_Request(zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendFire_Info(request)
os.remove(settings.BASE_DIR + img_path) # 删除临时图片
if response.FireinfoList:
@ -86,9 +91,59 @@ def fire1(ip: str, pic_url: str):
return True, response
def fangtang(ip: str, pic_url: str):
# 未穿防烫服事件
channel = grpc.insecure_channel(ip+':2003')
stub = BeiHangGrpc_pb2_grpc.FA_RegStub(channel)
image_id = 4
img_path = save_dahua_pic(pic_url)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendFire_Info(request)
os.remove(settings.BASE_DIR + img_path) # 删除临时图片
if response.FAinfo == False:
return True, response
return False, response
def jingjiedai(ip: str, pic_url: str):
# 未配置警戒带事件
channel = grpc.insecure_channel(ip+':2001')
stub = BeiHangGrpc_pb2_grpc.Fire_RegStub(channel)
image_id = 3
img_path = save_dahua_pic(pic_url)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendFire_Info(request)
os.remove(settings.BASE_DIR + img_path) # 删除临时图片
if response.FireinfoList:
for i in response.FireinfoList:
if i.fire == 2: # 配置了警戒带
return False, response
return True, response
def qiping(ip: str, pic_url: str):
# 气瓶倾倒事件
channel = grpc.insecure_channel(ip+':2001')
stub = BeiHangGrpc_pb2_grpc.Fire_RegStub(channel)
image_id = 3
img_path = save_dahua_pic(pic_url)
request = BeiHangGrpc_pb2.JinYu_Request(
zzid=image_id, imgUrl=settings.BASE_URL_OUT + img_path)
response = stub.sendFire_Info(request)
os.remove(settings.BASE_DIR + img_path) # 删除临时图片
if response.FireinfoList:
for i in response.FireinfoList:
if i.fire == 3: # 发现气瓶倾倒
return True, response
return False, response
if __name__ == "__main__":
path = 'http://10.99.5.24/evo-apigw/evo-oss/6ad010cf-ce45-11ec-9715-e4246c7d1635/20220826/1/dsf_3de82501-2521-11ed-884a-e4246c7d1635_7236037_7245601.jpg?token=399773e6-71f7-4202-b234-ff5aa8d2492c'
base64img = str(base64.b64encode(BytesIO(requests.get(url=path, verify=False).content).read()), 'utf-8')
base64img = str(base64.b64encode(BytesIO(requests.get(
url=path, verify=False).content).read()), 'utf-8')
with open('face_test.txt', 'w') as f:
f.write(base64img)
is_happend, res = analyse(

View File

@ -7,7 +7,10 @@ myLogger = logging.getLogger('log')
algo_dict = {
"helmet": "apps.ai.client.helmet",
"fire1": "apps.ai.client.fire1"
"fire1": "apps.ai.client.fire1",
"fangtang": "apps.ai.client.fangtang",
"jingjiedai": "apps.ai.jingjiedai",
"qiping": "apps.ai.qiping"
}
@ -19,14 +22,14 @@ def ai_analyse(codes: list, global_img: str, face_img: str = None):
global_img (str): 全景图片地址
face_img (str): 人脸图片地址
"""
results = {}
results = {} # dict key: 触发的事件标识字符 value: 多个矩形框坐标列表
for i in codes:
if i in algo_dict: # 如果算法支持
if i in algo_dict and i not in results: # 如果算法支持且没有识别过
module, func = algo_dict[i].rsplit(".", 1)
m = importlib.import_module(module)
f = getattr(m, func)
try:
is_happend, res = False, None
is_happend, res, rectangle_dict = False, None, {}
if i == 'helmet': # 如果是安全帽抠图识别
if face_img:
is_happend, res = f(ip=settings.AI_IP, pic_url=face_img)
@ -34,8 +37,23 @@ def ai_analyse(codes: list, global_img: str, face_img: str = None):
is_happend, res = getattr(m, 'helmet2')(ip=settings.AI_IP, pic_url=global_img)
else:
is_happend, res = f(ip=settings.AI_IP, pic_url=global_img)
if is_happend:
results.update({i: res})
if i in ['fire1', 'jingjiedai', 'qiping']: # 如果是这3类算法就无需再识别都在一个算法里处理了
for x in res.FireinfoList:
has_fire = False # 默认没有灭火器
has_jingjiedai = False # 默认没有警戒带
qiping_qd = False # 气瓶倾倒未发生
rectangle_dict .update({'qiping':[]}) # 气瓶倾倒的坐标字典
if x.fire == 3 and 'qiping' in codes: # 气瓶倾倒
qiping_qd = True
rectangle_dict['qiping'].append([x.coord.x, x.coord.y]) # 加入矩形框
if x.fire == 0:
has_fire = True
if x.fire == 2:
has_jingjiedai = True
if (i == 'fire1' and not has_fire) or (i == 'jingjiedai' and not has_jingjiedai) or (i == 'qiping' and qiping_qd):
results.update({i: {'rectangles':rectangle_dict.get(i, [])}})
if is_happend and (i not in results):
results.update({i: {'rectangles':rectangle_dict.get(i, [])}})
except Exception:
myLogger.error('算法处理错误', exc_info=True)
return results

View File

@ -25,7 +25,7 @@ class EmployeeSimpleSerializer(CustomModelSerializer):
class Meta:
model = Employee
fields = ['id', 'type', 'name', 'belong_dept', 'belong_dept_name', 'post', 'post_name', 'photo', 'third_info']
fields = ['id', 'type', 'name', 'belong_dept', 'belong_dept_name', 'post', 'post_name', 'photo', 'third_info', 'number', 'id_number']
# class EmployeeBaseSerializer(CustomModelSerializer):