深度学习(二)车牌识别(40个类别)

图片加标签——创建数据集——创建模型——开始训练
代码如下:

import cv2
import numpy as np
import os
import torch.nn as nn
import  torch.utils.data as Data
from torch.autograd import Variable
from torch.utils.data import Dataset,DataLoader,TensorDataset
import torch

#给图片加标签
train_path = 'train_car'
train_list = os.listdir(train_path)

labels_list = []
images_path = []
images_list = []
hight = 32
width = 32
for train in train_list:
	one_train_list = os.listdir(train_path+'/'+train)
	num = len(one_train_list)

	for i in range(num):
		labels_list.append(int(train))

	for image_path in one_train_list:
		images_path.append(train_path+'/'+train+'/'+image_path)

for path in images_path:
	#image = cv_imread(path,0)
	image = cv2.imdecode(np.fromfile(path,dtype=np.uint8),-1)
	# if (hight==None or width==None):
	# 	hight,width = image.shape
	# 	if (hight>width):
	# 		hight = width
	# 	else:
	# 		width = hight

	image = cv2.resize(image,(hight,width))
	images_list.append(image)

#创建数据集
def data_loader(images_list,labels_list):
	train_list = np.asarray(images_list)
	labels_list = np.asarray(labels_list)
	train_list = torch.from_numpy(train_list.astype(np.float32))
	labels_list = torch.from_numpy(labels_list)

	dataset = TensorDataset(train_list,labels_list)
	dataloader = DataLoader(
		dataset,
		batch_size =100,
		shuffle = True,
		num_workers = 2
		)
	return dataloader

#开始训练
def train_data(images_list,labels_list):
	global hight,width
	dataloader = data_loader(images_list,labels_list)
	net = Net(hight,width)
	optimizer = torch.optim.SGD(net.parameters(),lr=0.001)
	loss_function = torch.nn.CrossEntropyLoss()

	for i in range(200):
		for item in dataloader:
			try:
				data_x = item[0]
				data_y = item[1]
				data_x = Variable(data_x).unsqueeze(0).view(100,1,hight,width)
				data_y = Variable(data_y).float()
				prediction = net(data_x)
				loss = loss_function(prediction,data_y.long())
				optimizer.zero_grad()
				loss.backward()
				optimizer.step()
				print(loss)
			except Exception as e:
				print(e)
	torch.save(net,'car_number.pkl')

创建模型
class Net(nn.Module):

	def __init__(self,hight,width):
		super(Net,self).__init__()
		self.body = nn.Sequential(
			nn.Conv2d(1,16,3,padding=1),
			nn.BatchNorm2d(16),
			nn.ReLU(True),
			)
		self.body1 = nn.Sequential(
			nn.Conv2d(16,32,3,padding=1),
			nn.BatchNorm2d(32),
			nn.ReLU(True),
			nn.MaxPool2d(kernel_size=2,stride=2)
			)
		self.body2 = nn.Sequential(
			nn.Conv2d(32,64,3,padding=1),
			nn.BatchNorm2d(64),
			nn.ReLU(True),
			nn.MaxPool2d(kernel_size=2,stride=2)
			)
		self.body3 = nn.Sequential(
			nn.Conv2d(64,128,3,padding=1),
			nn.BatchNorm2d(128),
			nn.ReLU(True),
			nn.MaxPool2d(kernel_size=2,stride=2)
			)
		tail = []
		tail.append(
			nn.Linear(int(hight*width*128/64),1024)
			)
		tail.append(
			nn.ReLU(True)
			)
		tail.append(
			nn.Linear(1024,256)
			)
		tail.append(
			nn.ReLU(True)
			)
		tail.append(
			nn.Linear(256,40)
			)
		self.tail = nn.Sequential(*tail)

	def forward(self,x):
		ret = self.body(x)
		ret = self.body1(ret)
		ret = self.body2(ret)
		ret = self.body3(ret)
		ret = ret.view(ret.size(0),-1)
		ret = self.tail(ret)
		return ret

def main():
	train_data(images_list,labels_list)

if __name__=='__main__':
	main()

测试模型代码如下:

import numpy as np
import cv2
import torch
import os
from train_car import Net

def main():
	path = 'test_images/'
	image_list = os.listdir(path)
	net = torch.load('car_number.pkl')
	loss_function = torch.nn.CrossEntropyLoss()

	for img in image_list:
		image_path = path+img
		image = cv2.imread(image_path,0)
		image = cv2.resize(image,(32,32))
		cv2.imshow('test',image)
		cv2.waitKey(2000)
		cv2.destroyAllWindows()

		h,w = image.shape
		imgae = np.asarray(image)
		image = torch.from_numpy(image).unsqueeze(0).unsqueeze(0).view(1,1,h,w)
		prediction = net(image.float())
		min_loss = 100
		result = None

		for i in range(40):
			value = np.asarray([i])
			value = torch.from_numpy(value)
			loss = loss_function(prediction,value.long())
			if (min_loss>loss):
				min_loss = loss
				result = i

		print(result)

if __name__=='__main__':
	main()
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
目标识别是计算机视觉一个重要的研究领域,由此延伸出的车辆型号识别具有重 要的实际应用价值,特别是在当今交通状况复杂的大城市,智能交通系统成为发展趋 势,这离不开对车辆型号进行识别和分类的工作,本文围绕如何利用计算机视觉的方 法进行车辆型号的识别和分类展开了一系列研究: 本文对当前的目标识别和分类的特征和算法做了总结和归纳。分析比较了作为图 像特征描述常见的特征算子,总结归纳了他们的提取方法、特征性能以及相互之间的 关联。另外,介绍了在目标识别工作中常用的分类方法,阐述了他们各自的原理和工作 方法。研究了深度神经网络的理论依据,分析比较了深度神经网络不同的特征学习方 法,以及卷积神经网络的训练方法。分析比较不同特征学习方法的特点选取 k-means 作为本文使用的特征学习方法,利用卷积神经网络结构搭建深度学习模型,进行车辆 车型识别工作。 本文为了测试基于深度学习的车辆型号分类算法的性能在 30 个不同型号共 7158 张图片上进行实验;并在相同数据上利用改进了的 SIFT 特征匹配的算法进行对比实验; 进过实验测试,深度学习方法在进行车型分类的实验中取得 94%的正确率,并在与 SIFT 匹配实验结果对比后进一步证实:深度学习的方法能够应用在车辆型号识别领域
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值