Datawhale AI夏令营第五期CV方向-城市管理违规行为智能识别-Task1

news/2024/9/18 14:56:32/ 标签: 人工智能, 算法

赛题解析

城市管理违规行为智能识别
初赛任务是根据给定的城管视频监控数据集,进行城市违规行为的检测。违规行为主要包括垃圾桶满溢、机动车违停、非机动车违停等。
选手需要能够从视频中分析并标记出违规行为,提供违规行为发生的时间和位置信息。

数据可视化

首先对现有数据可视化,直观地了解数据集。

import os
import cv2
import json
from PIL import Image, ImageDraw, ImageFont# 文件夹路径
video_folder = r"D:\Illegal_behavior_detection\训练集(有标注第一批)\视频"
annotation_folder = r"D:\Illegal_behavior_detection\训练集(有标注第一批)\标注"
output_folder = r"D:\Illegal_behavior_detection\训练集(有标注第一批)\标注视频"# 如果输出文件夹不存在,则创建
os.makedirs(output_folder, exist_ok=True)# 获取所有视频文件
video_files = [f for f in os.listdir(video_folder) if f.endswith('.mp4')]
labeled_video_files = [f for f in os.listdir(output_folder) if f.endswith('.mp4')]
# 类别对应的颜色
category_colors = {"非机动车违停": (0, 0, 255),    # 红色"机动车违停": (0, 255, 255),    # 黄色"垃圾桶满溢": (255, 0, 0),      # 蓝色"违法经营": (0, 255, 0)         # 绿色
}# 加载字体,指定一个支持中文的字体文件路径
font = ImageFont.truetype("simhei.ttf", 24) for video_file in video_files:if video_file in labeled_video_files: continuevideo_path = os.path.join(video_folder, video_file)annotation_path = os.path.join(annotation_folder, video_file.replace('.mp4', '.json'))# 读取视频cap = cv2.VideoCapture(video_path)if not cap.isOpened():print(f"无法打开视频文件: {video_file}")continue# 获取视频的宽、高、帧率width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = cap.get(cv2.CAP_PROP_FPS)# 创建保存视频的对象output_path = os.path.join(output_folder, video_file)fourcc = cv2.VideoWriter_fourcc(*'mp4v')out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))# 读取标注文件with open(annotation_path, 'r', encoding='utf-8') as f:annotations = json.load(f)frame_id_to_annotations = {}for annotation in annotations:frame_id = annotation['frame_id']if frame_id not in frame_id_to_annotations:frame_id_to_annotations[frame_id] = []frame_id_to_annotations[frame_id].append(annotation)frame_id = 0while True:ret, frame = cap.read()if not ret:breakif frame_id in frame_id_to_annotations:# 将OpenCV的图像转换为PIL图像frame_pil = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(frame_pil)for ann in frame_id_to_annotations[frame_id]:bbox = ann['bbox']category = ann['category']# 获取类别对应的颜色color = category_colors.get(category, (255, 255, 255))  # 如果类别不在字典中,则默认白色# 绘制矩形框draw.rectangle([bbox[0], bbox[1], bbox[2], bbox[3]], outline=color, width=2)# 添加类别标签draw.text((bbox[0], bbox[1] - 25), category, font=font, fill=color)# 将PIL图像转换回OpenCV格式frame = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)# 写入当前帧out.write(frame)frame_id += 1cap.release()out.release()print("标注视频已成功生成并保存到输出文件夹。")

在这里插入图片描述
在观看视频中,发现部分数据标注严重错误,需要用标注软件进行修正。

标注格式转换

由于视频趋于同质化,且帧之间区别不大,将所有帧(60000+)用于训练没有意义,故进行抽帧,将数据集大小减小至6000。

