Team Ai
Apppublic

Jianfeng777/Computer_Vision_AI_Platform

sourceHugging Faceupdated 3y agoView on Hugging Face
1likes
app.py764 linesDownload Raw Back to root
1import cv22from mmdeploy_runtime import Detector, Segmentor, Classifier3import numpy as np4import gradio as gr5import math6import os7 8 9# Load models globally to avoid redundancy10 11helmet_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/helmet', device_name='cuda', device_id=0)12red_tree_segmentor = Segmentor(model_path='/mnt/e/AI/mmdeploy/output/red_tree', device_name='cuda', device_id=0)13vest_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/vest_detection', device_name='cuda', device_id=0)14car_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/car_calculation', device_name='cuda', device_id=0)15crack_classifier = Classifier(model_path='/mnt/e/AI/mmdeploy/output/crack_classification', device_name='cuda', device_id=0)16disease_object_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/disease_object_detection', device_name='cuda', device_id=0)17crack_segmentor = Segmentor(model_path='/mnt/e/AI/mmdeploy/output/crack_detection2', device_name='cuda', device_id=0)18leaf_disease_segmentor = Segmentor(model_path='/mnt/e/AI/mmdeploy/output/disease_leaf', device_name='cuda', device_id=0)19single_label_disease_segmentor = Segmentor(model_path='/mnt/e/AI/mmdeploy/output/disease_detection', device_name='cuda', device_id=0)20fall_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/fall_detection_fastercnn', device_name='cuda', device_id=0)21mask_detector = Detector(model_path='/mnt/e/AI/mmdeploy/output/mask_detection', device_name='cuda', device_id=0)22smoker_detector_object = Detector(model_path='/mnt/e/AI/mmdeploy/output/smoker_nonsmoker', device_name='cuda', device_id=0)23 24def smoker_detector(frame, confidence_threshold=0.3):25    SMOKE_LABELS = ['smoker', 'nonsmoker']  # 新的标签列表26    bboxes, labels, masks = smoker_detector_object(frame)  # 修改检测器名字27 28    # 获取有效的bbox索引29    valid_indices = [(i, SMOKE_LABELS[label]) for i, label in enumerate(labels) if SMOKE_LABELS[label] == 'smoker' and bboxes[i][4] >= confidence_threshold]30 31    smoker_count = 032 33    for i, label_name in valid_indices:34        bbox = bboxes[i]35        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]36 37        if label_name == 'smoker':38            color = (255, 0, 0)  # 绿色用于'smoker'39            smoker_count += 140        41        line_thickness = 242        font_scale = 0.843        cv2.rectangle(frame, (left, top), (right, bottom), color, thickness=line_thickness)44        label_text = f"{label_name} ({score:.2f})"45        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)46 47        if masks and masks[i].size:48            mask = masks[i]49            blue, green, red = cv2.split(frame)50            if mask.shape == frame.shape[:2]:51                mask_img = blue52            else:53                x0 = int(max(math.floor(bbox[0]) - 1, 0))54                y0 = int(max(math.floor(bbox[1]) - 1, 0))55                mask_img = blue[y0:y0 + mask.shape[0], x0:x0 + mask.shape[1]]56            cv2.bitwise_or(mask, mask_img, mask_img)57            frame = cv2.merge([blue, green, red])58 59    # 显示smoker的数量60    frame_height, frame_width = frame.shape[:2]61    summary_text = f"Smokers: {smoker_count}"62    cv2.putText(frame, summary_text, (frame_width - 200, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)63 64    return frame, smoker_count65 66 67 68def crack_classification(frame, confidence_threshold=0.5):69    # 定义标签70    labels_dict = {0: 'Negative', 1: 'Positive'}71    72    # 使用裂缝分类器进行预测73    result = crack_classifier(frame)74    75    # 获取最大置信度的标签ID76    label_id, score = max(result, key=lambda x: x[1])77 78    if label_id == 1 and score > confidence_threshold:  # 如果检测到有裂缝,并且置信度超过阈值79        seg = crack_segmentor(frame)80        crack_pixel_count = np.sum(seg == 1)81        current_palette = [(255, 255, 255), (255, 0, 0)]  # 背景为白色,裂缝为红色82        color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)83        for label, color in enumerate(current_palette):84            color_seg[seg == label, :] = color85        frame = frame * 0.5 + color_seg * 0.586        frame = frame.astype(np.uint8)87    elif label_id == 0 and score <= confidence_threshold:88        crack_pixel_count = None89    else:90        crack_pixel_count = None91        label_id = 0  # 这里我默认设置为0,即"Negative",但你可以根据实际情况进行调整92 93    # 在图像右上角显示预测结果和置信度94    label_text = labels_dict[label_id] + f" ({score:.2f})"95    color = (255, 0, 0) if label_id == 1 else (0, 255, 0)  # 裂缝为红色,否则为绿色96    font_scale = 0.897    line_thickness = 298    text_size = cv2.getTextSize(label_text, cv2.FONT_HERSHEY_SIMPLEX, font_scale, line_thickness)[0]99    cv2.putText(frame, label_text, (frame.shape[1] - text_size[0] - 10, text_size[1] + 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)100 101    return frame, labels_dict[label_id], crack_pixel_count102 103 104def crack_detection(frame):105    # 使用裂缝检测器进行检测106    seg = crack_segmentor(frame)107    crack_pixel_count = np.sum(seg == 1)108 109    # 如果检测到裂缝,进行可视化处理110    if crack_pixel_count > 0:111        current_palette = [(255, 255, 255), (255, 0, 0)]  # 背景为白色,裂缝为红色112        color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)113        for label, color in enumerate(current_palette):114            color_seg[seg == label, :] = color115        frame = frame * 0.5 + color_seg * 0.5116        frame = frame.astype(np.uint8)117 118    # 在图像右上角显示检测到的裂缝像素数量119    label_text = f"Crack Pixels: {crack_pixel_count}"120    color = (255, 0, 0) if crack_pixel_count > 0 else (0, 255, 0)  # 如果有裂缝则为红色,否则为绿色121    font_scale = 0.8122    line_thickness = 2123    text_size = cv2.getTextSize(label_text, cv2.FONT_HERSHEY_SIMPLEX, font_scale, line_thickness)[0]124    cv2.putText(frame, label_text, (frame.shape[1] - text_size[0] - 10, text_size[1] + 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)125 126    return frame, crack_pixel_count127 128 129def car_calculation(frame, confidence_threshold=0.7):130    CAR_LABEL = 'car'  # 这里只有一个车辆标签131    bboxes, labels, masks = car_detector(frame)132    valid_indices = [i for i, label in enumerate(labels) if bboxes[i][4] >= confidence_threshold]133    134    car_count = 0135    136    for i in valid_indices:137        bbox = bboxes[i]138        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]139        140        color = (0, 255, 0)  # 使用绿色标记车辆141        line_thickness = 2142        font_scale = 0.8143 144        cv2.rectangle(frame, (left, top), (right, bottom), color, thickness=line_thickness)145        label_text = CAR_LABEL + f" ({score:.2f})"146        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)147        148        if masks and masks[i].size:149            mask = masks[i]150            blue, green, red = cv2.split(frame)151            if mask.shape == frame.shape[:2]:152                mask_img = blue153            else:154                x0 = int(max(math.floor(bbox[0]) - 1, 0))155                y0 = int(max(math.floor(bbox[1]) - 1, 0))156                mask_img = blue[y0:y0 + mask.shape[0], x0:x0 + mask.shape[1]]157            cv2.bitwise_or(mask, mask_img, mask_img)158            frame = cv2.merge([blue, green, red])159        160        car_count += 1161 162    return frame, car_count163 164 165 166def vest_detection(frame, confidence_threshold=0.3):167    VEST_LABELS = ['other_clothes', 'vest']  # 新的标签列表168    bboxes, labels, masks = vest_detector(frame)169    170    # 获取有效的bbox索引171    valid_indices = [(i, VEST_LABELS[label]) for i, label in enumerate(labels) if VEST_LABELS[label] in ['vest', 'other_clothes'] and bboxes[i][4] >= confidence_threshold]172 173    vest_count = 0174    other_clothes_count = 0175 176    for i, label_name in valid_indices:177        bbox = bboxes[i]178        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]179 180        if label_name == 'vest':181            color = (0, 255, 255)  # 黄色用于'vest'182            vest_count += 1183        else:184            color = (255, 0, 0)  # 蓝色用于'other_clothes'185            other_clothes_count += 1186        187        line_thickness = 2188        font_scale = 0.8189        cv2.rectangle(frame, (left, top), (right, bottom), color, thickness=line_thickness)190        label_text = f"{label_name} ({score:.2f})"191        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)192 193        if masks and masks[i].size:194            mask = masks[i]195            blue, green, red = cv2.split(frame)196            if mask.shape == frame.shape[:2]:197                mask_img = blue198            else:199                x0 = int(max(math.floor(bbox[0]) - 1, 0))200                y0 = int(max(math.floor(bbox[1]) - 1, 0))201                mask_img = blue[y0:y0 + mask.shape[0], x0:x0 + mask.shape[1]]202            cv2.bitwise_or(mask, mask_img, mask_img)203            frame = cv2.merge([blue, green, red])204 205    # 显示vest和other_clothes的数量和置信度206    frame_height, frame_width = frame.shape[:2]207    summary_text = f"Vests: {vest_count}, Other Clothes: {other_clothes_count}"208    cv2.putText(frame, summary_text, (frame_width - 300, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)209 210    return frame, vest_count, other_clothes_count211 212def detect_falls(frame, confidence_threshold=0.5):213    # 假设输入图像是RGB格式,转换为BGR214    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)215 216    LABELS = ['fall', 'person']217    # 初始化摔倒计数器218    fall_count = 0219 220    # 使用模型进行检测221    bboxes, labels, masks = fall_detector(frame)222    223    for bbox, label_id in zip(bboxes, labels):224        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]225        if score < confidence_threshold:226            continue227        if LABELS[label_id] == 'fall':  # 仅显示摔倒的标注框228            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)229            label_text = f"{LABELS[label_id]}: {int(score*100)}%"230            cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)231            # 递增摔倒计数器232            fall_count += 1233 234    # 转换图像回RGB格式235    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)236 237    # 返回处理后的图像和摔倒的数量238    return frame, fall_count239 240def leaf_disease_detection(frame, confidence_threshold=0.3):241    # 假设输入图像是RGB格式,转换为BGR242    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)243 244    LABELS = ['disease']245    # 初始化病害计数器246    disease_count = 0247    bboxes, labels, masks = disease_object_detector(frame)248    indices = [i for i in range(len(bboxes))]249    for index, bbox, label_id in zip(indices, bboxes, labels):250        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]251        if score < confidence_threshold:252            continue253        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 1)254        label_text = f"{LABELS[label_id]}: {int(score*100)}%"255        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)256 257        if masks[index].size:258            mask = masks[index]259            blue, green, red = cv2.split(frame)260            if mask.shape == frame.shape[:2]:261                mask_img = blue262            else:263                x0 = int(max(math.floor(bbox[0]) - 1, 0))264                y0 = int(max(math.floor(bbox[1]) - 1, 0))265                mask_img = blue[y0:y0 + mask.shape[0], x0:x0 + mask.shape[1]]266            cv2.bitwise_or(mask, mask_img, mask_img)267            frame = cv2.merge([blue, green, red])268        # 递增病害计数器269        disease_count += 1270 271    # 转换图像回RGB格式272    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)273 274    # 返回处理后的图像、病害计数和保存的图像路径275    return frame, disease_count276 277def detect_masks(frame, confidence_threshold=0.5):278    # 假设输入图像是RGB格式,转换为BGR279    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)280 281    LABELS = ['unfit', 'mask', 'nomask']282    # 初始化三个标签的计数器283    mask_count, nomask_count, unfit_count = 0, 0, 0284 285    # 使用模型进行检测286    bboxes, labels, masks = mask_detector(frame)287    288    for bbox, label_id in zip(bboxes, labels):289        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]290        if score < confidence_threshold:291            continue292 293        # 根据标签ID判断类别,并进行相应的计数294        if LABELS[label_id] == 'mask':295            mask_count += 1296            color = (0, 255, 0)297        elif LABELS[label_id] == 'nomask':298            nomask_count += 1299            color = (0, 0, 255)300        elif LABELS[label_id] == 'unfit':301            unfit_count += 1302            color = (255, 0, 0)303        304        cv2.rectangle(frame, (left, top), (right, bottom), color, 2)305        label_text = f"{LABELS[label_id]}: {int(score*100)}%"306        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 1)307 308    # 转换图像回RGB格式309    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)310 311    # 返回处理后的图像和每个标签的数量312    return frame, mask_count, nomask_count, unfit_count313 314def helmet_detection(frame, confidence_threshold=0.3):315 316    HEL_LABELS = ['head', 'helmet']317    bboxes, labels, masks = helmet_detector(frame)318    valid_indices = [i for i, bbox in enumerate(bboxes) if bbox[4] >= confidence_threshold]319    320    helmet_count = 0321    head_count = 0322    323    for i in valid_indices:324        bbox = bboxes[i]325        label_id = labels[i]326        [left, top, right, bottom], score = bbox[0:4].astype(int), bbox[4]327        328        if HEL_LABELS[label_id] == 'helmet':329            color = (0, 255, 0)  # Green color for 'helmet'330            line_thickness = 1331            font_scale = 0.5332        elif HEL_LABELS[label_id] == 'head':333            color = (255, 0, 0)  # Red color for 'head'334            line_thickness = 1  # Increased line thickness for 'head' boxes335            font_scale = 0.5  # Decreased font size for 'head' labels336 337        cv2.rectangle(frame, (left, top), (right, bottom), color, thickness=line_thickness)338        label_text = HEL_LABELS[label_id] + f" ({score:.2f})"339        cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)340 341        if HEL_LABELS[label_id] == 'helmet':342            helmet_count += 1343        elif HEL_LABELS[label_id] == 'head':344            head_count += 1345 346    return frame, helmet_count, head_count347 348 349 350def human_calculation(frame, confidence_threshold=0.3):351    """352    Process the given image to count the number of humans.353    """354    HEL_LABELS = ['head', 'helmet']355    bboxes, labels, masks = helmet_detector(frame)356    357    human_count = 0  # Initialize human count358    359    for i in range(len(bboxes)):360        bbox = bboxes[i]361        label_id = labels[i]362        score = bbox[4]363        364        # Check if the label is 'head' or 'helmet' and the score is greater than confidence_threshold365        if HEL_LABELS[label_id] in ['head', 'helmet'] and score > confidence_threshold:366            human_count += 1367            [left, top, right, bottom] = bbox[0:4].astype(int)368            cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), thickness=1)  # Red color for boxes369            label_text = f"human ({score:.2f})"  # Include confidence score in label_text370            cv2.putText(frame, label_text, (left, top - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 1)371 372 373    return frame, human_count374 375 376def red_tree(img):377    img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)378    def get_palette(num_classes=2):379        return [(255, 255, 255), (255, 0, 0)]380    seg = red_tree_segmentor(img_bgr)381    red_tree_pixel_count = np.sum(seg == 1)382    current_palette = get_palette()383    color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)384    for label, color in enumerate(current_palette):385        color_seg[seg == label, :] = color386    color_seg_bgr = color_seg[..., ::-1]387 388    img_bgr = img_bgr * 0.5 + color_seg_bgr * 0.5389    img_bgr = img_bgr.astype(np.uint8)390    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)391 392    return img_rgb, red_tree_pixel_count393 394 395def leaf_disease(img):396    img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)397    398    def get_palette(num_classes=3):399        return [(255, 255, 255), (0, 255, 0), (255, 0, 0)]400 401    seg = leaf_disease_segmentor(img_bgr)402    403    leaf_pixel_count = np.sum(seg == 1)404    disease_pixel_count = np.sum(seg == 2)405    406    current_palette = get_palette()407    color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)408    409    for label, color in enumerate(current_palette):410        color_seg[seg == label, :] = color411    412    color_seg_bgr = color_seg[..., ::-1]413    img_bgr = img_bgr * 0.5 + color_seg_bgr * 0.5414    img_bgr = img_bgr.astype(np.uint8)415    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)416    417    return img_rgb, leaf_pixel_count, disease_pixel_count418 419def single_label_disease(img):420    img_bgr = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)421    422    def get_palette(num_classes=2):423        return [(255, 255, 255), (255, 0, 0)]424 425    seg = single_label_disease_segmentor(img_bgr)426    427    disease_pixel_count = np.sum(seg == 1)428    429    current_palette = get_palette()430    color_seg = np.zeros((seg.shape[0], seg.shape[1], 3), dtype=np.uint8)431    432    for label, color in enumerate(current_palette):433        color_seg[seg == label, :] = color434    435    color_seg_bgr = color_seg[..., ::-1]436    img_bgr = img_bgr * 0.5 + color_seg_bgr * 0.5437    img_bgr = img_bgr.astype(np.uint8)438    img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)439 440    441    return img_rgb, disease_pixel_count442 443 444 445def get_image_examples():446    image_dir = "/mnt/e/AI/mmdeploy/gradio/photo"447    image_files = [f for f in os.listdir(image_dir) if f.endswith(('.png', '.jpg', '.jpeg'))]448    image_files.sort(key=lambda f: int(''.join(filter(str.isdigit, f))))  # 按数字排序449    example_choices = [450        '红树林识别', '红树林识别', '红树林识别', 451        '安全帽检测', '安全帽检测', '安全帽检测',452        '人数统计', '人数统计', '人数统计',453        '反光衣检测','反光衣检测','反光衣检测',454        '道路车辆统计', '道路车辆统计', '道路车辆统计',455        '裂缝识别', '裂缝识别', '裂缝识别',456        '吸烟检测','吸烟检测','吸烟检测',457        '树叶病害识别1','树叶病害识别1','树叶病害识别1',458        '树叶病害识别2','树叶病害识别2','树叶病害识别2',459        '树叶病害检测3','树叶病害检测3','树叶病害检测3',460        '摔倒检测','摔倒检测','摔倒检测',461        '口罩佩戴检测','口罩佩戴检测','口罩佩戴检测',462    ]463    464    confidence_thresholds = [465    0, 0, 0, 466    0.7, 0.8, 0.6, 467    0.3, 0.8, 0.5, 468    0.8, 0.7, 0.8, 469    0.5, 0.2, 0.7, 470    0, 0, 0, 471    0.6, 0.9, 0.5, 472    0, 0, 0, 473    0, 0, 0, 474    0.4, 0.4, 0.5, 475    0.9, 0.9, 0.5, 476    0.8, 0.6, 0.5477]478    examples = [[example_choices[i], f"{image_dir}/{image_file}", confidence_thresholds[i]] for i, image_file in enumerate(image_files)]479    return examples480 481  482 483 484model_choices = ['红树林识别','裂缝识别','树叶病害识别1','树叶病害识别2','树叶病害检测3', '安全帽检测','反光衣检测', '吸烟检测','摔倒检测', '口罩佩戴检测','人数统计','道路车辆统计']485 486 487def create_blank_image(width=640, height=480, color=(255, 255, 255)):488    blank_image = np.zeros((height, width, 3), np.uint8)489    blank_image[:, :] = color490    return blank_image491 492def process_image(model_choice, image_array=None, confidence_threshold=0.3):493    output_text = '当前未有图片输入,请上传图片后再次点击运行。'494    495    if image_array is None:496        img = create_blank_image()497    else:498        if model_choice not in model_choices:499            model_choice = "安全帽检测"500        # 以下是模型选择和执行逻辑501        if model_choice == "红树林识别":502            img, red_tree_pixel_count = red_tree(image_array)  # 语义分割模型503            output_text = f"红树林的像素点有 {red_tree_pixel_count} 个。"504        elif model_choice == "安全帽检测":505            img, helmet_count, head_count = helmet_detection(image_array, confidence_threshold)506            output_text = f"佩戴安全帽的人数为:{helmet_count},未佩戴安全帽的人数为:{head_count}。"507        elif model_choice == "人数统计":508            img, human_count = human_calculation(image_array, confidence_threshold)509            output_text = f"该图片人员总人数为: {human_count}。"510        elif model_choice == "反光衣检测":511            img, vest_count, other_clothes_count= vest_detection(image_array, confidence_threshold)512            output_text = f"该图片中总有 {vest_count} 人配备了反光衣,{other_clothes_count} 人没有配备反光衣。"513        elif model_choice == "道路车辆统计":514            img, car_count = car_calculation(image_array, confidence_threshold)515            output_text = f"该道路上目前共有 {car_count} 台车辆。"516        elif model_choice == "裂缝识别":517            img, crack_result, crack_pixel_count = crack_classification(image_array, confidence_threshold)518            if crack_result == "Positive":519                output_text = f"该图片内存在裂缝,裂缝的像素点有 {crack_pixel_count} 个。"520            else:521                output_text = "该图片不存在裂缝。"522        elif model_choice == "树叶病害检测3":  523            img, disease_count = leaf_disease_detection(image_array, confidence_threshold)524            if disease_count > 0:525                output_text = f"共检测到 {disease_count} 处病害。"526            else:527                output_text = "并未检测到病害。"528        elif model_choice == "吸烟检测":529            img, smoker_count = smoker_detector(image_array, confidence_threshold)530            output_text = f"当前图片有 {smoker_count} 人在吸烟。"531        elif model_choice == "树叶病害识别1":532            img, leaf_pixel_count, disease_pixel_count = leaf_disease(image_array)  # 语义分割模型533            if disease_pixel_count == 0:534                output_text = "该树叶并未出现病害。"535            else:536                output_text = f"病害的像素点有 {disease_pixel_count} 个。"537        elif model_choice == "树叶病害识别2":  538            img, disease_pixel_count = single_label_disease(image_array)  # 语义分割模型539            output_text = f"病害的像素点有 {disease_pixel_count} 个。"540        elif model_choice == "摔倒检测":  # 您可以根据实际情况调整模型选择的名称541            img, fall_count = detect_falls(image_array,confidence_threshold)542            output_text = f"图像中摔倒的人数为 {fall_count} 人。"543        elif model_choice == "口罩佩戴检测":  # 您可以根据实际情况调整模型选择的名称544            img, mask_count, nomask_count, unfit_count = detect_masks(image_array,confidence_threshold)545            output_text = f"当前佩戴口罩的人数为 {mask_count},未正确佩戴口罩的人数为 {unfit_count},没有佩戴口罩的人数为 {nomask_count}。"546            547    return img, output_text548 549def process_video(model_choice, video=None, confidence_threshold=0.3):550 551    # 内部函数:创建空白视频552    def create_blank_video(filename, duration=5, fps=30, width=640, height=480, color=(255, 255, 255)):553        fourcc = cv2.VideoWriter_fourcc(*'mp4v')  # 使用mp4v编解码器554        out = cv2.VideoWriter(filename, fourcc, fps, (width, height))555        blank_image = np.zeros((height, width, 3), np.uint8)556        blank_image[:, :] = color557        for _ in range(int(fps * duration)):558            out.write(blank_image)559        out.release()560 561    # 检查视频是否存在562    if video is None:563        video_output_path = '/mnt/e/AI/mmdeploy/gradio/video/none.mp4'564        create_blank_video(video_output_path)565        output_text2 = '当前未有视频输入,请上传视频后再次点击运行。'566        return video_output_path, output_text2567    else:568        video_output_path = '/mnt/e/AI/mmdeploy/gradio/video/output_video.mp4'569        cap = cv2.VideoCapture(video)570        if not cap.isOpened():571            raise ValueError("无法打开视频文件")572        fps = int(cap.get(cv2.CAP_PROP_FPS))573        num_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))574        # 获取输入视频的分辨率575        width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))576        height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))577        # 使用帧采样的逻辑,但考虑到所有帧都需要处理,我们使用间隔为1的采样。578        clip_len, frame_interval, num_clips = 1, 1, num_frames579        avg_interval = (num_frames - clip_len * frame_interval + 1) / float(num_clips)580        frame_inds = []581        for i in range(num_clips):582            clip_offset = int(i * avg_interval + avg_interval / 2.0)583            for j in range(clip_len):584                ind = (j * frame_interval + clip_offset) % num_frames585                if num_frames <= clip_len * frame_interval - 1:586                    ind = j % num_frames587                frame_inds.append(ind)588 589        fourcc = cv2.VideoWriter_fourcc(*'mp4v')590        processed_frames = []591        for frame_id in sorted(frame_inds): 592            cap.set(cv2.CAP_PROP_POS_FRAMES, frame_id)  # 设置读取特定的帧593            ret, frame = cap.read()594            if not ret:595                break596            # 将帧率添加到视频的左上角597            cv2.putText(frame, "FPS: {}".format(fps), (10, 30), 598                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)599            600            if model_choice == "红树林识别":601                # 在此处调用红树林模型处理帧602                processed_frame, red_tree_pixel_count = red_tree(frame)603                    # 在处理后的帧的右上角添加文字604                cv2.putText(processed_frame, "Number of pixels in this frame: {}".format(red_tree_pixel_count), 605                            (processed_frame.shape[1] - 300, 30), cv2.FONT_HERSHEY_SIMPLEX, 606                            0.7, (255, 255, 255), 2)607 608 609            elif model_choice == "安全帽检测":610                # 在此处调用安全帽检测模型处理帧611                processed_frame, helmet_count, head_count = helmet_detection(frame, confidence_threshold)612                613                cv2.putText(processed_frame, "Number of people wearing helmets: {}".format(helmet_count), 614                (processed_frame.shape[1] - 400, 30), cv2.FONT_HERSHEY_SIMPLEX, 615                0.7, (255, 255, 255), 2)616    617                # 在上一行文字下方添加表示未佩戴安全帽的人数的文字618                cv2.putText(processed_frame, "Number of people without helmets: {}".format(head_count - helmet_count), 619                            (processed_frame.shape[1] - 450, 60), cv2.FONT_HERSHEY_SIMPLEX, 620                            0.7, (255, 255, 255), 2)621 622 623            elif model_choice == "人数统计":624                # 在此处调用人数统计模型处理帧625                processed_frame, human_count = human_calculation(frame, confidence_threshold)626                cv2.putText(processed_frame, "Current number of people: {}".format(human_count), 627                (processed_frame.shape[1] - 300, 30), cv2.FONT_HERSHEY_SIMPLEX, 628                0.7, (255, 255, 255), 2)629 630            elif model_choice == "反光衣检测":631                # 在此处调用反光衣检测模型处理帧632                processed_frame, vest_count, other_clothes_count= vest_detection(image_array, confidence_threshold)633                cv2.putText(processed_frame, "Number of reflective vests: {}".format(vest_count), 634                (processed_frame.shape[1] - 350, 30), cv2.FONT_HERSHEY_SIMPLEX, 635                0.7, (255, 255, 255), 2)636                cv2.putText(processed_frame, "Number without reflective vests: {}".format(other_clothes_count), 637                        (processed_frame.shape[1] - 450, 60), cv2.FONT_HERSHEY_SIMPLEX, 638                        0.7, (255, 255, 255), 2)639 640            elif model_choice == "道路车辆统计":641                # 在此处调用道路车辆统计模型处理帧642                processed_frame, car_count = car_calculation(frame, confidence_threshold)643                cv2.putText(processed_frame, "Number of vehicles: {}".format(car_count), 644                (processed_frame.shape[1] - 250, 30), cv2.FONT_HERSHEY_SIMPLEX, 645                0.7, (255, 255, 255), 2)               646 647            elif model_choice == "裂缝识别":648                # 在此处调用裂缝识别模型处理帧649                processed_frame, crack_pixel_count= crack_detection(frame)650 651            elif model_choice == "树叶病害检测3":652                # 在此处调用树叶病害检测模型处理帧653                processed_frame, disease_count= leaf_disease_detection(frame, confidence_threshold)654                # 在图像右上角显示叶片的病害数量655                label_text = f"Leaf Disease Count: {disease_count}"656                color = (0, 0, 255)  # 红色657                font_scale = 0.8658                line_thickness = 2659                text_size = cv2.getTextSize(label_text, cv2.FONT_HERSHEY_SIMPLEX, font_scale, line_thickness)[0]660                cv2.putText(processed_frame, label_text, (processed_frame.shape[1] - text_size[0] - 10, text_size[1] + 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, color, line_thickness)661 662 663 664            elif model_choice == "吸烟检测":665                # 在此处调用吸烟检测模型处理帧666                processed_frame, smoker_count = smoker_detector(frame, confidence_threshold)667 668                # 准备要显示的文本669                text = f"吸烟者数量: {smoker_count}"670 671                # 获取文本大小672                text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 2)[0]673 674                # 计算文本的位置,以便它出现在帧的右上角675                text_position = (processed_frame.shape[1] - text_size[0] - 10, text_size[1] + 10)676 677                # 将文本绘制到帧上678                cv2.putText(processed_frame, text, text_position, cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)679                680            elif model_choice == "树叶病害识别1":681                # 在此处调用树叶病害识别模型处理帧682                processed_frame, _, disease_pixel_count = leaf_disease(frame)683                text = f"Current disease pixel count on the leaf: {disease_pixel_count}"684                text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 2)[0]685                cv2.putText(processed_frame, text, 686                            (processed_frame.shape[1] - text_size[0] - 10, text_size[1] + 10), 687                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)688 689 690            elif model_choice == "树叶病害识别2":  691                # 在此处调用树叶病害识别模型处理帧692                processed_frame, disease_pixel_count= single_label_disease(frame)693                text = f"Current disease pixel count on the leaf: {disease_pixel_count}"694                text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 2)[0]695                cv2.putText(processed_frame, text, 696                            (processed_frame.shape[1] - text_size[0] - 10, text_size[1] + 10), 697                            cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)698                699            elif model_choice == "口罩佩戴检测":  # 您可以根据实际情况调整模型选择的名称700                processed_frame, mask_count, nomask_count, unfit_count = detect_masks(frame,confidence_threshold)701                cv2.putText(processed_frame, "Number wearing masks: {}".format(mask_count), 702                            (processed_frame.shape[1] - 350, 30), cv2.FONT_HERSHEY_SIMPLEX, 703                            0.7, (255, 255, 255), 2)704 705                cv2.putText(processed_frame, "Number not wearing masks: {}".format(nomask_count), 706                            (processed_frame.shape[1] - 400, 60), cv2.FONT_HERSHEY_SIMPLEX, 707                            0.7, (255, 255, 255), 2)708 709                cv2.putText(processed_frame, "Number wearing masks incorrectly: {}".format(unfit_count), 710                            (processed_frame.shape[1] - 500, 90), cv2.FONT_HERSHEY_SIMPLEX, 711                            0.7, (255, 255, 255), 2)712                713            elif model_choice == "摔倒检测":  714                715                processed_frame, fall_count= detect_falls(frame,confidence_threshold)716                cv2.putText(processed_frame, "Number of people who fell: {}".format(fall_count), 717            (processed_frame.shape[1] - 350, 30), cv2.FONT_HERSHEY_SIMPLEX, 718            0.7, (255, 255, 255), 2)719 720            processed_frames.append(processed_frame)721        out = cv2.VideoWriter(video_output_path, fourcc, fps, (width,height))722        for frame in processed_frames:723            out.write(frame)724        out.release()725        cap.release()726        output_text2 = '请点击蓝色按钮下载视频。'727    return video_output_path, output_text2728 729with gr.Blocks() as demo:730    gr.Markdown("# <center>启云科技AI识别示例样板V1.12</center>")731    gr.Markdown("请上传图像或视频进行预测")732    with gr.Tab("AI图像处理"):733        with gr.Row():734            image_input2 = gr.Image(label="上传图像", type="numpy")735            with gr.Column():736                image_input1 = gr.Dropdown(choices=model_choices, label="模型选择")737                image_input3 = gr.Slider(minimum=0, maximum=1, step=0.1, label="置信度阈值")738        with gr.Row():739            image_output1 = gr.Image(label="处理后的图像", type="numpy")740            with gr.Column():741                image_output2 = gr.Textbox(label="图像输出信息")742        image_button = gr.Button('请点击按钮进行图像预测')743        gr.Examples(get_image_examples(),inputs=[image_input1, image_input2, image_input3],outputs=[image_output1, image_output2], fn=process_image ,examples_per_page=6 ,cache_examples=True)744    with gr.Tab("AI视频处理"):745 746        with gr.Row():747            video_input2 = gr.Video(label = '上传视频', format='mp4',interactive = True)748            with gr.Column():749                video_input1 = gr.Dropdown(choices=model_choices, label="模型选择")750                video_input3 = gr.Slider(minimum=0, maximum=1, 751                                         step=0.1, label="置信度阈值")752        with gr.Row():753            video_output1 = gr.File(label='处理后的视频', type='file')754            with gr.Column():755                video_output2 = gr.Textbox(label = '视频输出信息')   756        video_button = gr.Button('请点击按钮进行视频预测')757    with gr.Accordion("平台简介"):758        gr.Markdown("红树林识别模型、裂缝识别模型、树叶病害识别模型、安全帽检测模型、反光衣检测模型、吸烟检测模型、口罩佩戴检测、摔倒检测、人数统计模型及道路车辆统计模型展示平台。")759    image_button.click(process_image, inputs = [image_input1, image_input2, image_input3], outputs=[image_output1, image_output2])760    video_button.click(process_video, inputs=[video_input1,video_input2, video_input3], outputs=[video_output1, video_output2])761 762demo.launch(share=True)763 764