一 场景说明

在道路上,利用AI算法定位机动车的位置并识别车辆的属性,这些信息对于交警来说是非常重要的。下面我们将对道路上的车辆进行检测和属性识别,整个过程包含两个算法,基于yolov5的目标检测算法和基于多任务的属性识别算法。

二 算法详解

1. 基于yolov5的目标检测算法

个人感觉yolov5算法还是非常nice的,在实际项目和比赛中经常用到。由于一年前我就写过几篇博客对yolov5进行了说明,在此就不再赘述。如果读者感兴趣,可以参考我的博客:YOLOV5实战
下面是我的测试代码,对yolo v5进行了再次封装:

import os
import cv2
import numpy as np
import torch
import torch.backends.cudnn as cudnn
from PIL import Image,ImageDraw,ImageFontfrom models.experimental import attempt_load
from utils.general import letterbox, non_max_suppression, scale_coordsclass Yolov5Detect(object):def __init__(self, weights='./weights/yolov5m.pt', device=0, img_size=(352,352), conf=0.5, iou=0.5):with torch.no_grad():self.device = "cuda:%s" % deviceself.model = attempt_load(weights, map_location=self.device) # load FP32 modelself.model.half() # to FP16self.imgsz = img_size  # img_size最好是32的整数倍self.conf = confself.iou = ioutemp_img = torch.zeros((1, 3, self.imgsz[0], self.imgsz[1]), device=self.device)  # init img_ = self.model(temp_img.half())  # run oncedef pre_process(self, img_path):img0 = cv2.imread(img_path)assert img0 is not None, "Image Not Found " + img_pathimg = letterbox(img0, new_shape=self.imgsz,auto=False)[0]# Convertimg = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, to 3x416x416img = np.ascontiguousarray(img)return img, img0def predict(self, img_path):img, img0 = self.pre_process(img_path)img = torch.from_numpy(img).to(self.device)img = img.half()  # uint8 to fp16img /= 255.0  # 0 - 255 to 0.0 - 1.0if img.ndimension() == 3:img = img.unsqueeze(0)# Inferencepred = self.model(img, augment=False)[0]return pred, img, img0def post_process(self, img_path):pred, img, img0 = self.predict(img_path)# Apply NMSpred = non_max_suppression(pred, self.conf, self.iou, classes=None, agnostic=False)pred, im0 = pred[0], img0if pred is not None and len(pred):pred[:, :4] = scale_coords(img.shape[2:], pred[:, :4], im0.shape).round()pred = pred.cpu().detach().numpy().tolist() # from tensor to listreturn pred, img0def draw_box_string(img, box, string):x,y,w,h = boxcv2.rectangle(img, (x,y), (x+w, y+h), (0,0,255), 2)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = Image.fromarray(img)draw = ImageDraw.Draw(img)font = ImageFont.truetype("simhei.ttf", 24, encoding="utf-8")draw.text((x+w, y), string, (0, 255, 0), font=font)img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)return imgdef get_image_list(image_dir, suffix=['jpg', 'jpeg', 'JPG', 'JPEG','png']):'''get all image path ends with suffix'''if not os.path.exists(image_dir):print("PATH:%s not exists" % image_dir)return []imglist = []for root, sdirs, files in os.walk(image_dir):if not files:continuefor filename in files:filepath = os.path.join(root, filename)if filename.split('.')[-1] in suffix:imglist.append(filepath)return imglistif __name__ == '__main__':from tqdm import tqdmdetector = Yolov5Detect()img_list = get_image_list("test_imgs")for img_path in tqdm(img_list):img_name = os.path.basename(img_path)pred, img0 = detector.post_process(img_path)pred = [i for i in pred if i[-1]==2.0]  # 2.0是car的标签if pred is None:cv2.imwrite(os.path.join("output", os.path.basename(img_path)), img0)continuefor obj in pred:x1, y1, x2, y2, conf, label = objbox = [int(x1), int(y1), int(x2-x1), int(y2-y1)]string = "%s:%.3f" % ("car", conf)img0 = draw_box_string(img0, box, string)cv2.imwrite(os.path.join("output", img_name), img0)

2. 基于多任务的属性识别算法

基于多任务的属性识别算法:有多个head, 每个分支识别车辆的一种属性。
博主之前也写过类似的文章,详细解读可参考:行人属性识别

车辆属性识别的训练过程如图所示,中间结果各个属性识别的准确率基本超过了90%:

考虑到识别的实时性,这里的识别模型用了非常小的模型,也便于算法部署到边缘设备。
下面是车辆属性识别的测试代码:

