在很多的项目中,都会用到图像识别技术。我在智能电子秤的项目中,就使用了简单的图像识别算法来完成对果蔬的分类(三分类)。
图像识别中,最常用的框架就是TensorFlow,我们今天就使用这个框架,手把手教学完成图像识别分类。
完成一个图像识别模块主要包括四步:

  • 采集数据集
  • 搭建合适的模型
  • 调参、训练并测试
  • 完成接口到项目中

关于环境的配置我在此处不多赘余描述,可以自行百度搜索,进行环境配置:python3.6+tensorflow+opencv。关于编译器,我在此处推荐spyder。使用起来非常方便,非常适合数据处理和图像识别。
spyder界面

采集数据集

首先,我们需要对分类的物体采集数据集。
数据集会直接影响图像识别最后的精确度,所以我们在采集数据集的时候,需要严格按照要求,完成一个高质量的数据集。
互联网上并没有总结数据集的要求,这里我用我自己的经验来总结几点:

  • 需要数据集数量大(需要充分对数据进行训练)
    如果初学者不知道需要训练多少张,这里给出一个大概的推荐值供参考,如果是三分类,建议每种选取1000张以上代表性能力强的图像,如果代表性不强,建议两千张以上。我在实际的项目中,在超市中购买了三种果蔬,每种购买了十个左右,来采集数据集,这就是代表性很差的情况,所以我为了最终的识别效果,每一种拍摄了两千多张。建议初学者可以在互联网上查询现有的数据集,加入进自己的数据集中,也可以使用python爬虫,在百度图片进行爬取并手动筛选。此处给出一个百度图片的爬虫源码,可以很方便的爬取图片。
# -*- coding: utf-8 -*-
# @Author  : Ein
import re
import requests
from urllib import error
from bs4 import BeautifulSoup
import osnum = 0
numPicture = 0
file = ''
List = []def Find(url):global Listprint('正在检测图片总数,请稍等.....')t = 0i = 1s = 0while t < 1000:Url = url + str(t)try:Result = requests.get(Url, timeout=7)Result.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')except BaseException:t = t + 60continueelse:result = Result.textpic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正则表达式找到图片urls += len(pic_url)if len(pic_url) == 0:breakelse:List.append(pic_url)t = t + 60return sdef recommend(url):Re = []try:html = requests.get(url)except error.HTTPError as e:returnelse:html.encoding = 'utf-8'bsObj = BeautifulSoup(html.text, 'html.parser')div = bsObj.find('div', id='topRS')if div is not None:listA = div.findAll('a')for i in listA:if i is not None:Re.append(i.get_text())return Redef dowmloadPicture(html, keyword):global num# t =0pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正则表达式找到图片urlprint('找到关键词:' + keyword + '的图片,即将开始下载图片...')for each in pic_url:print('正在下载第' + str(num + 1) + '张图片,图片地址:' + str(each))try:if each is not None:pic = requests.get(each, timeout=7)else:continueexcept BaseException:print('错误,当前图片无法下载')continueelse:string = file + r'\\' + keyword + '_' + str(num) + '.jpg'fp = open(string, 'wb')fp.write(pic.content)fp.close()num += 1if num >= numPicture:returnif __name__ == '__main__':  # 主函数入口word = input("请输入搜索关键词(可以是人名,地名等): ")# add = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%BC%A0%E5%A4%A9%E7%88%B1&pn=120'url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='tot = Find(url)Recommend = recommend(url)  # 记录相关推荐print('经过检测%s类图片共有%d张' % (word, tot))numPicture = int(input('请输入想要下载的图片数量 '))file = input('请建立一个存储图片的文件夹,输入文件夹名称即可')y = os.path.exists(file)if y == 1:print('该文件已存在,请重新输入')file = input('请建立一个存储图片的文件夹,)输入文件夹名称即可')os.mkdir(file)else:os.mkdir(file)t = 0tmp = urlwhile t < numPicture:try:url = tmp + str(t)result = requests.get(url, timeout=10)print(url)except error.HTTPError as e:print('网络错误,请调整网络后重试')t = t + 60else:dowmloadPicture(result.text, word)t = t + 60print('当前搜索结束,感谢使用')print('猜你喜欢')for re in Recommend:print(re, end='  ')

用户使用时可以很方便的爬取图片,此处就不写教程了。

  • 尽量选择代表性图片
    代表性的图片可以大幅度增加泛华能力,可以在不同的光照下、不同的环境下多次进行采集图像,也可以从网上爬取代表性图片,这样可以大幅度提高识别效果。
  • 训练的背景需要多次更换
    我做的数据集存在着一个问题,就是数据集的背景过于单一:都是白底。所以,在采集数据时,可以多打印几张不同的纸,在不同的纸上训练,这样就可以避免背景被误认为是训练的因素了。
  • 每种种类的数量要接近,不能偏差太大
    如果有三种训练对象,第一种有50张训练集,第二种有500张,第三种有5000张。
    这种情况下,欢迎大家进行测试,会发现训练效果极差无比。
    所以应当保证每种训练集的数量接近,比如,都是2000张左右。

