【Android开发AI实战】基于CNN混合YOLOV实现多车牌颜色区分且针对车牌进行矫正识别(含源码)

news/2025/2/9 1:26:41 标签: 人工智能, android, cnn

文章目录

  • 引言
  • 单层卷积神经网络(Single-layer CNN)
    • 📌 单层 CNN 的基本结构
    • 📌 单层 CNN 计算流程图像
  • 透视变换矫正车牌c++实现
    • 🪄关键代码实现:
    • 🪄crnn结构图
  • 使用jni实现高级Android开发
    • 🎉java层如何调用c++层
  • 车牌识别效果图
  • 参考文章

引言

本文中使用的模型文件说明均采用ncnn模型格式适配安卓手机端以得到最大的运行推理速度可实现CPU加速以及GPU加速加速推理。

  1. 车牌检测模型:yolov5
  2. 车牌矫正:透视变换 车牌识别:crnn
  3. 车牌颜色识别:单层卷积神经网络

单层卷积神经网络(Single-layer CNN)

单层卷积神经网络(Single-layer CNN) 指的是 仅包含一个卷积层 的神经网络。它主要用于简单的图像特征提取任务,如边缘检测或简单的分类任务。


📌 单层 CNN 的基本结构

一个典型的 单层 CNN 由以下部分组成:

  1. 输入层(Input Layer)
    • 例如输入一个 32×32×3 的 RGB 图像。

  1. 单个卷积层(Single Convolutional Layer)
    • 例如使用 5×5×3 大小的卷积核,共 6 个卷积核,stride=1,padding=0。

  1. 激活函数(Activation Function)
    • 例如 ReLU(Rectified Linear Unit)增加非线性表达能力。

  1. 池化层(Pooling Layer)
    • 例如 2×2 的最大池化(Max Pooling),用于降维。

  1. 全连接层(Fully Connected Layer, FC)
    • 将卷积层输出的数据展平(Flatten),输入到全连接层。

  1. 输出层(Output Layer)
    • 例如使用 Softmax 进行分类。

📌 单层 CNN 计算流程图像

假设输入图像是 32×32×3(RGB 图像),使用 5×5×3 的卷积核,共 6 个卷积核,stride = 1,padding = 0。

卷积运算 5x5
ReLU 激活
最大池化 2x2
展平
全连接
Softmax
输入层: 32x32x3
卷积层: 28x28x6
激活层: 28x28x6
池化层: 14x14x6
展平层: 1176
全连接层
输出层: 分类

透视变换矫正车牌c++实现

🪄关键代码实现:

for (size_t i=0; i<objects.size(); i++)
{
    // letterbox pad to multiple of 32
    cv::Mat image;
    BitmapToMatrix(env, bitmap, image);
    const Object& obj = objects[i];

    // 计算车牌四个角点相对于车牌区域左上角的坐标
    float new_x1 = objects[i].p3x - objects[i].x;
    float new_y1 = objects[i].p3y - objects[i].y;
    float new_x2 = objects[i].p4x - objects[i].x;
    float new_y2 = objects[i].p4y - objects[i].y;
    float new_x3 = objects[i].p2x - objects[i].x;
    float new_y3 = objects[i].p2y - objects[i].y;
    float new_x4 = objects[i].p1x - objects[i].x;
    float new_y4 = objects[i].p1y - objects[i].y;

    // 定义源图像的四个角点
    cv::Point2f src_points[4];
    // 定义目标图像的四个角点
    cv::Point2f dst_points[4];
    // 通过Image Watch查看的二维码四个角点坐标
    src_points[0]=cv::Point2f(new_x1, new_y1);
    src_points[1]=cv::Point2f(new_x2, new_y2);
    src_points[2]=cv::Point2f(new_x3, new_y3);
    src_points[3]=cv::Point2f(new_x4, new_y4);
    // 期望透视变换后二维码四个角点的坐标
    dst_points[0]=cv::Point2f(0.0, 0.0);
    dst_points[1]=cv::Point2f(168.0, 0.0);
    dst_points[2]=cv::Point2f(0.0, 48.0);
    dst_points[3]=cv::Point2f(168.0, 48.0);

    // 计算透视变换矩阵
    cv::Mat rotation,img_warp;
    cv::Rect_<float> rect;
    rect.x = objects[i].x;
    rect.y = objects[i].y;
    rect.height = objects[i].h;
    rect.width = objects[i].w;
    // 提取车牌区域
    cv::Mat ROI = image(rect);
    // 计算透视变换矩阵
    rotation=getPerspectiveTransform(src_points,dst_points);
    // 应用透视变换,将车牌区域矫正为指定大小
    warpPerspective(ROI,ROI,rotation,cv::Size(168, 48));
    }
    //具体看我给的源码实现。

  • 下面是结构图

🪄crnn结构图

在这里插入图片描述

  • 还可以参考此链接我写的另外一篇文章也是矫正的有异曲同工之处点击下面
  • 三行代码实现文档智能校正
  • crnn实现车牌数字识别

使用jni实现高级Android开发

