vgg16网络实现车牌二分类(整理)

【原创】深度学习第17弹:基于VGG16的手势识别 一、前文回顾 在图像处理章节使用mediapipe进行了手势1-9的识别,但是既然学习了深度学习,所以我尝试使用深度学习来实现手势识别。 二、关键词语 Mediapipe:谷歌的一个训练好的神经网络模型。这个模块可以识别手,脸,姿态等等很多东西。我这次只使用手部识别的功能,以便确定手的位置 Tensorflow:谷歌的开源深度学习框架。这个框架封装了底层算法(比如池化操作,卷积操作,反向求导等等),我们只需要象搭积木一样就可以很快的搭建自己的网络模型。 ※tensorflow版本为2.6.0 阅读详情

参考:https://blog.youkuaiyun.com/qq_37389133/article/details/80707304,感谢

文件结构:

vgg16:

---data      #存放训练数据

     ---Yes

     ---No

---model   #存放训练好的模型

---pred_data   #存放测速数据

    ---Yes

    ---No

---vgg16.npy   #参数文件,直接下载即可,点击此处下载

---vgg16.py     #程序文件,如下

# 代码如下:

import os
import numpy as np
import tensorflow as tf
import skimage.io
import skimage.transform
import matplotlib as mpl

#在ubuntu-server版本上运行,所以不能显示图片,解决办法就是加上下面这句话,ubuntu桌面版应该不需要。
mpl.use('Agg')
#第二步就是在.config/matplotlib下的matplotlibrc文件中添加一行 ckend : Agg
#.config在home文件下,我的是在账户文件夹下 .config一般是隐藏的,用ls -a即可显示。


from matplotlib import pyplot as plt


# 这段代码是将文件夹中的图片读出来,并且统一好规格,224*224的规格

def load_img(path):
    img = skimage.io.imread(path)
    img = img / 255.0
    short_edge = min(img.shape[:2])
    yy = int((img.shape[0] - short_edge) / 2)
    xx = int((img.shape[1] - short_edge) / 2)
    crop_img = img[yy: yy + short_edge, xx: xx + short_edge]
    resized_img = skimage.transform.resize(crop_img, (224, 224))[None, :, :, :]  # shape [1, 224, 224, 3]
    return resized_img


# 这里指从图片中读取数据,并且我们自己规定身体长度为一种结果特征,以此来进行区别和训练,注意这里只是指一种条件,方便训练,事实上也可以多种或者其他的条件!
def load_data():
    #参考博客是分类猫和老虎,所以两个文件夹分别叫tiger和cat
    imgs = {'Yes': [], 'No': []}
    for k in imgs.keys():
        #data文件中存放的是训练数据,下面有两个子文件夹,分别是你的两个分类tiger,cat,当然也可以是其他分类,比如我做的就是车牌和非车牌的二分类
        dir = 'data/' + k
        for file in os.listdir(dir):
            if not file.lower().endswith('.jpg'):
                continue
            try:
                resized_img = load_img(os.path.join(dir, file))
            except OSError:
                continue
            imgs[k].append(resized_img)
            if len(imgs[k]) == 400:
                break
        print('***', k, len(imgs[k]))
    #如果你改了tiger和cat的名字,记着把以下的也改了呀
    tigers_y = np.maximum(36, np.random.randn(len(imgs['Yes']), 1) * 32 + 180)
    cat_y = np.maximum(10, np.random.randn(len(imgs['No']), 1) * 8 + 40)
    return imgs['Yes'], imgs['No'], tigers_y, cat_y


# 这里就是训练的和预测的主体部分了
class Vgg16:
    vgg_mean = [103.939, 116.779, 123.68]

    def __init__(self, vgg16_npy_path=None, restore_from=None, **kwargs):
        try:
            # 这里我们将vgg16.npy里的参数导入
            self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()

        except FileNotFoundError:
            print('Something error about the vgg_npy')

        self.tfx = tf.placeholder(tf.float32, [None, 224, 224, 3])
        self.tfy = tf.placeholder(tf.float32, [None, 1])

        red, green, blue = tf.split(axis=3, num_or_size_splits=3, value=self.tfx * 255.0)
        # 这里需要将图片的rgb格式转化为bgr格式。

        bgr = tf.concat(axis=3, values=[
            blue - self.vgg_mean[0],
            green - self.vgg_mean[1],
            red - self.vgg_mean[2],
        ])
        # 这里我们都是再用vgg16.npy中的参数来进行前面部分的训练和预测
        conv1_1 = self.conv_layer(bgr, "conv1_1")
        conv1_2 = self.conv_layer(conv1_1, "conv1_2")
        pool1 = self.max_pool(conv1_2, 'pool1')

        conv2_1 = self.conv_layer(pool1, "conv2_1")
        conv2_2 = self.conv_layer(conv2_1, "conv2_2")
        pool2 = self.max_pool(conv2_2, 'pool2')

        conv3_1 = self.conv_layer(pool2, "conv3_1")
        conv3_2 = self.conv_layer(conv3_1, "conv3_2")
        conv3_3 = self.conv_layer(conv3_2, "conv3_3")
        pool3 = self.max_pool(conv3_3, 'pool3')

        conv4_1 = self.conv_layer(pool3, "conv4_1")
        conv4_2 = self.conv_layer(conv4_1, "conv4_2")
        conv4_3 = self.conv_layer(conv4_2, "conv4_3")
        pool4 = self.max_pool(conv4_3, 'pool4')

        conv5_1 = self.conv_layer(pool4, "conv5_1")
        conv5_2 = self.conv_layer(conv5_1, "conv5_2")
        conv5_3 = self.conv_layer(conv5_2, "conv5_3")
        pool5 = self.max_pool(conv5_3, 'pool5')

        # 事实上,我们训练的部分只有一下两个神经网络层,但这两个就足以我们训练自己的模型了
        self.flatten = tf.reshape(pool5, [-1, 7 * 7 * 512])
        self.fc_6 = tf.layers.dense(self.flatten, 256, tf.nn.relu, name='fc6')
        self.out = tf.layers.dense(self.fc_6, 1, name='fc_out')
        self.sess = tf.Session()
        # 这里我们进行判断是 区分训练还是预测,这两个方法都要用到整个类,所以这里通过有无文件路径进行了判断
        if restore_from:
            saver = tf.train.Saver()
            saver.restore(self.sess, restore_from)
        else:  # training graph
            self.loss = tf.losses.mean_squared_error(labels=self.tfy, predictions=self.out)
            self.train_op = tf.train.RMSPropOptimizer(0.001).minimize(self.loss)
            self.sess.run(tf.global_variables_initializer())
        return super().__init__(**kwargs)
    # 这里我们添加我们的卷积层,注意我们里面的参数都是来自于vgg16.npy


    def conv_layer(self, conv_in, name):
        with tf.variable_scope(name):
            conv = tf.nn.conv2d(conv_in, self.data_dict[name][0], [1, 1, 1, 1], padding='SAME')
            l_out = tf.nn.relu(tf.nn.bias_add(conv, self.data_dict[name][1]))
            return l_out
        # 池化层


    def max_pool(self, conv_in, name):
        return tf.nn.max_pool(conv_in, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name)
        # 类中的训练函数


    def train(self, x, y):
        loss, _ = self.sess.run([self.loss, self.train_op], {self.tfx: x, self.tfy: y})
        return loss
        # 类中预测函数


    def predict(self, paths):
        #这里是预测方法,我改成了批量预测,你也可以根据自己的需求进行修改。
        count=0 #车牌的数量
        sum=0 #非车牌的数量
        #fig, axs = plt.subplots(1, 2)
        for i, path in enumerate(paths):
            x = load_img("pred_data/No/"+path)
            length = self.sess.run(self.out, {self.tfx: x})
            #axs[i].imshow(x[0])
            if length < 80:
                animal_ = 'This is not a plate!'
                print(path+'不是车牌')
                sum=sum+1
            else:
                print(path+'是车牌')
                animal_ = 'This is a plate!'
                count=count+1
            #axs[i].set_title(animal_ + ' body length: %.1f cm' % length)
            #axs[i].set_xticks(());
            #axs[i].set_yticks(())
        plt.show()
        return count,sum
        #plt.savefig('table.png')
        # 类中保存模型函数


    def save(self, path='model/transform_learning'):
        saver = tf.train.Saver()
        saver.save(self.sess, path, write_meta_graph=False)


