整个Ai接口是通过外挂模块来实现的.   ai.module通过后台下载.

在调用Ai接口之前,需要保证LoadAi或者LoadAiMemory接口成功.

另外,由于是内存加载,卸载模块会导致程序出异常,所以只提供了加载接口(LoadAiLoadAiMemory),没有提供卸载接口. 所以要特别注意,千万不能在LoadAi或者LoadAiMemory后卸载对象. 这样会导致模块没卸载,从而内存泄漏. 除非是程序结束.

关于Yolo部分,由于模型很占用内存空间,并且检测接口很占用内存和CPU,所以在多线程中AiYoloDetectXX系列接口不建议频繁调用,更不可以用此接口来代替找图等接口.

如果只是单线程调用,或者同一时间只有一个线程调用AiYoloDetectXX系列接口,那么没什么影响.

内部实现上,Yolo是使用了全局的静态模型. 所有的对象是共用模型. 所以在多线程的使用上要特别注意.

对于同一个序号的模型,在多线程上是排队执行的. 尤其是同一个脚本程序控制很多窗口时,那么多线程执行AiYoloDetect系列接口时,并且使用的序号是相同的,那么效率会大打折扣.

另外在脚本程序下,识别效率会不如Yolo综合工具里的效率. 因为32位程序的优化不如64.

另外也不要问我为何没有GPU加速,因为cuda不支持32位程序.

具体的使用例子请查看我录制的视频.

 

:
如果想提高检测效率,两个途径
1.
使用更小更快的预训练模型. 比如yolov5n
2.
运行的机器CPU核心数越多,效率越高. 因为检测函数内部是多线程执行的.

如果想提高检测精度,两个途径
1.
使用更大但是更慢的预训练模型. 比如yolov5x
2.
对于每个类尽可能多的提供训练图片. 尽可能多的提供各种复杂背景下的训练图片. 尽可能对每个类在各种复杂背景下都提供训练图片. 训练的轮次可以稍微多一些.

如果发现自己训练后的模型,会越训练越差,说明是你训练的过头了(过拟合),减少轮次,重新训练.