搭建合适的模型

模型的复杂度会直接影响识别效果。
因为在我的项目中仅仅用到了三分类,所以我选择了比较简单的模型,如果大家有更高的要求,可以参考googlenet等优秀的模型。
我的模型设计是这样的:
模型设计
即输入图片并进行预处理后,经过两个卷积层,两个池化层,两个全连接层,最后通过一个softmax层输出结果。
卷积层以及池化层的原理这里不多解释,大家可以自行百度进行查看,我个人的理解是这样的,一张图片会通过全卷积的方式,逐步降维,最终得到分类。
TensorFlow对于模型的代码比较简单,模型相关函数可直接使用,只需对照着自己设计的模型,来编写模型的代码即可。
此处我将代码段贴出,代码段的备注直接在代码中。
首先是加载数据的代码load_data.py:

# -*- coding: utf-8 -*-#D:\\360安全浏览器下载\\果蔬识别\\data\\train
import tensorflow as tf
import numpy as np
import osdef get_all_files(file_path, is_random=True):"""获取图片路径及其标签:param file_path: a sting, 图片所在目录:param is_random: True or False, 是否乱序:return:"""image_list = []label_list = []corn_count = 0cucumber_count = 0orange_count=0for item in os.listdir(file_path):item_path = file_path + '\\' + itemitem_label = item.split('.')[0]  # 文件名形如  cat.0.jpg,只需要取第一个if os.path.isfile(item_path):image_list.append(item_path)else:raise ValueError('文件夹中有非文件项.')if item_label == 'corn':  # 玉米标记为'0'label_list.append(0)corn_count += 1elif item_label == 'cucumber': # 黄瓜标记为'1'label_list.append(1)cucumber_count += 1elif item_label == 'orange':#橙子标记为'2'label_list.append(2)orange_count += 1print('数据集中有%d个玉米,%d个黄瓜,%d个橙子.' % (corn_count, cucumber_count,orange_count))image_list = np.asarray(image_list)label_list = np.asarray(label_list)# 乱序文件if is_random:rnd_index = np.arange(len(image_list))np.random.shuffle(rnd_index)image_list = image_list[rnd_index]label_list = label_list[rnd_index]return image_list, label_listdef get_batch(train_list, image_size, batch_size, capacity, is_random=True):"""获取训练批次:param train_list: 2-D list, [image_list, label_list]:param image_size: a int, 训练图像大小:param batch_size: a int, 每个批次包含的样本数量:param capacity: a int, 队列容量:param is_random: True or False, 是否乱序:return:"""intput_queue = tf.train.slice_input_producer(train_list, shuffle=False)# 从路径中读取图片image_train = tf.read_file(intput_queue[0])image_train = tf.image.decode_jpeg(image_train, channels=3)  # 这里是jpg格式image_train = tf.image.resize_images(image_train, [image_size, image_size])image_train = tf.cast(image_train, tf.float32) / 255.  # 转换数据类型并归一化# 图片标签label_train = intput_queue[1]# 获取批次if is_random:image_train_batch, label_train_batch = tf.train.shuffle_batch([image_train, label_train],batch_size=batch_size,capacity=capacity,min_after_dequeue=100,num_threads=2)else:image_train_batch, label_train_batch = tf.train.batch([image_train, label_train],batch_size=1,capacity=capacity,num_threads=1)return image_train_batch, label_train_batchif __name__ == '__main__':import matplotlib.pyplot as plt# 测试图片读取image_dir = 'data\\train'train_list = get_all_files(image_dir, True)image_train_batch, label_train_batch = get_batch(train_list, 256, 1, 200, False)sess = tf.Session()coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)try:for step in range(10):if coord.should_stop():breakimage_batch, label_batch = sess.run([image_train_batch, label_train_batch])if label_batch[0]==0:label = 'corn'elif label_batch[0]==1:label = 'cucumber'elif label_batch[0]==2:label='orange'plt.imshow(image_batch[0]), plt.title(label)plt.show()except tf.errors.OutOfRangeError:print('Done.')finally:coord.request_stop()coord.join(threads=threads)sess.close()

其作用就是加载训练集的所有图片,并将训练集乱序,此处,我们使用python对于文件名的分割来获取图像的类别。例如:apple.1.jpg代表的就是label是苹果。代码段对训练集进行标号。在会话中完成读取训练集。

其次是模型的代码,model.py:

# -*- coding: utf-8 -*-import tensorflow as tf
import tensorflow.contrib.layers as layersdef inference(images, n_classes):# conv1, shape = [kernel_size, kernel_size, channels, kernel_numbers]with tf.variable_scope("conv1") as scope:weights = tf.get_variable("weights",shape=[3, 3, 3, 16],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))biases = tf.get_variable("biases",shape=[16],dtype=tf.float32,initializer=tf.constant_initializer(0.1))conv = tf.nn.conv2d(images, weights, strides=[1, 1, 1, 1], padding="SAME")pre_activation = tf.nn.bias_add(conv, biases)conv1 = tf.nn.relu(pre_activation, name="conv1")# pool1 && norm1with tf.variable_scope("pooling1_lrn") as scope:pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],padding="SAME", name="pooling1")norm1 = tf.nn.lrn(pool1, depth_radius=4, bias=1.0, alpha=0.001/9.0,beta=0.75, name='norm1')# conv2with tf.variable_scope("conv2") as scope:weights = tf.get_variable("weights",shape=[3, 3, 16, 16],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.1, dtype=tf.float32))biases = tf.get_variable("biases",shape=[16],dtype=tf.float32,initializer=tf.constant_initializer(0.1))conv = tf.nn.conv2d(norm1, weights, strides=[1, 1, 1, 1], padding="SAME")pre_activation = tf.nn.bias_add(conv, biases)conv2 = tf.nn.relu(pre_activation, name="conv2")# pool2 && norm2with tf.variable_scope("pooling2_lrn") as scope:pool2 = tf.nn.max_pool(conv2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],padding="SAME", name="pooling2")norm2 = tf.nn.lrn(pool2, depth_radius=4, bias=1.0, alpha=0.001/9.0,beta=0.75, name='norm2')# full-connect1with tf.variable_scope("fc1") as scope:reshape = layers.flatten(norm2)dim = reshape.get_shape()[1].valueweights = tf.get_variable("weights",shape=[dim, 128],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))biases = tf.get_variable("biases",shape=[128],dtype=tf.float32,initializer=tf.constant_initializer(0.1))fc1 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name="fc1")# full_connect2with tf.variable_scope("fc2") as scope:weights = tf.get_variable("weights",shape=[128, 128],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))biases = tf.get_variable("biases",shape=[128],dtype=tf.float32,initializer=tf.constant_initializer(0.1))fc2 = tf.nn.relu(tf.matmul(fc1, weights) + biases, name="fc2")# softmaxwith tf.variable_scope("softmax_linear") as scope:weights = tf.get_variable("weights",shape=[128, n_classes],dtype=tf.float32,initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))biases = tf.get_variable("biases",shape=[n_classes],dtype=tf.float32,initializer=tf.constant_initializer(0.1))softmax_linear = tf.add(tf.matmul(fc2, weights), biases, name="softmax_linear")# softmax_linear = tf.nn.softmax(softmax_linear)return softmax_lineardef losses(logits, labels):with tf.variable_scope('loss'):cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels=labels)loss = tf.reduce_mean(cross_entropy)return lossdef evaluation(logits, labels):with tf.variable_scope("accuracy"):correct = tf.nn.in_top_k(logits, labels, 1)correct = tf.cast(correct, tf.float16)accuracy = tf.reduce_mean(correct)return accuracy

其中,softmax用来得到分类,losses函数和evaluation函数分别用来得到loss的值和准确率,以方便在训练的过程中进行观察,避免过拟合。

调参、训练并测试

接下来,加载完了训练集,设计好了模型,就要进行训练了。
此处我先把训练段代码贴出,再进行解释。
train.py:

# -*- coding: utf-8 -*-
import os
import shutil
import tensorflow as tf
import numpy as np
import time
#import load_data
#import model
from load_data import *
from model import *
import matplotlib.pyplot as plt
import sys
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
#global_iii=0# 训练模型
def training():N_CLASSES = 3IMG_SIZE = 208BATCH_SIZE = 16CAPACITY = 2000MAX_STEP = 20000LEARNING_RATE = 1e-4# 测试图片读取image_dir = 'data\\train'logs_dir = 'logs_1'     # 检查点保存路径Asess = tf.Session()train_list = get_all_files(image_dir, True)image_train_batch, label_train_batch = get_batch(train_list, IMG_SIZE, BATCH_SIZE, CAPACITY, True)train_logits = inference(image_train_batch, N_CLASSES)train_loss = losses(train_logits, label_train_batch)train_acc = evaluation(train_logits, label_train_batch)train_op = tf.train.AdamOptimizer(LEARNING_RATE).minimize(train_loss)var_list = tf.trainable_variables()paras_count = tf.reduce_sum([tf.reduce_prod(v.shape) for v in var_list])print('参数数目:%d' % sess.run(paras_count), end='\n\n')saver = tf.train.Saver()sess.run(tf.global_variables_initializer())coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)s_t = time.time()try:for step in range(MAX_STEP):if coord.should_stop():break_, loss, acc = sess.run([train_op, train_loss, train_acc])if step % 100 == 0:  # 实时记录训练过程并显示runtime = time.time() - s_tprint('Step: %6d, loss: %.8f, accuracy: %.2f%%, time:%.2fs, time left: %.2fhours'% (step, loss, acc * 100, runtime, (MAX_STEP - step) * runtime / 360000))s_t = time.time()if step % 1000 == 0 or step == MAX_STEP - 1:  # 保存检查点checkpoint_path = os.path.join(logs_dir, 'model.ckpt')saver.save(sess, checkpoint_path, global_step=step)except tf.errors.OutOfRangeError:print('Done.')finally:coord.request_stop()coord.join(threads=threads)sess.close()#%%class MyDirEventHandler(FileSystemEventHandler):global global_iiidef on_moved(self, event):print(event)eval()def on_created(self, event):print(event)def on_deleted(self, event):print(event)def on_modified(self, event):print("modified:", event)eval()if __name__ == '__main__':training()