# 这里是主函数的训练函数,进行整体训练
def main_train():
    tigers_x, cats_x, tigers_y, cats_y = load_data()

    plt.hist(tigers_y, bins=20, label='Tigers')
    plt.hist(cats_y, bins=10, label='Cats')
    plt.legend()
    plt.xlabel('length')
    plt.ion()
    plt.show()  # 显示猫和老虎的身长直方图

    xs = np.concatenate(tigers_x + cats_x, axis=0)
    ys = np.concatenate((tigers_y, cats_y), axis=0)  # 这里将数据混合,注意顺序

    vgg16 = Vgg16(vgg16_npy_path='vgg16.npy')  # 这里将vgg16.npy添加进来,初始化类

    for i in range(100):
        batch_idx = np.random.randint(0, len(xs), 6)
        loss = vgg16.train(xs[batch_idx], ys[batch_idx])
        print(i, ":get the train loss/", loss)

    vgg16.save('model/transform_learning')  # 这里结束时保存模型


# 这是预测函数,我们采用了两张图片来进行预测
def main_to_pred():
    vgg_pred = Vgg16(vgg16_npy_path='vgg16.npy', restore_from='model/transform_learning')
    #参考博客只是预测两张图片,我做的批量预测,所以改成了以下方法。
    #在pred_data文件夹下新建两个子文件夹,因为我做的是车牌二分类,所以新建了Yes和No两个文件夹,分别
    #存放车牌和非车牌。
    #当测试给非车牌的时候,是以下写法,当预测车牌的时候将No改成Yes即可,记得改预测函数中的Yes和No呀
    for root, dirs, files in os.walk('./pred_data/No/'):
        #vgg_pred.predict(['pred_data/10b76f8-0.jpg', 'pred_data/8aab94-2.jpg'])
        result=[]
        result=vgg_pred.predict(files)
        print("车牌的数量为:")
        print(result[0])
        print("非车牌的数量为:")
        print(result[1])


# 注意主函数,先训练,在预测,分开完成!!!!!!
if __name__ == '__main__':
    main_train()
    main_to_pred()

CNN设计哲学三重跃迁:从VGG统一化到EfficientNet可扩展性 卷积神经网络(CNN)并非单纯堆叠层的黑箱,而是融合硬件约束、优化机理与工程可扩展性的系统工程。其核心演进逻辑始于对计算效率与访存带宽的权衡(如VGG中3×3卷积的硬件友好性),继而转向对深度训练稳定性的结构重构(如ResNet残差连接提供的梯度重路由能力),最终升维至多维协同缩放的建模范式(如EfficientNet复合缩放所定义的depth/width/resolution正交约束)。这种由底层硬件特性驱动、经数学建模固化、在真实部署中反复校准的技术路径,使CNN从经验调参走向可复用、可验证、可编程的设 阅读详情

相关推荐

CPU/GPU/NPU/TPU四大AI芯片选型实战指南

AI芯片不是性能参数的简单比拼,而是面向不同计算范式的工程解法。从冯·诺依曼架构的通用调度(CPU),到并行吞吐优化的图形计算引擎(GPU),再到为神经网络算子深度定制的专用加速器(NPU),直至重构数据流动路径的张量原生架构(TPU),四类芯片分别对应控制密集、规则并行、能效优先与内存墙突破等核心技术价值。其典型应用场景覆盖边缘实时推理、云上大模型训练、工业质检流水线及推荐系统低延迟排序等真实AI落地环节。理解CPUs、GPUs、NPUs、TPUs的本质差异,是构建高性价比、可演进AI基础设施的前提。

赵士杰的博客 846

基于VGG的猫狗识别

1、首先进行图像处理: import csv import glob import os import random os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers import numpy as np gpus = tf.config.experimental.list_physical_

qq_56618414的博客 2861

实战十七:车辆分类实战:基于keras搭建VGG网络实现

车辆分类实战:基于keras搭建VGG网络实现

325

Pytorch使用VGG16模型进行预测猫狗二分类

pytorch python

qq_43649937的博客 4816

23、遥感图像中的先进技术与应用领域:深度学习与YOLOv5算法融合

本文探讨了遥感图像中深度学习技术与物体检测算法的融合应用,重点分析了YOLOv5和YOLOR等模型在无人机图像处理中的表现。通过TensorFlow物体检测API,研究者能够高效处理大规模遥感数据并训练定制化模型。博文还结合交通监控和电网故障检测等实际案例,展示了这些技术在现实场景中的应用价值。未来,随着技术的进步,这些方法有望在更多领域实现突破性发展。

