计算机视觉知识点-车型识别

本篇博文是一个简单的车型识别介绍的例子,我参考了这个github,这个git中,对于车型识别, 开放场景整理了1776种车型,并共享了数据,是这里(链接: https://pan.baidu.com/s/1ZtXvjwLzIMQodEp3SAbN8g 提取码: byhy , 大约4.5G)交通卡口版本支持4000多种车型,开源了模型,但是没有开源数据。

车型检测的流程为:

 

 

车辆检测采用mobile-ssd模型,车型识别采用一个20层左右的分类模型。项目的目录结构为:

vehicle_recg.cpp        //逻辑实现类,实现了图片加载,模型推理,结果输出
vehicle_recg.h          //头文件
label.txt               //车型标签文件
models                  //模型目录
    det.bin             //检测模型
    det.prototxt        //检测模型信息文件
    reg.bin             //识别模型
    reg.prototxt        //识别模型信息文件

 经过检测模型后,就得到这样的车辆区域

 

得到上面的图片后,把这些车辆区域送入车型识别模型就可以得到车型类别了,为什么不直接用一个模型得到车型类别呢,因为这个任务中车型的类别有2000-4000个,普通的mobilessd检测模型不能很好的完成分类任务。 

另外git上还提供了android的模型调用例子,安卓移植的时候可以参考一下。下面贴一下python版本推理代码和C++版本推理代码,方便大家查阅。

识别模型的python推理代码,使用opencv进行推理。一般cpu或安卓,使用opencv推理就可以。

import cv2
import numpy as np


def softmax(x):
    """Compute softmax values for each sets of scores in x."""
    pass  # TODO: Compute and return softmax(x)
    x = np.array(x)
    x = np.exp(x)
    x.astype('float32')
    if x.ndim == 1:
        sumcol = sum(x)
        for i in range(x.size):
            x[i] = x[i]/float(sumcol)
    if x.ndim > 1:
        sumcol = x.sum(axis = 0)
        for row in x:
            for i in range(row.size):
                row[i] = row[i]/float(sumcol[i])
    return x

def softmax_2(x):
    return np.exp(x)/np.sum(np.exp(x),axis=0)


model = cv2.dnn.readNetFromCaffe("model/vehicle_model.prototxt","model/vehicle_model.caffemodel")

mean_rgb = [123.68, 116.779, 103.939]
std_rgb = [58.393, 57.12, 57.375]


aligned = cv2.imread("data/p1.jpg")
aligned = cv2.resize(aligned,(224,224))

im_tensor = np.zeros((1, 3, 224,224))
for i in range(3):
    im_tensor[0, i, :, :] = (aligned[:, :, 2 - i] / 1.0- mean_rgb[2 - i]) / std_rgb[2 - i]

model.setInput(im_tensor)
_embedding = model.forward()[0]

print(_embedding.transpose().max())
idx = _embedding.transpose().argmax()
print(idx)
label = open("label.txt","r")
label_txt =label.readlines()
print(label_txt[idx])

c++版本的检测推理代码。

vehicle_recg.h

#pragma once

#ifndef __MOBILENET_DNN_H__
#define __MOBILENET_DNN_H__

#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include <time.h>
#include <algorithm>
#include <map>
#include <iostream>


#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace dnn;

using namespace std;



class VEHICLE_RECG {

public:
	VEHICLE_RECG(const string &model_path);
	~VEHICLE_RECG();

	std::pair<std::string,float> detect(cv::Mat& img_);
	void recognize(cv::Mat& img_, cv::Rect& rect);
private:


	Net reg_net,det_net;
	
	std::vector<std::string> classes;
	const float detect_thresh = 0.6;
	const Scalar mean{ 123.68, 116.779, 103.939 };

};

#endif //__MOBILENET_DNN_H__

vehicle_recg.cpp

#include "vehicle_recg.h"

std::vector<std::string> loadLabel(std::string filename)
{
	std::ifstream fin(filename, std::ios::in);
	char line[1024] = { 0 };
	std::vector<std::string> labels;

	while (fin.getline(line, sizeof(line)))
	{
		std::stringstream word(line);
		std::string string;
		word >> string;
		labels.push_back(string);
	}
	fin.clear();
	fin.close();
	return labels;

}


VEHICLE_RECG::VEHICLE_RECG(const string &model_path){

	reg_net = readNetFromCaffe(model_path + "/reg.prototxt", model_path+ "/reg.bin");
	det_net = readNetFromCaffe(model_path + "/det.prototxt", model_path+"/det.bin");
	//String classesFile = model_path + "/list.txt";

	string car_list[] = { "DS_4S", "DS_5", "DS_5LS", "DS_5LS_2014款", "DS_5_2014款", "DS_6", "DS_6_2014款", "GMC_SAVANA", "Jeep_大切诺基", "Jeep_大切诺基_2014款", "Jeep_指南者", "Jeep_指南者_2011款", "Jeep_指南者_2012款", "Jeep_指南者_2013款", "Jeep_指南者_2015款", "Jeep_指挥官", "Jeep_牧马人", "Jeep_自由侠", "Jeep_自由侠_2016款", "Jeep_自由光", "Jeep_自由光_2016款", "Jeep_自由客", "Jeep_自由客_2014款", "MG3", "MG3_2011款", "MG3_2013款", "MG3_2014款", "MG5", "MG5_2012款", "MG6", "MG6_2010款", "MG6_2012款", "MG6_2013款", "MG6_2014款", "MG7", "MG_3SW", "MG_名爵6新能源", "MG_名爵ZS", "MG_名爵ZS_2017款", "MG_锐腾", "MG_锐腾_2015款", "MG_锐腾_2016款", "MG_锐行", "MINI", "MINI_2011款", "MINI_2014款", "MINI_2016款", "MINI_Clubman", "MINI_Clubman_2011款", "MINI_Countryman", "MINI_Countryman_2011款", "MINI_Coupe", "MINI_Paceman", "Smart_smart_forfour", "Smart_smart_fortwo", "Smart_smart_fortwo_2012款", "Smart_smart_fortwo_2015款", "WEY_VV5_2017款", "WEY_VV7_2017款", "一汽_佳宝V52", "一汽_佳宝V70_II代", "一汽_佳宝V75", "一汽_佳宝V80", "一汽_威姿", "一汽_威志", "一汽_威志V2", "一汽_威志V2_Cross", "一汽_威志V5", "一汽_森雅M80", "一汽_森雅R7", "一汽_森雅R7_2016款", "一汽_森雅S80", "一汽_骏派A70", "一汽_骏派D60", "一汽_骏派D60_2015款", "三菱_劲炫", "三菱_劲炫ASX", "三菱_劲炫ASX_2013款", "三菱_君阁", "三菱_帕杰罗", "三菱_帕杰罗·劲畅", "三菱_欧蓝德", "三菱_欧蓝德EX劲界", "三菱_欧蓝德_2016款", "三菱_欧蓝德经典", "三菱_祺智PHEV", "三菱_翼神", "三菱_翼神_2011款", "三菱_翼神_2012款", "三菱_翼神_2013款", "三菱_蓝瑟", "三菱_风迪思", "三菱劲炫ASX", "三菱戈蓝", "三菱风迪思", "上汽大通_大通D90_2017款", "上汽大通_大通G10", "上汽大通_大通RV80", "上汽大通_大通V80", "上汽大通大通G10", "东南DX3", "东南DX3_2016款", "东南DX7", "东南DX7_2015款", "东南_V3菱悦", "东南_V3菱悦_2012款", "东南_V3菱悦_2014款", "东南_V3菱悦_2015款", "东南_V5菱致", "东南_V5菱致_2015款", "东南_V6菱仕", "东南_希旺", "东风_帅客", "东风_景逸", "东风_景逸_2012款", "东风_风光330", "东风_风光360", "东风_风度MX6", "东风_风行CM7", "东风_风行S500_2016款", "东风_风行SX6", "东风小康C37", "东风小康K07S", "东风小康K07_II", "东风小康K17", "东风小康V27", "东风小康V29", "东风小康_东风风光330", "东风小康_东风风光330_2014款", "东风小康_东风风光360", "东风小康_东风风光370", "东风小康_东风风光580", "东风小康_东风风光580_2016款", "东风小康_东风风光S560", "东风小康_风光", "东风小康_风光580", "东风风度MX5", "东风风神A30", "东风风神A60", "东风风神AX3_2016款", "东风风神AX5", "东风风神AX7", "东风风神AX7_2015款", "东风风神AX7_2016款", "东风风神H30", "东风风神L60", "东风风神S30", "东风风行_景逸S50", "东风风行_景逸SUV", "东风风行_景逸X3", "东风风行_景逸X3_2014款", "东风风行_景逸X5", "东风风行_景逸X5_2013款", "东风风行_景逸X5_2015款", "东风风行_景逸X5_2016款", "东风风行_景逸X6", "东风风行_景逸XV", "东风风行_景逸XV_2015款", "东风风行_菱智", "东风风行_菱智_2013款", "东风风行_菱智_2014款", "东风风行_菱智_2015款", "东风风行_菱智_2016款", "东风风行_菱智_2018款", "中华H230", "中华H320", "中华H330_2013款", "中华H530", "中华H530_2011款", "中华V3_2015款", "中华V3_2016款", "中华V5", "中华V5_2012款", "中华_尊驰", "中华_骏捷", "中华_骏捷FRV", "中华_骏捷FSV_2011款", "丰田", "丰田4Runner", "丰田86", "丰田C-HR", "丰田Fortuner", "丰田Sienna", "丰田YARiS_L_致炫", "丰田_FJ酷路泽", "丰田_RAV4", "丰田_RAV4_2009款", "丰田_RAV4_2011款", "丰田_RAV4_2012款", "丰田_RAV4_2013款", "丰田_RAV4_2015款", "丰田_RAV4_2016款", "丰田_YARiS_L_致享_2017款", "丰田_YARiS_L_致炫", "丰田_YARiS_L_致炫_2014款", "丰田_YARiS_L_致炫_2015款", "丰田_YARiS_L_致炫_2016款", "丰田_兰德酷路泽", "丰田_凯美瑞", "丰田_凯美瑞_2009款", 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值