for anno_path, video_path in zip(annos, videos):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:breakif frame_idx % 10 == 0:img_height, img_width = frame.shape[:2]frame_anno = anno_df[anno_df['frame_id'] == frame_idx]cv2.imwrite(img_path + os.path.basename(anno_path).split('.')[0] + '_' + str(frame_idx) + '.jpg', frame)if len(frame_anno) != 0:with open(label_path + os.path.basename(anno_path).split('.')[0] + '_' + 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 = bboxx_center = (x_min + x_max) / 2 / img_widthy_center = (y_min + y_max) / 2 / img_heightwidth = (x_max - x_min) / img_widthheight = (y_max - y_min) / img_heightif x_center > 1 or y_center > 1:print(bbox)up.write(f'{category_idx} {x_center} {y_center} {width} {height}\n')frame_idx += 1

标注清洗

针对标注严重错误的视频,使用X-Anylabeling重新进行标注,导出yolo标注文件。

模型训练

最后遵循教程进行训练并提交结果。

个人思考

  1. 标注有待优化。
  2. 训练集位置单一,测试集场景和训练集完全隔离,预估必须增加数据集训练。
  3. 如何区分正常停放车辆和违规停放车辆是个需要思考的问题。

http://www.ppmy.cn/news/1516947.html

相关文章

提示工程自动化实践

提示工程很糟糕。 这是使用大型语言模型最乏味的部分。这些模型非常挑剔,对提示进行看似无害的更改可能会导致截然不同的结果。我厌倦了手动调整、不系统的变化以及与手动提示工程相关的头痛…… 首先让我们统一认识,提示工程是指对 AI 模型给出的指令…

Elasticsearch 8 RAG 技术分享

Tech Day 本文由Elastic 中国区首席架构师 Jerry Zhu 在【AI搜索 TechDay】上的分享整理而成。【AI搜索 TechDay】 是 Elastic 和阿里云联合主办的 AI 技术Meetup系列,聚焦企业级 AI 搜索应用和开发者动手实践,旨在帮助开发者在大模型浪潮下升级 AI搜索…

探索Facebook的AI算法:如何优化用户体验

在数字化时代,社交媒体平台不断引领着技术创新的潮流。作为全球领先的社交平台之一,Facebook在人工智能(AI)算法的应用上取得了显著进展,极大地提升了用户的社交体验。本文将探讨Facebook如何通过先进的AI算法优化用户…

第4章 汇编语言和汇编软件

第4章 汇编语言和汇编软件 该章主要介绍了汇编语言和汇编语言编译器的安装和使用。 汇编语言程序 该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。 书中有提到CPU有不同的架构,汇编语言有不同的风格,那么不同的CPU架构和不同的汇…

RPA自动化流程机器人在企业财务中的安全与合规性考虑

随着企业对数字化转型的需求不断增加,财务系统变得更加复杂和集成,而新技术的应用将改变企业财务管理传统的运营模式,帮助企业提质增效的同时也可能带来系统安全性的挑战。RPA自动化流程机器人作为最受企业欢迎的数字化转型工具之一&#xff…

【C语言】深入理解指针3(附转移表源码)

深入理解指针3 1.字符指针变量2.数组指针变量2.1是什么2.2应用 3.二维数组传参的本质4.函数指针变量4.1函数指针变量的创建和使用4.2 typedef关键字 5.函数指针数组6.转移表 1.字符指针变量 上⾯代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 《剑指…

WITH (NOLOCK) 是 SQL Server 中的一个提示

WITH (NOLOCK) 是 SQL Server 中的一个提示(hint),它告诉 SQL Server 在读取数据时不要获取共享锁。这个提示通常用于优化读取操作的性能,特别是在读取大量数据时,因为它可以减少锁的竞争,从而可能加快查询…

Mac M1 Max配置torch-geometric等深度学习库

前提:此电脑中已经安装好了Anaconda环境 (一)查看创建的虚拟环境中torch的版本 import torch torch.__version__(二)针对安装的 torch 版本,去官网下载torch-geometric 依赖的对应版本 torch-sparse、tor…

Mysql 集群技术

目录 一、MySQL在服务器中的部署方法 1、MySQL的源码编译安装 2、MySQL部署 二、MySQL的主从复制 1、配置master 2、配置slave 当有数据时添加node3 4、延迟复制 5、慢查询日志 6、MySQL的并行复制 7、原理剖析 8、架构缺陷 三、半同步模式 1、原理 2、gtid模式…

vue2前端阿里云oss断点续传

官方文档地址:如何通过断点续传上传的方式将文件上传到OSS_对象存储(OSS)-阿里云帮助中心 1、需要后端提供一个接口,接口数据包含: const client new OSS({// yourRegion填写Bucket所在地域。以华东1(杭州)为例&…

【STM32】PWR电源控制(低功耗模式)

本篇博客重点在于标准库函数的理解与使用,搭建一个框架便于快速开发 目录 PWR简介 修改主频 低功耗模式 睡眠模式 停止模式 待机模式 PWR简介 PWR(Power Control)电源控制 ,负责管理STM32内部的电源供电部分,可…

31套科技风PPT免费分享

目录 部分展示 部分展示 #PPT下载 「科技风模板」链接:https://pan.quark.cn/s/fb2f39a1d343 链接永久有效,点击这里下载,记得给个赞哦

中间件安全

1.中间件 中间件(Middleware)是指一种软件组件,其作用是在不同的系统、应用程序或服务之间传递数据和消息。它通常位于应用程序和操作系统之间,负责在不同的应用程序之间传递数据、协调不同应用程序之间的通信,以及处理网络请求等。 中间件…

Oracle开始严查Java许可!

0x01、 前段时间在论坛里就看到一个新闻,说“Oracle又再次对Java下手,开始严查Java许可,有企业连夜删除JDK”,当时就曾在网上引起了一阵关注和讨论。 这不最近在科技圈又看到有媒体报道,Oracle再次严查,对…

【树的最长路径】

题目 错误代码&#xff08;18过15&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e410, M N << 1; const int null -0x3f3f3f3f; int h[N], e[M], ne[M], w[M], idx; int v[N]; int maxx; int res; int twice; void add(int a, int …

C语言占领游戏

目录 开头程序程序的流程图程序的效果结尾 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include <Windows.h> void pri…

windows核心编程:5章:将一个进程放入一个作业中,以限制此进程具体能够做那些事情

windows核心编程&#xff1a;5章&#xff1a;将一个进程放入一个作业中&#xff0c;以限制此进程具体能够做那些事情 windows核心编程&#xff1a;5章&#xff1a;将一个进程放入一个作业中&#xff0c;以限制此进程具体能够做那些事情 文章目录 windows核心编程&#xff1a;…

Linux的yum包管理工具(在线安装)

Linux的软件从哪里下载&#xff1f; 我们用的Linux系统都是国外的&#xff0c;所以下载软件自然从国外下载。但是访问国外网址太慢了&#xff0c;有没有什么办法快一点呢&#xff1f; 有&#xff01; 啊&#xff0c;还有这么美的事情&#xff1f;快点告诉我&#xff01; 好…

【Redis】RDB和AOF持久化

RDB和AOF持久化 一、什么是持久化&#xff1f;二、RDB三、AOF 一、什么是持久化&#xff1f; 数据一般写在内存上&#xff0c;但是当重新启动计算机内存数据是会丢失的&#xff0c;而硬盘中的数据是不会丢失的&#xff0c;所以&#xff0c;当我们把数据从内存放到硬盘中的话就…

andorid动画之呼吸效果

目录 效果图实现方式一 &#xff1a;使用 ObjectAnimator 实现呼吸效果方式二&#xff1a;使用 ValueAnimator 实现呼吸效果 总结 在 Android 中实现呼吸效果的动画可以通过多种方式来实现&#xff0c;最常见的方法是使用 ObjectAnimator 和 AnimatorSet。呼吸效果通常指的是一…