k8l9m0n的博客 73

基于YOLOv5与CRNN的车牌识别系统:从算法到GUI的完整实现

目标检测与字符识别是计算机视觉领域的核心任务,广泛应用于安防、交通与自动化系统。其原理在于通过深度学习模型自动学习图像特征,实现目标的定位与内容解析。YOLOv5作为高效的单阶段检测器,结合CRNN(卷积循环神经网络)的序列识别能力,构成了处理车牌这类典型视觉任务的强大技术组合。这种技术方案的价值在于平衡了精度与速度,并能通过模块化设计集成到实际应用中。在智能交通、停车场管理、车辆身份验证等场景中,此类系统是实现自动化流程的关键。本文以车牌识别项目为例,详细拆解了如何利用YOLOv5进行车牌定位,并采用CR

weixin_29065015的博客 333

端到端中文车牌识别

端到端中文车牌识别 这是一个pytorch实现的端到端中文车牌识别,整个项目主要是从SSD修改而来的,非常感谢作者的开源。同时项目主要参考了阿里的这篇paperA Novel Integrated Framework for Learning both Text Detection and Recognition的思想,实现了ocr_roi_pooling,基于此,可以将检测、分类和文字识别整合在...

怡宝2号 4232

MATLAB车牌识别实战:从传统图像处理到早期机器学习的完整实现与调试指南

图像处理与模式识别是计算机视觉领域的核心基础,其原理在于通过数学变换和算法从图像中提取并分析有意义的信息。在工程实践中,这些技术为自动化识别系统提供了关键支撑,广泛应用于安防、交通管理等场景。车牌识别系统正是这一技术的典型应用,它通常遵循图像预处理、目标定位、字符分割和字符识别的标准流程。本文以MATLAB为工具,深入解析两套经典的车牌识别实现方案:一套基于传统的图像处理流水线,强调流程的可解释性和模块化;另一套则引入了早期机器学习方法,侧重于特征工程和分类器的应用。通过对比这两种方案在车牌定位、字符分割和

weixin_30536861的博客 325

NVIDIA AI City Challege 2018资料整理

AI CITY CHALLENGE 是英伟达举办的智能交通视频分析比赛。以下是一些参赛团队算法资料的整理。 Single-Camera and Inter-Camera Vehicle Tracking and 3D Speed Estimation Based on Fusion of Visual and Semantic Features Team 48 zhengthomastang/2...

yiran103的专栏 5985

基于PyTorch与OpenCV的车牌识别系统:从检测到识别的完整实践

目标检测与图像分类是计算机视觉领域的核心任务,广泛应用于安防、交通、工业自动化等场景。其原理在于通过算法模型自动定位并识别图像中的特定目标。PyTorch作为主流的深度学习框架,凭借其动态图机制和灵活的API,极大地简化了卷积神经网络(CNN)等模型的构建与训练过程,为视觉任务提供了强大的智能核心。OpenCV则作为计算机视觉的基石库,负责高效的图像预处理、几何变换等传统操作,与PyTorch形成优势互补。本文以车牌识别这一经典工程问题为例,详细拆解了如何结合PyTorch构建轻量级CNN模型进行车牌检测与

weixin_28235513的博客 333

基于PyTorch与YOLO+CRNN的车牌识别系统:从算法到GUI的完整实现

目标检测与光学字符识别(OCR)是计算机视觉领域的核心基础技术,广泛应用于自动化、安防与智能交通等场景。其原理在于通过深度学习模型自动定位图像中的特定目标并识别其文本内容。在工程实践中,结合YOLO系列算法进行高效目标定位,并采用CRNN+CTC架构处理序列识别问题,已成为解决复杂视觉任务的成熟方案。这种技术组合的价值在于平衡了精度与速度,并能端到端地处理从图像输入到结构化信息输出的完整流程。本文以车牌识别这一经典应用为切入点,详细阐述了如何利用PyTorch框架,集成YOLOv5进行车牌检测,并结合CRN

weixin_29051149的博客 310

OCR大综述

端到端OCR实验与结果记录 上一份工作主要是做OCR识别的相关工作。当时的主要思路就是分成检测+ocr识别两个步骤来实现。 关键点: 图像采集设备。很容易出现曝光过重的情况。 文字有长,有短。 文本行有倾斜,旋转的情况,对检测部分就需要支持旋转文本检测 同时在很多OCR识别场景中是比较简单的。比如车牌识别,在这个任务中:1. 检测部分目标较少。一个场景中最多只有几张车牌。2. 识别部分相对来说...

