96SEO 2026-02-20 10:06 0
APP构建1导入OpenCV库2导入动态链接库so文件3引入Csupport、用CMake生成链接库

导入训练好的模型5.注册内容提供器、声明SD卡访问权限6.配置Lite
Recognition车牌识别模型结合深度学习和目标检测等先进技术构建了一个全面的车牌识别系统实现了从车牌检测到字符识别的端到端解决方案。
首先我们利用CCPD数据集其中包含大量的中文车牌图像用于模型的训练和验证。
这个数据集的丰富性有助于模型更好地理解不同场景下的车牌特征。
接着我们引入LPR模型这是一种专门设计用于车牌识别的模型。
通过深度学习技术LPR模型可以学习和识别不同类型的车牌无论是小轿车、卡车还是摩托车。
在模型设计中我们使用目标检测技术让模型能够自动定位和框选出图像中的车牌区域。
这样系统可以在不同图像中准确地找到车牌并且不受不同角度、光照等因素的影响。
通过将车牌区域提取出来我们将其输入到LPR模型中进行字符识别。
模型将车牌上的字符识别出来从而实现了完整的车牌识别功能。
综合上述技术本项目实现了一个端到端的车牌识别系统能够高效准确地检测和识别车牌无论是在不同的场景还是在各种环境下。
这种系统在交通管理、安防监控等领域具有重要的应用价值。
APP中应用的算法流程包括车牌粗定位、车牌精定位、快速倾斜矫正和无分割端到端字符识别的算法描述及流程如下图所示。
在清华TUNA开源镜像站https://mirrors.tuna.tsinghua.edu.cn/下载Miniconda
#其他常见的数据科学库如numpy在创建虚拟环境时或者安装TensorFlow
#若未安装,可以自行用conda或pip命令安装OpenCV环境
进入OpenCV官网的release页面https://opencv.org/releases/中下载OpenCV
下载地址为https://developer.android.google.cn/studio/APP开发使用Android
创建NewProject选择EmptyActivity-next在Name输入框输入项目名称Package
(语言)选择]avaMinimumAPllevel指定项目兼容的最低API版本设置后单击Finish按钮完成创建。
name命名为com.pcr.lpr。
创建Project后需安装SDK
Platforms和SDKTools。
单击窗口右上方右起第2个图标安装。
若系统中未安装JDK可前往https://www.oracle.com/java/technologies/javase-downloads.html下载单击Android
在https://developer.android.google.cn/ndk/downloads/older_releases.html中下载Android-ndk-r14b版本NDK并解压。
Structure在弹出的窗口中设置NDK路径如图17-6所示。
本项目包括3个模块数据预处理、模型训练、APP构建下面分别介绍各模块的功能及相关代码。
从CCPD页面https://github.com/detectRecog/CCPD中下载数据集解压得到图片数据如图所示。
获取数据集之后进行预处理。
依据数据集图片名称提供的信息对车牌进行裁剪文件名依据“_”进行分割第4组数据是图片中车牌的4个角点坐标第5组数据是7位车牌信息依据这两组数据可以得到分割后的车牌图片和车牌标签。
正样本和负样本的大小均为150X40用于Cascade级联分类器训练。
负样本可以随意裁剪图片中没有车牌正样本用于训练无分割车牌字符识别。
相关代码如下:
os.path.exists(output):os.mkdir(output)
cv2.imread(image_path#以“-”为分隔符将图片名切分其中iname[4]为车牌字符iname[2]为车牌坐标iname
iname[4].split(_)#将文件名七位车牌写入dataframe中new_line
new_line#crop车牌的左上角和右下角坐标[leftUp,
img.shape#将图片压缩成40*150计算压缩比imgScale
height#(目标宽-实际宽)/2,分别向左、右拓宽所有除以2deltaD
deltaD#切割宽度向右平移保证补够250rightDown[0]
newimg)#将图片信息写入.txt文件中fp.write(pos/new_name
filenames[400000:80000]:#补充完整图片路径image_path
cv2.imread(image_path)#裁剪不含车牌的区域new_img
new_img)#将图片信息写入.txt文件中fn.write(neg/
级联分类器和无分割车牌字符的卷积神经网络模型的训练具体过程如下。
得到正样本和负样本后在终端中切换到之前下载OpenCV的解压。
以D:\opencv\为例:
D:\opencv\build\x64\vc15\bin\在终端中执行如下命令其中-info填入正样本.txt文件的路径-bg填入负样本.txt文件的路径-num根据上一步分割得到的正样本数量修改-W、-h分别为样本图片的宽和高所有样本图片的宽高必须一致故此处填入上一步裁剪车牌设置的样本宽高。
40000执行完毕后生成pos.vec文件接着在终端中执行如下命令:
0.20其中-vec填入上一步生成的pos.vec文件路径-bg填入负样本.txt文件路径-numPos和
-numNeg根据上一步分割得到的正样本数量修改其他参数按命令提供的参数即可。
上述命令执行完毕后会在样本目录下得到训练好的cascade.xml的级联分类器文件。
process_info(img_info):#处理每条csv中的信息返回图片名称和one-hot后的标签img_path
label):#返回归一化后的解码图片矩阵和标签矩阵#读取文件image_string
tf.io.read_file(filename)#解码image_decoded
tf.image.decode_jpeg(image_string,
labels):#创建数据集管道#补充完整的图片路径filenames
tf.data.Dataset.from_tensor_slices((filenames,
dataset.map(parse_function,num_parallel_callstf.data.experimental.AUTOTUNE)#数据集分批dataset
dataset.batch(BATCH_SIZE)#在训练时预先加载数据dataset
dataset.prefetch(buffer_sizetf.data.experimental.AUTOTUNE)return
thresh0.5):#计算一个批次的宏f1分数返回宏f1分数y_pred
tf.cast(tf.math.count_nonzero(y_pred
tf.cast(tf.math.count_nonzero(y_pred
tf.cast(tf.math.count_nonzero((1
#两层卷积一层池化model.add(Conv2D(64,(3,3),paddingsame,
activationrelu,input_shape[150,
activationrelu))model.add(MaxPooling2D())
activationrelu))model.add(Conv2D(128,
activationrelu))model.add(MaxPooling2D())
activationrelu))model.add(Conv2D(256,
activationrelu))model.add(Conv2D(256,
activationrelu))model.add(MaxPooling2D())#全连接层model.add(Flatten())model.add(Dense(1024,
activationrelu))model.add(Dense(512,
activationrelu))model.add(Dense(238,
ML\output\pos.csv)train_pic_name
process_info(img_info.loc[i])#创建网络model
myModel()model.compile(lossbinary_crossentropy,optimizeradam,metrics[macro_f1])train_ds
train_label)#调用tensorboardtbTensorBoard(log_dirlogs)#训练网络model.fit(train_ds,
callbacks[tb])#保存模型model.save(segmention_free.h5)训练完成后在代码文件所在目录下得到segmention_free.h5模型文件。
myApplicationk处右击→New→Module创建新模块。
单击ImportEclipseADTProject选择sdk/java目录单击next按钮完成导入。
在界面左侧Project区打开openCVLibrary346\src\main\AndroidManifest.xml删除下图方框中的文字。
在左侧Project区打开新引入的Module\build.gradle修改compileSdkVersion和targetSdkVersion为28,
project(path::openCVLibrary346)2导入动态链接库so文件
在app\build.gradle的android{defaultConfig{}}中添加下列语句
将OpenCV-android-sdk-3.4.6\sdk\native\libs下的armeabi-v7复制到jniLibs中。
在app\build.gradle的android{defaultConfig{}}中添加下列语句
externalNativeBuild{cmake{cppFlags
}创建app\src\main\jniLibs目录。
在jniLibs下创建javaWrapper.cpp,引入jni.h和string.h,所有用native声明的java本地函数将在该文件中用C实现。
创建app\src\main\jniLibs\include下。
创建app\src\main\jniLibs\src下。
在APP目录下新建File命名为CMakeLists.txt添加如下代码
include_directories(src/main/jni/include)
include_directories(src/main/jni)
aux_source_directory(src/main/jni
aux_source_directory(src/main/jni/src
#修改为自己的opencv-android-sdk的jni路径
D:\\Android\\OpenCV-android-sdk-3.4.6\\sdk\\native\\jni)
#设置库的名称lprSHARED${SOURCE_FILES})
#指定目标库lpr${OpenCV_LIBS}#将目标库链接到NDK中包含的日志库${log-lib})
打开app\src\AndroidManifest.xml在application
providerandroid:nameandroidx.core.content.FileProviderandroid:authoritiescom.example.cameraalbumtest.fileproviderandroid:exportedfalseandroid:grantUriPermissionstruemeta-dataandroid:nameandroid.support.FILE_PROVIDER_PATHSandroid:resourcexml/file_paths
/provider在app\src\res下创建目录xmlxml中创建file_paths.xml并修改代码
xmlns:androidhttp://schemas.android.com/apk/res/android
external-pathnamemy_imagespath/
/pathsName属性可以随意设置path为空表示将整个SD卡进行共享也可修改为使用provider的文件地址。
打开app\src\AndroidManifest.xml在application
android:nameandroid.permission.WRITE_EXTERNAL_STORAGE
打开app\build.gradle在dependencies内添加代码
org.litepal.android:core:2.0.0在app\src\main\assets内创建Android
其中--logdir填写logs目录的路径loss和macro_
采用HyperLPR提供训练好的模型识别准确率为95%~97%下载地址为https://github.com/zeusees/HyperLPR/tree/master。
单击主界面中的相机图标进入相机界面拍摄带车牌图片或单击主界面中的图片图标进入选择带车牌图片。
单击右上方垃圾桶图标可删除已导入的图片单击SUBMIT按钮提交检测如下图所示。
单击“结果”页面右上方图标可保存识别结果。
保存的记录可单击“车牌识别”页面左上角图标查看如下图所示。
如果大家想继续了解人工智能相关学习路线和知识体系欢迎大家翻阅我的另外一篇博客《重磅
这篇博客参考了Github知名开源平台AI技术平台以及相关领域专家DatawhaleApacheCNAI有道和黄海广博士等约有近100G相关资料希望能帮助到所有小伙伴们。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback