在这里使用的是pytorch版本的EAST,下载地址 :
https://github.com/SakuraRiven/EAST
将model.load_state_dict(torch.load(model_path))换成
model.load_state_dict(torch.load(model_path, map_location='cpu'))
里面需要用到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)
同样会报错,于是舍弃了这个办法
原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,过程中会报很多错,令人头疼
这个错误是找不到头文件,观察这个cpython大概是python拥有的基础头文件。于是在第一行加上头文件地址
CXXFLAGS = -I include -std=c++11 -O3 -I 'C:/ProgramData/Anaconda3/include'
再重新make,又出现了新的错误
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的库,说明编译成功了。
DEPS = lanms.h
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)
我是用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能正常运行起来了!