import os
import cv2
import glob
import torch
from torchvision import transforms as T
from torch.nn import DataParallelfrom tqdm import tqdm
from PIL import Image,ImageDraw,ImageFont
import numpy as np
from MobileNetV2 import mobilenet_v2class Car_recog(object):def __init__(self, model_path="./checkpoint/mobilenet-v2_30.pth"):self.device = torch.device("cuda")self.net = mobilenet_v2().to(self.device)self.net = DataParallel(self.net)self.weights = model_pathself.net.load_state_dict(torch.load(self.weights))normalize = T.Normalize(mean = [0.5, 0.5, 0.5],std = [0.5, 0.5, 0.5])self.transforms = T.Compose([T.ToTensor(),normalize])def recog(self, img):# img = cv2.imread(img_path)img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)img = Image.fromarray(img)img_RGB = img.copy()img = img.resize((256, 256))img = self.transforms(img)img = img.unsqueeze(0)with torch.no_grad():self.net.eval()img_input = img.to(self.device)outputs_color, outputs_type, outputs_sub_type = self.net(img_input)outputs_color = torch.softmax(outputs_color, 1)outputs_type = torch.softmax(outputs_type, 1)outputs_sub_type = torch.softmax(outputs_sub_type, 1)label_color = outputs_color.argmax()label_type = outputs_type.argmax()label_sub_type = outputs_sub_type.argmax()return img_RGB, label_color, label_type, label_sub_typeif __name__ == "__main__":color_name = ['白色', '黑色', '红色', '黄色', '灰色', '蓝色','绿色', '棕色']orientation_name = ['车头', '车尾']type_name = ["car", 'SUV', "MPV", "中型客车", "大型客车"]car_recog = Car_recog()img_list = [os.path.join("test_imgs", i) for i in os.listdir("test_imgs")]for img_path in img_list:img = cv2.imread(img_path)img_RGB, label_color, label_ori, label_type = car_recog.recog(img)result = "颜色:%s, 朝向:%s, 类型:%s" % (color_name[label_color], orientation_name[label_ori], type_name[label_type])print("车辆属性识别结果:%s" % result)# 把车属性的识别结果画到图上draw = ImageDraw.Draw(img_RGB)font = ImageFont.truetype("./simhei.ttf", 24, encoding="utf-8")draw.text((0, 0), result, (255, 0, 0), font=font)img_BGR = cv2.cvtColor(np.array(img_RGB), cv2.COLOR_RGB2BGR)cv2.imwrite(os.path.join("result_test", os.path.basename(img_path)), img_BGR)

三 测试结果

整个算法的流程是:先用yolo v5检测算法检测到车辆,然后用车辆属性识别算法识别车辆的属性,最后将结果画到图上。
整个流程的测试代码如下:

import os
import cv2
import glob
import torch
from torchvision import transforms as T
from torch.nn import DataParallelfrom tqdm import tqdm
from PIL import Image,ImageDraw,ImageFont
import numpy as npimport sys
sys.path.insert(1, "car_attributes")
sys.path.insert(1, "yolov5.2")
from test_img import Car_recog
from demo import Yolov5Detect, draw_box_stringcolor_name = ['白色', '黑色', '红色', '黄色', '灰色', '蓝色','绿色', '棕色']
orientation_name = ['车头', '车尾']
type_name = ["car", 'SUV', "MPV", "中型客车", "大型客车"]if __name__ == "__main__":car_recog = Car_recog("car_attributes/checkpoint/mobilenet-v2_30.pth")detector = Yolov5Detect("yolov5.2/weights/yolov5m.pt")print("load model successfuly")img_path = "yolov5.2/test_imgs/test.png"  # 测试图片路径pred, img0 = detector.post_process(img_path)pred = [i for i in pred if i[-1]==2.0]  # 2.0是汽车的标签for obj in pred:x1, y1, x2, y2, conf, label = objbox = [int(x1), int(y1), int(x2-x1), int(y2-y1)]x1, y1, w, h = boximg_car = img0[y1:y1+h, x1:x1+w]img_RGB, label_color, label_ori, label_type = car_recog.recog(img_car)result = "颜色:%s\n朝向:%s\n类型:%s" % (color_name[label_color], orientation_name[label_ori], type_name[label_type])print("车辆属性识别结果:%s" % result)img0 = draw_box_string(img0, box, result)cv2.imwrite("result.jpg", img0)

测试图片:

测试结果:

注:本文所用的训练数据都是公开数据集,如果你需要训练好的模型或者训练数据或者技术交流,请留言或者微信,近期会将代码开源。

智能交通——车辆属性识别相关推荐

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

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

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

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

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

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

  4. 【车牌识别】+【模板匹配】基于智能交通的车牌识别系统

    这个项目,主要包括图像采集.图像预处理.车牌定位.字符分割.字符识别这五大核心部分.字符的分割将二值化后的车牌部分进行寻找连续有文字的块,若长度大于设定的阈值则切割,从而完成字符的分割.字符识别上较困 ...

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

    PP-Vehicle车辆属性的识别服务 一.功能说明 实现web服务,在页面上导入图片,输出车位置.颜色和车型 绘制在图片上,并显示 支持API接口 当前提供的预训练模型支持识别10种车辆颜色及9种车 ...

  6. NVIDIA专家实战演示,教你快速搭建基于Python的车辆信息识别系统

    主讲人 | 何琨 英伟达 量子位编辑 | 公众号 QbitAI 随着智慧城市.自动驾驶的快速落地,车辆的检测和识别应用场景非常广泛,如车牌识别.车流统计.车辆属性识别等. 近日,在英伟达x量子位发起的 ...

  7. CV公开课报名 | 快速搭建基于Python的车辆信息识别系统

    位来 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 时下,智慧城市和自动驾驶快速发展,车辆的检测和识别应用场景非常广泛,如车牌识别.车流统计.车辆属性识别等. 但是从0搭建一个精度高.速度快的 ...

  8. 耐克人脸识别_狄耐克智能交通再结一位“老铁”——与力高地产达成战略合作协议!...

    自新冠病毒肺炎疫情爆发以来 狄耐克各个产业的表现均可圈可点 · · 在楼宇对讲领域 狄耐克以人脸识别门禁系统让用户回家无忧: 在智能家居方面 狄耐克以智能语音控制功能让用户随心享家 同时,狄耐克智能门 ...

  9. 浅析AI智能分析网关的车辆/车牌识别技术的研发及应用场景

    车牌识别技术是计算机视频图像识别技术在车辆牌照识别中的一种应用,它融合了ORC识别.云计算等多种技术,可将运动中的汽车牌照从复杂的背景中提取并识别出来,通过车牌提取.图像预处理.特征提取.车牌字符识别 ...

  10. 智能交通组合拳--飞桨实现车辆类别/车牌/车速检测、跨境头跟踪、车流密度检测、逆行检测

    智能交通组合拳–飞桨实现车辆类别/车牌/车速检测.跨境头跟踪.车流密度检测.逆行检测 总体简介 这个项目的代码和文件全部都已经上传到百度aistudio上,有需要的伙伴的可以搜索下面的链接找到,那里已 ...

最新文章

  1. Jedis无法远程连接阿里云服务器的redis问题
  2. MySQL · 最佳实践 · 如何索引JSON字段
  3. MATLAB-Direct access of structure fields returned by a function call is not allowed 的解决方法~
  4. python基础高频_面试题(一)
  5. Google 联合 Plaxo 对 OpenID 进行改进
  6. 如何为Apache Kylin快速开发新数据源?
  7. 985博导:我的研究生,学生会干部不招,面试的时候,直接淘汰!
  8. 如何科学地浪费朋友手中的啤酒
  9. W10系统配置java环境变量
  10. [CF1093G] Multidimensional Queries
  11. Java中的==符号与equals()的使用(测试两个变量是否相等)
  12. 使用微信公众号实现扫码开门
  13. 如何使用IP访问阿里云服务器
  14. python人脸识别毕业设计-毕业论文:基于树莓派的人脸识别门禁系统本科毕业设计文章...
  15. SpringSecurity实现登陆认证并返回token
  16. 深信服php面经,深信服面经
  17. 占内存少的java开发工具_Java所占内存中神奇的64MB
  18. MATLAB | 经典力学框架下的三体运动数值模拟软件
  19. 车牌识别关键技术-车牌定位
  20. 华硕笔记本 安装系统

热门文章

  1. Sentaurus TCAD SDevice 实例教程
  2. mac 思科 链路聚合_思科链路聚合协议实验.docx
  3. Java常量池详解:字符串常量池、Class常量池、运行时常量池 三者关系
  4. max导unity注意及解决
  5. VMware虚拟机安装Windows Server 2008 R2
  6. 免费的中医处方系统软件
  7. python新浪微博爬虫_基于Python的新浪微博数据爬虫
  8. 图纸管理协同办公软件推荐
  9. 2020年中国轴承套圈行业市场现状分析,国内市场格局十分分散「图」
  10. TIM网盘批量下载方法