2024“大运河杯”数据开发大赛:城市治理 baseline

学术   2024-08-23 08:33   日本  

unsetunset赛题描述unsetunset

赛题链接:https://www.marsbigdata.com/competition/details?id=3839107548872

报名来源请填写 datawhale

随着城市化步伐的加速迈进,城市治理面临着前所未有的挑战与机遇。城市管理的精细化、智能化已成为全球城市追求卓越的关键路径。然而,机动车违停、非机动车违停、占道经营等城市违规行为如同现代都市肌体上的疮疤,不仅侵蚀着城市的美学与秩序,更对公众福祉构成了潜在威胁。传统的人力巡查与被动响应模式,已然无法匹配当今城市治理的需求。

本赛题最终目标是开发一套智能识别系统,能够自动检测和分类城市管理中的违规行为。该系统应利用先进的图像处理和计算机视觉技术,通过对摄像头捕获的视频进行分析,自动准确识别违规行为,并及时向管理部门发出告警,以实现更高效的城市管理。

unsetunset赛题题目unsetunset

城市管理违规行为智能识别

unsetunset赛题任务unsetunset

【初赛】

初赛任务是根据给定的城管视频监控数据集,进行城市违规行为的检测。违规行为主要包括垃圾桶满溢、机动车违停、非机动车违停等。

选手需要能够从视频中分析并标记出违规行为,提供违规行为发生的时间和位置信息。

【复赛】

复赛任务是根据给定的城管视频监控数据集,进行城市违规行为的检测。违规行为主要包括违法经营、垃圾桶满溢、机动车违停、非机动车违停等。

选手需要基于大赛提供的复赛环境,进行复赛模型构建与预测,同时复赛数据集对选手不可见。

【决赛】

具体时间待定,决赛阶段采用线下或者线上答辩的方式(待定),晋级决赛队伍需要提前准备答辩PPT及相关支撑材料,评委将根据选手的初复赛及答辩表现进行综合评分,决定最终排名。

unsetunset数据描述unsetunset

【初赛】

初赛提供城管视频监控数据与对应违规行为标注。违规行为包括垃圾桶满溢、机动车违停、非机动车违停等。

视频数据为mp4格式,标注文件为json格式,每个视频对应一个json文件。

json文件的内容是每帧检测到的违规行为,包括以下字段:

  • frame_id:违规行为出现的帧编号
  • event_id:违规行为ID
  • category:违规行为类别
  • bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式

标注示例如下:

[
  {
   "frame_id": 20,
   "event_id": 1,
   "category""机动车违停",
   "bbox": [200, 300, 280, 400]
  },
  {
   "frame_id": 20,
   "event_id": 2,
   "category""机动车违停",
   "bbox": [600, 500, 720, 560]
  },
  {
   "frame_id": 30,
   "event_id": 3,
   "category""垃圾桶满溢",
   "bbox": [400, 500, 600, 660]
  }
 ]

违规行为示例如下:

垃圾桶满溢

机动车违停

非机动车违停

【复赛】

复赛提供城管视频监控数据与对应违规行为标注。违规行为包括违法经营、垃圾桶满溢、机动车违停、非机动车违停等。

数据与初赛数据格式相同,新增违法经营类别,行为示例如下:

违法经营

unsetunset评估指标unsetunset

【初赛】

使用F1score、MOTA指标来评估模型预测结果。

img

对每个json文件得到两个指标的加权求和,最终得分为所有文件得分取均值。

注1:若真实目标框与预测框IOU大于0.5,则判定目标正确识别。若MOTA指标为负,则该类别精度得分为0。

注2:若该视频中没有某个类别的目标,则此类别计算均值时,忽略该视频。

赛】

复赛需同时评估模型的准确度与效率。

模型准确率评估指标与初赛一致,使用F1score、MOTA进行评估。

模型效率使用FPS(每秒钟能够处理的帧数)等进行评估。

unsetunset提交说明unsetunset

###【初赛】**

选手需要生成result文件夹,文件夹中包含每个视频对应的json结果文件,文件名与视频名对应。选手需要将文件夹打包成result.zip进行上传。

json文件中包含了检测到的违规行为列表,若未检测到违规行为,则列表为空。

每个违规行为包含的字段如下:

  • frame_id:违规行为出现的帧编号
  • event_id:违规行为ID
  • category:违规行为类别
  • bbox:检测到的违规行为矩形框的坐标,[xmin,ymin,xmax,ymax]形式
  • confidence:置信度

提交的json示例如下:

[
  {
   "frame_id": 20,
   "event_id": 1,
   "category""机动车违停",
   "bbox": [200, 300, 280, 500],
   "confidence": 0.85
  },
  {
   "frame_id": 20,
   "event_id": 2,
   "category""垃圾桶满溢",
   "bbox": [600, 500,720, 560],
   "confidence": 0.90
  },
  {
   "frame_id": 30,
   "event_id": 3,
   "category""垃圾桶满溢",
   "bbox": [400, 500, 500, 560],
   "confidence": 0.78
  }
 ]