这段代码中,除了简单的参数配置,要具体说明的几个点如下:

  • N_CLASSES代表训练的分类个数
  • MAX_STEP代表训练次数
    有的人可能会想当然的认为,训练的越多越好,其实并不是这样的,训练的过少或过多,都会影响结果。初学者可能会把握不好训练的次数,这里我也对训练的次数进行一个推荐,我个人认为,每张图片训练三次左右最为合适。
    此处引入一个概念:过拟合。大家可以自行百度。
    如果训练的次数过多,则会发生过拟合,影响识别结果,大家可能在使用matlab进行拟合的过程中也会有相同的感受,
    我的训练集个数总共约为6000张,所以我将训练步数设置为20000,这样就可以避免过拟合。
  • LEARNING_RATE代表训练率,这个参数的调节需要用户自行测试

训练的过程还是新建一个会话,程序会时常保留训练步数对应的模型,比如你训练两万次,程序会在10000次保存一次模型,12000次保存一次模型等等。训练的过程中,会实时输出当前步数的loss和准确率,用户可以自行通过这两个参数来测试。

完成接口到项目中

最后一步就是完成接口到项目中了。
我们知道图像识别使用的是会话,如果要让它不停执行图像识别就需要将执行识别进行循环。所以图像识别就直接占用了一个线程。
而在实际的项目中,线程又必须提供给主程序。所以,我们在这里提出多线程的方案。当主线程需要图像识别时,设置事件,将主线程暂停,开启图像识别线程,识别完成后,关闭图像识别线程,开启主线程。
我们还是先把代码段贴出,test.py:

# -*- coding: utf-8 -*-
import os
import shutil
import tensorflow as tf
import numpy as np
import time
import pyttsx3
import threadingimport socket
import sys
import structfrom load_data import *
from model import *
import matplotlib.pyplot as plt
import sys
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import chardet
import codecs
lock=threading.Lock()
start=time.time()class MyDirEventHandler(FileSystemEventHandler):global global_iiidef on_moved(self, event):print(event)eval()               def on_created(self, event):print(event)def on_deleted(self, event):print(event)        def on_modified(self, event):print("modified:", event)eval()def socket_service_image():global event1,event2,answertry:s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#设置成非阻塞#s.setblocking(False)#s.bind(('192.168.43.180', 1902))
#        s.bind(('192.168.226.1', 1900))s.bind(('192.168.43.180', 1904))s.listen(10)except socket.error as msg:print(msg)sys.exit(1)print("Wait for Connection.....................")while True:sock, addr = s.accept()  # addr是一个元组(ip,port)print("已建立连接")deal_image(sock, addr)'''
def deal_image(sock, addr):global event1,event2,answerprint("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口filename = "D:\\360Download\\guoshushibie\\data\\receive\\corn.1.jpg" #接收到的图片写入的路径#    filename= "D:\\360Download\\guoshushibie\\data\\receive\\"
#    filename0="cuke.1"
#    filename += filename0 + '.jpg'while True:data = sock.recv(1024)if data:try:myfile = open(filename,'wb')print("%s 文件打开成功" % filename)except IOError:print("%s 文件打开失败,该文件不存在" % filename)myfile.write(data)while True:data=sock.recv(1024)if not data:myfile.close()breakmyfile.write(data)#myfile.close()    ###识别结果#event1.set()event2.set()#唤醒图像识别print("5",event1.isSet())print("6",event2.isSet())event1.wait()#睡眠自己#time.sleep(1)print("7",event1.isSet())print("8",event2.isSet())#print("test########################")print("输出结果为:",answer)send_data = answersock.send(send_data.encode("gbk"))              ##############这边是接收到图片,后发出数据到电子秤# sock.shutdown()event1.clear()#变成Falseprint("9",event1.isSet())print("10",event2.isSet())'''def deal_image(sock, addr):global event1,event2,answerprint("Accept connection from {0}".format(addr))  # 查看发送端的ip和端口filename = "D:\\360Download\\guoshushibie\\data\\receive\\corn.1.jpg" #接收到的图片写入的路径#    filename= "D:\\360Download\\guoshushibie\\data\\receive\\"
#    filename0="cuke.1"
#    filename += filename0 + '.jpg'while True:#try:#data = sock.recv(4096)datahead = sock.recv(5)#codeType = chardet.detect(datahead)["encoding"]  #检测编码方式#print(u"编码是 ", codeType)#size=datahead.decode('utf-8','replace')print(datahead)size = datahead.decode()if size=='':breaksize_int=int(size)print(size_int)#size = size[:5]#size_int=int(size)#size=datahead.decode()# size_int=int(size)#datahead = int(datahead.decode())#print(datahead)#datahead.decode()#print(datahead.type())#datahead1=str(datahead)#datahead2=int(datahead1)#print(datahead2)#txt = str(data)#print(txt)inital=0myfile = open(filename,'wb')print("%s 文件打开成功" % filename)while(inital!=size_int):data=sock.recv(1024)myfile.write(data)inital=inital+len(data)#print(inital)myfile.close()event2.set()#唤醒图像识别print("5",event1.isSet())print("6",event2.isSet())event1.wait()#睡眠自己#time.sleep(1)print("7",event1.isSet())print("8",event2.isSet())#print("test########################")print("输出结果为:",answer)send_data = answersock.send(send_data.encode("gbk"))              ##############这边是接收到图片,后发出数据到电子秤# sock.shutdown()event1.clear()#变成Falseprint("9",event1.isSet())print("10",event2.isSet())#except:#sock.close()#continue# 测试检查点
def eval():global event1,event2,answerprint("waiting for socket")
#    print(socket.gethostbyname(socket.gethostname()))while True:#print("waiting for socket222")event2.wait()#睡眠自己#time.sleep(1)print("开始调用")tf.reset_default_graph()N_CLASSES = 3IMG_SIZE = 208BATCH_SIZE = 1CAPACITY = 200MAX_STEP = 1test_dir = 'D:\\360Download\\guoshushibie\\data\\receive'logs_dir = 'logs_1'     # 检查点目录path=test_dirsess = tf.Session()i=1#对目录下的文件进行遍历for file in os.listdir(path):if os.path.isfile(os.path.join(path,file))==True:#设置新文件名new_name=file.replace(file,"corn.%d.jpg"%i)#重命名os.rename(os.path.join(path,file),os.path.join(path,new_name))i+=1#结束train_list = get_all_files(test_dir, is_random=True)image_train_batch, label_train_batch = get_batch(train_list,IMG_SIZE, BATCH_SIZE, CAPACITY, True)train_logits = inference(image_train_batch, N_CLASSES)train_logits = tf.nn.softmax(train_logits)  # 用softmax转化为百分比数值# 载入检查点saver = tf.train.Saver()print('\n载入检查点...')ckpt = tf.train.get_checkpoint_state(logs_dir)if ckpt and ckpt.model_checkpoint_path:global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]saver.restore(sess, ckpt.model_checkpoint_path)print('载入成功,global_step = %s\n' % global_step)else:print('没有找到检查点')coord = tf.train.Coordinator()threads = tf.train.start_queue_runners(sess=sess, coord=coord)try:for step in range(MAX_STEP):if coord.should_stop():breakimage, prediction = sess.run([image_train_batch, train_logits])max_index = np.argmax(prediction)#            data=open("D:\\360Download\\guoshushibie\\data\\data.txt",'a')if max_index == 0:#                print ('%.2f%% is a cuke.' % (prediction[0][0] * 100))#                data=open("D:\\360Download\\guoshushibie\\data\\data.txt",'w+') #                print('cuke',file=data)answer="corn"print(answer)plt.imshow(image[0])plt.show()#                time.sleep(3)#                break#                engine=pyttsx3.init()#                voice=engine.getProperty('voice')#                voices=engine.getProperty('voices')#                for item in voices:#                    print(item.id,item.languages)#                engine.setProperty('voice','zh')#               engine.say('黄瓜 单价是 三块五一斤。The unit price of cucumber is three pieces per catty.')#              engine.runAndWait()elif max_index == 1:#                print ( '%.2f%% is a bittergourd.' % (prediction[0][1] * 100))#               print('grape')#data=open("D:\\360安全浏览器下载\\果蔬识别\\data\\data.txt",'w+')                 #                print('bittergourd',file=data)answer="cucumber"print(answer)#                engine=pyttsx3.init()#                voice=engine.getProperty('voice')#                voices=engine.getProperty('voices')#                for item in voices:#                    print(item.id,item.languages)#                engine.setProperty('voice','zh')#                engine.say('我的天哪!苦 瓜 今日 特价 打八折 单价是 十三块五一斤。  Oh my god! Bitter melon today special price, hit twenty per cent off, the unit price is thirteen yuan per catty')#                engine.runAndWait()plt.imshow(image[0])plt.show()elif max_index == 2:#                print ('%.2f%% is a tomato.' % (prediction[0][2] * 100))#               print('tomato')#data=open("D:\\360安全浏览器下载\\果蔬识别\\data\\data.txt",'w+') #                print('tomato',file=data)answer="orange"print(answer)#data.close()#                engine=pyttsx3.init()#                voice=engine.getProperty('voice')#                voices=engine.getProperty('voices')#                for item in voices:#                    print(item.id,item.languages)#                engine.setProperty('voice','zh')#                engine.say('我的天哪!番 茄 今日 特价 打九折 单价是 六块五一斤 Oh my god!Tomato today special price, ten per cent off, the unit price is Six five per catty')#                engine.runAndWait()plt.imshow(image[0])plt.show()except tf.errors.OutOfRangeError:print('Done.')finally:coord.request_stop()coord.join(threads=threads)#删除文件filelist=[]                      #选取删除文件夹的路径,最终结果删除img文件夹filelist=os.listdir(test_dir)                #列出该目录下的所有文件名for f in filelist:filepath = os.path.join( test_dir, f )   #将文件名映射成绝对路劲if os.path.isfile(filepath):            #判断该文件是否为文件或者文件夹os.remove(filepath)                 #若为文件,则直接删除print(str(filepath)+" removed!")elif os.path.isdir(filepath):shutil.rmtree(filepath,True)        #若为文件夹,则删除该文件夹及文件夹内所有文件print("dir "+str(filepath)+" removed!")tf.reset_default_graph()sess.close()print("结束eval函数")print("answer:",answer)print("11",event1.isSet())print("12",event2.isSet())event2.clear()print("1",event1.isSet())print("2",event2.isSet())print("**********************************")while True:time.sleep(0.1)if event1.isSet()==False:event1.set()break#event1.set()print("3",event1.isSet())print("4",event2.isSet())#        print("clear event")if __name__ == '__main__':#for i1 in range(0,200):# while(1):# eval()#time.sleep(1) event1 = threading.Event()event2 = threading.Event()answer="none"    test_dir = 'D:\\360Download\\guoshushibie\\data\\receive'logs_dir = 'logs_1'     # 检查点目录path=test_dir
#    eval()
#    print(answer)t1=threading.Thread(target=socket_service_image,args=())t2=threading.Thread(target=eval,args=())t2.start()t1.start()
'''    for mmm in range(1000):break_flag=0for i in range(1000):      #监听from文件work_path = 'D:\\360Download\\guoshushibie\\data\\from'if os.listdir(work_path):print( '目录为有')time.sleep(1)f=open('D:\\360Download\\guoshushibie\\data\\data.txt', "r+")f.truncate()os.remove(r'D:\\360Download\\guoshushibie\\data\\from\\from.txt')for file in os.listdir(path):if os.path.isfile(os.path.join(path,file))==False:                time.sleep(1)if os.path.isfile(os.path.join(path,file))==True:                break_flag=1breakif(break_flag==1):breaktime.sleep(1)
'''

人生最痛苦的事情之一就是读以前自己写的代码,此处我写的代码和备注有些乱,由于线程的机制实在是复杂,所以删删改改了很多,建议大家养成优良的代码习惯,不要像我一样。
这个代码段我已经集成到了项目中,开启了socket通信和图像识别两个线程,实现的结果就是,当socket传来一张图片,我的图像识别就可以对这张图像进行识别,并将识别的结果通过socket通信返回发送回去。
这个里面的socket通信也是很有讲究,我和小组成员为了这个通信问题真的是绞尽脑汁,我以后有空再出一个socket通信传输图片的教程。这里直接把server端的socket成品放在这里了,大家有兴趣的可以自行研究研究。
这里的代码实在是简单,我就不多作解释了,大概的流程就是,会话首先读取模型,然后读取图像,进行识别,然后根据标签,输出结果。

总结

以上就是我在完成图像识别模块开发的全过程了。当初图像识别并没有选择调用api,就是想要自己进行一个尝试,好在tensorflow框架已经非常成熟,开发起来非常方便,不需要重复造轮子。
小白在入门的时候,知道自己想做分类,但是不知道怎么做,可能就会耗费大量的时间,我在刚开始,就在乱打乱撞,学了一段时间opencv,发现并没有卵用,自己尝试使用基于颜色的方法来识别,的确可以区分出差别大的,比如青菜和番茄,但是还是不能实用。后来我才了解了深度学习的概念,先后接触了百度api、英伟达api等,我就坚信肯定可以通过深度学习的方式来解决。后来咨询了无数大佬,才知道有卷积神经网络,就是CNN这个好东西。有了方向才能进行下一步。所以知识面广非常重要,并不是要什么都会,而是碰到不会的情况下,你就可以知道自己应该学习什么。

我现在正在开发目标检测+图像分割的技术,由于这个技术正在进行多项比赛和申请专利,所以暂时不进行开源,比完赛后申请完专利后也会进行开源,用自己的理解进行教学。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Linux服务器离线安装python库——XXX.tar.gz

    服务器无法外网,只能挂VPN连接校内网,所以一些python库只能离线安装。在Linux环境下直接安装xx.bz2是非常简单的,可以见另一篇文章。但是如果只有在官网下载的xx.tar.gz的源文件怎么办呢?以terminaltables-3.1.0.tar.gz为例,在清华的镜像里是找不到的.bz2的安装包的。那就…...

    2024/5/1 15:11:29
  2. 无网络环境的Centos7中安装Docker

    最近公司应用需要逐渐实现docker部署。由于各种原因不能使用外网,现在记录离线版本docker安装。 准备安装包 首先进入官网下载二进制安装包 https://docs.docker.com/install/linux/docker-ce/binaries/#install-static-binaries 下载二进制包https://download.docker.com/lin…...

    2024/5/1 19:04:20
  3. python正则表达式通过re模块使用方法

    1. match 和 searchre.match(表达式, string, 选项).span() 只从开头开始匹配,存在则返回(起始位置,结束位置),否则返回Nonere.search(表达式, string, 选项).span() 全文搜索,存在则返回(起始位置,结束位置),否则返回None代码举例>>> re.match(com, www.baidu.co…...

    2024/4/20 5:21:46
  4. python正则表达式基础语法

    1. 转义字符字符 描述\n 换行符\r 回车符\s 空白字符:空格、制表符、换行符\S 非空白字符2. 特殊字符字符 描述( ) 子表达式[ ] 中括号表达式| 两项之间一个选择3. 限定符字符 描述限定个数? 0、1个字符. 除换行外的任意1个字符* 0或多个字符+ 1或多个字符{n} 明确n个字符{n,…...

    2024/5/1 9:00:23
  5. 搭建jitsi的prosody出现的问题

    最近又在搭建jitsi的时候出现了新坑,这篇文章会一直持续更新下去。 我使用的是手动安装(Manual installation),官方虽然不推荐这么安装,但是这是你如果你想改里面的源代码那么快速安装和docker是行不通的。 我使用的是Ubuntu18.04,在安装prosody的时候出现了很多问题,下面就…...

    2024/5/1 16:53:50
  6. goroutine调度详解,以及进程、线程、协程区别

    1. 进程通俗点讲,程序(比如你写的爬虫程序,http服务器等)运行起来就是进程。每个进程都有自己的独立内存空间,拥有自己独立的地址空间、独立的堆和栈,既不共享堆,亦不共享栈。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件…...

    2024/5/1 19:00:47
  7. python正则表达式的使用

    1. match 和 searchre.match(表达式, string, 选项).span() 只从开头开始匹配,存在则返回(起始位置,结束位置),否则返回Nonere.search(表达式, string, 选项).span() 全文搜索,存在则返回(起始位置,结束位置),否则返回None代码举例>>> re.match(com, www.baidu.co…...

    2024/5/1 5:35:04
  8. Harris特征点检测

    Datawhale 计算机视觉基础-图像处理(下)- Task01 Harris特征点检测器-兴趣点检测简介内容介绍结果 简介在图像处理领域中,特征点又被称为兴趣点或者角点,它通常具有旋转不变性和光照不变性和视角不变性等优点,是图像的重要特征之一,常被应用到目标匹配、目标跟踪、三维重…...

    2024/5/1 16:06:52
  9. PAT 1151 LCA in a Binary Tree

    原题链接:1151 LCA in a Binary Tree (30分) 关键词:LCA 参考的柳神的博客:PAT 1151 LCA in a Binary Tree(30 分)- 甲级 The lowest common ancestor (LCA) of two nodes U and V in a tree is the deepest node that has both U and V as descendants. Given any two no…...

    2024/5/1 13:23:42
  10. 简单ctf逆向题

    文章目录xctf 逆向 getitxctf 逆向 csaw2013reversing2xctf 逆向 no-strings-attachedbugku 逆向 逆向入门bugku 逆向 游戏过关bugku 安卓逆向 First_Mobile(xman)bugku 安卓逆向 HelloSmali2 xctf 逆向 getit 载入IDA,shfit+F12查找字符串:得知 s 为c61b68366edeb7bdce3c682…...

    2024/5/1 15:23:04
  11. Qt学习之提升类

    在实际开发中,有时候我们需要用到一些组合控件,每次都要写重复的代码以及重复的属性设置,能不能把这些常用的控件给整合起来,需要用到的包含一下头文件就好了?答案是可以的,可以使用Qt的提升控件。先建立一个工程Test点击文件,新建文件,如下图所示,选好之后选择choose…...

    2024/5/1 16:00:47
  12. JNI系列(二)Java代码通过JNI与C++代码通信

    我们来看下一个简单的JNI示例,JAVA代码如下:1)编写声明了native方法的Java类public class JniHelloWord {/*** native关键字,表明这个方法使用java以外的语言实现,方法不包括实现,因为我们要用c/c++语言实现它*/public native void printHelloWorld();static {//System.loa…...

    2024/5/1 7:06:20
  13. python正则表达式基础

    1. 转义字符字符 描述\n 换行符\r 回车符\s 空白字符:空格、制表符、换行符\S 非空白字符2. 特殊字符字符 描述( ) 子表达式[ ] 中括号表达式| 两项之间一个选择3. 限定符字符 描述限定个数? 0、1个字符. 除换行外的任意1个字符* 0或多个字符+ 1或多个字符{n} 明确n个字符{n,…...

    2024/5/1 12:09:10
  14. 说说List,Set,Map三者的区别

    List集合存储的元素是有序的,且允许相同的元素存在。 Set存储的是不相同的元素,也就是不允许存在相同的元素。 Map存储的是Key—Value键值对,一个Key只能够对应一个Value。而且它不允许存在相同的Key,但是可以存在相同的Values。...

    2024/4/26 15:14:12
  15. 动态规划学习 (一)面向过程的思想

    前言 动态规划的算法往往非常简洁,但是感觉始终把我不住算法的精髓,不知道什么时候能使用动态规划,也不知道怎么证明动态规划能解决这个问题。我被找这个问题摩擦了一下午,最后得出了一些结论,希望能启发和我一样有困惑的同学。 最后发现,我平常的思维模式,往往是从源头…...

    2024/4/25 0:07:20
  16. 先天和后天,遗传和环境哪个更重要

    1. 影响人的因素有很多,比如,先天和后天,遗传和环境,那哪个更重要?先天和后天都会刺激我们的选择。你可以说,选择塑造了生活,我们就是过往选择的总和。2. 但是,塑造选择的又是什么?是行为的普遍性?是我们个体的生物学差异?是文化情境的影响?还是我们的个人经历?答…...

    2024/4/27 15:10:21
  17. 粒子群算法求解0-1背包问题的python实现

    具体算法原理评论区提问吧,或者有时间的话我再写原理部分 代码自己手写的,有详细注释 import numpy as np import random import math import matplotlib.pyplot as plt from time import *def init_x(n, d):""":param n: 粒子总数量:param d: 粒子种基因个数…...

    2024/4/24 23:33:15
  18. 【Leetcode 刷题】【206】反转链表

    题目描述 反转一个单链表 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 我们这里还是用到大名鼎鼎的双指针,我们可以申请一个指针cur和一个指针reversehead,最初reverhead指向null,cur指向头结点,还有一个指针temp,指向c…...

    2024/4/25 0:07:21
  19. 口语练习

    口语练习You can say it again! 你说的没错!I can’t see your point. 我没听懂你的话。...

    2024/4/21 2:58:30
  20. 设计模式干货

    1 定义:2 现实场景3 uml图4 类图关系:参与者(各个类作用5 代码实现:6 应用场景7 总结: 有缺点,适用人群:初学者或者总结,本文没有展开介绍.0 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模…...

    2024/4/26 13:54:34

最新文章

  1. pinctrl和gpio子系统

    文章目录 一、pinctrl 子系统简介二、pinctrl子系统的配置形式分析1.主要功能2.配置格式3.pinctrl驱动匹配 三、gpio子系统1.gpio系统使用流程 四、程序举例-led五、总结 一、pinctrl 子系统简介 在led操作设备树的实验中&#xff0c;对于gpio的初始化是直接操作的寄存器&…...

    2024/5/1 20:03:49
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Unity核心学习

    目录 认识模型的制作流程模型的制作过程 2D相关图片导入设置图片导入概述纹理类型设置纹理形状设置纹理高级设置纹理平铺拉伸设置纹理平台打包相关设置 SpriteSprite Editor——Single图片编辑Sprite Editor——Multiple图片编辑Sprite Editor——Polygon图片编辑SpriteRendere…...

    2024/5/1 13:06:24
  4. 如何转行成为产品经理?

    转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…...

    2024/5/1 13:02:24
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57