我要开一个超市,超市里面卖的是“数据库和中间件(2)”
1. 筹备阶段:基础数据管理(MySQL基础)你开了一家社区超市,刚开始只有一台收银机(单机数据库),商品信息、库存、销售记录都存在一张大表里。
1.1 商品表设计:字段类型选择商品表需要存名称、价格、库存、描述。你发现描述用TEXT,但查询时很少用到,就单独拆成一张附表。这里涉及到行溢出:InnoDB每行最多只能存8KB左右,TEXT字段会存储在溢出页,只保留20字节指针。如果频繁查询商品列表时不查描述,就能避免读取溢出页的IO。
1.2 索引的底层原理顾客开始搜索商品,比如“找所有保质期大于30天的牛奶”。你给expire_days加了索引。InnoDB的索引是B+树,叶子节点存主键和expire_days。范围查询时,B+树通过双向链表顺序读取,非常快。深入细节:B+树的阶数(页面大小16KB,每个索引项约16字节,则一个页面可存约1000个键,三层B+树就能存10亿条数据,IO次数极少)。自适应哈希索引:InnoDB监控到某些索引值被频繁等值查询,会自动在内存中建哈希索引加速,但只适用于等值查询且无法持久化。
1.3 SQL优化与执行计划某天查询“销量前十的商品”变慢,用EXP ...
我要开一个超市,超市里面卖的是“数据库和中间件(1)”
1. 初期:单库单表扛业务,MySQL基础优化我们当时先上线了一个基础版:商品信息、用户信息、订单都放在一个MySQL实例里,几张表。一开始流量不大,一切正常。但很快,随着商品种类增多,订单表数据量突破百万级,查询开始变慢。
问题1:查询慢,尤其是订单列表按用户ID和时间排序。
我们分析慢查询日志,发现一个典型查询:
1SELECT * FROM order WHERE user_id = 123 ORDER BY create_time DESC LIMIT 10;
explain发现全表扫描,因为user_id和create_time没联合索引。于是我们加了联合索引(user_id, create_time),查询瞬间变快。这里涉及B+树索引结构:联合索引先按user_id排序,再按create_time排序,所以能快速定位到该用户的记录,并利用索引的有序性直接拿到前10条,避免filesort。同时,因为只查10条,我们用到了索引下推(ICP),MySQL在存储引擎层就能根据索引过滤掉不符合user_id的记录,减少回表。
问题2:订单状态更新频繁,行锁竞争激烈。
秒杀时大量用户 ...
我要开一个超市,超市里面卖的是“C++续集(2)”
超市系统 V2.0:精细化运营1. 商品类别与类型安全——enum class 与 using enum需求:超市商品种类繁多,需要精确分类(食品、电器、服装等)。之前用整数或字符串表示类别,容易混淆,比如误将电器类别传入食品函数。我们需要强类型枚举。
解决方案:C++11的enum class。
123456enum class Category { Food, Electronics, Clothing, /*...*/ };class Product { Category category; // ...};
enum class不会隐式转换为整数,避免了意外混用。C++20引入了using enum,可以在作用域内引入枚举成员,简化代码:
1234567void processProduct(const Product& p) { using enum Category; // 引入 Food, Electronics 等 switch (p.category) { ca ...
我要开一个超市,超市里面卖的是“C++续集(1)”
补充阶段:会员系统与类型擦除(Type Erasure)超市想搞会员积分,会员有不同等级(普通、黄金、钻石)。我们需要存储不同类型的会员信息,但不想用继承(因为会员类型固定,且可能增加新类型)。这就可以用 std::variant 或 类型擦除。
12345678910111213141516171819202122class Member { struct Concept { virtual ~Concept() = default; virtual int getPoints() const = 0; virtual std::unique_ptr<Concept> clone() const = 0; }; template<typename T> struct Model : Concept { T data; Model(T d) : data(std::move(d)) {} int ...
我要开一个超市,超市里面卖的是“C++”
假设我要从零开发一个“智能超市管理系统”,咱们就跟着需求一步步看C++是怎么派上用场的,而且为什么非得用它这些特性不可。
第一阶段:商品和货架——类与对象、封装、RAII最开始,超市得有商品。每个商品有名称、价格、条码、保质期。这自然就用类来抽象:
12345678910class Product { std::string name; double price; std::string barcode; Date expiryDate;public: Product(std::string n, double p, std::string bc, Date exp) : name(std::move(n)), price(p), barcode(std::move(bc)), expiryDate(exp) {} // ... 访问接口};
这里就涉及RAII(资源获取即初始化):std::string 自己管理内存,我们不用操心释放。如果不用RAII,手动 new/delete 很 ...
我要开一个超市,超市里面卖的是“图像分类、语义分割、模型量化剪枝与压缩-遇到了第一个挑战(1)”
8. 数据准备:从标注到数据集管理在超市项目中,我们面临第一个挑战:数据标注的规模和质量。我们需要两种标注:目标检测的边界框和语义分割的像素级标签。
8.1 标注规范与工具
检测标注:用labelImg框出每个商品,类别包括“可口可乐”、“乐事薯片”等数百种。注意边界框要贴合商品边缘,避免过多背景。
分割标注:用labelme绘制多边形,区分“商品”、“货架板”、“空隙”、“顾客手部”等。分割标注更耗时,所以我们只对部分关键帧进行分割标注,用于训练UNet。
数据格式:检测数据转为COCO格式(一个JSON文件包含images、annotations、categories),分割数据转为标准的分割掩码(单通道PNG,像素值对应类别ID)。
8.2 数据增强与预处理在训练YOLO和UNet时,数据增强至关重要。我们通过源码自定义增强策略:
YOLO的数据增强:YOLOv5源码中的datasets.py实现了Mosaic、MixUp、随机仿射变换等。Mosaic将四张图拼成一张,丰富背景和小物体。但Mosaic产生的图像分布与真实场景有差异,我们只在训练前期使用,后期关闭。123456 ...
我要开一个超市,超市里面卖的是“图像分类、语义分割、模型量化剪枝与压缩(升级版V1)”
1. 整体故事:我要开一家“未来超市”假设我们团队接了一个项目:为一家连锁超市打造AI视觉系统,实现无人结算、货架智能管理、顾客行为分析。硬件是Jetson AGX Orin(性能比Nano强,但依然资源受限),要求所有模型在边缘实时运行(摄像头30fps)。系统包括:
目标检测:识别顾客拿取的商品,并关联到购物车。
语义分割:分析货架商品覆盖情况、顾客手部与货架的交互区域。
模型部署:所有模型必须转换成能在边缘高效运行的格式,并做极致优化。
模型压缩:为了达到实时性,需要对模型进行剪枝、量化,甚至知识蒸馏。
这个项目涉及的技术栈正好是你提到的所有内容。下面我们一步步深入。
2. 目标检测:YOLO源码深度剖析2.1 为什么选择YOLOv5(或者v8)?YOLO系列是目前工业界最常用的实时检测器。我们选择YOLOv5,因为它平衡了速度和精度,且工程化做得很好(代码易读、部署友好)。但作为工程师,不能只会调包,必须理解源码里的每个模块。
2.2 YOLOv5 网络结构细节YOLOv5的网络可以分为:
Backbone:CSPDarknet53,但加入了Focus层和CSPNet结 ...
我要开一个超市,超市里面卖的是“图像分类、语义分割、模型量化剪枝与压缩
@TOC
1. 需求与问题:我要开一家智能超市假设我想开一家24小时无人智能超市。核心需求是:
商品识别:顾客拿商品时,摄像头能自动识别拿了什么,并计入账单。
货架监控:检测商品是否缺货、摆放是否整齐,甚至分析顾客的购物行为。
边缘部署:所有计算必须在本地边缘设备(比如Jetson Nano或者树莓派)上实时完成,不能依赖云端(延迟和隐私问题)。
模型优化:设备资源有限(算力、内存),需要把模型压缩到足够小,同时保持精度。
2. 目标检测:用YOLO识别商品首先,商品识别是个典型的目标检测问题。我们需要在图像中框出每个商品,并给出类别(比如可口可乐、薯片)。
为什么选YOLO?因为需要实时性。YOLO(You Only Look Once)是单阶段检测器,一次前向就能同时预测边界框和类别,速度极快。像Faster R-CNN这种两阶段检测器虽然精度可能更高,但速度慢,不适合实时场景。
YOLO的细节理解YOLO的核心思想是把图像划分成网格,每个网格负责预测中心点落在该网格内的物体。每个网格预测多个边界框(anchor-based),以及每个框的置信度和类别概率。
以YOLOv5为 ...
二-1-(4):在你的两个AI小宠物GEMINI与TRAE的交互下,帮你实现能听懂人话并诊断模型错误的小助手
@TOC
代码仓库入口:- github源码地址。- gitee源码地址。系列文章规划:
(OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(1):从开发的视角看下CAD画出那些好看的图形们))
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(2):看似“老派”的 C++ 底层优化,恰恰是这些前沿领域最需要的基础设施)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(3):你的 CAD 终于能画标准零件了,但用户想要“弧面”、“流线型”,怎么办?)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(4):GstarCAD / AutoCAD 客户端相关产品 —— 深入骨髓的数据库哲学)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(5)番外篇:给 CAD 加上“控制台”——让用户能实时“调参数、看性能”)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(6)番外篇:让视图“活”起来——鼠标拖拽、缩放背后的数学魔法
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(7)-番外篇:点击 ...
二-1-(5):在你的GEMINI和TRAE 宠物帮助下,帮你实现能听懂人话并诊断模型错误的小助手-问题总结和解决篇
@[TOC](OpenGL渲染与几何内核那点事-项目实践理论补充(二-1-5-在你的GEMINI和TRAE 宠物帮助下,帮你实现能听懂人话并诊断模型错误的小助手-问题总结和解决篇))
代码仓库入口:- github源码地址。- gitee源码地址。系列文章规划:
(OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(1):从开发的视角看下CAD画出那些好看的图形们))
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(2):看似“老派”的 C++ 底层优化,恰恰是这些前沿领域最需要的基础设施)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(3):你的 CAD 终于能画标准零件了,但用户想要“弧面”、“流线型”,怎么办?)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(4):GstarCAD / AutoCAD 客户端相关产品 —— 深入骨髓的数据库哲学)
OpenGL渲染与几何内核那点事-项目实践理论补充(一-1-(5)番外篇:给 CAD 加上“控制台”——让用户能实时“调参数、看性能”)
OpenGL渲染与几何内核那点 ...
