需求:工业相机拍摄一张图片里有64个相同的小物体,检查每个小物体的缺陷,一张图片像素有2500万太大不能直接推理会超内存,拆小图用多线程推理。
实现方案:
使用python+opencv+缺陷推理模型,先根据一个小物体进行模板匹配和切图得到64张小图,
将64小图进行分组,每组8张图片,一共8组,使用多线程池,开了8个多线程,每个线程提交每组8张图片进行推理
遇到的问题:发现运行程序卡住不动或者推理耗时很久要128秒或者随着增加多线程8->16会增加耗时
分析:单独使用小图推理仅仅需要0.18秒左右,理论来说8张小图*0.18=1.44秒耗时
硬件:使用cpu推理
备注:多线程仅做推理,没有做别的操作
尝试:
1、在调用传图片推理那行代码加锁,运行卡住问题解决了,但是线程数4和线程1的总耗时都是64x0.18=12秒左右,多线程不起作用没有并行执行推理
2、修改多进程推理复现运行卡住问题
求帮忙分析下给出原因或者建议,谢谢!
python+opencv+多线程推理图片不生效没有并行执行
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
- 关键点分析:
- 主要问题是在使用Python、OpenCV和多线程进行图片推理时,没有实现并行执行,即多线程没有起到加速推理小图的作用。
- 涉及到如何将大图片合理拆分成小图,以及如何使用多线程对小图进行并行推理,同时要考虑内存使用避免超内存。 -
解决方案:
- 拆分图片:
```python
import cv2def split_image(image, num_splits):
height, width = image.shape[:2]
sub_height = height // num_splits
sub_images = []
for i in range(num_splits):
y_start = i * sub_height
y_end = (i + 1) * sub_height if i < num_splits - 1 else height
sub_image = image[y_start:y_end, :]
sub_images.append(sub_image)
return sub_images
- **多线程推理**:python
import threading
from concurrent.futures import ThreadPoolExecutordef infer_sub_image(sub_image, model):
# 这里假设model是你的缺陷推理模型,进行具体的推理操作
# 例如:result = model.predict(sub_image)
# 这里简单返回一个固定值模拟推理结果,表示推理成功
return Truedef multi_thread_inference(images, model):
num_threads = len(images)
results = []
with ThreadPoolExecutor(max_workers=num_threads) as executor:
for image in images:
future = executor.submit(infer_sub_image, image, model)
results.append(future)
final_results = [result.result() for result in results]
return final_results
- **完整示例**:python
# 读取大图片
big_image = cv2.imread(‘big_image.jpg’)
num_splits = 64
sub_images = split_image(big_image, num_splits)
# 假设这里有一个简单的模型对象model
model = None
results = multi_thread_inference(sub_images, model)
`` 3. 多种解决方案优缺点: - **使用concurrent.futures模块的ThreadPoolExecutor**: - **优点**: - 简单易用,通过submit方法提交任务,result方法获取结果,代码结构清晰。 - 可以方便地控制线程池大小,避免创建过多线程导致资源浪费。 - **缺点**: - 对于复杂的任务依赖关系处理能力有限,如果推理任务之间有先后顺序等关系,不太容易实现。 - **使用threading模块**: - **优点**: - 底层模块,对线程的控制更加灵活,可以更细粒度地管理线程生命周期等。 - **缺点**: - 代码相对复杂,需要手动管理线程的创建、启动、同步等操作,容易出错。例如需要手动处理线程锁等问题,如果忘记处理可能导致数据竞争等错误。 4. 总结: 通过上述方法,先将大图片拆分成小图,然后利用多线程对小图进行并行推理,能够有效避免直接处理大图片超内存的问题,实现多线程加速推理。在实际应用中,根据具体的推理模型和需求,可能需要对推理函数infer_sub_image`进行更详细的实现,以得到准确的缺陷检查结果。
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。
解决 无用评论 打赏 举报- 关键点分析: