ice 发布的文章

先对pdf数据格式做统一的处理,二值化,尽可能保证文字为纯黑,背景为白,图片不考虑
拉高对比度,或者根据文字rgb和背景rgb的差做二值化,两大问题:一:避免浅色文字和拍照时带阴影的背景被同时变白或变黑,错误二值化;二:水印与文字要区分开
对图片做最大池化,再二值化区分文字区域和空白区域,根据黑色区域的像素位置(可以先对黑色区域画框)反向计算出图片中的文本区域,根据文本区域做第一步裁剪,可以理解为换分段落,将分段排序,再做单行文本切割和文字识别。

kernel objects nvidia-fs这个选项是一个针对容器优化的文件系统,可能会提高容器中使用物理主机上的gpu的性能
安装过程中提示
sh: 1: lsmod: not found
sh: 1: dkms: not found
安装lsmod:https://commandnotfound.cn/linux/1/340/lsmod-%E5%91%BD%E4%BB%A4
ubuntu运行命令sudo apt-get install kmod(sudo根据情况添加,root用户不需要)
安装dkms:https://www.zhihu.com/question/474222642#%E7%BC%96%E8%AF%91nvidia%E9%A9%B1%E5%8A%A8%E6%A8%A1%E5%9D%97
sudo apt-get install dkms

nvidia-fs没有安装成功,sad

gpu环境配置:

安装cuda和cudnn

nvidia-smi查看gpu驱动以及支持的最高cuda版本
对应表格中的版本依次安装cuda、cudnn、TensorRT
版本对应表:https://onnxruntime.ai/docs/execution-providers/CUDA-ExecutionProvider.html#requirements
cuda:https://developer.nvidia.com/cuda-toolkit-archive
cudnn:https://developer.nvidia.com/rdp/cudnn-archive
TensorRT:https://developer.nvidia.com/tensorrt-download
cuda安装直接使用官网的安装命令安装
cuda安装.png
参考安装方式:https://blog.csdn.net/h3c4lenovo/article/details/119003405
安装完成后记得配置环境变量
安装cudnn比较简单,只需要把文件复制到指定的目录,授予ar读写权限就可以了

安装tensorrt

https://zhuanlan.zhihu.com/p/392143346

安装cnocr(装新版再替换为旧版)

参考链接:https://cnocr.readthedocs.io/zh/latest/install/
安装命令:pip install cnocr[ort-gpu]
卸载新版onnxruntime:pip uninstall onnxruntime-gpu
安装旧版(指定版本的onnxruntime-gpu):pip install onnxruntime-gpu==1.8

替换为旧版pytorch
历史版本查询下载链接:https://pytorch.org/get-started/previous-versions/

安装过程可能会有版本过老不兼容的情况,根据每个包的发布时间大概推算安装一个,先从pip install cnocr[ort-gpu]==(指定版本)开始,然后pip install cnstd(指定版本)然后pip install 自己下载的torch包

这步完成之后就可以运行了,如果运行过程中出现cv2库import异常,需要继续安装opengl库

ubuntu系统不自带opengl库,需要用apt命令安装,参考下面的链接
https://blog.csdn.net/chengde6896383/article/details/88028826
安装编译器与基本库函数:sudo apt-get install build-essential
安装OpenGL Library:sudo apt-get install libgl1-mesa-dev
安装OpenGL Utilities:sudo apt-get install libglu1-mesa-dev
安装OpenGL Utility Toolkit:sudo apt-get install libglut-dev
注意:在这一步的时候,可能会出现以下情况,shell提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libglut-dev
将上述sudo apt-get install libglut-dev命令改成sudo apt-get install freeglut3-dev即可。

最近在学习联合索引的最左前缀原则时发现有好几种说法不一样,于是自己动手验证了一下,mysql8.0.34,navicat16.1.5,创建数据库均为默认选项,创建表的编码格式选择utf8mb4
创建一个id作为主键,外加三个字段作为联合索引
初始test表.png
test表联合索引.png
在这个表使用EXPLAIN SELECT * from test_lianhe_index where name='',发现如预期中一样走了联合索引。
selectname1.png
运行EXPLAIN SELECT * from test_lianhe_index where age=0,发现居然也走了联合索引,但是type中显示类型与正常走联合索引不同,其类型是index,仅仅是走了一个覆盖索引,对另外一个字段单独搜索也是一样的。
seleceage1.png
经过测试,如果表中其他非主键字段全部联合在一起做联合索引,那么每次加上联合索引中最左侧的列,就可以正常走联合索引,否则就会走一个相对合适的索引数
如果加上一个为加入联合索引的列,那么情况又会发生变化
带上联合索引最左侧的项就会走联合索引,如果没有带上就会走全文索引。但是从效率上来讲,如果建立了索引123,却只是用了13,那么效率会打折,没有123效率高,理论上来讲跟只用1差不多。

在java多线程内存模型中,每个线程占用一个处理器内核,共同与唯一的主存交互数据,但线程操作数据不会直接操作主存中的数据,而是直接与每个内核的缓存交互,所以线程对数据的操作仅仅作用在缓存中的备份,如果没有同步给主存,则会一直使用该备份数据(失效过期了可能也不知道),在多线程的情况下可能会导致一个线程对数据的操作另一个线程不可见(不知道数据被修改了),于是需要使用volatile关键字来标记可能会被多线程操作的对象,保证多线程下变量的可见性。

volatile作用原理:

  1. 将缓存数据立即写回主存
  2. 这个写回主存的操作会引起其他cpu内核里缓存了该主存地址的数据失效
  3. 提供内存屏障(使用汇编的lock前缀实现)使lock前后指令不会重排序

指令重排:
as-if-serial:重排序不影响单线程程序执行结果
happens-before原则:锁规则、volatile规则、线程启动规则、传递性、线程终止规则、线程中断规则、对象终结规则

传统的DCL实现的单例模式可能会因为指令重排序导致对象不为空但为零值

if(object==null){
    synchronized(ClassName.class){
        if(object==null){
            new;
        }
    }
}

上述代码在java编译执行时可能会发生指令重排序,对象在创建时要先创建,再分配内存,但是重排序可能颠倒这两步,则会导致另一个线程访问对象时发现对象存在,但是读取到的对象并不是创建完成的对象,只是一个初始化为零值的对象。

对象创建流程:类加载检查,未加载则加载类,加载了则分配内存,初始化零值,设置对象头,执行init方法。

解决方法:在该属性声明的时候添加volatile关键字,实现内存屏障

内存屏障类型:loadload、storestore、loadstore、storeload

jvm中内存屏障使用lock前缀实现,intel的cpu有硬件级的内存屏障指令:ifence、sfence、mfence