AI项目二十二:行人属性识别

若该文为原创文章,转载请注明原文出处。

分享一个行人属性分析系统,识别行人,并标记每个人的属性。

项目代码来自公众号渡码的项目。

本人用Win10复现完整项目,并记录过程。

源码会上传到github,可以自行下载测试。

Yinyifeng18/AI_pedestrain_attributes: 行人属性识别 (github.com)

一、介绍

实现行人属性分析系统需要 3 个步骤:

  • 用 YOlOv5 识别行人

  • 用 ByteTrack 跟踪标记同一个人

  • 训练多标签图像分类网络,识别行人 26 个属性

二、环境安装

使用环境是win10下CPU版本

1、安装Anaconda

下载地址:Miniconda — Anaconda documentation

下载安装即可。

2、创建虚拟机

conda create -n pedestrain_env python=3.8

3、激活

conda activate pedestrain_env

三、安装轮子

pip install loguru -i https://pypi.tuna.tsinghua.edu.cn/simple  
pip install lapx -i https://pypi.tuna.tsinghua.edu.cn/simple 
pip install thop -i https://pypi.tuna.tsinghua.edu.cn/simple pip install numpy==1.23.5 -i https://pypi.tuna.tsinghua.edu.cn/simple 

 安装cython_bbox,win下无法直接安装

先安装cython

pip install cython -i https://pypi.tuna.tsinghua.edu.cn/simple 

下载cython_bbox-0.1.3

https://pypi.org/project/cython-bbox/0.1.3/#files

修改里面的setup.py文件

extra_compile_args = [-Wno-cpp]为extra_compile_args = {'gcc': ['/Qstd=c99']}

安装

python setup.py build_ext install

安装时如果出Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"的错误处理方法安装VS C++

Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"的解决办法 - 知乎 (zhihu.com)

四、安装paddlepadddle

电脑无GPU,安装的是CPU版本

python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple

五、安装paddleclas

paddleclas识别的属性包括以下 10 类

1、安装

pip install paddleclas  -i https://mirror.baidu.com/pypi/simple

2、测试

测试数据下载:
https://paddleclas.bj.bcebos.com/data/PULC/pulc_demo_imgs.zip

下载后解压到当前目录

测试有两种方法:

1)、使用命令行快速预测

paddleclas --model_name=person_attribute --infer_imgs=./pulc_demo_imgs/person_attribute/090004.jpg

2)、python测试

创建paddleclas_demo.py文件,内容如下:

import paddleclas
model = paddleclas.PaddleClas(model_name="person_attribute")
result = model.predict(input_data="pulc_demo_imgs/person_attribute/090004.jpg")
print(next(result))

运行测试

测试结果相同。

这里只测试不做训练,如果想训练,参考文章PaddleClas/docs/zh_CN/models/PULC/PULC_person_attribute.md at release/2.5 · PaddlePaddle/PaddleClas (github.com)

六、安装yolov5

1、下载yolov5

git clone https://github.com/ultralytics/yolov5

2、安装

cd yolov5
pip install -r requirements.txt  -i https://pypi.tuna.tsinghua.edu.cn/simple 

3、测试

创建yolov5_demo.py文件,内容如下:

import torch# Model
model = torch.hub.load('yolov5','custom',path='./yolov5/weights/yolov5s.pt',source='local')# or yolov5n - yolov5x6, custom# Images
img = "./zidane.jpg"  # or file, Path, PIL, OpenCV, numpy, list# Inference
results = model(img)# Results
results.print()  # or .show(), .save(), .crop(), .pandas(), etc.

需要先下载yolov5s.pt文件。

测试结果

七、下载ByteTrack

git clone https://github.com/ifzhang/ByteTrack.git

到此文件准备完成

八、代码分析测试

代码只有三个,全部附上

track.py

# track.py
from dataclasses import dataclass
import numpy as np
import cv2
import paddleclas
from pedestrain_attr_dict import *
import sys
sys.path.append('./ByteTrack/')
from yolox.tracker.byte_tracker import BYTETracker, STrack@dataclass(frozen=True)
class BYTETrackerArgs:track_thresh: float = 0.25track_buffer: int = 30match_thresh: float = 0.8aspect_ratio_thresh: float = 3.0min_box_area: float = 1.0mot20: bool = Falseclass Detection(object):def __init__(self, ltrb, track_id, person_attr):self.track_id = track_idself.ltrb = Noneself.sex = ''self.age = ''self.front = '未知'self.has_glasses = '否'self.has_hat = '否'self.bag = '未知'self.upper = ''self.lower = ''self.boots = '否'self.update(ltrb, person_attr)def update(self, ltrb, attr):self.ltrb = ltrbif attr is not None:self.sex = '女' if attr[0] == 'Female' else '男'self.age = age_dict[attr[1]]self.front = direct_list[attr[2]]self.has_glasses = '是' if attr[3] == 'Glasses: True' else '否'self.has_hat = '是' if attr[4] == 'Hat: True' else '否'self.bag = bag_dict[attr[6]]# 上半身self.upper = ' '.join([upper_dict[up] for up in attr[7].replace('Upper: ', '').split(' ')])# 下半身self.lower = ' '.join([lower_dict[lo] for lo in attr[8].replace('Lower:  ', '').split(' ')])self.boots = '是' if attr[9] == 'Boots' else '否'class PedestrainTrack(object):def __init__(self):self.byte_tracker = BYTETracker(BYTETrackerArgs())self.detection_dict = {}# 行人属性模型self.pedestrain_attr_model = paddleclas.PaddleClas(model_name="person_attribute")def update_track(self, boxes, frame):tracks = self.byte_tracker.update(output_results=boxes,img_info=frame.shape,img_size=frame.shape)new_detection_dict = {}for track in tracks:l, t, r, b = track.tlbr.astype(np.int32)track_id = track.track_id# 调用行人检测模型,识别行人属性track_box = frame[t:b, l:r]# print(track_box.shape)# cv2.imwrite('a.jpg', track_box)person_attr_res = self.pedestrain_attr_model.predict(track_box)attr = Nonetry:for i in person_attr_res:attr = i[0]['attributes']except:passif track_id in self.detection_dict:detection = self.detection_dict[track_id]detection.update((l, t, r, b), attr)else:detection = Detection((l, t, r, b), track_id, attr)new_detection_dict[track_id] = detectionself.detection_dict = new_detection_dictreturn self.detection_dict

pedestrain_attr_dict.py


gender_dict = {'Female': '女','Male': '男',
}age_dict = {'AgeLess18': '小于18岁','Age18-60': '18-60岁','AgeOver60': '大于60岁'
}# 朝向
direct_list = {'Front': '正面','Side': '侧面','Back': '背面'
}# 背包
bag_dict = {'HandBag': '手提包','ShoulderBag': '单肩包','Backpack': '双肩包','No bag': '未背包'
}# 上衣风格
upper_dict = {'LongSleeve': '长袖','ShortSleeve': '短袖','UpperStride': '带条纹','UpperLogo': '带logo','UpperPlaid': '带格子','UpperSplice': '拼接风格'
}# 下身风格
lower_dict = {'LowerStripe': '带条纹','LowerPattern': '带图案','LongCoat': '长外套','Trousers': '长裤','Shorts': '短裤','Skirt&Dress': '短裙&裙子'
}

pedestrain_attributes.py

