PP-Vehicle车辆属性的识别服务

一.功能说明

  • 实现web服务,在页面上导入图片,输出车位置、颜色和车型
  • 绘制在图片上,并显示
  • 支持API接口
  • 当前提供的预训练模型支持识别10种车辆颜色及9种车型,同VeRi数据集,具体如下:
# 车辆颜色
- "yellow"
- "orange"
- "green"
- "gray"
- "red"
- "blue"
- "white"
- "golden"
- "brown"
- "black"# 车型
- "sedan"
- "suv"
- "van"
- "hatchback"
- "mpv"
- "pickup"
- "bus"
- "truck"
- "estate"

二.开发环境搭建

1.搭建conda环境

1.1.下载conda安装包

  wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.11-Linux-x86_64.sh

1.2.执行安装

  bash Anaconda3-2021.11-Linux-x86_64.sh

期间Enter直接回车,yes|no选择yes

1.3.安装后添加环境变量

  vim ~/.bashrc

文件最后追加下面内容

  export  PATH="/home/test/anaconda3/bin:$PATH"

加载环境变量

  source ~/.bashrc

1.4.查看安装结果

  conda --version

如果有版本输出则安装成功

2.搭建项目运行环境

2.1.创建虚拟运行环境

  conda create -n pp python=3.7

这里选择工程的python运行版本为3.7

2.2.切换到虚拟运行环境

  conda activate pp

2.3.安装python依赖module

依赖module列表
cat >> requestsments.txt << EOFnumpy==1.21.6tqdm
typeguard
visualdl>=2.2.0
opencv-python <= 4.6.0
PyYAML
shapely
scipy
terminaltables
Cython
pycocotools
setuptools# for vehicleplate
pyclipper# for mot
lap
motmetrics
sklearn==0.0
filterpy# flask
Flask>=2.1.0paddlepaddle==2.4.1EOF

2.4.执行安装命令

conda install lap
pip install -r requirements.txt  -i https://pypi.douban.com/simple

在安装requirements.txt是会有异常产生,需要依赖lap

三.运行测试code

1.下载工程

git clone https://github.com/PaddlePaddle/PaddleDetection.git

2.测试demo

cd PaddleDetection
# 预测单张图片文件
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_ppvehicle.yml \
--image_file=test_image.jpg \
--device=gpu

image_file:指定测试文件

四.配置项说明

1.配置文件

配置文件路径
deploy/pipeline/config/infer_cfg_ppvehicle.yml

配置文件中与属性相关的参数如下:

VEHICLE_ATTR:model_dir: output_inference/vehicle_attribute_infer/ # 车辆属性模型调用路径batch_size: 8     # 模型预测时的batch_size大小color_threshold: 0.5  # 颜色属性阈值,需要置信度达到此阈值才会确定具体颜色,否则为'Unknown‘type_threshold: 0.5   # 车型属性阈值,需要置信度达到此阈值才会确定具体属性,否则为'Unknown‘enable: False         # 是否开启该功能

2.修改模型路径,有以下两种方式:

  • 方法一:./deploy/pipeline/config/infer_cfg_ppvehicle.yml下可以配置不同模型路径,属性识别模型修改VEHICLE_ATTR字段下配置
  • 方法二:直接在命令行中增加-o,以覆盖配置文件中的默认模型路径:
python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_ppvehicle.yml \--video_file=test_video.mp4 \--device=gpu \-o VEHICLE_ATTR.model_dir=output_inference/vehicle_attribute_infer

五.封装接口

1.调用工程模块,切换运行环境

import os
import sys
#运行环境切换到调用工程目录
PRO_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)),"PaddleDetection")
ENV_PATH = os.path.join(PRO_PATH,"deploy/pipeline")
sys.path.append(ENV_PATH)
from PaddleDetection.deploy.pipeline.pipeline import argsparser,merge_cfg,print_arguments,Pipeline

2.初始化模型

def init_ppvehicle():"""初始化车辆属性识别Returns:_type_: 车辆属性识别对象"""paddle.enable_static()# parse params from commandparser = argsparser()# python deploy/pipeline/pipeline.py --config deploy/pipeline/config/infer_cfg_ppvehicle.yml --image_file=./deploy/pipeline/docs/images/ppvehicleplate.jpg --device=gpu# 输入初始化参数FLAGS = parser.parse_args([#测试结果输出到指定目录'--output_dir','./out',#配置文件路径'--config',os.path.join(PRO_PATH,'deploy/pipeline/config/infer_cfg_ppvehicle.yml'),  # 测试图片路径'--image_file',os.path.join(PRO_PATH,'deploy/pipeline/docs/images/ppvehicleplate.jpg'),  #设置运行gpu:0'--device','0' ])FLAGS.device = FLAGS.device.upper()cfg = merge_cfg(FLAGS)  # use command params to update configprint_arguments(cfg)pipeline = Pipeline(FLAGS, cfg)return pipeline

