基于yolov5只进行人物目标检测

embedded/2024/10/24 9:06:27/

背景

本项目背景是使用一个usb摄像头模组,在一定距离下检测人,并判断人是否进入设定的区域中。因此,需要一种目标检测模型,我们选择yolov5作为检测网络,把原来包含80类的coco数据集提取出包含人物的图像,重新训练一次。
我使用的yolov5的代码版本如下图框选所示
在这里插入图片描述

人物数据集提取

在coco网站下载coco2017训练、验证、测试数据集及其标签数据
coco数据下载
在这里插入图片描述
使用如下python的代码提取人物数据及其标签到新的文件夹中,因为coco2017数据集中的标签格式为.json,需要将其中的人物标签信息获取,并保存为.txt格式,txt中每一行的格式为
[标签ID] [标记框左上角x坐标] [标记框左上角y 坐标] [标记框宽度] [标记框高度]
共5个元素
值得注意的是,如果想要尽量避免修改读取模型的代码,就和train.py中提到的coco128数据文件格式相同,当前是
coco128
|----images/
|— images/train2017/
|----labels/
|----labels/train2017/
|-----LICENSE
|-----README.txt
因此,我的文件格式为
coco2017_person
|----images/
|— images/train2017/
|— images/val2017/
|----labels/
|----labels/train2017/
|----labels/val2017/

import os
import json
import shutildef convert(size, box):dw = 1. / size[0]dh = 1. / size[1]x = (box[0] + box[2] / 2.0) * dwy = (box[1] + box[3] / 2.0) * dhw = box[2] * dwh = box[3] * dhreturn (x, y, w, h)def main():json_file = 'E:/pycharm/coco2017/annotations_trainval2017/annotations/instances_train2017.json'  # 替换为你的JSON文件路径save_path = 'E:/pycharm/coco2017_person/labels/train2017/'  # 替换为你要保存YOLO格式标签的路径category_id = 1  # COCO中person的类别IDsrc_img_path = 'E:/pycharm/coco2017/train2017/' #替换为你的原始图像路径dst_img_path = 'E:/pycharm/coco2017_person/images/train2017/' #替换为你的保存的图像路径data = json.load(open(json_file, 'r'))if not os.path.exists(save_path):os.makedirs(save_path)for img in data['images']:filename = img["file_name"]img_width = img["width"]img_height = img["height"]img_id = img["id"]head, tail = os.path.splitext(filename)ana_txt_name = head + ".txt"bHasId = 0for ann in data['annotations']:if ann['image_id'] == img_id and ann['category_id'] == category_id:bHasId = 1breakif bHasId:f_txt = open(os.path.join(save_path, ana_txt_name), 'w')for ann in data['annotations']:if ann['image_id'] == img_id and ann['category_id'] == category_id:box = convert((img_width, img_height), ann["bbox"])f_txt.write("0 %s %s %s %s\n" % (box[0], box[1], box[2], box[3]))f_txt.close()src_path = src_img_path + filenamedst_path = dst_img_path + filenameshutil.copy(src_path, dst_path)if __name__ == '__main__':main()

提取后的数据都与人物相关
在这里插入图片描述

使用仅含人物的数据集训练

在yolov5\data\文件夹下面,复制一份coco128.yaml, 并修改名字为coco_person.yaml

# coco_person.yaml
# Ultralytics YOLOv5 🚀, AGPL-3.0 license
# COCO 2017 dataset http://cocodataset.org by Microsoft
# Example usage: python train.py --data coco.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco  ← downloads here (20.1 GB)# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../coco2017_person # dataset root dir
train: images/train2017 # train images (relative to 'path') 118287 images
val: images/val2017 # val images (relative to 'path') 5000 images
test: # 20288 of 40670 images, submit to https://competitions.codalab.org/competitions/20794# Classes
names:0: person# Download script/URL (optional)
download: |from utils.general import download, Path# Download labelssegments = False  # segment or box labelsdir = Path(yaml['path'])  # dataset root dir# url = 'https://github.com/ultralytics/assets/releases/download/v0.0.0/'# urls = [url + ('coco2017labels-segments.zip' if segments else 'coco2017labels.zip')]  # labels# download(urls, dir=dir.parent)# Download data# urls = ['http://images.cocodataset.org/zips/train2017.zip',  # 19G, 118k images#         'http://images.cocodataset.org/zips/val2017.zip',  # 1G, 5k images#         'http://images.cocodataset.org/zips/test2017.zip']  # 7G, 41k images (optional)# download(urls, dir=dir / 'images', threads=3)