【复赛】

复赛与初赛的提交内容一致。

unsetunset违法标准unsetunset

【机动车违停】

机动车在设有禁止停车标志、标线的路段停车,或在非机动车道、人行横道、施工地段等禁止停车的地方停车。具体包含以下:

1、无论有无禁停标志,机动车道禁止车辆停放;

2、距路口、桥梁50米以内禁止车辆停放;

3、距公交车站、消防栓、消防队、医院30米以内禁止使用上述设施以外的车辆停放;

4、禁止车辆双排停放、靠左侧停放、横向停放、逆向停放;

5、人行道仅允许在已设置的停车泊位内停车,禁止在停车泊位外停车;

6、在设有禁停标志、标线的路段,人行横道、施工路段,不得停车。

【非机动车违停】

非机动车(如自行车、‌电动车等)‌未按照规定停放在指定的非机动车停车泊位或停车线内,‌而是在非机动车禁停区域或未划定的区域(消防通道、盲道、非机动车停车区线外、机动车停车区等)随意停放。

【垃圾满溢】

生活垃圾收集容器内垃圾超过三分之二以上即为满溢。垃圾桶无法封闭、脏污且周边有纸屑、污渍、塑料、生活垃圾及杂物堆放。

【占道经营】

经营者占用城市道路、桥梁、城市广场等公共场所进行盈利性买卖商品或服务的行为。

unsetunsetBaseline介绍unsetunset

读取数据集

train_annos = glob.glob('训练集(有标注第一批)/标注/*.json')
train_videos = glob.glob('训练集(有标注第一批)/视频/*.mp4')
train_annos.sort(); train_videos.sort();

category_labels = ["非机动车违停""机动车违停""垃圾桶满溢""违法经营"]

生成YOLO格式

for anno_path, video_path in zip(train_annos[:5], train_videos[:5]):
    print(video_path)
    anno_df = pd.read_json(anno_path)
    cap = cv2.VideoCapture(video_path)
    frame_idx = 0 
    while True:
        ret, frame = cap.read()
        if not ret:
            break

        img_height, img_width = frame.shape[:2]
        
        frame_anno = anno_df[anno_df['frame_id'] == frame_idx]
        cv2.imwrite('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.jpg', frame)

        if len(frame_anno) != 0:
            with open('./yolo-dataset/train/' + anno_path.split('/')[-1][:-5] + '_' + str(frame_idx) + '.txt''w') as up:
                for category, bbox in zip(frame_anno['category'].values, frame_anno['bbox'].values):
                    category_idx = category_labels.index(category)
                    
                    x_min, y_min, x_max, y_max = bbox
                    x_center = (x_min + x_max) / 2 / img_width
                    y_center = (y_min + y_max) / 2 / img_height
                    width = (x_max - x_min) / img_width
                    height = (y_max - y_min) / img_height

                    if x_center > 1:
                        print(bbox)
                    up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')
        
        frame_idx += 1

模型训练与验证

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

import warnings
warnings.filterwarnings('ignore')


from ultralytics import YOLO
model = YOLO("yolov8n.pt")
results = model.train(data="yolo-dataset/yolo.yaml", epochs=2, imgsz=1080, batch=16)

测试集预测

from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
import glob

for path in glob.glob('测试集/*.mp4'):
    submit_json = []
    results = model(path, conf=0.05, imgsz=1080,  verbose=False)
    for idx, result in enumerate(results):
        boxes = result.boxes  # Boxes object for bounding box outputs
        masks = result.masks  # Masks object for segmentation masks outputs
        keypoints = result.keypoints  # Keypoints object for pose outputs
        probs = result.probs  # Probs object for classification outputs
        obb = result.obb  # Oriented boxes object for OBB outputs

        if len(boxes.cls) == 0:
            continue
        
        xywh = boxes.xyxy.data.cpu().numpy().round()
        cls = boxes.cls.data.cpu().numpy().round()
        conf = boxes.conf.data.cpu().numpy()
        for i, (ci, xy, confi) in enumerate(zip(cls, xywh, conf)):
            submit_json.append(
                {
                    'frame_id': idx,
                    'event_id': i+1,
                    'category': category_labels[int(ci)],
                    'bbox': list([int(x) for x in xy]),
                    "confidence"float(confi)
                }
            )

    with open('./result/' + path.split('/')[-1][:-4] + '.json''w', encoding='utf-8') as up:
        json.dump(submit_json, up, indent=4, ensure_ascii=False)

完整代码见:https://github.com/datawhalechina/competition-baseline/tree/master/competition


 学习大模型 & 讨论Kaggle  #


△长按添加竞赛小助手

每天大模型、算法竞赛、干货资讯

与 36000+来自竞赛爱好者一起交流~

Coggle数据科学
Coggle全称Communication For Kaggle,专注数据科学领域竞赛相关资讯分享。
 最新文章