🎉java层如何调用c++层

  • 方法命名规则:C++ 层的 JNI 函数名需要遵循特定的命名规则,例如 Java_包名_类名_方法名。
  • 数据类型转换:在 Java 和C++ 之间传递数据时,需要进行数据类型的转换,例如 jstring 和 std::string 之间的转换。
  • 内存管理:在 JNI编程中,需要注意内存的分配和释放,避免内存泄漏。
  • 如果需要更详细的教程请在评论区留言我下次更新就专门针对Android的高级开发进行讲解。

车牌识别效果图

在这里插入图片描述

参考文章

  • 三行代码实现文档智能校正
  • NCNN 官方文档:NCNN 是一个为手机端极致优化的高性能神经网络前向计算框架,本文使用 ncnn 模型格式适配安卓手机端,此文档提供了关于 NCNN 的详细介绍、使用方法和相关技术细节。
  • YOLOv5 官方仓库:本文使用 YOLOv5 作为车牌检测模型,该仓库包含了 YOLOv5 的源代码、训练脚本、预训练模型等资源,有助于深入了解 YOLOv5 的原理和使用方式。
  • OpenCV 官方文档:在车牌矫正部分使用了 OpenCV 的透视变换函数,此文档详细介绍了 OpenCV 的各种功能和 API,为计算机视觉开发提供了丰富的资源和指导。
  • CRNN 相关论文:本文使用 CRNN 进行车牌识别,该论文是 CRNN 的原始论文,详细阐述了 CRNN 的架构和原理,对于理解和应用 CRNN 模型有很大的帮助。
  • JNI 官方教程:在实现 Java 层调用 C++ 层代码时使用了 JNI 技术,该教程提供了关于 JNI 的详细规范和使用方法,是学习和使用 JNI 的重要参考资料。
  • 通过结合 YOLOv 与 CNN 以及 OpenCV 算法实现了高精度的车牌识别。
    如果以上内容有不足欢迎您的指出。

http://www.niftyadmin.cn/n/5845426.html

相关文章

安卓7以上抓包证书安装

安卓7以上抓包证书安装 fiddler 用户可以直接试试这个文件 前提是要root过了&#xff0c;如果是模拟器就很容易开启 前提&#xff1a;要有openssl工具&#xff0c;在linux一个指令就可以下载了&#xff1a;sudo apt-get install openssl,windons则是在https://www.openssl.org/…

LM Studio 部署本地大语言模型

一、下载安装 1.搜索&#xff1a;lm studio LM Studio - Discover, download, and run local LLMs 2.下载 3.安装 4.更改成中文 二、下载模型(软件内下载) 1.选择使用代理&#xff0c;否则无法下载 2.更改模型下载目录 默认下载位置 C:\Users\用户名\.lmstudio\models 3.搜…

算法日记13:SC41树状数组(区间修改)

一、题目&#xff1a; 二、题解&#xff1a; 在单点修改中&#xff0c;我们用t[i]来维护原数组2.1:在区间修改中&#xff0c;我们将维护原数组的差分数组 接下来&#xff0c;让我们来回顾一些差分的性质 此时&#xff0c;假设我们需要求 a 1 a 2 a 3 a 4 a1a2a3a4 a1a2a3a…

LeetCode:59. 螺旋矩阵 II(模拟 Java)

目录 59. 螺旋矩阵 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 模拟 原理思路&#xff1a; 59. 螺旋矩阵 II 题目描述&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 ma…

s1:简单测试-时间规模化

25年1月来自斯坦福、西雅图 UW、AI2 和 Contextual AI 的论文“s1: Simple test-time scaling”。 测试-时间规模化是一种很有前途的语言建模新方法&#xff0c;它使用额外的测试-时间计算来提高性能。最近&#xff0c;OpenAI 的 o1 模型展示这种能力&#xff0c;但并未公开分…

apisix的real-ip插件使用说明

k8s集群入口一般都需要过负载均衡&#xff0c;然后再到apisix。 这时候如果后台业务需要获取客户端ip&#xff0c;可能拿到的是lb或者网关的内网ip。 这里一般要获取真实ip需要做几个处理。 1. 负载均衡上&#xff0c;一般支持配置获取真实ip参数&#xff0c;需要配置上。然…

Cloudflare 2024 网络流量回顾:洞悉网络发展趋势与安全挑战

Cloudflare 近日发布了 2024 年网络流量回顾报告&#xff0c;为我们提供了宝贵的全球互联网流量数据。这份报告涵盖了 IPv4/IPv6 比例、HTTP 协议版本占比、API 客户端语言分布、浏览器市场份额以及机器人流量分析等多个方面&#xff0c;为我们理解当前网络发展趋势和安全挑战提…

profinet转ModbusTCP网关,助机器人“掀起”工业智能的惊涛骇浪

在现代汽车制造过程中&#xff0c;生产设备的精确控制与实时监测是确保产品质量和生产效率的关键。某汽车制造厂在其生产线上应用了可编程逻辑控制器&#xff08;PLC&#xff09;和压力传感器&#xff0c;这两种设备分别使用稳联技术Profinet和ModbusTCP协议&#xff08; WL-A…