`

京东活动系统--openresty实践之路

 
阅读更多

背景

     先来说下今天的主角openresty,它是一个基于 Nginx Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。可以使用Lua编写脚本,然后部署到Nginx Web容器中运行。利用nginx的高并发处理能力,轻松构建自己的高性能的Web服务。

    但个人觉得,使用lua编写一些复杂业务逻辑不是它的专长,编写成本也比较高。现有业务的web系统,大多还是以javac#等为主。如要完全改为lua实现,几乎不可能完成。

    上一篇分享《京东活动系统亿级流量架构应对之术》的核心,其实是活动页面的浏览与页面的渲染的异步化。即:活动页面在被浏览时,view工程直接从redis或者硬盘获取已经在engine工程被渲染好的页面返回。简而言之,就是通过engine工程提前渲染好页面,实现页面全静态化。保证view工程每次请求都直接获取静态页面返回,无需等待页面渲染。

 

    这样复杂的业务逻辑已经被完全剥离到engine工程。view工程可以采用nginx+lua+redis+硬盘实现自己的高性能web服务。最终架构如下:



 

 

其中,硬盘和redis互为主备,做一个开关相互切换。

 

lua+redis 字符串压缩

engine工程采用java把静态html字符串放入redisview工程再采用luaredis中获取。这里本身没有问题,但是由于活动页面的内容较多,一个静态页面html动辄几百kb,大的甚至几兆。存取速度势必会很慢,很自然的会想到压缩。

 

 

view工程没有引入openresty之前,我们所有的活动页面都是采用的javagzipGZIPInputStreamGZIPOutputStream来进行压缩和解压,也收到很好的收益,并且待压缩内容越长压缩效果越是明显。存入redis前先用GZIPInputStream压缩,把压缩后的字节数组存入redis(在engine中完成)。view工程从redis中取出,再用GZIPOutputStream解压,还原成正常的活动页面静态html字符串返回。如下:



 

现在要把view工程改为用openresty实现,难点就在于用luaredis中取出字符串的内容是用gzip压缩后的,直接返回是乱码。通过查找资料,lua可以调用zlib来实现对字符串的压缩和解压(参考

https://github.com/brimworks/lua-zlib)。

 

engine工程压缩端把gzip压缩方式改成zlib压缩、并存入redisjava zlib压缩可以参考http://snowolf.iteye.com/blog/465433)。view工程就可以直接从redis中获取,再通过zlib解压即可。但由于redis已存在大量gzip压缩的活动页,这种方式没办法实现平滑过渡。

 

通过分析gzipzlib,可以发现他们本质上都是deflate算法进行压缩。只是gzip相对于zlib会多一个描述头部,如果直接用lua-zlib解压gzip压缩的内容,头部会多出一段乱码,其余内容完全一样。我们直接去掉这部分乱码头部即可:



 

 

lua实现如下:

nginx.conf配置如下:

   

location  ~ ^/act/(\w+)\.html{
      default_type "text/html";
      charset utf-8,gbk;
      set $shortUrl $1;
      content_by_lua_file /export/app/view/page_view_redis.lua;
    }
 

 

/export/app/view/page_view_redis.lua代码如下:

 

local redis_pool = require "redis_pool" -- lua redis缓存池封装
local zlib = require "zlib"
local stream = zlib.inflate()
local key = "pc-page-cache-key-"..ngx.var.shortUrl
local red = redis_pool:new()
local res, err = red:get(key)
if res ~= nil then
    -- 解压, page内容为:"xxxxxx<html><header></header><body>test page</body></html>"其中xxxxx即为gzip压缩的乱码头
    local page=stream(res);
    -- 去掉乱码头
    local h1,h2=string.find(r, "<html>")
 
page= string.sub(page,h1)
    -- 返回页面内容
    ngx.say(page)
end
ngx.say("页面不存在")
ngx. ngx.exit(200)
 

 

 

lua+硬盘

先说下,静态活动页面存硬盘:

1engine:渲染页面完成;

2engine:页面内容存入redis

3engine:根据活动url hash规则,向指定的view服务器发送数据推送请求;

4viewview服务器收到请求,从redis中获取页面内容存到指定目录下。

 

步骤4中,从redis中取出,还是要先进行解压,再存储到指定目录,lua代码如下:

nginx.conf配置:

 

# engine 发起的保存页面到本地硬盘请求
    location  ~ ^/save/(\w+)\.html{
      default_type "text/html";
      charset utf-8,gbk;
      set $key $1;
      content_by_lua_file /export/app/view/save_disk.lua;
    }
 

 

/export/app/view/save_disk.lua代码内容如下:

 

local redis_pool = require "redis_pool" -- lua redis缓存池封装
local util_tools = require "util_tools"
local zlib = require "zlib"
local stream = zlib.inflate()
 
local key = "pc-page-cache-key-"..ngx.var.shortUrl
local red = redis_pool:new();
local res, err = red:get(key)
if res ~= nil then
    -- 解压, page内容为:"xxxxxx<html><header></header><body>test page</body></html>"其中xxxxx即为gzip压缩的乱码头
    local page=stream(res);
    -- 去掉乱码头
    local h1,h2=string.find(page, "<html>")
    page= string.sub(page,h1)
 
    -- 通过md5(uri),构造存储目录和文件名
    local pageUri="/act/"..ngx.var.shortUrl..".html"
    local filePath,pageName = util_tools:get_abpath(pageUri)
    local file,err=io.open(filePath)
    if not file then  --如果文件目录不存在,就先创建
        os.execute("mkdir -p "..filePath)
    end
    local f = assert(io.open(filePath..pageName,'w')) --写入硬盘文件中
    f:write(page) -- 存储页面
    f:close()
end
ngx.exit(200)
 

 

 

util_tools.lua代码内容:

 

local rootPath="/export/static/page/"
local uri_pre = "page"
 
local util_tools = {}
 
-- get static html page
-- 如md5(url)=xxxxxxabc,最终的页面内容存放到:"/export/static/page/c/ab/xxxxxxabc",拼装的新uri为:/page/c/ab/xxxxxxabc
function util_tools:get_path(url)
    local md5path = ngx.md5(url)
    local pathlen = string.len(md5path)
    local path1 = string.sub(md5path,-1)
    local path2 = string.sub(md5path,pathlen-2,-2)
    local abPathFile = uri_pre.."/"..path1.."/"..path2.."/"..md5path
    return abPathFile
end
 
-- get static html page path and name
--类似nginx proxy cache对文件的存储结构,把链接先md5,取后三位字符串,拼成文件存放目录
--存取文件:如md5(url)=xxxxxxabc,最终的页面内容存放到:"/export/static/page/c/ab/xxxxxxabc"
function util_tools:get_abpath(url)
    local md5path = ngx.md5(url)
    local pathlen = string.len(md5path)
    local path1 = string.sub(md5path,-1)
    local path2 = string.sub(md5path,pathlen-2,-2)
    local abPathFile = rootPath.."/"..path1.."/"..path2.."/"
    return abPathFile,md5path
end
return util_tools
 

 

步骤3中的url hash规则讲解:由于京东活动页面较多,所有在线的活动静态页面大小已经超过10G。如果把如此大量的数据存放到每台sale服务上,是不可取的。

首先不方便扩展,随着京东业务快速增长,活动数据也会快速增加,而硬盘大小始终有限。

其次,在用lua读取静态页面时,从如此大量的静态文件中查找也会增加耗时。通过活动url规则进行hash,把这些活动页面内容平均分配到不同sale服务器分组,是我们目前采取的方式。其中还涉及到sale服务器主备分组,这里就不再详细讲解,后面单独再做一次分享。

 

再说下从硬盘获取,根据url拼装出文件存放路径,直接从本地硬盘获取即可。代码如下:

 

location  ~ ^/act/(\w+)\.html{
      default_type "text/html";
      charset utf-8,gbk;
      set $shortUrl $1;
      content_by_lua_file /export/app/view/page_view_redis.lua;
    }
/export/app/view/page_view_redis.lua代码内容:
local util_tools = require "util_tools"
-- 如果链接为http://sale.jd.com/act/Ok70VSmKFZo1Weca.html,pageUri为:
-- /act/Ok70VSmKFZo1Weca.html
local pageUri="/act/"..ngx.var.key..".html"
local abpath = util_tools:get_abpath(pageUri)
--abpath相对路径 规则为:/page/c/ab/xxxxxxabc
local resSta = ngx.location.capture(abpath)
if resSta.status == ngx.HTTP_OK then  --读取到硬盘
    if resSta.body ~= nil and resSta.body ~= "nil" and resSta.body ~= "" then
        ngx.say(resSta.body) --返回页面内容
        return ngx.exit(200)
    end
end
 

 

view 工程代码结构(lua

 

再来看下代码结构:

|--export

|-----|app

|---------|view

|--------------| page_view_redis.lua

|--------------| page_view_disk.lua

|--------------| save_disk.lua

|--------------| util_tools.lua

|-----|pro

|--------|nginx

|------------|conf

|----------------|nginx.conf

 

比起java来是不是简洁多了。页面浏览可以读redis和硬盘,可以在lua_shared_dict中存放一个切换开关,根据开关值选择执行page_view_redis.lua或者page_view_disk.lua

 

    好了就写这么多了吧,回顾下这次讲解的主要内容:luaredislua-zlibgzip压缩字符串、lua读硬盘等。

 

  • 大小: 91.2 KB
  • 大小: 53.1 KB
  • 大小: 49.6 KB
分享到:
评论

相关推荐

    京东李开涛 跟我学Nginx+Lua 开发

    - **实践意义**:京东大神李开涛基于Nginx+OpenResty进行Web高并发实践,不仅提高了系统的响应速度和服务质量,也为业界提供了宝贵的经验和技术方案。 #### 知识点二:OpenResty 及其核心优势 - **OpenResty概述**...

    基于ceph构建PB级对象存储实践-JD金融.pdf

    综上所述,京东金融基于Ceph构建的PB级对象存储系统,在满足海量数据存储需求的同时,通过一系列自研技术和工具的应用,实现了高可用性、高性能以及灵活的扩展性,为企业的业务发展提供了强有力的支持。

    开涛高可用高并发-亿级流量核心技术

    17 京东商品详情页服务闭环实践 348 17.1 为什么需要统一服务 348 17.2 整体架构 349 17.3 一些架构思路和总结 350 17.3.1 两种读服务架构模式 351 17.3.2 本地缓存 352 17.3.3 多级缓存 353 17.3.4 统一入口/服务...

    数据集-苹果果目标检测-labelme-4430

    包含4430张苹果目标检测图片和标签数据。 数据集介绍: https://blog.csdn.net/qq_21386397/article/details/147465394

    基于YOLOv5和Django实现了对道路交通标识的实时识别系统+项目说明(毕设作品).zip

    基于YOLOv5和Django实现了对道路交通标识的实时识别系统+项目说明(毕设作品).zip 项目简介 该项目基于YOLOv5和Django实现了对道路交通标识的实时识别并利用Django后端框架部署该项目,用户可以在网页上实时观看检测画面。 项目组成 detect文件夹 Django APP 主要是识别的代码、模型、以及相关的资源 主要功能点 基于YOLOv5的道路交通标识实时识别 利用Django后端框架部署项目,提供网页界面供用户实时观看检测结果 技术栈 计算机视觉: YOLOv5 Web框架: Django

    NetworkWordCount.py

    NetworkWordCount.py

    groovy-2.4.0-beta-3.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    groovy-2.3.0-beta-2.jar中文文档.zip

    # 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    Python新手入门学习方法指南.pdf

    内容概要:本文档为Python新手提供了全面的学习指南,涵盖从零基础到独立编程所需的知识和技能。首先介绍了Python的核心优势和应用场景,强调其简洁的语法、丰富的生态以及跨平台支持。接着详细规划了四个学习阶段:基础语法(1-2周),包括变量、数据类型、流程控制等;数据结构与文件操作(2-3周),涉及列表、字典、文件读写;面向对象与模块化编程(3-4周),讲解类与对象、继承、模块化开发;实战项目(持续练习),通过具体项目巩固所学知识。此外,还提供了开发环境搭建指导、高效学习技巧、常见问题避坑指南及学习资源推荐,帮助初学者顺利入门。 适合人群:零基础或有少量编程经验,希望系统学习Python的新手程序员。 使用场景及目标:①为初学者提供系统的Python学习路径,从基础到实战逐步提升编程能力;②帮助学习者掌握Python核心语法和常用工具,能够独立完成小型项目;③通过实战项目积累经验,培养解决实际问题的能力。 其他说明:建议学习者按照规划的学习路径循序渐进,每天坚持练习,并积极参与社区交流。遇到问题时,善用官方文档和在线资源,保持学习动力,逐步成长为自信的开发者。

    flink-table-api-java-1.14.1.jar中文-英文对照文档.zip

    # 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

    Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据

    Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数据Python 实现的爬取汽车之家数据并进行可视化展示项目源代码+全部数

    基于Gensim和Jieba的中文文本聚类LDA模型构建与优化

    内容概要:本文详细介绍了如何利用Gensim库和Jieba分词工具进行中文文本聚类,尤其是LDA(Latent Dirichlet Allocation)主题模型的应用。首先,通过自定义词典和停用词表来提高分词准确性,确保专业术语不会被错误分割。然后,将分词后的文本转换为词袋模型,作为LDA模型的输入。文中还探讨了多个重要参数的选择与调优方法,如主题数量(num_topics)、迭代次数(passes)、以及随机种子(random_state)。此外,作者分享了一些实用的经验,例如如何通过coherence score评估模型质量,以及如何使用pyLDAvis进行可视化展示。 适合人群:有一定编程基础的数据分析师、自然语言处理工程师、文本挖掘研究人员。 使用场景及目标:适用于需要从大量非结构化文本中抽取潜在主题的场景,如舆情分析、市场调研、文献分类等。主要目标是帮助用户掌握LDA模型的基本原理及其在中文环境下的具体实现方法。 其他说明:本文不仅提供了完整的代码示例,还强调了实践中需要注意的问题和技巧,使读者能够更好地理解和应用这一强大的文本分析工具。

    毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型

    毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolov5路面桥梁裂缝检测识别项目源代码+模型毕业设计基于Python+Yolo

    go2rtc流媒体平台,支持rtsp大华摄像头海康H264 H265 WEBRTC

    go2rtc流媒体平台,支持rtsp大华摄像头海康H264 H265 WEBRTC,有支持http接口

    基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明

    基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视化项目源代码+数据+文档说明基于Python实现Boss直聘岗位数据采集及分析可视

    STM32CubeIDE 1.18.1自动补全插件

    STM32CubeIDE自动补全代码功能插件,覆盖STM32CubeIDE\plugins对应文件!

    基于springboot+vue前后端分离,科研工作量管理系统(源码+Mysql数据库+视频+教程),高分项目,开箱即用(毕业设计)(课堂设计)

    基于springboot+vue前后端分离,科研工作量管理系统(源码+Mysql数据库+视频+教程),高分项目,开箱即用(毕业设计)(课堂设计) 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本科研工作量管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此科研工作量管理系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理字典管理、工作量管理、科研获奖管理、科研论文管理、秘书管理、科研项目管理、教师管理、管理员管理等功能。科研工作量管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。

    集装箱号码自动识别软件-DEMO演示程序

    如因版本过旧,测试过程中有任何问题可联系作者获取最新版本,可提供私有化部署API。 1、集装箱箱号OCR识别技术实现流程 (1)图像预处理 目标检测:使用启智畅想模型定位集装箱区域,缩小处理范围。 角度矫正:通过透视变换(如霍夫变换检测边缘)校正倾斜或扭曲的箱号。 图像增强:灰度化、二值化、去噪、对比度调整等,提升文本可读性。 (2)字符区域定位 字符检测:基于深度学习的文本检测模型定位箱号区域。 区域筛选:根据集装箱号长度(11字符)和排列规则筛选候选区域。 (3)字符识别 端到端方法:使用网络神经以及深度学习模型直接识别字符序列,避免传统分割步骤。 字符分割:投影法、连通域分析或U-Net分割粘连字符。 字符识别:训练CNN分类模型,支持数字以及大小写字母(0-9,A-Z,排除部分易混字符如I和1/O和0)。 (4)校验码验证 校验码比对:将识别的前10位转换为ISO6346标准数值,按权重计算并与OCR结果比对。 校验机制:若校验失败,触发重新识别或人工复核。 2、集装箱箱号OCR识别技术的多场景应用 复杂环境:应对光照不均、污渍、锈蚀、反光等干扰。 特殊字体:集装箱号的特殊字体(如OCR-B字体)需针对性训练。 3.数据集与训练 数据收集:自建数据集。 数据增强:模拟真实场景的噪声、模糊、旋转、仿射变换等。 算法迭代:基于预训练模型(如ImageNet)微调,提升训练效率,通过在线学习更新集装箱箱号OCR识别模型,适应新字体或环境变化。 4.评估指标 字符级准确率:99.9%以上 校验码通过率:99.9%以上 推理速度(FPS):毫秒级识别 通过结合深度学习的集装箱箱号OCR识别技术与规则校验,集装箱号OCR识别系统可达到高精度与高可靠性,广泛应用于物流追踪、海关通关和智能港口管理等场景

    基于Matlab的自动泊车系统中垂直车位路径规划仿真

    内容概要:本文详细介绍了使用Matlab进行自动泊车系统的垂直车位路径规划仿真。首先解释了Hybrid A*算法的基本原理及其在垂直车位泊车中的应用,重点讨论了路径规划的关键步骤,如外摆车头、转向角调整、碰撞检测以及路径生成。文中提供了具体的Matlab代码示例,展示了从车辆参数定义、路径点生成到最终路径验证的全过程。此外,还探讨了几何分析阶段的车辆运动轨迹建模,包括最小转弯半径的计算和转向圆心的确定。同时,为了确保路径的安全性和可行性,引入了边界圆检测法进行碰撞检测,并对路径进行了优化以满足实际驾驶的需求。 适合人群:对自动驾驶技术感兴趣的科研人员、工程师以及希望深入了解自动泊车系统的学生。 使用场景及目标:适用于研究和开发自动泊车系统的路径规划算法,帮助开发者理解和实现自动泊车过程中遇到的技术挑战,如路径规划、碰撞检测和路径优化。 其他说明:本文不仅提供了理论分析,还有详细的代码实现,便于读者快速上手并进行实验。同时,文中提到的一些技巧和注意事项对于提高仿真的准确性和实用性非常有帮助。

    基于轨迹预测的辅助驾驶安全预警系统:Carsim2019+Simulink周向防碰撞技术解析

    内容概要:本文详细介绍了基于轨迹预测的周向防碰撞系统,重点探讨了CTRV(恒定转向率和速度)轨迹预测模型的应用。该系统利用Carsim2019和Simulink进行建模和仿真,结合车载激光雷达获取的环境信息,实现了对未来几秒钟内车辆轨迹的精准预测。文中不仅提供了Python和MATLAB的伪代码示例,还讨论了如何通过动态安全距离策略、运动趋势权重等方法提高系统的鲁棒性和准确性。此外,文章还涉及了传感器数据处理、状态预测、决策模块的设计等方面的内容。 适合人群:从事自动驾驶技术研发的工程师和技术爱好者,尤其是对车辆轨迹预测、防碰撞算法感兴趣的读者。 使用场景及目标:适用于研究和开发辅助驾驶系统的机构和个人。主要目标是在各种危险碰撞场景下,提前预测并采取措施,确保行车安全。同时,也为未来自动驾驶技术的发展提供了理论依据和技术支持。 其他说明:文章强调了系统在实际应用中的挑战和优化方法,如噪声模型的改进、传感器数据的处理等。通过实例展示了系统在不同工况下的表现,如连续S弯、鬼探头等情况下的应对能力。

Global site tag (gtag.js) - Google Analytics