怡宝2号 3463

深度学习OCR实战:从CRNN模型构建到部署优化的全流程解析

光学字符识别(OCR)是计算机视觉领域的关键技术,其核心原理是通过算法自动检测并识别图像中的文字信息。传统OCR方法依赖手工特征,而基于深度学习的OCR技术通过卷积神经网络(CNN)自动学习图像特征,结合循环神经网络(RNN)或Transformer处理序列信息,实现了端到端的文字识别。这项技术的核心价值在于能够高效、准确地处理复杂场景下的文本,如文档数字化、车牌识别、票据处理等。在实际工程中,构建一个鲁棒的OCR系统需要重点关注数据预处理、模型选型与训练策略。例如,CRNN+CTC架构因其结构清晰、训练稳

weixin_29038155的博客 271

西电-2019模式识别研究生考试

以老师考前的复习为主,仔细听重点,老师的考前复习很重要,揣摩会出什么题。2019年是8道大题,5个简答,3个计算。虽然要记要背的很多,但是考高分很容易。不要刷往年打印店的题,太久远了,和现在的很不一样,不用管。 昨天考完,今天早上复现记忆一下,以后供师弟师妹参考。研究生所有考试就结束啦哈哈哈! 整理的考前复习PPT,2015年题,2017年课程的PPT,还有今年的考前复习PPT上传到了百度网盘...

luolan9611的博客 2333

基于vgg16的车牌定位识别.rar

深度学习,车牌定位

车牌号识别项目.zip

算法性能: 1、检测正面清晰车牌号图片,车牌号在整张图片占比1/8-1/3之间,精度可达99%以上。 2、整体算法耗时104ms-164ms之间,处理视频流畅。 算法原理: 1、利用u-net网络做语义分割,检测得到车牌号位置。 2、按比例裁减图片,得到省份汉字图片和字母数字图片。 3、利用vgg网络分类,识别省份类别。 4、利用c_rnn网络分割分类,识别字母数字。

CRNN实战:从原理到实现——端到端文本识别技术解析

本文深入解析了CRNN(卷积循环神经网络)这一端到端文本识别技术的核心原理与实战实现。通过剖析其CNN特征提取、RNN序列建模与CTC转录的三层结构,并结合PyTorch代码示例,详细展示了如何从零搭建、训练并优化CRNN模型,适用于身份证、车牌等场景的文本识别,有效解决了传统OCR流程繁琐、切分不准的痛点。

weixin_29035147的博客 329

鸿蒙OS开机动画背后的秘密:从代码到视觉的完整解析(附源码分析)

本文深入解析了鸿蒙OS开机动画的系统级实现原理。从bootanimation服务的启动配置、与Render Service的协同,到基于VSync信号的帧率同步与绘制流水线,结合OpenHarmony源码进行了逐行解读。文章揭示了其事件驱动的优雅退出机制,并探讨了视频支持、多屏适配等高级特性与定制化可能,为开发者理解鸿蒙图形子系统提供了硬核技术视角。

sony5的博客 972

《创龙 RK3588 离线部署 AI 模型推荐列表》

摘要(149字) 创龙RK3588基于6TOPS NPU提供AI离线部署方案,支持RKNN-Toolkit2(视觉模型)和RKLLM-Toolkit(大模型)两套工具链。大语言模型包括DeepSeek、Qwen、LLaMA等系列,1.5B模型适配4GB内存;视觉模型涵盖YOLO系列、ResNet等目标检测/分类模型,YOLOv5推理约20ms/帧;多模态支持Qwen-VL、MiniCPM-V等图文模型。推荐8GB以上内存运行7B级模型,配套Ubuntu系统及RKNN Runtime环境。

zheng_ruiguo的专栏 465

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 413

使用单片机和电流互感器对非正弦周期电流有效值测定

使用单片机和电流互感器,利用一种高速采样的方法来进行有效值测定

月光绿叶滴水音乐 3945
下一篇: 计算机编码(电脑内部代表字母或数字的方式)如:Unicode、UTF-8、UTF-16、ASCII等
Raven_csdn
博客等级 码龄8年 26粉丝 69原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值