使用python多线程加载模型并测试

前言:之前只用过单线程处理,加载模型进行测试,运行时间上也可以接受。但是现在需要处理比较大量的数据,如果进行线性处理,可能测试一次就花10个小时,而且还不知道结果怎么样,所以多线程就必须使用上了。有关线程部分主要参考:https://junyiseo.com/python/211.html

1 多线程

多线程类似于同时执行多个不同程序,线程在执行过程中与进程还是有区别的。每个独立的进程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

特点:

  • 线程可以被抢占(中断)。
  • 在其他线程正在运行时,线程可以暂时搁置(也称为睡眠) – 这就是线程的退让。

应用场景:

  • 使用线程可以把占据长时间的程序中的任务放到后台去处理。
  • 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度
  • 程序的运行速度可能加快
  • 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下我们可以释放一些珍贵的资源如内存占用等等。

以上内容来自:https://www.runoob.com/python/python-multithreading.html

更多多线程python知识可以访问以上网站

2 使用多线程进行多模型加载和测试

  • 先说一下如何分配多线程执行的思路:

    • 由于单线程进行测试的时候是一张图像进一次网络,然后得到结果。其占用的显存很小,只有900MB左右,而这里使用的是11G显存,所以在这种条件下支持每一个线程分配一个模型,然后进行预测。

    • 然后就是数据分配问题,多线程常常会遇到访问数据冲突的问题,但是这里我们可以避开这个问题,是用一个List存储所有图片,然后根据长度分配每个线程所要处理的图片多少。

    • 剩下就可以看模板了。

  • 这里提供一个模板,可以替换其中关键的测试图片的函数,然后就可以运行了。

# -*- coding: UTF-8 -*-

import threading
from time import sleep, ctime

import cv2
import os
import json

totalThread = 16  # 需要创建的线程数,可以控制线程的数量

config_file = '模型配置文件'
checkpoint_file = '模型权重文件'
test_data_dir = '测试集所在文件夹(里边是待测试图片)'

listImg = [file for file in os.listdir(test_data_dir)]  #创建需要读取的列表,可以自行创建自己的列表
lenList = len(listImg)  #列表的总长度
gap = int(lenList 
使用 TensorFlow 的 CNN 对测试集进行多线程测试,您可以使用 TensorFlow 提供的多线程输入处理机制来实现。以下是一个基本的示例: ```python import tensorflow as tf # 定义测试数据集 test_images = ... test_labels = ... # 创建输入队列 input_queue = tf.train.slice_input_producer([test_images, test_labels], shuffle=False) # 读取和预处理数据 image, label = read_and_preprocess_data(input_queue) # 构建 CNN 模型 logits = build_cnn_model(image) # 定义预测操作 prediction = tf.argmax(logits, axis=1) # 创建 TensorFlow 会话 with tf.Session() as sess: # 加载模型参数 saver = tf.train.Saver() saver.restore(sess, 'path/to/model') # 创建协调器和线程 coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) try: while not coord.should_stop(): # 运行预测操作 pred = sess.run(prediction) # 处理预测结果 # ... except tf.errors.OutOfRangeError: print('Testing completed.') finally: # 请求停止所有线程 coord.request_stop() # 等待所有线程完成 coord.join(threads) ``` 在上述示例中,首先您需要定义测试数据集 `test_images` 和 `test_labels`。然后,通过 `tf.train.slice_input_producer()` 创建输入队列,并使用 `tf.train.start_queue_runners()` 启多个线程来读取和预处理数据。 接下来,构建 CNN 模型并定义预测操作。在 TensorFlow 会话中加载模型参数,并通过循环运行预测操作来对测试集进行预测。 最后,通过协调器和线程管理器来确保所有线程在完成任务后正确停止。 这只是一个基本示例,您可以根据您的具体需求进行适当的修改和扩展。 希望这能帮助到您!如果您还有其他问题,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*pprp*

如果有帮助可以打赏一杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值