整个Ai接口是通过外挂模块来实现的. ai.module通过后台下载.
在调用Ai接口之前,需要保证LoadAi或者LoadAiMemory接口成功.
另外,由于是内存加载,卸载模块会导致程序出异常,所以只提供了加载接口(LoadAi和LoadAiMemory),没有提供卸载接口. 所以要特别注意,千万不能在LoadAi或者LoadAiMemory后卸载对象. 这样会导致模块没卸载,从而内存泄漏. 除非是程序结束.
关于Yolo部分,由于模型很占用内存空间,并且检测接口很占用内存和CPU,所以在多线程中AiYoloDetectXX系列接口不建议频繁调用,更不可以用此接口来代替找图等接口.
如果只是单线程调用,或者同一时间只有一个线程调用AiYoloDetectXX系列接口,那么没什么影响.
内部实现上,Yolo是使用了全局的静态模型. 所有的对象是共用模型. 所以在多线程的使用上要特别注意.
对于同一个序号的模型,在多线程上是排队执行的. 尤其是同一个脚本程序控制很多窗口时,那么多线程执行AiYoloDetect系列接口时,并且使用的序号是相同的,那么效率会大打折扣.
另外在脚本程序下,识别效率会不如Yolo综合工具里的效率. 因为32位程序的优化不如64位.
另外也不要问我为何没有GPU加速,因为cuda不支持32位程序.
具体的使用例子请查看我录制的视频.
注:
如果想提高检测效率,两个途径
1. 使用更小更快的预训练模型. 比如yolov5n
2. 运行的机器CPU核心数越多,效率越高. 因为检测函数内部是多线程执行的.
如果想提高检测精度,两个途径
1. 使用更大但是更慢的预训练模型. 比如yolov5x
2. 对于每个类尽可能多的提供训练图片. 尽可能多的提供各种复杂背景下的训练图片. 尽可能对每个类在各种复杂背景下都提供训练图片. 训练的轮次可以稍微多一些.
如果发现自己训练后的模型,会越训练越差,说明是你训练的过头了(过拟合),减少轮次,重新训练.