import cv2
import torch
import numpy as np
from PIL import Image, ImageDraw, ImageFont
from track import PedestrainTrackdef cv2_add_chinese_text(img, text, position, text_color=(0, 255, 0), text_size=30):img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))# 创建一个可以在给定图像上绘图的对象draw = ImageDraw.Draw(img)# 字体的格式fontStyle = ImageFont.truetype("./fonts/simsun.ttc", text_size, encoding="utf-8")# 绘制文本draw.text(position, text, text_color, font=fontStyle)# 转换回OpenCV格式return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)class PedestrainAttrDetection(object):def __init__(self):self.yolo_model = torch.hub.load('yolov5','custom',path='./yolov5/weights/yolov5s.pt',source='local')self.yolo_model.conf = 0.6self.tracker = PedestrainTrack()def plot_detection(self, person_track_dict, frame):for track_id, detection in person_track_dict.items():l, t, r, b = detection.ltrbtrack_id = detection.track_idcv2.rectangle(frame, (l, t), (r, b), (0, 255, 0), 1)cv2.putText(frame, f'id-{track_id}', (l + 2, t - 3), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1)top_margin = 20font_size = 14font_color = (255, 0, 255)frame = cv2_add_chinese_text(frame, f'性别:{detection.sex}', (l+2, t+top_margin), font_color, font_size)frame = cv2_add_chinese_text(frame, f'年龄:{detection.age}', (l+2, t+top_margin*2), font_color, font_size)frame = cv2_add_chinese_text(frame, f'朝向:{detection.front}', (l+2, t+top_margin*3), font_color, font_size)frame = cv2_add_chinese_text(frame, f'戴眼镜:{detection.has_glasses}', (l+2, t+top_margin*4), font_color, font_size)frame = cv2_add_chinese_text(frame, f'戴帽子:{detection.has_hat}', (l+2, t+top_margin*5), font_color, font_size)frame = cv2_add_chinese_text(frame, f'背包:{detection.bag}', (l+2, t+top_margin*6), font_color, font_size)frame = cv2_add_chinese_text(frame, f'上半身:{detection.upper}', (l+2, t+top_margin*7), font_color, font_size)frame = cv2_add_chinese_text(frame, f'下半身:{detection.lower}', (l+2, t+top_margin*8), font_color, font_size)frame = cv2_add_chinese_text(frame, f'穿靴:{detection.boots}', (l+2, t+top_margin*9), font_color, font_size)# cv2.putText(frame, f'sex-{sex}', (l + 2, t + 10), cv2.FONT_HERSHEY_PLAIN, 1, (0, 0, 255), 1)return frame@staticmethoddef yolo_pd_to_numpy(yolo_pd):box_list = yolo_pd.to_numpy()detections = []for box in box_list:l, t = int(box[0]), int(box[1])r, b = int(box[2]), int(box[3])conf = box[4]detections.append([l, t, r, b, conf])return np.array(detections, dtype=float)def detect(self, video_file):cap = cv2.VideoCapture(video_file)video_w = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))video_h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = round(cap.get(cv2.CAP_PROP_FPS))print(fps)# video_writer = cv2.VideoWriter('./video_p2.mp4', cv2.VideoWriter_fourcc(*'H264'), fps, (video_w, video_h))while True:ret, frame = cap.read()if not ret or frame is None:breakyolo_det_results = self.yolo_model(frame[:, :, ::-1])pd = yolo_det_results.pandas().xyxy[0]person_pd = pd[pd['name'] == 'person']person_det_boxes = self.yolo_pd_to_numpy(person_pd)person_track_dict = self.tracker.update_track(person_det_boxes, frame)frame = self.plot_detection(person_track_dict, frame)cv2.imshow('pedestrain attributes detect', frame)# video_writer.write(frame)if cv2.waitKey(10) & 0xFF == ord('q'):returnif __name__ == '__main__':PedestrainAttrDetection().detect('./video.mp4')

代码不多,比较容易看懂


九、总结

测试过程中由于使用的是CPU安装cython_bbox花了一点时间.环境搭建还是蛮麻烦的。

如有侵权,或需要完整代码,请及时联系博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter 简化CustomPainter的绘制

文章目录 前言一、为何简化?1、通常做法(1)、绘制形状1(2)、绘制形状2(3)、界面显示 2、简化 二、完整代码三、使用示例1、绘制图形2、动态触发绘制 总结 前言 使用Flutter做界面时&#xff0c…

Linux DMA-Buf驱动框架

一、DMABUF 框架 dmabuf 是一个驱动间共享buf 的机制,他的简单使用场景如下: 用户从DRM(显示驱动)申请一个dmabuf,把dmabuf 设置给GPU驱动,并启动GPU将数据输出到dmabuf,GPU输出完成后&#xf…

大数据实训项目(小麦种子)-02、实训项目整体功能介绍与演示

文章目录 前言界面及功能描述实现功能描述技术选型界面展示首页界面功能1:HDFS,选择文件上传文件详细步骤 功能2:MapReduce预处理数据功能3:Hbase存储小麦种子数据并查询前10条记录功能4:Hive分析原始csv文件数据并ech…

RTA_OS基础功能讲解 2.9-警报器

RTA_OS基础功能讲解 2.9-警报器 文章目录 RTA_OS基础功能讲解 2.9-警报器一、警报器简介二、警报器配置2.1 激活一个任务2.2 设置一个事件2.3 执行回调函数2.4 递增一个(软件)计数器三、警报器设置3.1 绝对警报3.1.1 单次触发3.1.2 周期触发3.1.3 在过去设置警报3.1.4 将绝对…

swift微调牧歌数据电商多模态大语言模型

大规模中文多模态评测基准MUGE_数据集-阿里云天池多模态理解和生成评估挑战榜(MUGE)是由阿里巴巴达摩院智能计算实验室发起,由阿里云天池平台承办,并由浙江大学、清华大学等单位共同协办。 Mhttps://tianchi.aliyun.com/dataset/107332微调的是牧歌数据集,结果都不好,记录…

