使用EAST ocr遇到的坑解决方法(编译lanms)

在这里使用的是pytorch版本的EAST,下载地址 :
https://github.com/SakuraRiven/EAST

一、在用不了cuda的情况下运行

将model.load_state_dict(torch.load(model_path))换成

model.load_state_dict(torch.load(model_path, map_location='cpu'))

二、lanms包无法使用

1.方法一:使用locality_aware_nms

里面需要用到lanms包,我直接用pip install有各种各样的问题下不下来,寻找别人的解决方法,说把detect.py中的import lanms注释掉,改成

import locality_aware_nms as nms_clslocality

boxes = lanms.merge_quadrangle_n9(boxes.astype(‘float32’), nms_thresh)改成

boxes = nms_locality.nms_locality(boxes.astype('float32'), nms_thresh)

同样会报错,于是舍弃了这个办法

2方法二:编译lanms

原pytorch的版本的EAST中没有lanms,我在TensorFlow版本的EAST中找到了lanms源码
https://github.com/argman/EAST
首先需要将mingw配入环境变量,不然无法make编译lanms中的makefile
原版makefile

CXXFLAGS = -I include  -std=c++11 -O3 $(shell python3-config --cflags)
LDFLAGS = $(shell python3-config --ldflags)

DEPS = lanms.h $(shell find include -xtype f)
CXX_SOURCES = adaptor.cpp include/clipper/clipper.cpp

LIB_SO = adaptor.so

$(LIB_SO): $(CXX_SOURCES) $(DEPS)
	$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $(CXX_SOURCES) --shared -fPIC

clean:
	rm -rf $(LIB_SO)

然后运行detect.py它会自动开始编译lanms,过程中会报很多错,令人头疼

使用EAST ocr遇到的坑解决方法(编译lanms)_第1张图片
这个错误是找不到头文件,观察这个cpython大概是python拥有的基础头文件。于是在第一行加上头文件地址

CXXFLAGS = -I include  -std=c++11 -O3   -I 'C:/ProgramData/Anaconda3/include'

再重新make,又出现了新的错误

使用EAST ocr遇到的坑解决方法(编译lanms)_第2张图片
undefined reference to `__imp_PyErr_SetString
出现这种错误一般是找不到头文件相对应的库
将LDFLAGS改成以下形式

LDFLAGS = -L 'C:/ProgramData/Anaconda3/libs'

然后将第九十行的内容改成以下

$(LIB_SO): $(CXX_SOURCES) $(DEPS) 
   $(CXX)  -o $@  $(CXXFLAGS) $(LDFLAGS) $(CXX_SOURCES) -lpython3 -lpython38 --shared -fPIC

再看就发现成功编译出了一个叫adapter.so的库,说明编译成功了。

需要注意的地方:Anaconda下的include和libs文件分别是python原始头文件和库文件。

Anaconda下的Library下的include 和lib应该是anaconda安装的包的头文件和库文件,类似opencv

在这里插入图片描述这个问题对编译库没有影响,但是将第四行改写成为

DEPS = lanms.h

就没有相关报错了
在这里插入图片描述
全部更改后的makefile文件

CXXFLAGS = -I include  -std=c++11 -O3   -I 'C:/ProgramData/Anaconda3/include'
LDFLAGS = -L 'C:/ProgramData/Anaconda3/libs'

DEPS = lanms.h
CXX_SOURCES = adaptor.cpp include/clipper/clipper.cpp

LIB_SO = adaptor.so

$(LIB_SO): $(CXX_SOURCES) $(DEPS)
	$(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $(CXX_SOURCES) -lpython3 -lpython38 --shared -fPIC

clean:
	rm -rf $(LIB_SO)

三、无法import adapter库

我是用windows测试EAST,上一步编译出来的so调用的时候会显示No module named ‘adaptor’,
在这里插入图片描述
后来我突然想到so是linux上的动态库,windows上应该不能调用,然后我改了makefile中的第七行改成

LIB_SO = adaptor.dll

结果发现仍然不能调用

首先测试是否是库的问题
使用这个方法:https://blog.csdn.net/zhanglifu3601881/article/details/106563907

如果库没问题就需要考虑是别的问题通过这个博客找到了问题的关键点
https://blog.csdn.net/XCCCCZ/article/details/111089151

确认你当前使用的python版本支持哪些后缀的库能被import

import importlib.machinery
print(importlib.machinery.all_suffixes())

在这里插入图片描述
打印出来so库和dll库都不能被import调用

于是直接将dll后缀改成pyd,结果调用成功,detect.py能正常运行起来了!

你可能感兴趣的:(python,人工智能,c++)