3.执行检测识别

def exec_ppvehicle(pipeline,input = None,output = None):"""车辆属性识别Args:pipeline (_type_): 车辆属性识别对象input (_type_, optional): 输入路径. Defaults to None.output (_type_, optional): 输出目录. Defaults to None.Returns:_type_: _description_"""if input:#输入路径['']pipeline.input = inputif output:#修改测试结果输出目录pipeline.predictor.output_dir = output# 执行车辆检测识别pipeline.run()#返回结果return pipeline.predictor.pipeline_res.res_dict

4.检测结果解析

def result_ppvehicle(out_path,res_dict,isprit=False):"""车辆属性识别返回结果解析Args:out_path (_type_): 输出图片路径res_dict (_type_): 识别结果,返回结构化结果isprit (bool, optional): 特殊格式. Defaults to False.Returns:_type_: _description_"""out_dict = {}logging.warning(out_path)if os.path.exists(out_path):with open(out_path,"rb") as f:img = str(base64.b64encode(f.read()),'utf-8')boxes = res_dict["det"]["boxes"]vehicle_attrs = res_dict["vehicle_attr"]["output"]rec_res = []num = 0for box,attrs in zip(boxes,vehicle_attrs):score = box[1]x1,y1,x2,y2 = box[2:]if isprit:rec_res.append([num,",".join(attrs),float(f'{score:.3f}')])else:atrr_dict = dict(attr.split(":") for attr in attrs)atrr_dict["score"] = float(f'{score:.3f}')atrr_dict["box"]={"x1":float(f'{x1:.3f}'),"y1":float(f'{y1:.3f}'),"x2":float(f'{x2:.3f}'),"y2":float(f'{y2:.3f}'),}rec_res.append(atrr_dict)num = num + 1out_dict["dets"] = rec_reslogging.warning(out_dict)out_dict["image"] = imgreturn out_dict

六.开发Api,并Postman测试

1.Flask运行接口搭建

# -*- encoding: utf-8 -*-
# @Author: fy
# @Contact: yu.fu@test.com
import os
import base64
import json
import time
import logging
from wsgiref.simple_server import make_serverimport cv2
import numpy as np
from flask import Flask, render_template, requestfrom tools import CfgUtil as cfg
from tools.Logger import Loggerfrom Vehicle import init_ppvehicle,exec_ppvehicle,result_ppvehicleapp = Flask(__name__)
# 调整接收文本大小
app.config['MAX_CONTENT_LENGTH'] = 30 * 1024 * 1024@app.route('/')
def index():return render_template('index.html')@app.route('/api/v1/vehicle/detect', methods=['POST'])
def ocr_idcard():if request.method == 'POST':try:#接收检测图片json_obj = request.get_json()logging.warning(json_obj)img_str = json_obj["image"]image = base64.b64decode(img_str + '=' * (-len(img_str) % 4))nparr = np.frombuffer(image, np.uint8)except Exception as e:logging.error(e)return json.dumps({"code": -1001,"msg": u"Incomplete parameters","data": {}})try:image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)if image.ndim == 2:image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)except Exception as e:logging.error(e)return json.dumps({"code": -1101,"msg": u"Detection failed","data": {}})image = Noneout_dict = {}try:t1 = time.time()# 3.执行检测识别# 4.检测结果解析,格式化输出结果except Exception as e:logging.error(e)return json.dumps({"code": -1102,"msg": u"Parsing failed","data": {}})logging.warning(f'out_dict:{out_dict}')return json.dumps({"code": 1000,"msg": "success","data": out_dict})
if __name__ == '__main__':# 1.初始化模型,创建车辆属性识别对象# 2.对象第一次执行,可能存在第一次耗时较长的问题ip = '0.0.0.0'ip_port = 9999logging.warning(f"http://{ip}:{ip_port}")server = make_server(ip, ip_port, app)server.serve_forever()

2.调用识别封装接口

  1. 初始化模型,创建车辆属性识别对象
  2. 对象第一次执行,可能存在第一次耗时较长的问题
  3. 执行检测识别
  4. 检测结果解析,格式化输出结果

七.web支持,前后端测试

八.测试结果

测试结果预览

PP-Vehicle车辆属性的识别服务相关推荐

  1. 基于mmcls的车辆属性识别

    一.概述 本研究主要针对车辆属性识别课题.研究能够识别车辆多种外观属性的智能算法,这些属性包含颜色. 类型.副驾驶是否有人.是否系安全带.遮阳板是否放下.车辆朝向.是否有车顶架等. 二.研究过程 2. ...

  2. 百度AI攻略:车辆属性识别

    1.功能描述: 检测图像中的各类车辆,并针对小汽车识别11种外观属性,包括:是否有车窗雨眉.是否有车顶架.副驾驶是否有人等,可用于交通安防场景的特定车辆检测追踪. 2.平台接入 车辆属性识别接入网址: ...

  3. 智慧城市交通系列之行人、车辆属性识别方案设计

    序言 不知道大家是否还记得前几年网上流传着一个视频非常的火爆(如下),网友称之为"中国天网",在它的面前,行人的特征直接暴露无遗,当时看到觉得非常的吃惊,惊讶于当前的监控技术达到了 ...

  4. 用AI搭建车辆监控与管理服务其实很简单!

    车已经是生活中必备的交通工具了,随着国家的繁荣,良好的经济,民众生活水平的不断提高,私家车也越来越多,对应的服务.管理.监控工作也随之增加,今天我们就来从这几个维度,看看如何以利用AI来助力各场景下的 ...

  5. 【附源码】计算机毕业设计SSM校园车辆入校预约管理服务系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  6. (三)、从零开始搭建人脸识别服务之大规模人脸识别

    人脸识别服务需要包括以下几个功能模块: 1.人脸检测和人脸校正模块 2.人脸特征提取模块 3.人脸特征匹配模块 4.人脸识别结果计算模块 前两篇文章中分别介绍了人脸检测和人脸特征提取,这篇文章简要介绍 ...

  7. 【Python】调用百度云API文字识别服务 OCR

    # encoding:utf-8 # !/usr/local/bin/python3# 百度云:文字识别服务 # 应用名称:文字识别练习项目import urllib3 from urllib.par ...

  8. 【华为云技术分享】文字识别服务(OCR)基于对抗样本的模型可信安全威胁分析初析

    [摘要] 文字识别作为计算机视觉的重要分支之一,面临着视觉方向同样的安全威胁分析.随着人工智能的普及和文字识别服务大规模的商业落地,解决好相关的模型安全威胁问题已经刻不容缓. OCR处理流程融合了多种 ...

  9. 【华为云技术分享】云图说|人工智能新科技—文字识别服务

    在日常生产和生活中,我们往往要处理大量的文字.报表和文本.为了减轻人们的劳动,提高工作效率,华为云文字识别服务应用而生.您可以调用服务提供的文字识别API接口,将我们日常中大量的证件.票据.表格识别成 ...

最新文章

  1. Java异常之异常机制
  2. python编程初学者指南pdf-Python物理建模初学者指南
  3. python 字符串join
  4. C++ :学习(类、指针)
  5. 统计“3_人民日报语料”文本中的字符数和词数,把文件分别保存为 ansi, UTF8,UTF16,unicode 格式
  6. linuxpython23同时_linux上安装python3同时保留python2
  7. SpringBoot开发接口
  8. 第二章 染色热力学理论单元测验
  9. mqtt判断设备是否在线_如何在 Python 中使用 MQTT
  10. 资源放送丨《SQL条件等价改写秘笈》PPT视频
  11. 中兴通讯:将在全球范围内发布近10款5G手机
  12. windows 串口中断编程_万变不离其宗之单片机串口共性问题
  13. 版权审查只会越来越严
  14. mongodb的安装与简单操作
  15. 淮阴工学院计算机系在哪个校区,2021年淮阴工学院有几个校区,大一新生在哪个校区...
  16. PXE远程CentOS安装anaconda报错
  17. 遇到一个不得其解的问题。
  18. oc实时渲染的图如何导出_一键AO插件拯救你的白模分析图(附插件和教程)
  19. Ubuntu(Linux)腾达U12网卡驱动的离线安装
  20. linux 计算cpu利用率

热门文章

  1. 烟锁重楼,情缘若梦终是空
  2. VLAN三层交换机配置
  3. 《构建之法》第五次随笔
  4. html5调用手机gps坐标,html5获取手机GPS信息
  5. Nancy Async
  6. 搜索+思维 珂朵莉的值域连续段
  7. Microsoft Excel的学习
  8. 有奖调研 | 2021白帽调研启动!
  9. 动画Animation开发指南-动画基础类
  10. rsync 服务配置