中望CAD 2025 (ZW3D2025) 简体中文修改版

名称:中望CAD 2025 (ZW3D2025) 简体中文修改版 描述:一款三维CAD设计工具,运行破解补丁ZW3D2025-2024-Patch执行修补。 链接:夸克网盘分享 📁 大小:3.2GB 🏷 标签:#PC软件 #CAD #设…

支付宝 沙盒demo使用

简介:支付宝沙箱环境是一个为开发者提供的模拟测试环境,用于在应用上线前进行接口功能开发和联调。在这个环境中,开发者可以模拟开放接口,进行开发调试工作,以确保应用上线后能顺利运行。 1. 配置沙盒 1. 1 沙箱控制…

【odoo15】前端自定义模态弹窗

概要 在odoo15或者在15之前,odoo前端的owl框架还没完全替换当前前端框架的时候,我们很多时候都是用js或者jq来直接操作dom,那么我们如果需要在前端用到一个模态弹窗,可以怎么解决呢? 方法1 直接用js原生的模态弹窗&am…

Oracle的这些BUG你要遇到,说明你是一个DBA老鸟...

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复, 安装迁移,性能优化、故障…

【LVGL】Guider 界面分析

文章目录 前言架构创建 UI切换界面空间释放分析创建页面空间变化 前言 分析Gui Guider-1.7.2-GA 生成的 LVGL 界面切换,资源管理等处理 架构 所有控件存放于同一个结构体 lv_ui 内,每个页面都至少包含 screen_xxx 和 screen_xxx_del 两个成员 typede…

用HAL库改写江科大的stm32入门-7-1 ADC

实验目的:了解ADC基本概念 电路图: ADC(Analog-Digital Converter)模拟-数字转换器,它可以将引脚上连续变化的模拟电压转换为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。 实验效果: &#xff0…

【html】学会这一套布局,让你的网页更加

很多小伙伴们在刚刚开始学习网页设计的时候不知道怎么布局今天给大家介绍一种非常实用且更加专业的一种布局。 灵感来源: 小米官网 布局图; 实例效果图: 这是一个简单的HTML模板,包括头部、内容区域和底部。 头部部分包括一个分为左右两部分…

【代码随想录】【算法训练营】【第39天】 [62]不同路径 [63]不同路径II [343]整数拆分 [96]不同的二叉搜索树

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 39,周六,坚持不住了~ 题目详情 [62] 不同路径 题目描述 62 不同路径 解题思路 前提:每次只能向下或者向右移动一步 思路:动态规划&#xff0…

部署LVS-DR群集...

目录 最后一台主机(第四台) 本地yum源安装httpd(非必做) 继续开始从最后一台主机开始(第四台) 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Java 项目学习(初始化项目)

后端工程基于 maven 进行项目构建,并且进行分模块开发 参考:Spring或Spring Boot项目目录结构划分和代码分层 1、了解项目的整体结构 sky-take-out maven 父工程,统一管理依赖版本,聚合其他子模块 sky-common 子模块&#xff0c…

【背包题】oj题库

目录 1282 - 简单背包问题 1780 - 采灵芝 1888 - 多重背包&#xff08;1&#xff09;​编辑 1891 - 开心的金明 2073 - 码头的集装箱 1905 - 混合背包 1282 - 简单背包问题 #include <bits/stdc.h> using namespace std; //二维数组:dp[i][j]max(dp[i-1][j],v[i]dp[…

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

FLAN-T5模型的文本摘要任务

Text Summarization with FLAN-T5 — ROCm Blogs (amd.com) 在这篇博客中&#xff0c;我们展示了如何使用HuggingFace在AMD GPU ROCm系统上对语言模型FLAN-T5进行微调&#xff0c;以执行文本摘要任务。 介绍 FLAN-T5是谷歌发布的一个开源大型语言模型&#xff0c;相较于之前的…

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

浏览器必备插件:最新Allow copy万能网页复制下载,解锁网页限制!

今天阿星给大家安利一个超级实用的小工具&#xff0c;专治那些“禁止复制”的网页文字。学生党、资料搜集狂人&#xff0c;你们有福了&#xff01; 想象一下&#xff0c;你在网上冲浪&#xff0c;突然遇到一篇干货满满的文章&#xff0c;正想复制下来慢慢品味&#xff0c;结果…