[ext] 增加了喷阀计数功能(未测试)

This commit is contained in:
FEIJINTI 2022-09-04 20:26:22 +08:00
parent 6f2a9a1643
commit e62fdf3630
3 changed files with 45 additions and 8 deletions

View File

@ -44,3 +44,6 @@ class Config:
# logging # logging
root_dir = os.path.split(os.path.realpath(__file__))[0] root_dir = os.path.split(os.path.realpath(__file__))[0]
log_freq = 1500 # 进行log的频率多少次predict后进行log写出记录喷阀开启次数
rgb_log_dir = 'rgb_log' # rgb log 文件夹
spec_log_dir = 'spec_log' # spec log 文件夹

34
main.py
View File

@ -1,10 +1,13 @@
import os import os
from datetime import datetime
from pathlib import Path
import sys import sys
import cv2 import cv2
import time import time
import numpy as np import numpy as np
import utils
import utils as utils_customized import utils as utils_customized
from config import Config from config import Config
from models import RgbDetector, SpecDetector from models import RgbDetector, SpecDetector
@ -17,10 +20,17 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
rgb_detector = RgbDetector(tobacco_model_path=Config.rgb_tobacco_model_path, rgb_detector = RgbDetector(tobacco_model_path=Config.rgb_tobacco_model_path,
background_model_path=Config.rgb_background_model_path, background_model_path=Config.rgb_background_model_path,
ai_path=Config.ai_path) ai_path=Config.ai_path)
_, _ = spec_detector.predict(np.ones((Config.nRows, Config.nCols, Config.nBands), dtype=float)*0.4),\ _, _ = spec_detector.predict(np.ones((Config.nRows, Config.nCols, Config.nBands), dtype=float) * 0.4), \
rgb_detector.predict(np.ones((Config.nRgbRows, Config.nRgbCols, Config.nRgbBands), dtype=np.uint8)*40) rgb_detector.predict(np.ones((Config.nRgbRows, Config.nRgbCols, Config.nRgbBands), dtype=np.uint8) * 40)
total_len = Config.nRows * Config.nCols * Config.nBands * 4 # float型变量, 4个字节 total_len = Config.nRows * Config.nCols * Config.nBands * 4 # float型变量, 4个字节
total_rgb = Config.nRgbRows * Config.nRgbCols * Config.nRgbBands * 1 # int型变量 total_rgb = Config.nRgbRows * Config.nRgbCols * Config.nRgbBands * 1 # int型变量
log_file_name = datetime.now().strftime('%Y_%m_%d__%H_%M_%S.log')
if single_spec:
os.mkdirs(Path(Config.root_dir) / Path(Config.rgb_log_dir), exist_ok=True)
log_path = Path(Config.root_dir) / Path(Config.rgb_log_dir) / log_file_name
if single_color:
os.mkdirs(Path(Config.root_dir) / Path(Config.spec_log_dir), exist_ok=True)
log_path = Path(Config.root_dir) / Path(Config.spec_log_dir) / log_file_name
if not single_color: if not single_color:
logging.info("create color fifo") logging.info("create color fifo")
if not os.access(img_fifo_path, os.F_OK): if not os.access(img_fifo_path, os.F_OK):
@ -38,8 +48,10 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
if (interval_time is not None) and (delay_repeat_time is not None): if (interval_time is not None) and (delay_repeat_time is not None):
interval_time = float(interval_time) / 1000.0 interval_time = float(interval_time) / 1000.0
delay_repeat_time = int(delay_repeat_time) delay_repeat_time = int(delay_repeat_time)
logging.warning(f'Delay {interval_time*1000:.2f}ms will be added per {delay_repeat_time} frames') logging.warning(f'Delay {interval_time * 1000:.2f}ms will be added per {delay_repeat_time} frames')
delay_repeat_time_count = 0 delay_repeat_time_count = 0
log_time_count, value_num_count = 0, 0
while True: while True:
img_data, rgb_data = None, None img_data, rgb_data = None, None
if single_spec: if single_spec:
@ -76,7 +88,8 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
Config.rgb_size_threshold = rgb_threshold Config.rgb_size_threshold = rgb_threshold
logging.info(f'Get rgb threshold: {rgb_threshold}') logging.info(f'Get rgb threshold: {rgb_threshold}')
except Exception as e: except Exception as e:
logging.error(f'毁灭性错误:收到长度小于3却无法转化为整数spec_size_threshold的网络报文报文内容为 {total_rgb},' logging.error(
f'毁灭性错误:收到长度小于3却无法转化为整数spec_size_threshold的网络报文报文内容为 {total_rgb},'
f' 错误为 {e}.') f' 错误为 {e}.')
continue continue
else: else:
@ -112,6 +125,13 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
masks = [mask_spec, mask_rgb] masks = [mask_spec, mask_rgb]
# 进行多个喷阀的合并 # 进行多个喷阀的合并
masks = [utils_customized.valve_expend(mask) for mask in masks] masks = [utils_customized.valve_expend(mask) for mask in masks]
mask_nums = sum([np.sum(np.sum(mask)) for mask in masks])
log_time_count += 1
value_num_count += mask_nums
if log_time_count > Config.log_freq:
utils.valve_log(log_path, valve_num=value_num_count)
log_time_count, value_num_count = 0, 0
# 进行喷阀同时开启限制,在8月11日后收到倪超老师的电话关闭 # 进行喷阀同时开启限制,在8月11日后收到倪超老师的电话关闭
# masks = [utils_customized.valve_limit(mask, Config.max_open_valve_limit) for mask in masks] # masks = [utils_customized.valve_limit(mask, Config.max_open_valve_limit) for mask in masks]
# control the size of the output masks, 在resize前图像的宽度是和喷阀对应的 # control the size of the output masks, 在resize前图像的宽度是和喷阀对应的
@ -122,7 +142,7 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
if (interval_time is not None) and (delay_repeat_time is not None): if (interval_time is not None) and (delay_repeat_time is not None):
delay_repeat_time_count += 1 delay_repeat_time_count += 1
if delay_repeat_time_count > delay_repeat_time: if delay_repeat_time_count > delay_repeat_time:
logging.warning(f"Delay time {interval_time*1000:.2f}ms after {delay_repeat_time} frames") logging.warning(f"Delay time {interval_time * 1000:.2f}ms after {delay_repeat_time} frames")
delay_repeat_time_count = 0 delay_repeat_time_count = 0
time.sleep(interval_time) time.sleep(interval_time)
# 写出 # 写出
@ -145,11 +165,13 @@ def main(only_spec=False, only_color=False, if_merge=False, interval_time=None,
if __name__ == '__main__': if __name__ == '__main__':
import argparse import argparse
parser = argparse.ArgumentParser(description='主程序') parser = argparse.ArgumentParser(description='主程序')
parser.add_argument('-oc', default=False, action='store_true', help='只进行RGB彩色预测 only rgb', required=False) parser.add_argument('-oc', default=False, action='store_true', help='只进行RGB彩色预测 only rgb', required=False)
parser.add_argument('-os', default=False, action='store_true', help='只进行光谱预测 only spec', required=False) parser.add_argument('-os', default=False, action='store_true', help='只进行光谱预测 only spec', required=False)
parser.add_argument('-sc', default=False, action='store_true', help='只进行RGB预测且只返回一个mask', required=False) parser.add_argument('-sc', default=False, action='store_true', help='只进行RGB预测且只返回一个mask', required=False)
parser.add_argument('-ss', default=False, action='store_true', help='只进行光谱预测且只返回一个mask', required=False) parser.add_argument('-ss', default=False, action='store_true', help='只进行光谱预测且只返回一个mask',
required=False)
parser.add_argument('-m', default=False, action='store_true', help='if merge the two masks', required=False) parser.add_argument('-m', default=False, action='store_true', help='if merge the two masks', required=False)
parser.add_argument('-d', default=False, action='store_true', help='是否使用DEBUG模式', required=False) parser.add_argument('-d', default=False, action='store_true', help='是否使用DEBUG模式', required=False)
parser.add_argument('-dt', default=None, help='delay time', required=False) parser.add_argument('-dt', default=None, help='delay time', required=False)

View File

@ -6,6 +6,9 @@
import glob import glob
import logging import logging
import os import os
import pathlib
import time
from datetime import datetime
from queue import Queue from queue import Queue
import cv2 import cv2
@ -274,6 +277,15 @@ wavelength units = Unknown
return template_file return template_file
def valve_log(log_path: pathlib.Path, valve_num: [int, str]):
"""
将喷阀的开启次数记录到文件log_path当中
"""
valve_str = "截至 " + datetime.now().strftime('%Y-%m-%d %H:%M:%S') + f' 喷阀使用次数: {valve_num}.'
with open(log_path) as f:
f.write(str(valve_str))
if __name__ == '__main__': if __name__ == '__main__':
# color_dict = {(0, 0, 255): "yangeng", (255, 0, 0): "bejing", (0, 255, 0): "hongdianxian", # color_dict = {(0, 0, 255): "yangeng", (255, 0, 0): "bejing", (0, 255, 0): "hongdianxian",
# (255, 0, 255): "chengsebangbangtang", (0, 255, 255): "lvdianxian"} # (255, 0, 255): "chengsebangbangtang", (0, 255, 255): "lvdianxian"}