执行命令训练

python train.py --data coco_person.yaml --weights yolov5s.pt --img 640

测试结果
原始数据的训练结果验证yolov5s.pt

python detect.py --weights yolov5s.pt --source E:\pycharm\yolov5\data\images

在这里插入图片描述
仅含人物数据的训练结果验证E:\pycharm\coco2017_person\exp9\weights\best.pt,可以看到风筝、书包等不再检测,仅检测人

python detect.py --weights E:\pycharm\coco2017_person\exp9\weights\best.pt --source E:\pycharm\yolov5\data\images

在这里插入图片描述


http://www.ppmy.cn/embedded/130038.html

相关文章

Linux云计算 |【第五阶段】ARCHITECTURE-DAY4

主要内容: HDFS文件系统的使用,调用Hadoop集群分析数据、Hadoop集群的维护、NFS网络配置管理 一、HDFS文件系统管理 1)文件系统管理方式: ① WEB页面(能查看、能读取、不能写入)② 命令行(能…

Arduino-ESP32机器人控制器设计练习题汇总

机器人 对抗案例 迷宫案例 练习题 数码管计时器 74HC595等 单选题 ESP32与74HC595之间主要通过哪种通信方式连接? A. I2CB. SPIC. UARTD. 串行移位寄存器(答案)在Arduino环境中,控制74HC595移位寄存器的库是? A. Wi…

Navicat 17 新功能 | 数据分析 data profiling

Navicat 17 新功能 - 数据分析 Navicat 具备一系列丰富的数据处理工具。通过类似电子表格的编辑器,你可以轻松查看所有数据,方便地浏览、排序、输入和直接编辑数据。其中,所集成的数据分析工具,为你的数据查看提供一个更全面的视图…

详细且系统的Spring Boot应用开发

为了帮助大家更好地理解如何使用Spring Boot来构建一个基础的Web应用程序,我将通过一个简单的例子来进行说明。这个例子将是一个基本的RESTful API服务,用于管理图书信息。 项目准备 1. 开发环境设置(这个我之前有发文,这里就不详…

HTML+CSS实现超酷超炫的3D立方体相册

效果演示 HTML和CSS实现一个简单的3D立方体加载动画的相册。它使用了HTML来构建立方体的结构&#xff0c;并通过CSS来添加样式和动画效果。 HTML <div class"loader3d"><div class"cube"><div class"face"><img src&qu…

Node.js:深入探秘 CommonJS 模块化的奥秘

在Node.js出现之前&#xff0c;服务端JavaScript基本上处于一片荒芜的境况&#xff0c;而当时也没有出现ES6的模块化规范。因此&#xff0c;Node.js采用了当时比较先进的一种模块化规范来实现服务端JavaScript的模块化机制&#xff0c;它就是CommonJS&#xff0c;有时也简称为C…

Windows模拟电脑假死之键盘鼠标无响应

Windows模拟电脑假死之键盘鼠标无响应 1. 场景需求 模拟Windows电脑假死&#xff0c;失去键盘鼠标响应。 2. 解决方案 采用Windows系统提供的钩子(Hook) API 拦截系统鼠标键盘消息。 3. 示例程序 【1】. 创建MFC对话框项目 新建一个MFC应用程序项目&#xff0c;项目名称…

perl统一修改文件前缀并排序

perl统一修改文件前缀并排序 如题&#xff0c;perl统一修改文件前缀并排序。 举例说明&#xff0c;修改*.txt文件&#xff0c;并排序。 当前目录下&#xff0c;有如下文件 a.txt b.txt fsjkd.txt ffsjk_tst.txt运行rename_prefix脚本后&#xff0c;输入的第一个参数为txt&…