feat:20240410RGBtest1为socket通信下包含番茄rgb检测模型的全流程上机代码;20240419RGBtest2为pipe命名管道通信下包含番茄rgb检测模型的全流程上机代码;spectrum为光谱数据预处理代码(果子区域谱段均值)

This commit is contained in:
GG 2024-05-10 20:12:43 +08:00
commit ea62ca237c
57 changed files with 54880 additions and 0 deletions

10
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,10 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
# GitHub Copilot persisted chat sessions
/copilot/chatSessions

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated Normal file
View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="tengg" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/supermachine--tomato-passion_fruit.iml" filepath="$PROJECT_DIR$/.idea/supermachine--tomato-passion_fruit.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

@ -0,0 +1,444 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-04-10T14:49:51.025756600Z",
"start_time": "2024-04-10T14:49:51.021739700Z"
}
},
"source": [],
"outputs": []
},
{
"cell_type": "code",
"source": [
" import cv2\n",
" import numpy as np\n",
" import matplotlib.pyplot as plt\n",
" image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n",
" r_channel = image[:, :, 2]\n",
" b_channel = image[:, :, 0]\n",
" gray_image = r_channel - b_channel\n",
" gray_image = np.clip(gray_image, 0, 255)\n",
" gray_image = np.uint8(gray_image)\n",
"\n",
" # 显示新生成的灰度图像\n",
" plt.imshow(gray_image, cmap='gray')\n",
" plt.axis('off')\n",
" plt.show()\n",
" "
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T14:53:49.016762Z",
"start_time": "2024-04-10T14:53:48.426912500Z"
}
},
"id": "206810a054630770",
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"source": [
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"\n",
"# 读取RGB图像\n",
"img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n",
"\n",
"\n",
"# 获取图像的高度和宽度\n",
"height, width, _ = img.shape\n",
"\n",
"# 创建一个新的灰度图像\n",
"gray_img = np.zeros((height, width), dtype=np.uint8)\n",
"\n",
"# 遍历每个像素,计算R-B作为新的灰度值\n",
"for y in range(height):\n",
" for x in range(width):\n",
" r, g, b = img[y, x]\n",
" gray_value = r - b\n",
" if gray_value < 0:\n",
" gray_value = 0\n",
" elif gray_value > 255:\n",
" gray_value = 255\n",
" gray_img[y, x] = int(gray_value)\n",
"\n",
"\n",
"plt.imshow(gray_image, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n",
" \n",
"# 保存灰度图像\n",
"# cv2.imwrite('output_image.jpg', gray_img)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T15:04:30.607530400Z",
"start_time": "2024-04-10T15:03:55.344343200Z"
}
},
"id": "ba82f5c2fd049821",
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"source": [
"import torch\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"def extract_r_minus_b(image):\n",
" img_tensor = torch.tensor(image, dtype=torch.float32).to('cuda')\n",
"\n",
" r_channel = img_tensor[:, :, 0]\n",
" b_channel = img_tensor[:, :, 2]\n",
"\n",
" # 检查是否存在 NoneType 值,并将其替换为 0\n",
" r_channel = torch.nan_to_num(r_channel, nan=0)\n",
" b_channel = torch.nan_to_num(b_channel, nan=0)\n",
"\n",
" r_minus_b = torch.clamp(r_channel - b_channel, 0, 255).to('cpu').numpy().astype(np.uint8)\n",
"\n",
" return r_minus_b\n",
"\n",
"# 测试图像路径\n",
"image_path = '20240410tomatoRGBtest2/data/39.bmp'\n",
"\n",
"# 读取图像\n",
"image = cv2.imread(image_path)\n",
"\n",
"# 测试 extract_r_minus_b() 函数\n",
"r_minus_b = extract_r_minus_b(image)\n",
"\n",
"# 显示结果\n",
"plt.imshow(r_minus_b, cmap='gray')\n",
"plt.title('R-B Channel Difference')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T16:01:24.857246200Z",
"start_time": "2024-04-10T16:01:24.805385100Z"
}
},
"id": "7f09896cca12ec80",
"execution_count": 15,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 自适应阈值分割\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 自适应阈值分割\n",
"adaptive_threshold = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)\n",
"\n",
"# 显示结果\n",
"plt.imshow(adaptive_threshold, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T14:49:51.023762Z",
"start_time": "2024-04-10T14:49:47.876441200Z"
}
},
"id": "b9a2db758d89860e",
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 带滑动条调节的阈值分割\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import ipywidgets as widgets\n",
"from IPython.display import display\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 定义回调函数\n",
"def threshold_callback(threshold):\n",
" _, thresholded_image = cv2.threshold(gray_image, threshold, 255, cv2.THRESH_BINARY)\n",
" plt.imshow(thresholded_image, cmap='gray')\n",
" plt.axis('off')\n",
" plt.show()\n",
"\n",
"# 创建滑动条\n",
"threshold_slider = widgets.IntSlider(min=0, max=255, step=1, value=128, description='Threshold:')\n",
"display(threshold_slider)\n",
"\n",
"# 调用回调函数\n",
"threshold_callback(threshold_slider.value)\n",
"\n",
"# 连接滑动条和回调函数\n",
"widgets.interactive(threshold_callback, threshold=threshold_slider)\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T09:49:57.666748700Z",
"start_time": "2024-04-10T09:49:56.140521900Z"
}
},
"id": "6ff8e4e22d034f53",
"execution_count": 7,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### Otsu阈值分割\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 使用Otsu阈值分割\n",
"_, otsu_threshold = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n",
"\n",
"# 显示结果\n",
"plt.imshow(otsu_threshold, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T09:54:09.077152500Z",
"start_time": "2024-04-10T09:54:08.502123300Z"
}
},
"id": "6207115686820296",
"execution_count": 8,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### Sobel边缘检测\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 使用Sobel边缘检测\n",
"sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=5)\n",
"sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=5)\n",
"edges = np.sqrt(sobel_x**2 + sobel_y**2)\n",
"\n",
"# 显示结果\n",
"plt.imshow(edges, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T09:55:13.525305800Z",
"start_time": "2024-04-10T09:55:12.652295600Z"
}
},
"id": "f3bd38e5e62cbd3c",
"execution_count": 9,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 形态学处理\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 定义结构元素\n",
"kernel = np.ones((2,2),np.uint8)\n",
"\n",
"# 闭运算\n",
"closing = cv2.morphologyEx(gray_image, cv2.MORPH_CLOSE, kernel)\n",
"\n",
"# 显示结果\n",
"plt.imshow(closing, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T09:57:05.878548800Z",
"start_time": "2024-04-10T09:57:05.060591800Z"
}
},
"id": "7395629910ee8620",
"execution_count": 11,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 角点检测\n",
"import cv2\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# 读取R通道减去B通道的灰度图\n",
"gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# Shi-Tomasi角点检测\n",
"corners = cv2.goodFeaturesToTrack(gray_image, 100, 0.01, 10)\n",
"\n",
"# 绘制角点\n",
"corners = np.int0(corners)\n",
"for i in corners:\n",
" x, y = i.ravel()\n",
" cv2.circle(gray_image, (x, y), 3, 255, -1)\n",
"\n",
"# 显示结果\n",
"plt.imshow(gray_image, cmap='gray')\n",
"plt.axis('off')\n",
"plt.show()\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-10T09:59:32.789829500Z",
"start_time": "2024-04-10T09:59:31.769444500Z"
}
},
"id": "990a0ecebe27d9a0",
"execution_count": 12,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 二值化对象\n",
"\n",
"import cv2\n",
"import numpy as np\n",
"\n",
"# 读取原始图像\n",
"img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\output\\r_minus_b_26.jpg', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 使用Otsu's二值化方法\n",
"_, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n",
"\n",
"# # 显示二值化后的图像\n",
"# cv2.imshow('Binary Image', binary_img)\n",
"# cv2.waitKey(0)\n",
"# cv2.destroyAllWindows()\n",
"# 保存二值化后的图像\n",
"cv2.imwrite('06.jpg', binary_img)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-12T06:34:26.530387300Z",
"start_time": "2024-04-12T06:34:26.132598800Z"
}
},
"id": "c4a6c0bfd05d3283",
"execution_count": 1,
"outputs": []
},
{
"cell_type": "code",
"source": [
"### 光滑边缘\n",
"import cv2\n",
"import numpy as np\n",
"\n",
"# 假设您的两张图像已经保存为 image1.png 和 image2.png\n",
"image1 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\06.jpg', cv2.IMREAD_GRAYSCALE)\n",
"image2 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\010.png', cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 应用高斯模糊来平滑边缘\n",
"smoothed_image1 = cv2.GaussianBlur(image1, (9, 9), 0)\n",
"smoothed_image2 = cv2.GaussianBlur(image2, (9, 9), 0)\n",
"\n",
"# 将处理后的图像转换为二值图像\n",
"_, binary_image1 = cv2.threshold(smoothed_image1, 128, 255, cv2.THRESH_BINARY)\n",
"_, binary_image2 = cv2.threshold(smoothed_image2, 128, 255, cv2.THRESH_BINARY)\n",
"\n",
"# 保存二值化后的图像\n",
"cv2.imwrite('smoothed_binary_image06.png', binary_image1)\n",
"cv2.imwrite('smoothed_binary_image2.png', binary_image2)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-04-12T06:35:18.063684900Z",
"start_time": "2024-04-12T06:35:17.935028900Z"
}
},
"id": "1f6ac60b3150fc9e",
"execution_count": 3,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"collapsed": false
},
"id": "3749d97ac3719946",
"execution_count": null,
"outputs": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

View File

@ -0,0 +1,298 @@
import cv2
import numpy as np
import os
import argparse
# from svm import predict_image_array, load_model
def extract_s_l(image_path):
image = cv2.imread(image_path)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
s_channel = hsv[:,:,1]
l_channel = lab[:,:,0]
result = cv2.add(s_channel, l_channel)
return result
def find_reflection(image_path, threshold=190):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用阈值分割
_, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
return reflection
def otsu_threshold(image):
# 将图像转换为灰度图像
# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Otsu阈值分割
_, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
# 提取花萼使用G-R的图像
def extract_g_r(image):
# image = cv2.imread(image_path)
g_channel = image[:,:,1]
r_channel = image[:,:,2]
result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
return result
#提取西红柿使用R-B的图像
def extract_r_b(image_path):
image = cv2.imread(image_path)
r_channel = image[:,:,2]
b_channel = image[:,:,0]
result = cv2.subtract(r_channel, b_channel)
return result
def extract_r_g(image_path):
image = cv2.imread(image_path)
r_channel = image[:,:,2]
g_channel = image[:,:,1]
result = cv2.subtract(r_channel, g_channel)
return result
def threshold_segmentation(image, threshold, color=255):
_, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
return result
def bitwise_operation(image1, image2, operation='and'):
if operation == 'and':
result = cv2.bitwise_and(image1, image2)
elif operation == 'or':
result = cv2.bitwise_or(image1, image2)
else:
raise ValueError("operation must be 'and' or 'or'")
return result
def largest_connected_component(bin_img):
# 使用connectedComponentsWithStats函数找到连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
# 如果只有背景标签,返回一个空的二值图像
if num_labels <= 1:
return np.zeros_like(bin_img)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(bin_img)
new_bin_img[labels == largest_label] = 255
return new_bin_img
def close_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
return closed_img
def open_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
return opened_img
def draw_tomato_edge(original_img, bin_img):
bin_img_processed = close_operation(bin_img, kernel_size=(15, 15))
# cv2.imshow('Close Operation', bin_img_processed)
# bin_img_processed = open_operation(bin_img_processed, kernel_size=(19, 19))
# cv2.imshow('Open Operation', bin_img_processed)
# 现在使用处理后的bin_img_processed查找轮廓
contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 如果没有找到轮廓,直接返回原图
if not contours:
return original_img, np.zeros_like(bin_img) # 返回原图和全黑mask
# 找到最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 多边形近似的精度调整
epsilon = 0.0006 * cv2.arcLength(max_contour, True) # 可以调整这个值
approx = cv2.approxPolyDP(max_contour, epsilon, True)
# 绘制轮廓
cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
mask = np.zeros_like(bin_img)
# 使用白色填充最大轮廓
cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
return original_img, mask
def draw_tomato_edge_convex_hull(original_img, bin_img):
bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return original_img
max_contour = max(contours, key=cv2.contourArea)
hull = cv2.convexHull(max_contour)
cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
return original_img
# 得到完整的西红柿二值图像,除了绿色花萼
def fill_holes(bin_img):
# 复制 bin_img 到 img_filled
img_filled = bin_img.copy()
# 获取图像的高度和宽度
height, width = bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_d = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(bin_img, img_filled)
# 裁剪 img_filled 和 img_filled_d 到与 bin_img 相同的大小
# img_filled = img_filled[:height, :width]
img_filled_d = img_filled_d[:height, :width]
return img_filled, img_filled_d
def bitwise_and_rgb_with_binary(rgb_img, bin_img):
# 将二值图像转换为三通道图像
bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
# 使用 bitwise_and 操作合并 RGB 图像和二值图像
result = cv2.bitwise_and(rgb_img, bin_img_3channel)
return result
def extract_max_connected_area(image, lower_hsv, upper_hsv):
# 读取图像
# image = cv2.imread(image_path)
# 将图像从BGR转换到HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 使用阈值获取指定区域的二值图像
mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
# 找到二值图像的连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(mask)
new_bin_img[labels == largest_label] = 255
# 复制 new_bin_img 到 img_filled
img_filled = new_bin_img.copy()
# 获取图像的高度和宽度
height, width = new_bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_inv = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
return img_filled
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--dir_path', type=str, default=r'D:\project\Tomato\20240410RGBtest2\datatest',
help='the directory path of images')
parser.add_argument('--threshold_s_l', type=int, default=180,
help='the threshold for s_l')
parser.add_argument('--threshold_r_b', type=int, default=15,
help='the threshold for r_b')
args = parser.parse_args()
for img_file in os.listdir(args.dir_path):
if img_file.endswith('.png'):
img_path = os.path.join(args.dir_path, img_file)
s_l = extract_s_l(img_path)
otsu_thresholded = otsu_threshold(s_l)
img_fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), otsu_thresholded)
img_fore_defect = extract_g_r(img_fore)
img_fore_defect = threshold_segmentation(img_fore_defect, args.threshold_r_b)
# cv2.imshow('img_fore_defect', img_fore_defect)
thresholded_s_l = threshold_segmentation(s_l, args.threshold_s_l)
new_bin_img = largest_connected_component(thresholded_s_l)
zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
cv2.imshow('zhongggggg', zhongggggg)
new_otsu_bin_img = largest_connected_component(otsu_thresholded)
filled_img, defect = fill_holes(new_bin_img)
defect = bitwise_and_rgb_with_binary(cv2.imread(img_path), defect)
cv2.imshow('defect', defect)
edge, mask = draw_tomato_edge(cv2.imread(img_path), new_bin_img)
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), mask)
fore_g_r_t = threshold_segmentation(extract_g_r(fore), 20)
fore_g_r_t_ture = bitwise_and_rgb_with_binary(cv2.imread(img_path), fore_g_r_t)
cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
white = find_reflection(img_path)
# SVM预测
# 加载模型
# model, scaler = load_model('/Users/xs/PycharmProjects/super-tomato/svm_green.joblib')
# 对图像进行预测
# predicted_mask = predict_image_array(image, model, scaler)
cv2.imshow('white', white)
cv2.imshow('fore', fore)
cv2.imshow('fore_g_r_t', fore_g_r_t)
cv2.imshow('mask', mask)
print('mask', mask.shape)
print('filled', filled_img.shape)
print('largest', new_bin_img.shape)
print('rp', org_defect.shape)
cv2.imshow('res', res)
# lower_hsv = np.array([19, 108, 15])
# upper_hsv = np.array([118, 198, 134])
# max_connected_area = extract_max_connected_area(img_path, lower_hsv, upper_hsv)
# cv2.imshow('Max Connected Area', max_connected_area)
# 显示原始图像
original_img = cv2.imread(img_path)
cv2.imshow('Original', original_img)
cv2.imshow('thresholded_s_l', thresholded_s_l)
cv2.imshow('Largest Connected Component', new_bin_img)
cv2.imshow('Filled', filled_img)
cv2.imshow('Defect', defect)
cv2.imshow('Org_defect', org_defect)
cv2.imshow('otsu_thresholded', new_otsu_bin_img)
#显示轮廓
cv2.imshow('Edge', edge)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
main()

217
20240410RGBtest1/main.py Normal file
View File

@ -0,0 +1,217 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/12 15:04
# @Author : TG
# @File : main.py
# @Software: PyCharm
import socket
import sys
import numpy as np
import cv2
import root_dir
import time
import os
from root_dir import ROOT_DIR
from utils import PreSocket, receive_sock, parse_protocol, ack_sock, done_sock, DualSock, simple_sock, test_sock
import logging
from utils import threshold_segmentation, largest_connected_component, draw_tomato_edge, bitwise_and_rgb_with_binary, extract_s_l, get_tomato_dimensions, get_defect_info
from collections import deque
import time
def process_cmd(cmd: str, img: any, connected_sock: socket.socket) -> tuple:
"""
处理指令
:param cmd: 指令类型
:param data: 指令内容
:param connected_sock: socket
:param detector: 模型
:return: 是否处理成功
"""
start_time = time.time()
if cmd == 'IM':
# image = cv2.imdecode(np.frombuffer(img, dtype=np.uint8), cv2.IMREAD_COLOR)
# image = img
threshold_s_l = 180
# threshold_r_b = 15
s_l = extract_s_l(img)
# otsu_thresholded = ImageProcessor.otsu_threshold(s_l)
# img_fore = ImageProcessor.bitwise_and_rgb_with_binary(img, otsu_thresholded)
# img_fore_defect = ImageProcessor.extract_g_r(img_fore)
# img_fore_defect = ImageProcessor.threshold_segmentation(img_fore_defect, threshold_r_b)
# cv2.imshow('img_fore_defect', img_fore_defect)
thresholded_s_l = threshold_segmentation(s_l, threshold_s_l)
new_bin_img = largest_connected_component(thresholded_s_l)
# zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
# cv2.imshow('zhongggggg', zhongggggg)
# new_otsu_bin_img = ImageProcessor.largest_connected_component(otsu_thresholded)
# filled_img, defect = ImageProcessor.fill_holes(new_bin_img)
# defect = ImageProcessor.bitwise_and_rgb_with_binary(cv2.imread(img), defect)
# cv2.imshow('defect', defect)
edge, mask = draw_tomato_edge(img, new_bin_img)
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
# fore = ImageProcessor.bitwise_and_rgb_with_binary(cv2.imread(img), mask)
# fore_g_r_t = ImageProcessor.threshold_segmentation(ImageProcessor.extract_g_r(fore), 20)
# fore_g_r_t_ture = ImageProcessor.bitwise_and_rgb_with_binary(cv2.imread(img), fore_g_r_t)
# cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
# res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
# white = ImageProcessor.find_reflection(img)
# cv2.imwrite('new_bin_img.bmp', new_bin_img)
long_axis, short_axis = get_tomato_dimensions(mask)
number_defects, total_pixels = get_defect_info(new_bin_img)
rp = org_defect
rp = cv2.cvtColor(rp, cv2.COLOR_BGR2RGB)
# cv2.imwrite('rp1.bmp', rp)
# elif cmd == 'TR':
# detector = WoodClass(w=4096, h=1200, n=8000, p1=0.8, debug_mode=False)
# model_name = None
# if "$" in data:
# data, model_name = data.split("$", 1)
# model_name = model_name + ".p"
# settings.data_path = data
# settings.model_path = ROOT_DIR / 'models' / detector.fit_pictures(data_path=settings.data_path, file_name=model_name)
# response = simple_sock(connected_sock, cmd_type=cmd, result=result)
# elif cmd == 'MD':
# settings.model_path = data
# detector.load(path=settings.model_path)
# response = simple_sock(connected_sock, cmd_type=cmd, result=result)
# elif cmd == 'KM':
# x_data, y_data, labels, img_names = detector.get_luminance_data(data, plot_2d=True)
# result = detector.data_adjustments(x_data, y_data, labels, img_names)
# result = ','.join([str(x) for x in result])
# response = simple_sock(connected_sock, cmd_type=cmd, result=result)
else:
logging.error(f'错误指令,指令为{cmd}')
response = False
end_time = time.time()
elapsed_time = end_time - start_time
print(f'处理时间:{elapsed_time}')
return long_axis, short_axis, number_defects, total_pixels, rp
def main(is_debug=False):
file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
handlers=[file_handler, console_handler],
level=logging.DEBUG)
dual_sock = DualSock(connect_ip='127.0.0.1')
while not dual_sock.status:
dual_sock.reconnect()
while True:
long_axis_list = []
short_axis_list = []
defect_num_sum = 0
total_defect_area_sum = 0
rp = None
for i in range(5):
start_time = time.time()
pack, next_pack = receive_sock(dual_sock)
if pack == b"":
time.sleep(2)
dual_sock.reconnect()
continue
cmd, img = parse_protocol(pack)
print(cmd)
print(img.shape)
end_time = time.time()
elapsed_time = end_time - start_time
print(f'接收时间:{elapsed_time}')
long_axis, short_axis, number_defects, total_pixels, rp = process_cmd(cmd=cmd, img=img, connected_sock=dual_sock)
# print(long_axis, short_axis, number_defects, type(total_pixels), rp.shape)
if i <= 2:
long_axis_list.append(long_axis)
short_axis_list.append(short_axis)
if i == 1:
rp_result = rp
defect_num_sum += number_defects
total_defect_area_sum += total_pixels
long_axis = round(sum(long_axis_list) / 3)
short_axis = round(sum(short_axis_list) / 3)
# print(type(long_axis), type(short_axis), type(defect_num_sum), type(total_defect_area_sum), type(rp_result))
response = test_sock(dual_sock, cmd_type=cmd, long_axis=long_axis, short_axis=short_axis,
defect_num=defect_num_sum, total_defect_area=total_defect_area_sum, rp=rp_result)
print(long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result.shape)
# while True:
# result_buffer = []
# for _ in range(5):
# pack, next_pack = receive_sock(dual_sock) # 接收数据,如果没有数据则阻塞,如果返回的是空字符串则表示出现错误
# if pack == b"": # 无数据表示出现错误
# time.sleep(5)
# dual_sock.reconnect()
# break
#
# cmd, data = parse_protocol(pack)
# print(cmd)
# print(data)
#
# result = process_cmd(cmd=cmd, data=data, connected_sock=dual_sock, detector=detector, settings=settings)
# result_buffer.append(result) # 将处理结果添加到缓冲区
#
# # 在这里进行对5次结果的处理可以进行合并、比较等操作
# final_result = combine_results(result_buffer)
#
# # 发送最终结果
# response = simple_sock(dual_sock, cmd_type=cmd, result=final_result)
# print(final_result)
# result_buffer = []
if __name__ == '__main__':
# 2个端口
# 接受端口21122
# 发送端口21123
# 接收到图片 n_rows * n_bands * n_cols, float32
# 发送图片 n_rows * n_cols, uint8
main(is_debug=False)
# test(r"D:\build-tobacco-Desktop_Qt_5_9_0_MSVC2015_64bit-Release\calibrated15.raw")
# main()
# debug_main()
# test_run(all_data_dir=r'D:\数据')
# with open(r'D:\数据\虫子\valid2.raw', 'rb') as f:
# data = np.frombuffer(f.read(), dtype=np.float32).reshape(600, 29, 1024).transpose(0, 2, 1)
# plt.matshow(data[:, :, 10])
# plt.show()
# detector = SpecDetector('model_spec/model_29.p')
# result = detector.predict(data)
#
# plt.matshow(result)
# plt.show()
# result = result.reshape((600, 1024))

View File

@ -0,0 +1,129 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/11 15:18
# @Author : TG
# @File : parameter calculation.py
# @Software: PyCharm
import cv2
import numpy as np
from scipy.ndimage.measurements import label, find_objects
def get_tomato_dimensions(edge_img):
"""
根据番茄边缘二值化轮廓图,计算番茄的长径短径和长短径比值
使用最小外接矩形和最小外接圆两种方法
参数:
edge_img (numpy.ndarray): 番茄边缘二值化轮廓图,背景为黑色,番茄区域为白色
返回:
tuple: (长径, 短径, 长短径比值)
"""
# 最小外接矩形
rect = cv2.minAreaRect(cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
major_axis, minor_axis = rect[1]
aspect_ratio = max(major_axis, minor_axis) / min(major_axis, minor_axis)
# # 最小外接圆
# (x, y), radius = cv2.minEnclosingCircle(
# cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
# diameter = 2 * radius
# aspect_ratio_circle = 1.0
return (max(major_axis, minor_axis), min(major_axis, minor_axis), aspect_ratio)
def get_defect_info(defect_img):
"""
根据番茄区域缺陷二值化轮廓图,计算缺陷区域的个数和总面积
参数:
defect_img (numpy.ndarray): 番茄区域缺陷二值化轮廓图,背景为黑色,番茄区域为白色,缺陷区域为黑色连通域
返回:
tuple: (缺陷区域个数, 缺陷区域像素面积缺陷像素总面积)
"""
nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(defect_img, connectivity=4)
max_area = max(stats[i, cv2.CC_STAT_AREA] for i in range(1, nb_components))
areas = []
for i in range(1, nb_components):
area = stats[i, cv2.CC_STAT_AREA]
if area != max_area:
areas.append(area)
number_defects = len(areas)
total_pixels = sum(areas)
return number_defects, areas, total_pixels
def connected_components_analysis(binary_image):
"""
从二值化图像计算黑色连通域个数和各个黑色连通域像素面积及黑色像素总面积
参数:
binary_image (numpy.ndarray): 二值化图像, 其中 0 表示白色, 1 表示黑色
返回:
num_components (int): 黑色连通域的个数
component_areas (list): 每个黑色连通域的像素面积
total_black_area (int): 黑色像素的总面积
"""
# 标记连通域
labeled_image, num_components = label(binary_image)
# 获取每个连通域的像素位置
slices = find_objects(labeled_image)
# 计算每个连通域的像素面积
component_areas = []
for slice_obj in slices:
component_area = np.sum(binary_image[slice_obj])
component_areas.append(component_area)
# 计算黑色像素的总面积
total_black_area = np.sum(binary_image)
return num_components, component_areas, total_black_area
def main():
# 读取图像
defect_image = cv2.imread(r'D:\project\Tomato\20240410tomatoRGBtest2\Largest Connected Component_screenshot_15.04.2024.png', 0)
edge_image = cv2.imread(r'D:\project\Tomato\20240410tomatoRGBtest2\mask_screenshot_15.04.2024.png', 0)
filled_image = cv2.imread(r'D:\project\Tomato\20240410tomatoRGBtest2\Filled_screenshot_15.04.2024.png', 0)
# print(defect_image.shape)
# print(edge_image.shape)
# print(filled_image.shape)
# 执行二值化处理
_, thresh_defect = cv2.threshold(defect_image, 127, 255, cv2.THRESH_BINARY_INV)
_, thresh_edge = cv2.threshold(edge_image, 127, 255, cv2.THRESH_BINARY)
_, thresh_filled = cv2.threshold(filled_image, 127, 255, cv2.THRESH_BINARY)
print(thresh_defect.shape)
print(thresh_edge.shape)
print(thresh_filled.shape)
# # 直接使用二值图像
# thresh_defect = defect_image
# thresh_edge = edge_image
# thresh_filled = filled_image
# 获取番茄的长径、短径和长短径比值
major_axis, minor_axis, aspect_ratio = get_tomato_dimensions(thresh_edge)
# 获取缺陷区域的个数和总面积
num_defects, areas, total_pixels = get_defect_info(thresh_defect)
# 获取黑色连通域的个数、各个连通域的面积和总黑色面积
num_components, component_areas, total_black_area = connected_components_analysis(thresh_filled)
print(f'番茄的长径为{major_axis},短径为{minor_axis},长短径比值为{aspect_ratio}')
print(f'缺陷区域的个数为{num_defects},像素个数分别为{areas},缺陷总面积为{total_pixels}')
print(f'黑色连通域的个数为{num_components},像素个数分别为{component_areas},黑色像素总面积为{total_black_area}')
if __name__ == '__main__':
main()

211
20240410RGBtest1/qt_test.py Normal file
View File

@ -0,0 +1,211 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/12 16:54
# @Author : TG
# @File : qt_test.py
# @Software: PyCharm
import numpy as np
import socket
import logging
import matplotlib.pyplot as plt
import cv2
import os
import time
from utils import DualSock, try_connect, receive_sock, parse_protocol, ack_sock, done_sock
def rec_socket(recv_sock: socket.socket, cmd_type: str, ack: bool) -> bool:
if ack:
cmd = 'A' + cmd_type
else:
cmd = 'D' + cmd_type
while True:
try:
temp = recv_sock.recv(1)
except ConnectionError as e:
logging.error(f'连接出错, 错误代码:\n{e}')
return False
except TimeoutError as e:
logging.error(f'超时了,错误代码: \n{e}')
return False
except Exception as e:
logging.error(f'遇见未知错误,错误代码: \n{e}')
return False
if temp == b'\xaa':
break
# 获取报文长度
temp = b''
while len(temp) < 4:
try:
temp += recv_sock.recv(1)
except Exception as e:
logging.error(f'接收报文长度失败, 错误代码: \n{e}')
return False
try:
data_len = int.from_bytes(temp, byteorder='big')
except Exception as e:
logging.error(f'转换失败,错误代码 \n{e}, \n报文内容\n{temp}')
return False
# 读取报文内容
temp = b''
while len(temp) < data_len:
try:
temp += recv_sock.recv(data_len)
except Exception as e:
logging.error(f'接收报文内容失败, 错误代码: \n{e}\n报文内容\n{temp}')
return False
data = temp
if cmd.strip().upper() != data[:4].decode('ascii').strip().upper():
logging.error(f'客户端接收指令错误,\n指令内容\n{data}')
return False
else:
if cmd == 'DIM':
print(data)
# 进行数据校验
temp = b''
while len(temp) < 3:
try:
temp += recv_sock.recv(1)
except Exception as e:
logging.error(f'接收报文校验失败, 错误代码: \n{e}')
return False
if temp == b'\xff\xff\xbb':
return True
else:
logging.error(f"接收了一个完美的只错了校验位的报文,\n data: {data}")
return False
# def main():
# socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# socket_receive.bind(('127.0.0.1', 21123))
# socket_receive.listen(5)
# socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# socket_send.bind(('127.0.0.1', 21122))
# socket_send.listen(5)
# print('等待连接')
# socket_send_1, receive_addr_1 = socket_send.accept()
# print("连接成功:", receive_addr_1)
# # socket_send_2 = socket_send_1
# socket_send_2, receive_addr_2 = socket_receive.accept()
# print("连接成功:", receive_addr_2)
# while True:
# cmd = input('请输入指令:').strip().upper()
# if cmd == 'IM':
# with open('data/newrawfile_ref.raw', 'rb') as f:
# data = np.frombuffer(f.read(), dtype=np.float32).reshape(750, 288, 384)
# data = data[:, [91, 92, 93, 94, 95, 96, 97, 98, 99, 100], :]
# n_rows, n_bands, n_cols = data.shape[0], data.shape[1], data.shape[2]
# print(f'n_rows{n_rows}, n_bands{n_bands}, n_cols{n_cols}')
# n_rows, n_cols, n_bands = [x.to_bytes(2, byteorder='big') for x in [n_rows, n_cols, n_bands]]
# data = data.tobytes()
# length = len(data) + 10
# print(f'length: {length}')
# length = length.to_bytes(4, byteorder='big')
# msg = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + n_rows + n_cols + n_bands + data + b'\xff\xff\xbb'
# socket_send_1.send(msg)
# print('发送成功')
# result = socket_send_2.recv(5)
# length = int.from_bytes(result[1:5], byteorder='big')
# result = b''
# while len(result) < length:
# result += socket_send_2.recv(length)
# print(result)
# data = result[4:length].decode()
# print(data)
def main():
socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket_receive.bind(('127.0.0.1', 21123))
socket_receive.listen(5)
socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket_send.bind(('127.0.0.1', 21122))
socket_send.listen(5)
print('等待连接')
socket_send_1, receive_addr_1 = socket_send.accept()
print("连接成功:", receive_addr_1)
socket_send_2, receive_addr_2 = socket_receive.accept()
print("连接成功:", receive_addr_2)
# while True:
# cmd = input().strip().upper()
# if cmd == 'IM':
# image_dir = r'D:\project\Tomato\20240410tomatoRGBtest2\data'
# image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(".bmp")]
# for image_path in image_paths:
# img = cv2.imread(image_path)
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# img = np.asarray(img, dtype=np.uint8)
# width = img.shape[0]
# height = img.shape[1]
# print(width, height)
# img_bytes = img.tobytes()
# length = len(img_bytes) + 8
# print(length)
# length = length.to_bytes(4, byteorder='big')
# width = width.to_bytes(2, byteorder='big')
# height = height.to_bytes(2, byteorder='big')
# send_message = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + width + height + img_bytes + b'\xff\xff\xbb'
# socket_send_1.send(send_message)
# print('发送成功')
# result = socket_send_2.recv(5)
# print(result)
while True:
cmd = input().strip().upper()
if cmd == 'IM':
image_dir = r'D:\project\Tomato\20240410tomatoRGBtest2\data'
send_images(image_dir, socket_send_1, socket_send_2)
def send_images(image_dir, socket_send_1, socket_send_2):
image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(".bmp")]
num_images = len(image_paths)
num_groups = (num_images + 4) // 5
for group_idx in range(num_groups):
start = group_idx * 5
end = start + 5
group_images = image_paths[start:end]
group_start = time.time()
for image_path in group_images:
img_start = time.time()
img = cv2.imread(image_path)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.asarray(img, dtype=np.uint8)
width = img.shape[0]
height = img.shape[1]
print(width, height)
img_bytes = img.tobytes()
length = len(img_bytes) + 8
print(length)
length = length.to_bytes(4, byteorder='big')
width = width.to_bytes(2, byteorder='big')
height = height.to_bytes(2, byteorder='big')
send_message = b'\xaa' + length + (' ' + 'IM').upper().encode('ascii') + width + height + img_bytes + b'\xff\xff\xbb'
socket_send_1.send(send_message)
img_end = time.time()
print(f'图片发送时间: {img_end - img_start}')
print('图片发送成功')
group_end = time.time()
print(f'{group_idx + 1} 组图片发送时间: {group_end - group_start}')
result = socket_send_2.recv(5)
print(f'{group_idx + 1} 组结果: {result}')
if __name__ == '__main__':
main()

8
20240410RGBtest1/super-tomato/.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View File

@ -0,0 +1,48 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyInterpreterInspection" enabled="false" level="WARNING" enabled_by_default="false" />
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="34">
<item index="0" class="java.lang.String" itemvalue="qt5-applications" />
<item index="1" class="java.lang.String" itemvalue="python-dateutil" />
<item index="2" class="java.lang.String" itemvalue="qt5-tools" />
<item index="3" class="java.lang.String" itemvalue="PyQt5-sip" />
<item index="4" class="java.lang.String" itemvalue="cycler" />
<item index="5" class="java.lang.String" itemvalue="numpy" />
<item index="6" class="java.lang.String" itemvalue="requests" />
<item index="7" class="java.lang.String" itemvalue="func-timeout" />
<item index="8" class="java.lang.String" itemvalue="PyQt5-Qt5" />
<item index="9" class="java.lang.String" itemvalue="PyQt5" />
<item index="10" class="java.lang.String" itemvalue="urllib3" />
<item index="11" class="java.lang.String" itemvalue="pyparsing" />
<item index="12" class="java.lang.String" itemvalue="wincertstore" />
<item index="13" class="java.lang.String" itemvalue="six" />
<item index="14" class="java.lang.String" itemvalue="kiwisolver" />
<item index="15" class="java.lang.String" itemvalue="packaging" />
<item index="16" class="java.lang.String" itemvalue="pyserial" />
<item index="17" class="java.lang.String" itemvalue="torch" />
<item index="18" class="java.lang.String" itemvalue="click" />
<item index="19" class="java.lang.String" itemvalue="contourpy" />
<item index="20" class="java.lang.String" itemvalue="pandas" />
<item index="21" class="java.lang.String" itemvalue="fonttools" />
<item index="22" class="java.lang.String" itemvalue="pyqtgraph" />
<item index="23" class="java.lang.String" itemvalue="matplotlib" />
<item index="24" class="java.lang.String" itemvalue="typing_extensions" />
<item index="25" class="java.lang.String" itemvalue="charset-normalizer" />
<item index="26" class="java.lang.String" itemvalue="pytz" />
<item index="27" class="java.lang.String" itemvalue="idna" />
<item index="28" class="java.lang.String" itemvalue="Pillow" />
<item index="29" class="java.lang.String" itemvalue="scipy" />
<item index="30" class="java.lang.String" itemvalue="threadpoolctl" />
<item index="31" class="java.lang.String" itemvalue="thop" />
<item index="32" class="java.lang.String" itemvalue="tensorboard" />
<item index="33" class="java.lang.String" itemvalue="pycocotools" />
</list>
</value>
</option>
</inspection_tool>
</profile>
</component>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (deepo)" project-jdk-type="Python SDK" />
<component name="PyPackaging">
<option name="earlyReleasesAsUpgrades" value="true" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/super-tomato.iml" filepath="$PROJECT_DIR$/.idea/super-tomato.iml" />
</modules>
</component>
</project>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PySciProjectComponent">
<option name="PY_MATPLOTLIB_IN_TOOLWINDOW" value="false" />
</component>
</project>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,14 @@
import os
from PIL import Image
def convert_images(directory):
for filename in os.listdir(directory):
if filename.endswith('.png'):
filepath = os.path.join(directory, filename)
with Image.open(filepath) as img:
if img.mode == 'RGBA':
img = img.convert('RGB')
img.save(filepath)
# 调用函数,替换为你的目录路径
convert_images(r'D:\同步盘\project\Tomato\20240410RGBtest2\super-tomato\images')

View File

@ -0,0 +1,65 @@
import cv2
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def plot_color_spaces(image_path, mask_path):
# 读取原始图像和掩码图像
image = cv2.imread(image_path)
mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
# 确保掩码是二值的
_, mask = cv2.threshold(mask, 128, 255, cv2.THRESH_BINARY)
# 提取花萼部分和背景部分的像素
flower_parts = image[mask == 255]
background = image[mask == 0]
background = background[::50] # 每隔三个像素取一个
# 转换到HSV和LAB颜色空间
flower_parts_hsv = cv2.cvtColor(flower_parts.reshape(-1, 1, 3), cv2.COLOR_BGR2HSV).reshape(-1, 3)
flower_parts_lab = cv2.cvtColor(flower_parts.reshape(-1, 1, 3), cv2.COLOR_BGR2LAB).reshape(-1, 3)
background_hsv = cv2.cvtColor(background.reshape(-1, 1, 3), cv2.COLOR_BGR2HSV).reshape(-1, 3)
background_lab = cv2.cvtColor(background.reshape(-1, 1, 3), cv2.COLOR_BGR2LAB).reshape(-1, 3)
# 创建RGB空间的3D图
fig_rgb = plt.figure()
ax_rgb = fig_rgb.add_subplot(111, projection='3d')
ax_rgb.scatter(flower_parts[:, 2], flower_parts[:, 1], flower_parts[:, 0], c='r', label='Flower Parts',alpha=0.01)
ax_rgb.scatter(background[:, 2], background[:, 1], background[:, 0], c='b', label='Background',alpha=0.01)
ax_rgb.set_title('RGB Color Space')
ax_rgb.set_xlabel('Red')
ax_rgb.set_ylabel('Green')
ax_rgb.set_zlabel('Blue')
ax_rgb.legend()
plt.show()
# 创建HSV空间的3D图
fig_hsv = plt.figure()
ax_hsv = fig_hsv.add_subplot(111, projection='3d')
ax_hsv.scatter(flower_parts_hsv[:, 0], flower_parts_hsv[:, 1], flower_parts_hsv[:, 2], c='r', label='Flower Parts',alpha=0.01)
ax_hsv.scatter(background_hsv[:, 0], background_hsv[:, 1], background_hsv[:, 2], c='b', label='Background',alpha=0.01)
ax_hsv.set_title('HSV Color Space')
ax_hsv.set_xlabel('Hue')
ax_hsv.set_ylabel('Saturation')
ax_hsv.set_zlabel('Value')
ax_hsv.legend()
plt.show()
# 创建LAB空间的3D图
fig_lab = plt.figure()
ax_lab = fig_lab.add_subplot(111, projection='3d')
ax_lab.scatter(flower_parts_lab[:, 0], flower_parts_lab[:, 1], flower_parts_lab[:, 2], c='r', label='Flower Parts',alpha=0.01)
ax_lab.scatter(background_lab[:, 0], background_lab[:, 1], background_lab[:, 2], c='b', label='Background',alpha=0.01)
ax_hsv.set_title('LAB Color Space')
ax_hsv.set_xlabel('L')
ax_hsv.set_ylabel('A')
ax_hsv.set_zlabel('B')
ax_hsv.legend()
plt.show()
# 调用函数,确保替换下面的路径为你的图像路径
plot_color_spaces('/Users/xs/PycharmProjects/super-tomato/datasets_green/train/img/2.bmp',
'/Users/xs/PycharmProjects/super-tomato/datasets_green/train/label/2.png')

View File

@ -0,0 +1,157 @@
import torch
import torch.nn as nn
import torch.optim as optim
from torch import device
from torch.utils.data import Dataset, DataLoader
from PIL import Image
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score
import os
from tqdm import tqdm
import time
import matplotlib.pyplot as plt
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(64, 1, kernel_size=3, padding=1)
def forward(self, x):
x = torch.relu(self.conv1(x))
x = torch.sigmoid(self.conv2(x))
return x
class ImageDataset(Dataset):
def __init__(self, img_paths, mask_paths):
self.img_paths = img_paths
self.mask_paths = mask_paths
def __len__(self):
return len(self.img_paths)
def __getitem__(self, idx):
img = np.array(Image.open(self.img_paths[idx]).convert('RGB')).transpose((2, 0, 1)) # 转换为RGB图像确保有3个通道
if self.mask_paths[0] is not None:
mask = np.array(Image.open(self.mask_paths[idx]).convert('I')) # 转换为32位深度的灰度图像
mask = mask / np.max(mask) # Normalize to 0-1
return img, mask[np.newaxis, :]
else:
return img, None
def train_model(dataloader, model, criterion, optimizer, epochs):
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model.to(device)
best_accuracy = 0.0
for epoch in tqdm(range(epochs), desc="Training"):
for img, mask in dataloader:
img = img.float().to(device)
mask = mask.float().to(device)
optimizer.zero_grad()
outputs = model(img)
loss = criterion(outputs, mask)
loss.backward()
optimizer.step()
# 二值化模型的输出
preds = outputs.detach().cpu().numpy() > 0.5
mask = (mask.cpu().numpy() > 0.5) # Binarize the mask
# 计算准确度、精度和召回率
accuracy = accuracy_score(mask.flatten(), preds.flatten())
precision = precision_score(mask.flatten(), preds.flatten())
recall = recall_score(mask.flatten(), preds.flatten())
print(f'Epoch {epoch+1}/{epochs}, Loss: {loss.item()}, Accuracy: {accuracy}, Precision: {precision}, Recall: {recall}')
# 如果这个模型的准确度更好,就保存它
if accuracy > best_accuracy:
best_accuracy = accuracy
torch.save(model.state_dict(), 'best_model.pth')
return model
def predict(model, img_path):
img = np.array(Image.open(img_path)).transpose((2, 0, 1)) # 调整维度为(C, H, W)
img = torch.from_numpy(img).float().unsqueeze(0)
model.eval()
with torch.no_grad():
outputs = model(img)
pred = outputs.squeeze().numpy()
return pred
def main(train_img_folder, train_mask_folder, test_img_folder, test_mask_folder, epochs, img_path='/Users/xs/PycharmProjects/super-tomato/datasets_green/test/label'):
# Define device
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# Create model
model = SimpleCNN()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters())
# Create data loaders
train_dataset = ImageDataset(train_img_folder, train_mask_folder)
train_dataloader = DataLoader(train_dataset, batch_size=1)
# Train model
model = train_model(train_dataloader, model, criterion, optimizer, epochs)
# Create test data loaders
test_dataset = ImageDataset(test_img_folder, test_mask_folder)
test_dataloader = DataLoader(test_dataset, batch_size=1)
# Use trained model to predict
for img, mask in test_dataloader:
img = img.float().to(device)
mask = mask.float().to(device)
start_time = time.time()
outputs = model(img)
elapsed_time = time.time() - start_time
# Binarize model's output
preds = outputs.detach().cpu().numpy() > 0.5
mask = mask.cpu().numpy()
# Calculate accuracy, precision and recall
accuracy = accuracy_score(mask.flatten(), preds.flatten())
precision = precision_score(mask.flatten(), preds.flatten())
recall = recall_score(mask.flatten(), preds.flatten())
print(f'Prediction for {img_path} saved, Time: {elapsed_time:.3f} seconds, Accuracy: {accuracy}, Precision: {precision}, Recall: {recall}')
# 调用函数示例
main('/Users/xs/PycharmProjects/super-tomato/datasets_green/train/img',
'/Users/xs/PycharmProjects/super-tomato/datasets_green/train/label',
'/Users/xs/PycharmProjects/super-tomato/datasets_green/test/img',
'/Users/xs/PycharmProjects/super-tomato/datasets_green/test/label', 1)
def predict_and_display(model_path, img_paths):
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# 加载模型
model = SimpleCNN()
model.load_state_dict(torch.load(model_path))
model.to(device)
model.eval()
dataset = ImageDataset(img_paths, [None]*len(img_paths)) # 我们不需要掩码,所以传入一个空列表
dataloader = DataLoader(dataset, batch_size=1)
for i, img in enumerate(dataloader):
img = img.float().to(device)
with torch.no_grad():
outputs = model(img)
pred = outputs.detach().cpu().numpy() > 0.5
# 显示预测结果
plt.imshow(pred[0, 0, :, :], cmap='gray')
plt.title(f'Predicted Mask for {img_paths[i]}')
plt.show()
# 调用函数示例
predict_and_display('best_model.pth', ['/Users/xs/PycharmProjects/super-tomato/datasets_green/test/img/5.bmp'])

View File

@ -0,0 +1,85 @@
import numpy as np
from PIL import Image
from sklearn.ensemble import RandomForestClassifier
import os
import time
def load_image_data(img_path, label_path):
"""加载图像和标签,并将其转换为模型输入格式."""
image = Image.open(img_path)
label = Image.open(label_path).convert('L')
image_np = np.array(image)
label_np = np.array(label)
# 转换图像数据格式
n_samples = image_np.shape[0] * image_np.shape[1]
n_features = image_np.shape[2] # RGB通道
image_np = image_np.reshape((n_samples, n_features))
label_np = label_np.reshape((n_samples,))
# 二值化标签
label_np = (label_np > 128).astype(int)
return image_np, label_np
def train_model(X, y, n_estimators=100):
"""训练模型."""
model = RandomForestClassifier(n_estimators=n_estimators)
model.fit(X, y)
return model
def predict_and_save(model, image_path, output_path):
"""预测并保存结果图像."""
image = Image.open(image_path)
image_np = np.array(image)
n_samples = image_np.shape[0] * image_np.shape[1]
image_np = image_np.reshape((n_samples, -1))
# 预测
predicted_labels = model.predict(image_np)
predicted_labels = predicted_labels.reshape((image.size[1], image.size[0])) # Use correct dimensions
# 保存预测结果
output_image = Image.fromarray((predicted_labels * 255).astype('uint8'), 'L') # 'L' for grayscale
output_image.save(output_path)
def process_folder(train_folder):
X, y = [], []
img_folder = os.path.join(train_folder, "img")
label_folder = os.path.join(train_folder, "label")
for filename in os.listdir(img_folder):
img_path = os.path.join(img_folder, filename)
label_path = os.path.join(label_folder, filename.replace('.bmp', '.png'))
img_data, label_data = load_image_data(img_path, label_path)
X.append(img_data)
y.append(label_data)
# 将数据列表转换为numpy数组
X = np.vstack(X)
y = np.concatenate(y)
# 训练模型
return train_model(X, y)
# 示例用法
train_folder = '/Users/xs/PycharmProjects/super-tomato/datasets_green/train'
t1 = time.time()
model = process_folder(train_folder)
t2 = time.time()
print(f'训练模型所需时间: {t2 - t1:.2f}')
# 测试图像处理和保存预测结果
test_folder = '/Users/xs/PycharmProjects/super-tomato/tomato_img_25'
for test_filename in os.listdir(test_folder):
test_image_path = os.path.join(test_folder, test_filename)
output_path = os.path.join(test_folder, "predicted_" + test_filename)
predict_and_save(model, test_image_path, output_path)

View File

@ -0,0 +1,169 @@
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from torchvision import transforms
from PIL import Image
import os
import numpy as np
# 定义 U-Net 的下采样(编码器)部分
class UNetDown(nn.Module):
def __init__(self, in_size, out_size):
super(UNetDown, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(in_size, out_size, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(out_size, out_size, 3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(2)
)
def forward(self, x):
return self.conv(x)
# 定义 U-Net 的上采样(解码器)部分
class UNetUp(nn.Module):
def __init__(self, in_size, out_size):
super(UNetUp, self).__init__()
self.up = nn.ConvTranspose2d(in_size, out_size, 2, stride=2)
self.conv = nn.Sequential(
nn.Conv2d(in_size, out_size, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(out_size, out_size, 3, padding=1),
nn.ReLU(inplace=True)
)
def forward(self, x1, x2):
x1 = self.up(x1)
# 计算 padding
diffY = x2.size()[2] - x1.size()[2]
diffX = x2.size()[3] - x1.size()[3]
x1 = nn.functional.pad(x1, [
diffX // 2, diffX - diffX // 2,
diffY // 2, diffY - diffY // 2
])
x = torch.cat([x2, x1], dim=1)
return self.conv(x)
# 组装完整的 U-Net 模型
class UNet(nn.Module):
def __init__(self):
super(UNet, self).__init__()
self.down1 = UNetDown(3, 64)
self.down2 = UNetDown(64, 128)
self.down3 = UNetDown(128, 256)
self.down4 = UNetDown(256, 512)
self.middle_conv = nn.Sequential(
nn.Conv2d(512, 1024, 3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(1024, 1024, 3, padding=1),
nn.ReLU(inplace=True)
)
self.up1 = UNetUp(1024, 512)
self.up2 = UNetUp(512, 256)
self.up3 = UNetUp(256, 128)
self.up4 = UNetUp(128, 64)
self.final_conv = nn.Conv2d(64, 1, 1)
def forward(self, x):
x1 = self.down1(x)
x2 = self.down2(x1)
x3 = self.down3(x2)
x4 = self.down4(x3)
x_middle = self.middle_conv(x4)
x = self.up1(x_middle, x4)
x = self.up2(x, x3)
x = self.up3(x, x2)
x = self.up4(x, x1)
x = self.final_conv(x)
return torch.sigmoid(x)
# 创建模型
model = UNet()
print(model)
class ImageDataset(Dataset):
def __init__(self, image_dir, mask_dir, transform=None, size=(320, 458)):
self.image_dir = image_dir
self.mask_dir = mask_dir
self.transform = transform
self.size = size
self.images = os.listdir(image_dir)
def __len__(self):
return len(self.images)
def __getitem__(self, idx):
img_name = self.images[idx]
img_path = os.path.join(self.image_dir, img_name)
mask_path = os.path.join(self.mask_dir, img_name.replace('.bmp', '.png'))
image = Image.open(img_path).convert("RGB")
mask = Image.open(mask_path).convert("L") # 确保是单通道的灰度图
# Resize image and mask
resize = transforms.Resize(self.size)
image = resize(image)
mask = resize(mask)
if self.transform:
image = self.transform(image)
mask = self.transform(mask)
mask = (mask > 128).type(torch.FloatTensor) # 二值化标签
return image, mask
transform = transforms.Compose([
transforms.ToTensor(),
])
def test_and_save(model, test_dir, save_dir):
model.eval()
transform = transforms.Compose([transforms.ToTensor()])
test_images = os.listdir(test_dir)
for img_name in test_images:
img_path = os.path.join(test_dir, img_name)
image = Image.open(img_path).convert("RGB")
image = transform(image).unsqueeze(0) # 添加 batch dimension
with torch.no_grad():
prediction = model(image)
prediction = prediction.squeeze(0).squeeze(0) # 去掉 batch 和 channel dimension
prediction = (prediction > 0.5).type(torch.uint8) # 二值化
save_image = Image.fromarray(prediction.numpy() * 255, 'L')
save_image.save(os.path.join(save_dir, img_name))
def train(model, loader, optimizer, criterion, epochs):
model.train()
for epoch in range(epochs):
for images, masks in loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, masks)
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}, Loss: {loss.item()}")
train_dataset = ImageDataset('/Users/xs/PycharmProjects/super-tomato/datasets_green/train/img', '/Users/xs/PycharmProjects/super-tomato/datasets_green/train/label', transform=transform)
train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True)
# 上面定义的 UNet 类的代码
model = UNet()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 训练模型
train(model, train_loader, optimizer, criterion, epochs=50)
test_and_save(model, '/Users/xs/PycharmProjects/super-tomato/tomato_img_25', '/Users/xs/PycharmProjects/super-tomato/tomato_img_25/pre')

Binary file not shown.

View File

@ -0,0 +1,57 @@
import cv2
import numpy as np
def segment_image_by_variance(image_path, m, n, variance_threshold):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if image is None:
print("Error loading image")
return None
# 图像的高度和宽度
h, w = image.shape
# 计算每个块的尺寸
block_h, block_w = h // m, w // n
# 创建空白图像
segmented_image = np.zeros_like(image)
# 遍历每个块
for row in range(m):
for col in range(n):
# 计算块的位置
y1, x1 = row * block_h, col * block_w
y2, x2 = y1 + block_h, x1 + block_w
# 提取块
block = image[y1:y2, x1:x2]
# 计算方差
variance = np.var(block)
# 根据方差设置新图像的对应区块
if variance > variance_threshold:
segmented_image[y1:y2, x1:x2] = 1
else:
segmented_image[y1:y2, x1:x2] = 0
# 将新图像的值扩展到0-255范围以便可视化
segmented_image *= 255
return segmented_image
# 示例用法
image_path = '/Users/xs/PycharmProjects/super-tomato/tomato_img_25/60.bmp' # 替换为你的番茄图像路径
m, n = 300, 300 # 划分的区块数
variance_threshold = 80 # 方差的阈值
segmented_image = segment_image_by_variance(image_path, m, n, variance_threshold)
if segmented_image is not None:
cv2.imshow("Segmented Image", segmented_image)
cv2.imshow("Original Image", cv2.imread(image_path))
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

View File

@ -0,0 +1,295 @@
import cv2
import numpy as np
import os
import argparse
# from svm import predict_image_array, load_model
#提取西红柿使用S+L的图像
def extract_s_l(image_path):
image = cv2.imread(image_path)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
s_channel = hsv[:,:,1]
l_channel = lab[:,:,0]
result = cv2.add(s_channel, l_channel)
return result
def find_reflection(image_path, threshold=190):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用阈值分割
_, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
return reflection
def otsu_threshold(image):
# 将图像转换为灰度图像
# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Otsu阈值分割
_, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
# 提取花萼使用G-R的图像
def extract_g_r(image):
# image = cv2.imread(image_path)
g_channel = image[:,:,1]
r_channel = image[:,:,2]
result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
return result
#提取西红柿使用R-B的图像
def extract_r_b(image_path):
image = cv2.imread(image_path)
r_channel = image[:,:,2]
b_channel = image[:,:,0]
result = cv2.subtract(r_channel, b_channel)
return result
def extract_r_g(image_path):
image = cv2.imread(image_path)
r_channel = image[:,:,2]
g_channel = image[:,:,1]
result = cv2.subtract(r_channel, g_channel)
return result
def threshold_segmentation(image, threshold, color=255):
_, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
return result
def bitwise_operation(image1, image2, operation='and'):
if operation == 'and':
result = cv2.bitwise_and(image1, image2)
elif operation == 'or':
result = cv2.bitwise_or(image1, image2)
else:
raise ValueError("operation must be 'and' or 'or'")
return result
def largest_connected_component(bin_img):
# 使用connectedComponentsWithStats函数找到连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(bin_img)
new_bin_img[labels == largest_label] = 255
return new_bin_img
def close_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
return closed_img
def open_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
return opened_img
def draw_tomato_edge(original_img, bin_img):
bin_img_processed = close_operation(bin_img, kernel_size=(15, 15))
# cv2.imshow('Close Operation', bin_img_processed)
# bin_img_processed = open_operation(bin_img_processed, kernel_size=(19, 19))
# cv2.imshow('Open Operation', bin_img_processed)
# 现在使用处理后的bin_img_processed查找轮廓
contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 如果没有找到轮廓,直接返回原图
if not contours:
return original_img
# 找到最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 多边形近似的精度调整
epsilon = 0.0006 * cv2.arcLength(max_contour, True) # 可以调整这个值
approx = cv2.approxPolyDP(max_contour, epsilon, True)
# 绘制轮廓
cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
mask = np.zeros_like(bin_img)
# 使用白色填充最大轮廓
cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
return original_img, mask
def draw_tomato_edge_convex_hull(original_img, bin_img):
bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return original_img
max_contour = max(contours, key=cv2.contourArea)
hull = cv2.convexHull(max_contour)
cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
return original_img
# 得到完整的西红柿二值图像,除了绿色花萼
def fill_holes(bin_img):
# 复制 bin_img 到 img_filled
img_filled = bin_img.copy()
# 获取图像的高度和宽度
height, width = bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_d = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(bin_img, img_filled)
# 裁剪 img_filled 和 img_filled_d 到与 bin_img 相同的大小
# img_filled = img_filled[:height, :width]
img_filled_d = img_filled_d[:height, :width]
return img_filled, img_filled_d
def bitwise_and_rgb_with_binary(rgb_img, bin_img):
# 将二值图像转换为三通道图像
bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
# 使用 bitwise_and 操作合并 RGB 图像和二值图像
result = cv2.bitwise_and(rgb_img, bin_img_3channel)
return result
def extract_max_connected_area(image_path, lower_hsv, upper_hsv):
# 读取图像
image = cv2.imread(image_path)
# 将图像从BGR转换到HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 使用阈值获取指定区域的二值图像
mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
# 找到二值图像的连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(mask)
new_bin_img[labels == largest_label] = 255
# 复制 new_bin_img 到 img_filled
img_filled = new_bin_img.copy()
# 获取图像的高度和宽度
height, width = new_bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_inv = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
return img_filled
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--dir_path', type=str, default=r'D:\project\Tomato\20240410RGBtest2\data',
help='the directory path of images')
parser.add_argument('--threshold_s_l', type=int, default=180,
help='the threshold for s_l')
parser.add_argument('--threshold_r_b', type=int, default=15,
help='the threshold for r_b')
args = parser.parse_args()
for img_file in os.listdir(args.dir_path):
if img_file.endswith('.bmp'):
img_path = os.path.join(args.dir_path, img_file)
s_l = extract_s_l(img_path)
otsu_thresholded = otsu_threshold(s_l)
img_fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), otsu_thresholded)
img_fore_defect = extract_g_r(img_fore)
img_fore_defect = threshold_segmentation(img_fore_defect, args.threshold_r_b)
# cv2.imshow('img_fore_defect', img_fore_defect)
thresholded_s_l = threshold_segmentation(s_l, args.threshold_s_l)
new_bin_img = largest_connected_component(thresholded_s_l)
zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
cv2.imshow('zhongggggg', zhongggggg)
new_otsu_bin_img = largest_connected_component(otsu_thresholded)
filled_img, defect = fill_holes(new_bin_img)
defect = bitwise_and_rgb_with_binary(cv2.imread(img_path), defect)
cv2.imshow('defect', defect)
edge, mask = draw_tomato_edge(cv2.imread(img_path), new_bin_img)
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), mask)
fore_g_r_t = threshold_segmentation(extract_g_r(fore), 20)
fore_g_r_t_ture = bitwise_and_rgb_with_binary(cv2.imread(img_path), fore_g_r_t)
cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
white = find_reflection(img_path)
# SVM预测
# 加载模型
# model, scaler = load_model('/Users/xs/PycharmProjects/super-tomato/svm_green.joblib')
# 对图像进行预测
# predicted_mask = predict_image_array(image, model, scaler)
cv2.imshow('white', white)
cv2.imshow('fore', fore)
cv2.imshow('fore_g_r_t', fore_g_r_t)
cv2.imshow('mask', mask)
print('mask', mask.shape)
print('filled', filled_img.shape)
print('largest', new_bin_img.shape)
print('rp', org_defect.shape)
cv2.imshow('res', res)
# lower_hsv = np.array([19, 108, 15])
# upper_hsv = np.array([118, 198, 134])
# max_connected_area = extract_max_connected_area(img_path, lower_hsv, upper_hsv)
# cv2.imshow('Max Connected Area', max_connected_area)
# 显示原始图像
original_img = cv2.imread(img_path)
cv2.imshow('Original', original_img)
cv2.imshow('thresholded_s_l', thresholded_s_l)
cv2.imshow('Largest Connected Component', new_bin_img)
cv2.imshow('Filled', filled_img)
cv2.imshow('Defect', defect)
cv2.imshow('Org_defect', org_defect)
cv2.imshow('otsu_thresholded', new_otsu_bin_img)
#显示轮廓
cv2.imshow('Edge', edge)
# 等待用户按下任意键
cv2.waitKey(0)
# 关闭所有窗口
cv2.destroyAllWindows()
if __name__ == '__main__':
main()

View File

@ -0,0 +1,105 @@
import cv2
import numpy as np
from sklearn import svm
from sklearn.preprocessing import StandardScaler
import time
import os
import joblib
def load_model(model_path):
# 加载模型和标准化器
model, scaler = joblib.load(model_path)
return model, scaler
def predict_image_array(image_array, model_path):
# 加载模型和标准化器
model, scaler = load_model(model_path)
# 将图像转换为像素数组
test_pixels = image_array.reshape(-1, 3)
# 标准化
test_pixels_scaled = scaler.transform(test_pixels)
# 预测
predictions = model.predict(test_pixels_scaled)
# 转换预测结果为图像
mask_predicted = predictions.reshape(image_array.shape[0], image_array.shape[1])
return mask_predicted
def prepare_data(image_dir, mask_dir):
# 初始化像素和标签列表
all_pixels = []
all_labels = []
# 获取图像和掩码文件名列表
image_files = sorted(os.listdir(image_dir))
mask_files = sorted(os.listdir(mask_dir))
# 遍历所有图像和掩码文件
for image_file, mask_file in zip(image_files, mask_files):
# 读取原始图像和掩码图像
image = cv2.imread(os.path.join(image_dir, image_file))
mask = cv2.imread(os.path.join(mask_dir, mask_file), cv2.IMREAD_GRAYSCALE)
# 提取像素
pixels = image.reshape(-1, 3) # 将图像转换为(n_pixels, 3)
labels = (mask.reshape(-1) > 128).astype(int) # 标记为0或1
# 添加到列表
all_pixels.append(pixels)
all_labels.append(labels)
# 将列表转换为NumPy数组
all_pixels = np.concatenate(all_pixels, axis=0)
all_labels = np.concatenate(all_labels, axis=0)
return all_pixels, all_labels
# 加载数据
train_pixels, train_labels = prepare_data('/Users/xs/PycharmProjects/super-tomato/datasets_green/train-2/img',
'/Users/xs/PycharmProjects/super-tomato/datasets_green/train-2/label')
# 数据标准化
scaler = StandardScaler()
train_pixels_scaled = scaler.fit_transform(train_pixels)
# 创建SVM模型
# model = svm.SVC(kernel='linear', C=1.0)
# model.fit(train_pixels_scaled, train_labels)
# # 在训练模型后保存模型
# joblib.dump((model, scaler), '/Users/xs/PycharmProjects/super-tomato/svm_green.joblib') # 替换为你的模型文件路径
print('模型训练完成!')
def predict_image(image_path, model, scaler):
# 读取图像
image = cv2.imread(image_path)
test_pixels = image.reshape(-1, 3)
# 标准化
test_pixels_scaled = scaler.transform(test_pixels)
# 预测
predictions = model.predict(test_pixels_scaled)
# 转换预测结果为图像
mask_predicted = predictions.reshape(image.shape[0], image.shape[1])
return mask_predicted
# 对一个新的图像进行预测
time1 = time.time()
model, scaler = load_model('/Users/xs/PycharmProjects/super-tomato/svm_green.joblib')
predicted_mask = predict_image('/Users/xs/PycharmProjects/super-tomato/defect_big.bmp', model, scaler)
cv2.imwrite('/Users/xs/PycharmProjects/super-tomato/defect_mask.bmp', (predicted_mask * 255).astype('uint8'))
cv2.imshow('Predicted Mask', (predicted_mask * 255).astype('uint8'))
cv2.waitKey(0)
cv2.destroyAllWindows()
time2 = time.time()
print(f'预测时间: {time2 - time1:.2f}')

Binary file not shown.

View File

@ -0,0 +1,56 @@
import cv2
import numpy as np
def find_reflection(image_path, threshold=190):
# 读取图像
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用阈值分割
_, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
return reflection
def repair_reflection_telea(image_path, reflection, inpaint_radius=20):
# 读取图像
image = cv2.imread(image_path)
# 将高亮区域转换为二值图像
_, reflection_binary = cv2.threshold(reflection, 1, 255, cv2.THRESH_BINARY)
# 使用inpaint函数修复高亮区域
repaired_image = cv2.inpaint(image, reflection_binary, inpaint_radius, cv2.INPAINT_TELEA)
return repaired_image
# 读取图像
image_path = '/Users/xs/PycharmProjects/super-tomato/tomato_img_25/60.bmp' # 替换为你的图像路径
image = find_reflection(image_path)
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 修复反光
image = repair_reflection_telea(image_path, image)
cv2.imshow('ima11ge', cv2.imread(image_path))
# 创建窗口
cv2.namedWindow('image')
# 创建滑动条
cv2.createTrackbar('Threshold', 'image', 0, 255, lambda x: None)
while True:
# 获取滑动条的值
threshold = cv2.getTrackbarPos('Threshold', 'image')
# 使用阈值进行分割
_, thresholded_image = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
# 显示二值图像
cv2.imshow('image', thresholded_image)
# 按下'q'键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 销毁所有窗口
cv2.destroyAllWindows()

660
20240410RGBtest1/utils.py Normal file
View File

@ -0,0 +1,660 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/12 14:53
# @Author : TG
# @File : utils.py
# @Software: PyCharm
import os
import socket
import time
import logging
import numpy as np
import shutil
import cv2
import matplotlib.pyplot as plt
from typing import Tuple
import pickle
import sys
import os
from scipy.ndimage.measurements import label, find_objects
class PreSocket(socket.socket):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pre_pack = b''
self.settimeout(5)
def receive(self, *args, **kwargs):
if self.pre_pack == b'':
return self.recv(*args, **kwargs)
else:
data_len = args[0]
required, left = self.pre_pack[:data_len], self.pre_pack[data_len:]
self.pre_pack = left
return required
def set_prepack(self, pre_pack: bytes):
temp = self.pre_pack
self.pre_pack = temp + pre_pack
class DualSock(PreSocket):
def __init__(self, connect_ip='127.0.0.1', recv_port: int = 21122, send_port: int = 21123):
super().__init__()
received_status, self.received_sock = try_connect(connect_ip=connect_ip, port_number=recv_port)
send_status, self.send_sock = try_connect(connect_ip=connect_ip, port_number=send_port)
self.status = received_status and send_status
def send(self, *args, **kwargs) -> int:
return self.send_sock.send(*args, **kwargs)
def receive(self, *args, **kwargs) -> bytes:
return self.received_sock.receive(*args, **kwargs)
def set_prepack(self, pre_pack: bytes):
self.received_sock.set_prepack(pre_pack)
def reconnect(self, connect_ip='127.0.0.1', recv_port:int = 21122, send_port: int = 21123):
received_status, self.received_sock = try_connect(connect_ip=connect_ip, port_number=recv_port)
send_status, self.send_sock = try_connect(connect_ip=connect_ip, port_number=send_port)
return received_status and send_status
def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'', time_out: float = -1.0, time_out_single=5e20) -> (
bytes, bytes):
"""
从指定的socket中读取数据.自动阻塞如果返回的数据为空则说明连接出现问题需要重新连接
:param recv_sock: 指定sock
:param pre_pack: 上一包的粘包内容
:param time_out: 每隔time_out至少要发来一次指令,否则认为出现问题进行重连小于0则为一直等
:param time_out_single: 单次指令超时时间单位是秒
:return: data, next_pack
"""
recv_sock.set_prepack(pre_pack)
# 开头校验
time_start_recv = time.time()
while True:
if time_out > 0:
if (time.time() - time_start_recv) > time_out:
logging.error(f'指令接收超时')
return b'', b''
try:
temp = recv_sock.receive(1)
except ConnectionError as e:
logging.error(f'连接出错, 错误代码:\n{e}')
return b'', b''
except TimeoutError as e:
# logging.error(f'超时了,错误代码: \n{e}')
logging.info('运行中,等待指令..')
continue
except socket.timeout as e:
logging.info('运行中,等待指令..')
continue
except Exception as e:
logging.error(f'遇见未知错误,错误代码: \n{e}')
return b'', b''
if temp == b'\xaa':
break
# 接收开头后,开始进行时间记录
time_start_recv = time.time()
# 获取报文长度
temp = b''
while len(temp) < 4:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(1)
except Exception as e:
logging.error(f'接收报文的长度不正确, 错误代码: \n{e}')
return b'', b''
try:
data_len = int.from_bytes(temp, byteorder='big')
except Exception as e:
logging.error(f'转换失败,错误代码 \n{e}')
return b'', b''
# 读取报文内容
temp = b''
while len(temp) < data_len:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(data_len)
except Exception as e:
logging.error(f'接收报文内容失败, 错误代码: \n{e}')
return b'', b''
data, next_pack = temp[:data_len], temp[data_len:]
recv_sock.set_prepack(next_pack)
next_pack = b''
# 进行数据校验
temp = b''
while len(temp) < 3:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(1)
except Exception as e:
logging.error(f'接收报文校验失败, 错误代码: \n{e}')
return b'', b''
if temp == b'\xff\xff\xbb':
return data, next_pack
else:
logging.error(f"接收了一个完美的只错了校验位的报文")
return b'', b''
def parse_protocol(data: bytes) -> (str, any):
'''
指令转换
:param data: 接收到的报文
:return: 指令类型指令内容
'''
try:
assert len(data) > 4
except AssertionError:
logging.error('指令转换失败长度不足5')
return '', None
cmd, data = data[:4], data[4:]
cmd = cmd.decode('ascii').strip().upper()
if cmd == 'IM':
n_rows, n_cols, img = data[:2], data[2:4], data[4:]
try:
n_rows, n_cols = [int.from_bytes(x, byteorder='big') for x in [n_rows, n_cols]]
except Exception as e:
logging.error(f'长宽转换失败, 错误代码{e}, 报文大小: n_rows:{n_rows}, n_cols: {n_cols}')
return '', None
try:
assert n_rows * n_cols * 3 == len(img)
except AssertionError:
logging.error('图像指令IM转换失败数据长度错误')
return '', None
img = np.frombuffer(img, dtype=np.uint8).reshape((n_rows, n_cols, -1))
return cmd, img
def ack_sock(send_sock: socket.socket, cmd_type: str) -> bool:
'''
发送应答
:param cmd_type:指令类型
:param send_sock:指定sock
:return:是否发送成功
'''
msg = b'\xaa\x00\x00\x00\x05' + (' A' + cmd_type).upper().encode('ascii') + b'\xff\xff\xff\xbb'
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送应答失败,错误类型:{e}')
return False
return True
def done_sock(send_sock: socket.socket, cmd_type: str, result = '') -> bool:
'''
发送任务完成指令
:param send_sock: 指定sock
:param cmd_type: 指令类型
:param result: 数据
:return: 是否发送成功
'''
cmd = cmd_type.strip().upper()
if cmd_type == 'IM':
result = result.encode()
# 指令4位
length = len(result) + 4
length = length.to_bytes(4, byteorder='big')
msg = b'\xaa' + length + (' D' + cmd).upper().encode('ascii') + result + b'\xff\xff\xbb'
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
return True
def simple_sock(send_sock: socket.socket, cmd_type: str, result) -> bool:
'''
发送任务完成指令
:param cmd_type:指令类型
:param send_sock:指定sock
:param result:数据
:return:是否发送成功
'''
cmd_type = cmd_type.strip().upper()
if cmd_type == 'IM':
if result == 0:
msg = b'S'
elif result == 1:
msg = b'Z'
elif result == 2:
msg = b'Q'
elif cmd_type == 'TR':
msg = b'A'
elif cmd_type == 'MD':
msg = b'D'
elif cmd_type == 'KM':
msg = b'K'
result = result.encode('ascii')
result = b',' + result
length = len(result)
msg = msg + length.to_bytes(4, 'big') + result
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
return True
def test_sock(send_sock: socket.socket, cmd_type: str, long_axis, short_axis, defect_num, total_defect_area, rp) -> bool:
start_time = time.time()
cmd_type = cmd_type.strip().upper()
if cmd_type == 'IM':
# image_dir = r'D:\project\Tomato\20240410tomatoRGBtest2\huifu'
# image_paths = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(".jpg")]
# for image_path in image_paths:
# img = cv2.imread(r'D:\project\Tomato\20240410tomatoRGBtest2\huifu\thresholded_6.jpg')
# img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# img = np.asarray(img, dtype=np.uint8)
width = rp.shape[0]
height = rp.shape[1]
# print(width, height)
img_bytes = rp.tobytes()
length = len(img_bytes) + 18
# print(length)
length = length.to_bytes(4, byteorder='big')
width = width.to_bytes(2, byteorder='big')
height = height.to_bytes(2, byteorder='big')
long_axis = long_axis.to_bytes(2, byteorder='big')
short_axis = short_axis.to_bytes(2, byteorder='big')
defect_num = defect_num.to_bytes(2, byteorder='big')
total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
cmd_type = 'RIM'
# result = result.encode('ascii')
send_message = b'\xaa' + length + (' ' + cmd_type).upper().encode('ascii') + long_axis + short_axis + defect_num + total_defect_area + width + height + img_bytes + b'\xff\xff\xbb'
# print(long_axis)
# print(short_axis)
# print(defect_num)
# print(total_defect_area)
# print(width)
# print(height)
try:
send_sock.send(send_message)
print('发送成功')
# print(send_message)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
end_time = time.time()
print(f'发送时间:{end_time - start_time}')
return True
def try_connect(connect_ip: str, port_number: int, is_repeat: bool = False, max_reconnect_times: int = 50) -> (
bool, socket.socket):
"""
尝试连接.
:param is_repeat: 是否是重新连接
:param max_reconnect_times:最大重连次数
:return: (连接状态True为成功, Socket / None)
"""
reconnect_time = 0
while reconnect_time < max_reconnect_times:
logging.warning(f'尝试{"重新" if is_repeat else ""}发起第{reconnect_time + 1}次连接...')
try:
connected_sock = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
connected_sock.connect((connect_ip, port_number))
except Exception as e:
reconnect_time += 1
logging.error(f'{reconnect_time}次连接失败... 5秒后重新连接...\n {e}')
time.sleep(5)
continue
logging.warning(f'{"重新" if is_repeat else ""}连接成功')
return True, connected_sock
return False, None
def mkdir_if_not_exist(dir_name, is_delete=False):
"""
创建文件夹
:param dir_name: 文件夹
:param is_delete: 是否删除
:return: 是否成功
"""
try:
if is_delete:
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
print('[Info] 文件夹 "%s" 存在, 删除文件夹.' % dir_name)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print('[Info] 文件夹 "%s" 不存在, 创建文件夹.' % dir_name)
return True
except Exception as e:
print('[Exception] %s' % e)
return False
def create_file(file_name):
"""
创建文件
:param file_name: 文件名
:return: None
"""
if os.path.exists(file_name):
print("文件存在:%s" % file_name)
return False
# os.remove(file_name) # 删除已有文件
if not os.path.exists(file_name):
print("文件不存在,创建文件:%s" % file_name)
open(file_name, 'a').close()
return True
class Logger(object):
def __init__(self, is_to_file=False, path=None):
self.is_to_file = is_to_file
if path is None:
path = "tomato.log"
self.path = path
create_file(path)
def log(self, content):
if self.is_to_file:
with open(self.path, "a") as f:
print(time.strftime("[%Y-%m-%d_%H-%M-%S]:"), file=f)
print(content, file=f)
else:
print(content)
#提取西红柿使用S+L的图像
def extract_s_l(image):
# image = cv2.imread(image_path)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
s_channel = hsv[:,:,1]
l_channel = lab[:,:,0]
result = cv2.add(s_channel, l_channel)
return result
def find_reflection(image, threshold=190):
# 读取图像
# image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用阈值分割
_, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
return reflection
def otsu_threshold(image):
# 将图像转换为灰度图像
# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Otsu阈值分割
_, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
# 提取花萼使用G-R的图像
def extract_g_r(image):
# image = cv2.imread(image_path)
g_channel = image[:,:,1]
r_channel = image[:,:,2]
result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
return result
#提取西红柿使用R-B的图像
def extract_r_b(image):
# image = cv2.imread(image_path)
r_channel = image[:,:,2]
b_channel = image[:,:,0]
result = cv2.subtract(r_channel, b_channel)
return result
def extract_r_g(image):
# image = cv2.imread(image_path)
r_channel = image[:,:,2]
g_channel = image[:,:,1]
result = cv2.subtract(r_channel, g_channel)
return result
def threshold_segmentation(image, threshold, color=255):
_, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
return result
def bitwise_operation(image1, image2, operation='and'):
if operation == 'and':
result = cv2.bitwise_and(image1, image2)
elif operation == 'or':
result = cv2.bitwise_or(image1, image2)
else:
raise ValueError("operation must be 'and' or 'or'")
return result
def largest_connected_component(bin_img):
# 使用connectedComponentsWithStats函数找到连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(bin_img)
new_bin_img[labels == largest_label] = 255
return new_bin_img
def close_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
return closed_img
def open_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
return opened_img
def draw_tomato_edge(original_img, bin_img):
bin_img_processed = close_operation(bin_img, kernel_size=(15, 15))
# cv2.imshow('Close Operation', bin_img_processed)
# bin_img_processed = open_operation(bin_img_processed, kernel_size=(19, 19))
# cv2.imshow('Open Operation', bin_img_processed)
# 现在使用处理后的bin_img_processed查找轮廓
contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 如果没有找到轮廓,直接返回原图
if not contours:
return original_img
# 找到最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 多边形近似的精度调整
epsilon = 0.0006 * cv2.arcLength(max_contour, True) # 可以调整这个值
approx = cv2.approxPolyDP(max_contour, epsilon, True)
# 绘制轮廓
cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
mask = np.zeros_like(bin_img)
# 使用白色填充最大轮廓
cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
return original_img, mask
def draw_tomato_edge_convex_hull(original_img, bin_img):
bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return original_img
max_contour = max(contours, key=cv2.contourArea)
hull = cv2.convexHull(max_contour)
cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
return original_img
# 得到完整的西红柿二值图像,除了绿色花萼
def fill_holes(bin_img):
# 复制 bin_img 到 img_filled
img_filled = bin_img.copy()
# 获取图像的高度和宽度
height, width = bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_d = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(bin_img, img_filled)
# 裁剪 img_filled 和 img_filled_d 到与 bin_img 相同的大小
# img_filled = img_filled[:height, :width]
img_filled_d = img_filled_d[:height, :width]
return img_filled, img_filled_d
def bitwise_and_rgb_with_binary(rgb_img, bin_img):
# 将二值图像转换为三通道图像
bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
# 使用 bitwise_and 操作合并 RGB 图像和二值图像
result = cv2.bitwise_and(rgb_img, bin_img_3channel)
return result
def extract_max_connected_area(image, lower_hsv, upper_hsv):
# 读取图像
# image = cv2.imread(image_path)
# 将图像从BGR转换到HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 使用阈值获取指定区域的二值图像
mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
# 找到二值图像的连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(mask)
new_bin_img[labels == largest_label] = 255
# 复制 new_bin_img 到 img_filled
img_filled = new_bin_img.copy()
# 获取图像的高度和宽度
height, width = new_bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_inv = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
return img_filled
def get_tomato_dimensions(edge_img):
"""
根据番茄边缘二值化轮廓图,计算番茄的长径短径和长短径比值
使用最小外接矩形和最小外接圆两种方法
参数:
edge_img (numpy.ndarray): 番茄边缘二值化轮廓图,背景为黑色,番茄区域为白色
返回:
tuple: (长径, 短径, 长短径比值)
"""
# 最小外接矩形
rect = cv2.minAreaRect(cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
major_axis, minor_axis = rect[1]
aspect_ratio = max(major_axis, minor_axis) / min(major_axis, minor_axis)
# # 最小外接圆
# (x, y), radius = cv2.minEnclosingCircle(
# cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
# diameter = 2 * radius
# aspect_ratio_circle = 1.0
return (max(major_axis, minor_axis), min(major_axis, minor_axis))
def get_defect_info(defect_img):
"""
根据番茄区域缺陷二值化轮廓图,计算缺陷区域的个数和总面积
参数:
defect_img (numpy.ndarray): 番茄区域缺陷二值化轮廓图,背景为黑色,番茄区域为白色,缺陷区域为黑色连通域
返回:
tuple: (缺陷区域个数, 缺陷区域像素面积缺陷像素总面积)
"""
nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(defect_img, connectivity=4)
max_area = max(stats[i, cv2.CC_STAT_AREA] for i in range(1, nb_components))
areas = []
for i in range(1, nb_components):
area = stats[i, cv2.CC_STAT_AREA]
if area != max_area:
areas.append(area)
number_defects = len(areas)
total_pixels = sum(areas)
return number_defects, total_pixels
def connected_components_analysis(binary_image):
"""
从二值化图像计算黑色连通域个数和各个黑色连通域像素面积及黑色像素总面积
参数:
binary_image (numpy.ndarray): 二值化图像, 其中 0 表示白色, 1 表示黑色
返回:
num_components (int): 黑色连通域的个数
component_areas (list): 每个黑色连通域的像素面积
total_black_area (int): 黑色像素的总面积
"""
# 标记连通域
labeled_image, num_components = label(binary_image)
# 获取每个连通域的像素位置
slices = find_objects(labeled_image)
# 计算每个连通域的像素面积
component_areas = []
for slice_obj in slices:
component_area = np.sum(binary_image[slice_obj])
component_areas.append(component_area)
# 计算黑色像素的总面积
total_black_area = np.sum(binary_image)
return num_components, component_areas, total_black_area

View File

View File

@ -0,0 +1,65 @@
# 百香果&西红柿通信
OSI5~7层基于单播TCP/IP一包数据由8'haa打头8'hbb结束共6个字段
| 起始 | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 类型3 | 类型4 | 数据1 | 数据2 | ... | 数据i | 校验1 | 校验2 | 结束 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :--: | :---: | :---: | :---: | :---: |
| 8'haa | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | 8'hzz | ... | 8'hzz | 8'hff | 8'hff | 8'hbb |
### 起始
1字节8'haa
### 长度
一个32位无符号数length长度 = 数据字节数i + 4 。<br>`长度1`指length[31:24]`长度2`指length[23:16]`长度3`指length[15:8]`长度4`指length[7:0]
### 类型&数据
ASCII字符比如`类型1`为' '(空格)`类型2`为' '(空格)`类型3`为'I'`类型4`为'M'代表RGB图像数据包
- **RGB图像数据包' (空格)''(空格) ''I''M'**`数据1`~`数据i`包含了图像的行数rows(高度)、列数cols(宽度)、以及图像的RGB数据
$i-4=rows \times cols \times 3$具体如下:
| 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | ... | 图像数据(i-4) |
| :--------: | :-------: | :--------: | :-------: | :-------: | :--: | :-----------: |
| rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | ... | |
**返回结果数据包' (空格)''R''I''M'**`数据1`~`数据i`包含了长径long、短径short、缺陷个数num、缺陷面积area、结果图像的行数rows(高度)、列数cols(宽度)、以及结果图像的RGB数据
$i-14=rows \times cols \times 3$具体如下:
| 长径1 | 长径2 | 短径1 | 短径2 | 缺陷个数1 | 缺陷个数2 | 缺陷面积1 | 缺陷面积2 | 缺陷面积3 | 缺陷面积4 | 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | 图像数据(i-14) |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
| long[15:8] | long[7:0] | short[15:8] | short[7:0] | num[15:8] | num[7:0] | area[31:24] | area[23:16] | area[15:8] | area[7:0] | rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | | |
- **光谱数据包' (空格)''(空格) ''S''P'**`数据1`~`数据i`包含了光谱数据的行数rows(高度)、列数cols(宽度)、谱段数bands、以及图像的光谱数据
$i-6=rows \times cols \times bands \times 4$具体如下:
| 行数1 | 行数2 | 列数1 | 列数2 | 谱段1 | 谱段2 | 图像数据1 | ... | 图像数据(i-6) |
| :--------: | :-------: | :--------: | :-------: | :---------: | :--------: | :-------: | :--: | :-----------: |
| rows[15:8] | rows[7:0] | cols[15:8] | cols[7:0] | bands[15:8] | bands[7:0] | | ... | |
- **模型切换指令**
**' (空格)''(空格) ''P''A'**,表示使用的是百香果分级模型
| 起始 | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 类型3 | 类型4 | 数据1 | 校验1 | 校验2 | 结束 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 8'haa | 8'd0 | 8'd0 | 8'd0 | 8'd5 | ' ' | ' ' | 'P' | 'A' | 8'hff | 8'hff | 8'hff | 8'hbb |
**' (空格)''(空格) ''T''O'**,表示使用的是西红柿分级模型
| 起始 | 长度1 | 长度2 | 长度3 | 长度4 | 类型1 | 类型2 | 类型3 | 类型4 | 数据1 | 校验1 | 校验2 | 结束 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 8'haa | 8'd0 | 8'd0 | 8'd0 | 8'd5 | ' ' | ' ' | 'T' | 'O' | 8'hff | 8'hff | 8'hff | 8'hbb |
### 校验
2字节`校验1`为8'hff`校验2`为8'hff
### 结束
1字节8'hbb

228
20240419RGBtest2/main.py Normal file
View File

@ -0,0 +1,228 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/20 18:45
# @Author : TG
# @File : main.py
# @Software: PyCharm
# -*- coding: utf-8 -*-
# @Time : 2024/4/12 15:04
# @Author : TG
# @File : main.py
# @Software: PyCharm
import socket
import sys
import numpy as np
import cv2
import root_dir
import time
import os
from root_dir import ROOT_DIR
import logging
from utils import threshold_segmentation, largest_connected_component, draw_tomato_edge, bitwise_and_rgb_with_binary, \
extract_s_l, get_tomato_dimensions, get_defect_info, create_pipes, receive_rgb_data, send_data, receive_spec_data
from collections import deque
import time
import io
from PIL import Image
import threading
import queue
def process_data(img: any) -> tuple:
"""
处理指令
:param cmd: 指令类型
:param data: 指令内容
:param connected_sock: socket
:param detector: 模型
:return: 是否处理成功
"""
# start_time = time.time()
# if cmd == 'IM':
threshold_s_l = 180
# threshold_r_b = 15
s_l = extract_s_l(img)
thresholded_s_l = threshold_segmentation(s_l, threshold_s_l)
new_bin_img = largest_connected_component(thresholded_s_l)
edge, mask = draw_tomato_edge(img, new_bin_img)
org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
# filled_img, defect = fill_holes(new_bin_img)
long_axis, short_axis = get_tomato_dimensions(mask)
number_defects, total_pixels = get_defect_info(new_bin_img)
rp = org_defect
rp = cv2.cvtColor(rp, cv2.COLOR_BGR2RGB)
# cv2.imwrite('rp1.bmp', rp)
# else:
# logging.error(f'错误指令,指令为{cmd}')
# response = False
# end_time = time.time()
# elapsed_time = end_time - start_time
# print(f'处理时间:{elapsed_time}秒')
return long_axis, short_axis, number_defects, total_pixels, rp
## 20240423代码
def main(is_debug=False):
file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
handlers=[file_handler, console_handler],
level=logging.DEBUG)
rgb_receive_name = r'\\.\pipe\rgb_receive'
rgb_send_name = r'\\.\pipe\rgb_send'
spec_receive_name = r'\\.\pipe\spec_receive'
rgb_receive, rgb_send, spec_receive = create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name)
# data_size = 15040566
while True:
long_axis_list = []
short_axis_list = []
defect_num_sum = 0
total_defect_area_sum = 0
rp = None
start_time = time.time()
for i in range(5):
# start_time = time.time()
img_data = receive_rgb_data(rgb_receive)
image = Image.open(io.BytesIO(img_data))
img = np.array(image)
print(img.shape)
# end_time = time.time()
# elapsed_time = end_time - start_time
# print(f'接收时间:{elapsed_time}秒')
long_axis, short_axis, number_defects, total_pixels, rp = process_data(img=img)
# print(long_axis, short_axis, number_defects, type(total_pixels), rp.shape)
if i <= 2:
long_axis_list.append(long_axis)
short_axis_list.append(short_axis)
if i == 1:
rp_result = rp
defect_num_sum += number_defects
total_defect_area_sum += total_pixels
long_axis = round(sum(long_axis_list) / 3)
short_axis = round(sum(short_axis_list) / 3)
# print(type(long_axis), type(short_axis), type(defect_num_sum), type(total_defect_area_sum), type(rp_result))
spec_data = receive_spec_data(spec_receive)
print(f'光谱数据接收长度:', len(spec_data))
response = send_data(pipe_send=rgb_send, long_axis=long_axis, short_axis=short_axis,
defect_num=defect_num_sum, total_defect_area=total_defect_area_sum, rp=rp_result)
end_time = time.time()
elapsed_time = (end_time - start_time) * 1000
print(f'总时间:{elapsed_time}毫秒')
print(long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result.shape)
if __name__ == '__main__':
# 2个pipe管道
# 接收到图片 n_rows * n_cols * 3 uint8
# 发送long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result
main(is_debug=False)
### 多线程版本
# def receive_spec_data_thread(spec_receive, spec_queue):
# while True:
# spec_data = receive_spec_data(spec_receive)
# spec_queue.put(spec_data)
#
# def receive_process_rgb_data_thread(rgb_receive, img_queue, result_queue):
# while True:
#
# long_axis_list = []
# short_axis_list = []
# defect_num_sum = 0
# total_defect_area_sum = 0
# rp = None
#
# for i in range(5):
# img_data = receive_rgb_data(rgb_receive)
# image = Image.open(io.BytesIO(img_data))
# img = np.array(image)
#
# long_axis, short_axis, number_defects, total_pixels, rp = process_data(img=img)
#
# if i <= 2:
# long_axis_list.append(long_axis)
# short_axis_list.append(short_axis)
# if i == 1:
# rp_result = rp
#
# defect_num_sum += number_defects
# total_defect_area_sum += total_pixels
#
# long_axis = round(sum(long_axis_list) / 3)
# short_axis = round(sum(short_axis_list) / 3)
#
# result = (long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result)
# result_queue.put(result)
#
# def main(is_debug=False):
# file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
# file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
# console_handler = logging.StreamHandler(sys.stdout)
# console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
# logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
# handlers=[file_handler, console_handler],
# level=logging.DEBUG)
# rgb_receive_name = r'\\.\pipe\rgb_receive'
# rgb_send_name = r'\\.\pipe\rgb_send'
# spec_receive_name = r'\\.\pipe\spec_receive'
# rgb_receive, rgb_send, spec_receive = create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name)
#
# spec_queue = queue.Queue()
# img_queue = queue.Queue()
# result_queue = queue.Queue()
#
# # 创建并启动线程
# spec_thread = threading.Thread(target=receive_spec_data_thread, args=(spec_receive, spec_queue))
# rgb_thread = threading.Thread(target=receive_process_rgb_data_thread, args=(rgb_receive, img_queue, result_queue))
# spec_thread.start()
# rgb_thread.start()
#
# while True:
# spec_data = spec_queue.get()
# print(f'spec_data长度', len(spec_data))
# long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result = result_queue.get()
#
# response = send_data(pipe_send=rgb_send, long_axis=long_axis, short_axis=short_axis,
# defect_num=defect_num_sum, total_defect_area=total_defect_area_sum, rp=rp_result)
#
# print(long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result.shape)
#
# if __name__ == '__main__':
# main(is_debug=False)

124
20240419RGBtest2/pipe.py Normal file
View File

@ -0,0 +1,124 @@
import win32file
import win32pipe
import io
from PIL import Image
import time
import logging
def send_data(pipe_send, long_axis, short_axis, defect_num, total_defect_area, rp):
start_time = time.time()
# width = rp.shape[0]
# height = rp.shape[1]
# print(width, height)
img_bytes = rp.tobytes()
# length = len(img_bytes) + 18
# print(length)
# length = length.to_bytes(4, byteorder='big')
# width = width.to_bytes(2, byteorder='big')
# height = height.to_bytes(2, byteorder='big')
long_axis = long_axis.to_bytes(2, byteorder='big')
short_axis = short_axis.to_bytes(2, byteorder='big')
defect_num = defect_num.to_bytes(2, byteorder='big')
total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
# cmd_type = 'RIM'
# result = result.encode('ascii')
# send_message = b'\xaa' + length + (' ' + cmd_type).upper().encode('ascii') + long_axis + short_axis + defect_num + total_defect_area + width + height + img_bytes + b'\xff\xff\xbb'
send_message = long_axis + short_axis + defect_num + total_defect_area + img_bytes
# print(long_axis)
# print(short_axis)
# print(defect_num)
# print(total_defect_area)
# print(width)
# print(height)
try:
win32file.WriteFile(pipe_send, send_message)
print('发送成功')
# print(send_message)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
end_time = time.time()
print(f'发送时间:{end_time - start_time}')
return True
def receive_data(pipe, data_size):
try:
# 读取图片数据
result, img_data = win32file.ReadFile(pipe, data_size, None)
return img_data
except Exception as e:
print(f"Failed to receive data. Error: {e}")
return None
def create_pipes(pipe_receive_name, pipe_send_name):
# 打开或创建命名管道
pipe_receive = win32pipe.CreateNamedPipe(
pipe_receive_name,
win32pipe.PIPE_ACCESS_INBOUND,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 80000000, 80000000, 0, None
)
pipe_send = win32pipe.CreateNamedPipe(
pipe_send_name,
win32pipe.PIPE_ACCESS_OUTBOUND, # 修改为输出模式
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 80000000, 80000000, 0, None
)
# 等待发送端连接
win32pipe.ConnectNamedPipe(pipe_receive, None)
# 等待发送端连接
win32pipe.ConnectNamedPipe(pipe_send, None)
print("Sender connected.")
print("receive connected.")
return pipe_receive, pipe_send
def process_images(pipe_receive, pipe_send):
image_count = 0
batch_size = 5
images = []
while True:
for i in range(5):
start_time = time.time() # 记录开始时间
img_data = receive_data(pipe_receive)
if img_data:
image = Image.open(io.BytesIO(img_data))
image = image.convert("L") # 示例处理:转换为灰度图
buf = io.BytesIO()
image.save(buf, format='JPEG')
buf.seek(0) # 重置buffer位置到开始
processed_data = buf.getvalue()
images.append(buf) # 存储 BytesIO 对象而不是 Image 对象
if len(images) >= batch_size:
# 发送最后一个处理后的图像
send_image_back_to_qt(pipe_send, images[-1].getvalue())
images = [] # 清空列表以开始新的批处理
time.sleep(0.01) # 添加适当的延迟,降低CPU使用率
print("Image received and saved.")
end_time = time.time() # 记录结束时间
duration_ms = (end_time - start_time) * 1000 # 转换为毫秒
print(f"Image {i + 1} received and displayed in {duration_ms:.2f} ms.") # 打印毫秒级的时间
image_count += 1 # 图片计数器增加
print(f"Image {image_count} received and displayed.")
def main():
pipe_receive_name = r'\\.\pipe\pipe_receive'
pipe_send_name = r'\\.\pipe\pipe_send'
pipe_receive, pipe_send = create_pipes(pipe_receive_name, pipe_send_name)
process_images(pipe_receive, pipe_send)
if __name__ == '__main__':
main()

123
20240419RGBtest2/qt_test.py Normal file
View File

@ -0,0 +1,123 @@
import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QLabel, QVBoxLayout, QWidget
from PyQt5.QtGui import QPixmap, QImage
import win32pipe
import win32file
import struct
from PIL import Image
import io
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("Tomato Image Sender")
self.setGeometry(100, 100, 800, 600)
central_widget = QWidget()
self.setCentralWidget(central_widget)
layout = QVBoxLayout()
central_widget.setLayout(layout)
self.image_label = QLabel()
layout.addWidget(self.image_label)
self.rgb_send_name = r'\\.\pipe\rgb_receive' # 发送数据管道名对应 main.py 的接收数据管道名
self.rgb_receive_name = r'\\.\pipe\rgb_send' # 接收数据管道名对应 main.py 的发送数据管道名
self.spec_send_name = r'\\.\pipe\spec_receive' # 发送数据管道名对应 main.py 的接收数据管道名
# 连接main.py创建的命名管道
self.rgb_send = win32file.CreateFile(
self.rgb_send_name,
win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_EXISTING,
0,
None
)
self.rgb_receive = win32file.CreateFile(
self.rgb_receive_name,
win32file.GENERIC_READ,
0,
None,
win32file.OPEN_EXISTING,
0,
None
)
self.spec_send = win32file.CreateFile(
self.spec_send_name,
win32file.GENERIC_WRITE,
0,
None,
win32file.OPEN_EXISTING,
0,
None
)
def send_image_group(self, image_dir):
rgb_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith(('.bmp'))][:5]
spec_files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.raw')][:1]
for image_path in rgb_files:
with open(image_path, 'rb') as f:
img_data = f.read()
try:
win32file.WriteFile(self.rgb_send, len(img_data).to_bytes(4, byteorder='big'))
win32file.WriteFile(self.rgb_send, img_data)
except Exception as e:
print(f"数据发送失败. 错误原因: {e}")
if spec_files:
spec_file = spec_files[0]
with open(spec_file, 'rb') as f:
spec_data = f.read()
try:
win32file.WriteFile(self.spec_send, len(spec_data).to_bytes(4, byteorder='big'))
print(f"发送的光谱数据长度: {len(spec_data)}")
win32file.WriteFile(self.spec_send, spec_data)
print(f'发送的光谱数据长度: {len(spec_data)}')
except Exception as e:
print(f"数据发送失败. 错误原因: {e}")
self.receive_result()
def receive_result(self):
try:
# 读取结果数据
long_axis = int.from_bytes(win32file.ReadFile(self.rgb_receive, 2)[1], byteorder='big')
short_axis = int.from_bytes(win32file.ReadFile(self.rgb_receive, 2)[1], byteorder='big')
defect_num = int.from_bytes(win32file.ReadFile(self.rgb_receive, 2)[1], byteorder='big')
total_defect_area = int.from_bytes(win32file.ReadFile(self.rgb_receive, 4)[1], byteorder='big')
len_img = int.from_bytes(win32file.ReadFile(self.rgb_receive, 4)[1], byteorder='big')
img_data = win32file.ReadFile(self.rgb_receive, len_img)[1]
print(f"长径: {long_axis}, 短径: {short_axis}, 缺陷个数: {defect_num}, 缺陷面积: {total_defect_area}")
# 显示结果图像
image = Image.open(io.BytesIO(img_data))
qimage = QImage(image.tobytes(), image.size[0], image.size[1], QImage.Format_RGB888)
pixmap = QPixmap.fromImage(qimage)
self.image_label.setPixmap(pixmap)
except Exception as e:
print(f"数据接收失败. 错误原因: {e}")
def open_file_dialog(self):
directory_dialog = QFileDialog()
directory_dialog.setFileMode(QFileDialog.Directory)
if directory_dialog.exec_():
selected_directory = directory_dialog.selectedFiles()[0]
self.send_image_group(selected_directory)
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
main_window.open_file_dialog()
sys.exit(app.exec_())

579
20240419RGBtest2/utils.py Normal file
View File

@ -0,0 +1,579 @@
# -*- coding: utf-8 -*-
# @Time : 2024/4/20 18:24
# @Author : TG
# @File : utils.py
# @Software: PyCharm
import socket
import time
import logging
import numpy as np
import shutil
import cv2
import os
from scipy.ndimage.measurements import label, find_objects
import win32pipe
import win32file
import io
from PIL import Image
import select
import msvcrt
def receive_rgb_data(pipe):
try:
# 读取图片数据
len_img = win32file.ReadFile(pipe, 4, None)
data_size = int.from_bytes(len_img[1], byteorder='big')
result, img_data = win32file.ReadFile(pipe, data_size, None)
return img_data
except Exception as e:
print(f"数据接收失败,错误原因: {e}")
return None
def receive_spec_data(pipe):
try:
# 读取图片数据长度
len_spec = win32file.ReadFile(pipe, 4, None)
if len_spec is None:
# 未能读取到数据长度,返回"0"
return "0"
data_size = int.from_bytes(len_spec[1], byteorder='big')
if data_size == 0:
# 接收到空数据,返回"0"
return "0"
# 读取图片数据
result, spec_data = win32file.ReadFile(pipe, data_size, None)
return spec_data
except Exception as e:
print(f"数据接收失败,错误原因: {e}")
return '0'
# def receive_spec_data(pipe):
# try:
# # 读取图片数据
# len_spec = win32file.ReadFile(pipe, 4, None)
# data_size = int.from_bytes(len_spec[1], byteorder='big')
# result, spec_data = win32file.ReadFile(pipe, data_size, None)
# return spec_data
# except Exception as e:
# print(f"数据接收失败,错误原因: {e}")
# return None
# def create_pipes(pipe_receive_name, pipe_send_name):
# while True:
# try:
# # 打开或创建命名管道
# pipe_receive = win32pipe.CreateNamedPipe(
# pipe_receive_name,
# win32pipe.PIPE_ACCESS_INBOUND,
# win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
# 1, 80000000, 80000000, 0, None
# )
# pipe_send = win32pipe.CreateNamedPipe(
# pipe_send_name,
# win32pipe.PIPE_ACCESS_OUTBOUND, # 修改为输出模式
# win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
# 1, 80000000, 80000000, 0, None
# )
#
# # 等待发送端连接
# win32pipe.ConnectNamedPipe(pipe_receive, None)
# # 等待发送端连接
# win32pipe.ConnectNamedPipe(pipe_send, None)
# print("Sender connected.")
# print("receive connected.")
# return pipe_receive, pipe_send
#
# except Exception as e:
# print(f"Error occurred while creating pipes: {e}")
# print("Waiting for 5 seconds before retrying...")
# time.sleep(5)
def create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name):
while True:
try:
# 打开或创建命名管道
rgb_receive = win32pipe.CreateNamedPipe(
rgb_receive_name,
win32pipe.PIPE_ACCESS_INBOUND,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 80000000, 80000000, 0, None
)
rgb_send = win32pipe.CreateNamedPipe(
rgb_send_name,
win32pipe.PIPE_ACCESS_OUTBOUND, # 修改为输出模式
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 80000000, 80000000, 0, None
)
spec_receive = win32pipe.CreateNamedPipe(
spec_receive_name,
win32pipe.PIPE_ACCESS_INBOUND,
win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
1, 200000000, 200000000, 0, None
)
print("pipe管道创建成功等待连接...")
# 等待发送端连接
win32pipe.ConnectNamedPipe(rgb_receive, None)
print("rgb_receive connected.")
# 等待发送端连接
win32pipe.ConnectNamedPipe(rgb_send, None)
print("rgb_send connected.")
win32pipe.ConnectNamedPipe(rgb_receive, None)
print("spec_receive connected.")
return rgb_receive, rgb_send, spec_receive
except Exception as e:
print(f"管道创建连接失败,失败原因: {e}")
print("等待5秒后重试...")
time.sleep(5)
# def send_data(pipe_send, long_axis, short_axis, defect_num, total_defect_area, rp):
#
# # start_time = time.time()
#
# # width = rp.shape[0]
# # height = rp.shape[1]
# # print(width, height)
# img_bytes = rp.tobytes()
# # length = len(img_bytes) + 18
# # print(length)
# # length = length.to_bytes(4, byteorder='big')
# # width = width.to_bytes(2, byteorder='big')
# # height = height.to_bytes(2, byteorder='big')
# length = (len(img_bytes) + 10).to_bytes(4, byteorder='big')
# long_axis = long_axis.to_bytes(2, byteorder='big')
# short_axis = short_axis.to_bytes(2, byteorder='big')
# defect_num = defect_num.to_bytes(2, byteorder='big')
# total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
# # cmd_type = 'RIM'
# # result = result.encode('ascii')
# # send_message = b'\xaa' + length + (' ' + cmd_type).upper().encode('ascii') + long_axis + short_axis + defect_num + total_defect_area + width + height + img_bytes + b'\xff\xff\xbb'
# send_message = length + long_axis + short_axis + defect_num + total_defect_area + img_bytes
# # print(long_axis)
# # print(short_axis)
# # print(defect_num)
# # print(total_defect_area)
# # print(width)
# # print(height)
#
# try:
# win32file.WriteFile(pipe_send, send_message)
# print('发送成功')
# # print(send_message)
# except Exception as e:
# logging.error(f'发送完成指令失败,错误类型:{e}')
# return False
#
# # end_time = time.time()
# # print(f'发送时间:{end_time - start_time}秒')
#
# return True
def send_data(pipe_send, long_axis, short_axis, defect_num, total_defect_area, rp):
# start_time = time.time()
#
rp1 = Image.fromarray(rp.astype(np.uint8))
# cv2.imwrite('rp1.bmp', rp1)
# 将 Image 对象保存到 BytesIO 流中
img_bytes = io.BytesIO()
rp1.save(img_bytes, format='BMP')
img_bytes = img_bytes.getvalue()
# width = rp.shape[0]
# height = rp.shape[1]
# print(width, height)
# img_bytes = rp.tobytes()
# length = len(img_bytes) + 18
# print(length)
# length = length.to_bytes(4, byteorder='big')
# width = width.to_bytes(2, byteorder='big')
# height = height.to_bytes(2, byteorder='big')
print(f'原始长度:', len(rp.tobytes()))
print(f'发送长度:', len(img_bytes))
long_axis = long_axis.to_bytes(2, byteorder='big')
short_axis = short_axis.to_bytes(2, byteorder='big')
defect_num = defect_num.to_bytes(2, byteorder='big')
total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
length = (len(img_bytes) + 4).to_bytes(4, byteorder='big')
# cmd_type = 'RIM'
# result = result.encode('ascii')
# send_message = b'\xaa' + length + (' ' + cmd_type).upper().encode('ascii') + long_axis + short_axis + defect_num + total_defect_area + width + height + img_bytes + b'\xff\xff\xbb'
# send_message = long_axis + short_axis + defect_num + total_defect_area + img_bytes
send_message = long_axis + short_axis + defect_num + total_defect_area + length + img_bytes
# print(long_axis)
# print(short_axis)
# print(defect_num)
# print(total_defect_area)
# print(width)
# print(height)
try:
win32file.WriteFile(pipe_send, send_message)
time.sleep(0.01)
print('发送成功')
# print(len(send_message))
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
# end_time = time.time()
# print(f'发送时间:{end_time - start_time}秒')
return True
def mkdir_if_not_exist(dir_name, is_delete=False):
"""
创建文件夹
:param dir_name: 文件夹
:param is_delete: 是否删除
:return: 是否成功
"""
try:
if is_delete:
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
print('[Info] 文件夹 "%s" 存在, 删除文件夹.' % dir_name)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print('[Info] 文件夹 "%s" 不存在, 创建文件夹.' % dir_name)
return True
except Exception as e:
print('[Exception] %s' % e)
return False
def create_file(file_name):
"""
创建文件
:param file_name: 文件名
:return: None
"""
if os.path.exists(file_name):
print("文件存在:%s" % file_name)
return False
# os.remove(file_name) # 删除已有文件
if not os.path.exists(file_name):
print("文件不存在,创建文件:%s" % file_name)
open(file_name, 'a').close()
return True
class Logger(object):
def __init__(self, is_to_file=False, path=None):
self.is_to_file = is_to_file
if path is None:
path = "tomato.log"
self.path = path
create_file(path)
def log(self, content):
if self.is_to_file:
with open(self.path, "a") as f:
print(time.strftime("[%Y-%m-%d_%H-%M-%S]:"), file=f)
print(content, file=f)
else:
print(content)
#提取西红柿使用S+L的图像
def extract_s_l(image):
# image = cv2.imread(image_path)
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
s_channel = hsv[:,:,1]
l_channel = lab[:,:,0]
result = cv2.add(s_channel, l_channel)
return result
def find_reflection(image, threshold=190):
# 读取图像
# image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 应用阈值分割
_, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
return reflection
def otsu_threshold(image):
# 将图像转换为灰度图像
# gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Otsu阈值分割
_, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
return binary
# 提取花萼使用G-R的图像
def extract_g_r(image):
# image = cv2.imread(image_path)
g_channel = image[:,:,1]
r_channel = image[:,:,2]
result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
return result
#提取西红柿使用R-B的图像
def extract_r_b(image):
# image = cv2.imread(image_path)
r_channel = image[:,:,2]
b_channel = image[:,:,0]
result = cv2.subtract(r_channel, b_channel)
return result
def extract_r_g(image):
# image = cv2.imread(image_path)
r_channel = image[:,:,2]
g_channel = image[:,:,1]
result = cv2.subtract(r_channel, g_channel)
return result
def threshold_segmentation(image, threshold, color=255):
_, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
return result
def bitwise_operation(image1, image2, operation='and'):
if operation == 'and':
result = cv2.bitwise_and(image1, image2)
elif operation == 'or':
result = cv2.bitwise_or(image1, image2)
else:
raise ValueError("operation must be 'and' or 'or'")
return result
def largest_connected_component(bin_img):
# 使用connectedComponentsWithStats函数找到连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
# 如果只有背景标签,返回一个空的二值图像
if num_labels <= 1:
return np.zeros_like(bin_img)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(bin_img)
new_bin_img[labels == largest_label] = 255
return new_bin_img
def close_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
return closed_img
def open_operation(bin_img, kernel_size=(5, 5)):
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
return opened_img
def draw_tomato_edge(original_img, bin_img):
bin_img_processed = close_operation(bin_img, kernel_size=(15, 15))
# cv2.imshow('Close Operation', bin_img_processed)
# bin_img_processed = open_operation(bin_img_processed, kernel_size=(19, 19))
# cv2.imshow('Open Operation', bin_img_processed)
# 现在使用处理后的bin_img_processed查找轮廓
contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 如果没有找到轮廓,直接返回原图
if not contours:
return original_img, np.zeros_like(bin_img) # 返回原图和全黑mask
# 找到最大轮廓
max_contour = max(contours, key=cv2.contourArea)
# 多边形近似的精度调整
epsilon = 0.0006 * cv2.arcLength(max_contour, True) # 可以调整这个值
approx = cv2.approxPolyDP(max_contour, epsilon, True)
# 绘制轮廓
cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
mask = np.zeros_like(bin_img)
# 使用白色填充最大轮廓
cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
return original_img, mask
def draw_tomato_edge_convex_hull(original_img, bin_img):
bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not contours:
return original_img
max_contour = max(contours, key=cv2.contourArea)
hull = cv2.convexHull(max_contour)
cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
return original_img
# 得到完整的西红柿二值图像,除了绿色花萼
def fill_holes(bin_img):
# 复制 bin_img 到 img_filled
img_filled = bin_img.copy()
# 获取图像的高度和宽度
height, width = bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_d = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(bin_img, img_filled)
# 裁剪 img_filled 和 img_filled_d 到与 bin_img 相同的大小
# img_filled = img_filled[:height, :width]
img_filled_d = img_filled_d[:height, :width]
return img_filled, img_filled_d
def bitwise_and_rgb_with_binary(rgb_img, bin_img):
# 将二值图像转换为三通道图像
bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
# 使用 bitwise_and 操作合并 RGB 图像和二值图像
result = cv2.bitwise_and(rgb_img, bin_img_3channel)
return result
def extract_max_connected_area(image, lower_hsv, upper_hsv):
# 读取图像
# image = cv2.imread(image_path)
# 将图像从BGR转换到HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 使用阈值获取指定区域的二值图像
mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
# 找到二值图像的连通区域
num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
# 找到最大的连通区域(除了背景)
largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
# 创建一个新的二值图像,只显示最大的连通区域
new_bin_img = np.zeros_like(mask)
new_bin_img[labels == largest_label] = 255
# 复制 new_bin_img 到 img_filled
img_filled = new_bin_img.copy()
# 获取图像的高度和宽度
height, width = new_bin_img.shape
# 创建一个掩码,比输入图像大两个像素点
mask = np.zeros((height + 2, width + 2), np.uint8)
# 使用 floodFill 函数填充黑色区域
cv2.floodFill(img_filled, mask, (0, 0), 255)
# 反转填充后的图像
img_filled_inv = cv2.bitwise_not(img_filled)
# 使用 bitwise_or 操作合并原图像和填充后的图像
img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
return img_filled
def get_tomato_dimensions(edge_img):
"""
根据番茄边缘二值化轮廓图,计算番茄的长径短径和长短径比值
使用最小外接矩形和最小外接圆两种方法
参数:
edge_img (numpy.ndarray): 番茄边缘二值化轮廓图,背景为黑色,番茄区域为白色
返回:
tuple: (长径, 短径, 长短径比值)
"""
if edge_img is None or edge_img.any() == 0:
return (0, 0)
# 最小外接矩形
rect = cv2.minAreaRect(cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
major_axis, minor_axis = rect[1]
# aspect_ratio = max(major_axis, minor_axis) / min(major_axis, minor_axis)
# # 最小外接圆
# (x, y), radius = cv2.minEnclosingCircle(
# cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
# diameter = 2 * radius
# aspect_ratio_circle = 1.0
return (max(major_axis, minor_axis), min(major_axis, minor_axis))
def get_defect_info(defect_img):
"""
根据番茄区域缺陷二值化轮廓图,计算缺陷区域的个数和总面积
参数:
defect_img (numpy.ndarray): 番茄区域缺陷二值化轮廓图,背景为黑色,番茄区域为白色,缺陷区域为黑色连通域
返回:
tuple: (缺陷区域个数, 缺陷区域像素面积缺陷像素总面积)
"""
# 检查输入是否为空
if defect_img is None or defect_img.any() == 0:
return (0, 0)
nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(defect_img, connectivity=4)
max_area = max(stats[i, cv2.CC_STAT_AREA] for i in range(1, nb_components))
areas = []
for i in range(1, nb_components):
area = stats[i, cv2.CC_STAT_AREA]
if area != max_area:
areas.append(area)
number_defects = len(areas)
total_pixels = sum(areas)
return number_defects, total_pixels
def connected_components_analysis(binary_image):
"""
从二值化图像计算黑色连通域个数和各个黑色连通域像素面积及黑色像素总面积
参数:
binary_image (numpy.ndarray): 二值化图像, 其中 0 表示白色, 1 表示黑色
返回:
num_components (int): 黑色连通域的个数
component_areas (list): 每个黑色连通域的像素面积
total_black_area (int): 黑色像素的总面积
"""
# 标记连通域
labeled_image, num_components = label(binary_image)
# 获取每个连通域的像素位置
slices = find_objects(labeled_image)
# 计算每个连通域的像素面积
component_areas = []
for slice_obj in slices:
component_area = np.sum(binary_image[slice_obj])
component_areas.append(component_area)
# 计算黑色像素的总面积
total_black_area = np.sum(binary_image)
return num_components, component_areas, total_black_area

165
classfier.py Normal file
View File

@ -0,0 +1,165 @@
import logging
import sys
from typing import Optional
import numpy as np
import cv2
from sklearn.tree import DecisionTreeClassifier
from sklearn.cluster import KMeans
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
from scipy import ndimage
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_selection import SelectKBest
from sklearn.neighbors import KNeighborsClassifier
from scipy.stats import binom
import matplotlib.pyplot as plt
import time
import pickle
import os
import utils
from root_dir import ROOT_DIR
class Astragalin(object):
def __init__(self, load_from=None, debug_mode=False, class_weight=None):
if load_from is None:
self.model = DecisionTreeClassifier(random_state=65, class_weight=class_weight)
else:
self.load(load_from)
self.log = utils.Logger(is_to_file=debug_mode)
self.debug_mode = debug_mode
def load(self, path=None):
if path is None:
path = os.path.join(ROOT_DIR, 'models')
model_files = os.listdir(path)
if len(model_files) == 0:
self.log.log("No model found!")
return 1
self.log.log("./ Models Found:")
_ = [self.log.log("├--" + str(model_file)) for model_file in model_files]
file_times = [model_file[6:-2] for model_file in model_files]
latest_model = model_files[int(np.argmax(file_times))]
self.log.log("└--Using the latest model: " + str(latest_model))
path = os.path.join(ROOT_DIR, "models", str(latest_model))
if not os.path.isabs(path):
logging.warning('给的是相对路径')
return -1
if not os.path.exists(path):
logging.warning('文件不存在')
return -1
with open(path, 'rb') as f:
model_dic = pickle.load(f)
self.model = model_dic['model']
return 0
def fit(self, data_x, data_y):
x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, test_size=0.3, random_state=65)
self.model.fit(x_train, y_train)
y_pred = self.model.predict(x_test)
print(confusion_matrix(y_test, y_pred))
pre_score = accuracy_score(y_test, y_pred)
self.log.log("Test accuracy is:" + str(pre_score * 100) + "%.")
y_pred = self.model.predict(x_train)
pre_score = accuracy_score(y_train, y_pred)
self.log.log("Train accuracy is:" + str(pre_score * 100) + "%.")
y_pred = self.model.predict(data_x)
pre_score = accuracy_score(data_y, y_pred)
self.log.log("Total accuracy is:" + str(pre_score * 100) + "%.")
return int(pre_score * 100)
def fit_value(self, file_name=None, data_path='data/1.txt', select_bands=[91, 92, 93, 94, 95, 96, 97, 98, 99, 100]):
data_x, data_y = self.data_construction(data_path, select_bands)
score = self.fit(data_x, data_y)
print('score:', score)
model_name = self.save(file_name=file_name)
return score, model_name
def save(self, file_name):
# 保存模型
if file_name is None:
file_name = "model_" + time.strftime("%Y-%m-%d_%H-%M") + ".p"
file_name = os.path.join(ROOT_DIR, "models", file_name)
model_dic = {'model': self.model}
with open(file_name, 'wb') as f:
pickle.dump(model_dic, f)
self.log.log("Model saved to '" + str(file_name) + "'.")
return file_name
# def data_construction(self, data_path, select_bands):
# data = utils.read_envi_ascii(data_path)
# beijing = data['beijing'][:, select_bands]
# zazhi1 = data['zazhi1'][:, select_bands]
# # zazhi2 = data['zazhi2'][:, select_bands]
# huangqi = data['huangqi'][:, select_bands]
# gancaopian = data['gancaopian'][:, select_bands]
# # hongqi = data['hongqi'][:, select_bands]
# beijing_y = np.zeros(beijing.shape[0])
# zazhi1_y = np.ones(zazhi1.shape[0]) * 3
# # zazhi2_y = np.ones(zazhi2.shape[0]) * 2
# huangqi_y = np.ones(huangqi.shape[0]) * 1
# gancaopian_y = np.ones(gancaopian.shape[0]) * 4
# # hongqi_y = np.ones(hongqi.shape[0]) * 5
# data_x = np.concatenate((beijing, zazhi1, huangqi, gancaopian), axis=0)
# data_y = np.concatenate((beijing_y, zazhi1_y, huangqi_y, gancaopian_y), axis=0)
# return data_x, data_y
def data_construction(self, data_path='data/1.txt', select_bands=[91, 92, 93, 94, 95, 96, 97, 98, 99, 100],
type=['beijing', 'zazhi1', 'huangqi', 'gancaopian']):
'''
:param data_path: 数据文件路径
:param select_bands: 选择的波段
:param type: 选择的类型
:return: data_x, data_y
'''
data = utils.read_envi_ascii(data_path)
# 判断读取的txt文件内是否有beijing和haungqi类型的数据
if 'beijing' not in data or 'huangqi' not in data:
logging.error("数据文件中缺少'beijing''huangqi'类型标签")
raise ValueError("数据文件中缺少'beijing''huangqi'类型标签")
data_x = np.concatenate([data[key][:, select_bands] for key in type], axis=0)
data_y = np.concatenate([np.zeros(data[key].shape[0]) if key == 'beijing' else np.ones(data[key].shape[0])
if key == 'huangqi' else np.ones(data[key].shape[0]) * (i + 2) for i, key in enumerate(type)], axis=0)
return data_x, data_y
def predict(self, data_x):
'''
对数据进行预测
:param data_x: 波段选择后的数据
:return: 预测结果二值化后的数据0为背景1为黄芪,2为杂质23为杂质14为甘草片5为红芪
'''
data_x_shape = data_x.shape
data_x = data_x.reshape(-1, data_x.shape[2])
data_y = self.model.predict(data_x)
data_y = data_y.reshape(data_x_shape[0], data_x_shape[1]).astype(np.uint8)
data_y, centers, categories = self.connect_space(data_y)
result = {'data_y': data_y, 'centers': centers, 'categories': categories}
return result
def connect_space(self, data_y):
# 连通域处理离散点
labels, num_features = ndimage.label(data_y)
centers = []
categories = []
for i in range(1, num_features + 1):
mask = (labels == i)
counts = np.bincount(data_y[mask])
category = np.argmax(counts)
data_y[mask] = category
center = ndimage.measurements.center_of_mass(data_y, labels, [i])
center = list(center)
center = np.array(center).astype(int)
centers.append(center)
categories.append(category)
return data_y, centers, categories
if __name__ == '__main__':
detector = Astragalin()
detector.fit_value(file_name="astragalin.p", data_path="data/1.txt")

197
main.py Normal file
View File

@ -0,0 +1,197 @@
import socket
import time
import numpy as np
import logging
import os
import sys
import cv2 as cv
from classfier import Astragalin
from utils import DualSock, try_connect, receive_sock, parse_protocol, ack_sock, done_sock
from root_dir import ROOT_DIR
from model import resnet34
import torch
from torchvision import transforms
from PIL import Image
import json
import matplotlib.pyplot as plt
from PIL import Image
def process_cmd(cmd: str, data: any, connected_sock: socket.socket) -> tuple:
'''
处理指令
:param cmd: 指令类型
:param data: 指令内容
:param connected_sock: socket
:param detector: 模型
:return: 是否处理成功
'''
result = ''
if cmd == 'IM':
data = np.frombuffer(data, dtype=np.uint8)
data = cv.imdecode(data, cv.IMREAD_COLOR)
# 显示图片
cv.imshow('image', data)
cv.waitKey(0)
cv.destroyAllWindows()
# device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
#
# data_transform = transforms.Compose(
# [transforms.Resize(256),
# transforms.CenterCrop(224),
# transforms.ToTensor(),
# transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
#
# # load image
# # img_path = r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\1.jpg"
# # assert os.path.exists(img_path), "file: '{}' dose not exist.".format(img_path)
# # img = Image.open(img_path)
# # plt.imshow(img)
# # [N, C, H, W]
# img = data_transform(data)
# # expand batch dimension
# img = torch.unsqueeze(img, dim=0)
#
# # read class_indict
# # json_path = './class_indices.json'
# # assert os.path.exists(json_path), "file: '{}' dose not exist.".format(json_path)
# #
# # with open(json_path, "r") as f:
# # class_indict = json.load(f)
#
# # create model
# model = resnet34(num_classes=4).to(device)
#
# # load model weights
# weights_path = r"D:\project\deep-learning-for-image-processing-master\pytorch_classification\Test5_resnet\resNet34.pth"
# assert os.path.exists(weights_path), "file: '{}' dose not exist.".format(weights_path)
# model.load_state_dict(torch.load(weights_path, map_location=device))
#
# # prediction
# model.eval()
# with torch.no_grad():
# # predict class
# output = torch.squeeze(model(img.to(device))).cpu()
# predict = torch.softmax(output, dim=0)
# predict_cla = torch.argmax(predict).numpy()
# result = predict_cla
# print(predict_cla)
# print_res = "class: {} prob: {:.3}".format(class_indict[str(predict_cla)],
# predict[predict_cla].numpy())
# plt.title(print_res)
# for i in range(len(predict)):
# print("class: {:10} prob: {:.3}".format(class_indict[str(i)],
# predict[i].numpy()))
# plt.show()
# result = detector.predict(data)
# # 取出result中的字典中的centers和categories
# centers = result['centers']
# categories = result['categories']
# # 将centers和categories转换为字符串每一位之间用,隔开centers是list,每个元素为np.arraycategories是1维数组
# # centers_str = '|'.join([str(point[0][0]) + ',' + str(point[0][1]) for point in centers])
# # categories_str = ','.join([str(i) for i in categories])
# # # 将centers和categories的字符串拼接起来中间用;隔开
# # result = centers_str + ';' + categories_str
# 给result直接赋值用于测试
# result = 'HELLO WORLD'
# response = done_sock(connected_sock, cmd_type=cmd, result=result)
# print(result)
else:
logging.error(f'错误指令,指令为{cmd}')
# response = False
return result
def bytes_to_img(data):
data1 = Image.frombytes('RGB', (1200, 4096), data, 'raw')
# def main(is_debug=False):
# file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
# file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
# console_handler = logging.StreamHandler(sys.stdout)
# console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
# logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
# handlers=[file_handler, console_handler], level=logging.DEBUG)
# dual_sock = DualSock(connect_ip='127.0.0.1')
#
# while not dual_sock.status:
# logging.error('连接被断开,正在重连')
# dual_sock.reconnect()
# detector = Astragalin(ROOT_DIR / 'models' / 'astragalin.p')
# # _ = detector.predict(np.ones((4096, 1200, 10), dtype=np.float32))
# while True:
# pack, next_pack = receive_sock(dual_sock) # 接收数据,如果没有数据则阻塞,如果返回的是空字符串则表示出现错误
# if pack == b"": # 无数据表示出现错误
# time.sleep(5)
# dual_sock.reconnect()
# continue
#
# cmd, data = parse_protocol(pack)
# print(cmd)
# # print(data)
#
# process_cmd(cmd=cmd, data=data, connected_sock=dual_sock, detector=detector)
def main(is_debug=False):
file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
handlers=[file_handler, console_handler], level=logging.DEBUG)
dual_sock = DualSock(connect_ip='127.0.0.1')
while not dual_sock.status:
logging.error('连接被断开,正在重连')
dual_sock.reconnect()
# detector = Astragalin(ROOT_DIR / 'models' / 'resNet34.pth')
result_buffer = [] # 存储处理结果的缓冲区
while True:
for _ in range(5):
pack, next_pack = receive_sock(dual_sock) # 接收数据,如果没有数据则阻塞,如果返回的是空字符串则表示出现错误
if pack == b"": # 无数据表示出现错误
time.sleep(5)
dual_sock.reconnect()
break
cmd, data = parse_protocol(pack)
print(cmd)
# print(data)
result = process_cmd(cmd=cmd, data=data, connected_sock=dual_sock)
result_buffer.append(result) # 将处理结果添加到缓冲区
# 在这里进行对5次结果的处理可以进行合并、比较等操作
final_result = combine_results(result_buffer)
# 发送最终结果
response = done_sock(dual_sock, cmd_type=cmd, result=final_result)
print(final_result)
result_buffer = []
def combine_results(results):
# 在这里实现对5次结果的合并/比较等操作,根据实际需求进行修改
# 这里只是简单地将结果拼接成一个字符串,你可能需要根据实际情况进行更复杂的处理
return ';'.join(results)
if __name__ == '__main__':
main()

198
model.py Normal file
View File

@ -0,0 +1,198 @@
import torch.nn as nn
import torch
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_channel, out_channel, stride=1, downsample=None, **kwargs):
super(BasicBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=out_channel,
kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channel)
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(in_channels=out_channel, out_channels=out_channel,
kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channel)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out += identity
out = self.relu(out)
return out
class Bottleneck(nn.Module):
"""
注意原论文中在虚线残差结构的主分支上第一个1x1卷积层的步距是2第二个3x3卷积层步距是1
但在pytorch官方实现过程中是第一个1x1卷积层的步距是1第二个3x3卷积层步距是2
这么做的好处是能够在top1上提升大概0.5%的准确率
可参考Resnet v1.5 https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch
"""
expansion = 4
def __init__(self, in_channel, out_channel, stride=1, downsample=None,
groups=1, width_per_group=64):
super(Bottleneck, self).__init__()
width = int(out_channel * (width_per_group / 64.)) * groups
self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=width,
kernel_size=1, stride=1, bias=False) # squeeze channels
self.bn1 = nn.BatchNorm2d(width)
# -----------------------------------------
self.conv2 = nn.Conv2d(in_channels=width, out_channels=width, groups=groups,
kernel_size=3, stride=stride, bias=False, padding=1)
self.bn2 = nn.BatchNorm2d(width)
# -----------------------------------------
self.conv3 = nn.Conv2d(in_channels=width, out_channels=out_channel*self.expansion,
kernel_size=1, stride=1, bias=False) # unsqueeze channels
self.bn3 = nn.BatchNorm2d(out_channel*self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
def forward(self, x):
identity = x
if self.downsample is not None:
identity = self.downsample(x)
out = self.conv1(x)
out = self.bn1(out)
out = self.relu(out)
out = self.conv2(out)
out = self.bn2(out)
out = self.relu(out)
out = self.conv3(out)
out = self.bn3(out)
out += identity
out = self.relu(out)
return out
class ResNet(nn.Module):
def __init__(self,
block,
blocks_num,
num_classes=1000,
include_top=True,
groups=1,
width_per_group=64):
super(ResNet, self).__init__()
self.include_top = include_top
self.in_channel = 64
self.groups = groups
self.width_per_group = width_per_group
self.conv1 = nn.Conv2d(3, self.in_channel, kernel_size=7, stride=2,
padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(self.in_channel)
self.relu = nn.ReLU(inplace=True)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.layer1 = self._make_layer(block, 64, blocks_num[0])
self.layer2 = self._make_layer(block, 128, blocks_num[1], stride=2)
self.layer3 = self._make_layer(block, 256, blocks_num[2], stride=2)
self.layer4 = self._make_layer(block, 512, blocks_num[3], stride=2)
if self.include_top:
self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) # output size = (1, 1)
self.fc = nn.Linear(512 * block.expansion, num_classes)
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
def _make_layer(self, block, channel, block_num, stride=1):
downsample = None
if stride != 1 or self.in_channel != channel * block.expansion:
downsample = nn.Sequential(
nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(channel * block.expansion))
layers = []
layers.append(block(self.in_channel,
channel,
downsample=downsample,
stride=stride,
groups=self.groups,
width_per_group=self.width_per_group))
self.in_channel = channel * block.expansion
for _ in range(1, block_num):
layers.append(block(self.in_channel,
channel,
groups=self.groups,
width_per_group=self.width_per_group))
return nn.Sequential(*layers)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
if self.include_top:
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.fc(x)
return x
def resnet34(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnet34-333f7ec4.pth
return ResNet(BasicBlock, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)
def resnet50(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnet50-19c8e357.pth
return ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)
def resnet101(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnet101-5d3b4d8f.pth
return ResNet(Bottleneck, [3, 4, 23, 3], num_classes=num_classes, include_top=include_top)
def resnext50_32x4d(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth
groups = 32
width_per_group = 4
return ResNet(Bottleneck, [3, 4, 6, 3],
num_classes=num_classes,
include_top=include_top,
groups=groups,
width_per_group=width_per_group)
def resnext101_32x8d(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth
groups = 32
width_per_group = 8
return ResNet(Bottleneck, [3, 4, 23, 3],
num_classes=num_classes,
include_top=include_top,
groups=groups,
width_per_group=width_per_group)

BIN
models/12.p Normal file

Binary file not shown.

BIN
models/astragalin.p Normal file

Binary file not shown.

BIN
models/dt.p Normal file

Binary file not shown.

BIN
models/resNet34.pth Normal file

Binary file not shown.

167
qt_test.py Normal file
View File

@ -0,0 +1,167 @@
import numpy as np
import socket
import logging
import matplotlib.pyplot as plt
import cv2
def rec_socket(recv_sock: socket.socket, cmd_type: str, ack: bool) -> bool:
if ack:
cmd = 'A' + cmd_type
else:
cmd = 'D' + cmd_type
while True:
try:
temp = recv_sock.recv(1)
except ConnectionError as e:
logging.error(f'连接出错, 错误代码:\n{e}')
return False
except TimeoutError as e:
logging.error(f'超时了,错误代码: \n{e}')
return False
except Exception as e:
logging.error(f'遇见未知错误,错误代码: \n{e}')
return False
if temp == b'\xaa':
break
# 获取报文长度
temp = b''
while len(temp) < 4:
try:
temp += recv_sock.recv(1)
except Exception as e:
logging.error(f'接收报文长度失败, 错误代码: \n{e}')
return False
try:
data_len = int.from_bytes(temp, byteorder='big')
except Exception as e:
logging.error(f'转换失败,错误代码 \n{e}, \n报文内容\n{temp}')
return False
# 读取报文内容
temp = b''
while len(temp) < data_len:
try:
temp += recv_sock.recv(data_len)
except Exception as e:
logging.error(f'接收报文内容失败, 错误代码: \n{e}\n报文内容\n{temp}')
return False
data = temp
if cmd.strip().upper() != data[:4].decode('ascii').strip().upper():
logging.error(f'客户端接收指令错误,\n指令内容\n{data}')
return False
else:
if cmd == 'DIM':
print(data)
# 进行数据校验
temp = b''
while len(temp) < 3:
try:
temp += recv_sock.recv(1)
except Exception as e:
logging.error(f'接收报文校验失败, 错误代码: \n{e}')
return False
if temp == b'\xff\xff\xbb':
return True
else:
logging.error(f"接收了一个完美的只错了校验位的报文,\n data: {data}")
return False
# def main():
# socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# socket_receive.bind(('127.0.0.1', 21123))
# socket_receive.listen(5)
# socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# socket_send.bind(('127.0.0.1', 21122))
# socket_send.listen(5)
# print('等待连接')
# socket_send_1, receive_addr_1 = socket_send.accept()
# print("连接成功:", receive_addr_1)
# # socket_send_2 = socket_send_1
# socket_send_2, receive_addr_2 = socket_receive.accept()
# print("连接成功:", receive_addr_2)
# while True:
# cmd = input('请输入指令:').strip().upper()
# if cmd == 'IM':
# with open('data/newrawfile_ref.raw', 'rb') as f:
# data = np.frombuffer(f.read(), dtype=np.float32).reshape(750, 288, 384)
# data = data[:, [91, 92, 93, 94, 95, 96, 97, 98, 99, 100], :]
# n_rows, n_bands, n_cols = data.shape[0], data.shape[1], data.shape[2]
# print(f'n_rows{n_rows}, n_bands{n_bands}, n_cols{n_cols}')
# n_rows, n_cols, n_bands = [x.to_bytes(2, byteorder='big') for x in [n_rows, n_cols, n_bands]]
# data = data.tobytes()
# length = len(data) + 10
# print(f'length: {length}')
# length = length.to_bytes(4, byteorder='big')
# msg = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + n_rows + n_cols + n_bands + data + b'\xff\xff\xbb'
# socket_send_1.send(msg)
# print('发送成功')
# result = socket_send_2.recv(5)
# length = int.from_bytes(result[1:5], byteorder='big')
# result = b''
# while len(result) < length:
# result += socket_send_2.recv(length)
# print(result)
# data = result[4:length].decode()
# print(data)
def main():
socket_receive = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_receive.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket_receive.bind(('127.0.0.1', 21123))
socket_receive.listen(5)
socket_send = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_send.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
socket_send.bind(('127.0.0.1', 21122))
socket_send.listen(5)
print('等待连接')
socket_send_1, receive_addr_1 = socket_send.accept()
print("连接成功:", receive_addr_1)
# socket_send_2 = socket_send_1
socket_send_2, receive_addr_2 = socket_receive.accept()
print("连接成功:", receive_addr_2)
while True:
cmd = input().strip().upper()
if cmd == 'IM':
image_paths = [
r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\1.jpg",
r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\2.jpg",
r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\3.jpg",
r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\4.jpg",
r"D:\project\deep-learning-for-image-processing-master\data_set\test_image\5.jpg",
]
# 连续发送五张图片
for image_path in image_paths:
# 读取图片文件
img = cv2.imread(image_path)
# img = cv2.imread(r"/Users/zhouchao/Library/CloudStorage/OneDrive-macrosolid/PycharmProjects/wood_color/data/data20220919/dark/rgb60.png")
# img = cv2.imread(r"D:\project\Astragalin\data\02newrawfile_ref.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = np.asarray(img, dtype=np.uint8)
width = img.shape[0]
height = img.shape[1]
print(width, height)
img_bytes = img.tobytes()
length = len(img_bytes) + 8
print(length)
length = length.to_bytes(4, byteorder='big')
width = width.to_bytes(2, byteorder='big')
height = height.to_bytes(2, byteorder='big')
send_message = b'\xaa' + length + (' ' + cmd).upper().encode('ascii') + width + height + img_bytes + b'\xff\xff\xbb'
socket_send_1.send(send_message)
print('发送成功')
result = socket_send_2.recv(10)
print(result)
if __name__ == '__main__':
main()

6
renovate.json Normal file
View File

@ -0,0 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended"
]
}

840
report.log Normal file
View File

@ -0,0 +1,840 @@
2024-01-15 14:32:13,594 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 14:32:18,595 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-15 14:32:38,650 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 14:32:38,651 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-15 14:32:38,651 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 14:32:38,661 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-15 15:33:19,091 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:33:19,592 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-15 15:33:19,592 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:33:19,602 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-15 15:56:26,748 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:56:26,749 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 15:56:31,750 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:56:31,750 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 15:56:36,750 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:56:36,750 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 15:56:41,751 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:56:41,762 utils.py[line:224] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 15:58:41,933 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:58:41,933 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 15:58:58,774 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:59:00,778 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-15 15:59:05,778 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:59:07,791 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-15 15:59:12,791 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:59:14,804 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-15 15:59:58,488 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 15:59:58,488 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10065] <20>׽<EFBFBD><D7BD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2024-01-15 16:00:33,001 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-15 16:00:38,003 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-15 16:00:43,004 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:25:24,555 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:25:29,584 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:25:34,584 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:25:39,584 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:25:44,584 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:25:49,585 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:25:54,585 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:25:59,585 utils.py[line:224] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:26:04,586 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:26:09,587 utils.py[line:224] - ERROR - <20><>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:26:14,587 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:38:11,783 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:38:13,823 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 09:38:39,301 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:38:44,302 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:38:49,302 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:38:54,304 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:01,468 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:39:06,469 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:11,469 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:39:16,470 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:21,470 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:39:26,471 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:31,471 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:39:36,473 utils.py[line:224] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:41,473 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:39:46,473 utils.py[line:224] - ERROR - <20><>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:39:51,474 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:40:20,420 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:40:20,420 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 09:40:20,421 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:40:20,431 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 09:42:30,429 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:42:35,431 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:42:40,431 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:42:49,844 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:42:54,845 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:42:59,846 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:43:04,846 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:43:09,847 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:43:14,848 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:43:19,848 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:43:21,562 utils.py[line:224] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10053] <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>һ<EFBFBD><D2BB><EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 09:43:26,563 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:43:31,564 utils.py[line:224] - ERROR - <20><>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:43:36,564 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 09:43:41,564 utils.py[line:224] - ERROR - <20><>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-01-23 09:43:46,565 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 15:10:24,801 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 15:10:24,840 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 15:10:24,840 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 15:10:24,850 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 15:10:49,904 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 15:10:49,907 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 15:10:49,908 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 15:10:49,908 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 15:10:50,025 utils.py[line:296] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 18:15:41,050 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:15:41,061 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 18:15:41,061 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:15:41,073 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 18:17:09,557 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:17:10,099 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 18:17:10,099 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:17:10,099 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 18:19:41,713 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:19:41,718 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 18:19:41,719 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 18:19:41,720 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:02:21,402 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:02:21,471 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:02:21,472 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:02:21,472 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:15:31,925 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:15:31,926 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:15:31,926 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:15:31,936 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:16:44,610 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:16:44,611 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:16:44,611 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:16:44,612 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:17:28,898 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:17:28,898 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:17:28,899 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:17:28,899 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:21:07,938 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:09,943 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:14,943 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:16,959 utils.py[line:224] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:21,959 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:23,961 utils.py[line:224] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:28,962 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:30,967 utils.py[line:224] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:35,967 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:37,979 utils.py[line:224] - ERROR - <20><>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:42,980 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:44,993 utils.py[line:224] - ERROR - <20><>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:49,993 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:52,006 utils.py[line:224] - ERROR - <20><>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:21:57,006 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:21:59,009 utils.py[line:224] - ERROR - <20><>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:04,010 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>9<EFBFBD><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:06,014 utils.py[line:224] - ERROR - <20><>9<EFBFBD><39><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:11,015 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:13,018 utils.py[line:224] - ERROR - <20><>10<31><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:18,019 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>11<31><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:20,022 utils.py[line:224] - ERROR - <20><>11<31><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:25,023 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:27,035 utils.py[line:224] - ERROR - <20><>12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:32,036 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>13<31><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:34,051 utils.py[line:224] - ERROR - <20><>13<31><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-01-23 20:22:49,248 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:49,248 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:22:49,248 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:22:49,259 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:24:03,935 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:24:03,936 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:24:03,936 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:24:03,947 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:27:46,805 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:27:46,806 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:27:46,806 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:27:46,817 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:30:26,366 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:30:26,367 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-23 20:30:26,367 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-23 20:30:26,377 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-24 09:59:18,581 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-24 09:59:18,613 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-24 09:59:18,613 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-24 09:59:18,614 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-24 10:01:30,602 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-24 10:01:30,603 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-01-24 10:01:30,603 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-01-24 10:01:30,614 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:15,521 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:15,550 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:15,551 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:15,551 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:15,633 utils.py[line:296] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 16:00:20,635 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:20,645 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:20,645 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:20,656 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:27,391 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:27,391 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:27,391 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:27,392 utils.py[line:227] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 16:00:27,819 utils.py[line:296] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 16:00:32,820 utils.py[line:218] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 16:00:34,822 utils.py[line:224] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:26:30,849 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:26:30,920 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:26:30,920 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:26:30,921 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:26:38,869 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:26:39,137 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:27:44,530 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:27:46,536 utils.py[line:294] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:27:51,537 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:27:51,538 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:27:51,538 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:27:51,538 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:27:55,825 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:27:56,084 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:32:38,993 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:32:38,993 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:32:38,993 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:32:38,994 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:32:46,514 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:32:46,795 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:33:09,989 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:33:09,990 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:33:09,990 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:33:10,002 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:33:18,870 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-12 17:33:24,155 utils.py[line:269] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-12 17:34:44,607 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:34:46,609 utils.py[line:294] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:34:51,633 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:34:53,648 utils.py[line:294] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:34:58,649 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:34:58,660 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:34:58,661 utils.py[line:288] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:34:58,674 utils.py[line:297] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:40:25,640 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:40:25,641 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:40:25,641 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:40:25,652 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:42:05,696 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:42:05,697 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:42:05,697 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:42:05,698 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:42:54,830 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:42:54,830 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:42:54,831 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:42:54,842 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:43:57,387 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:43:57,388 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:43:57,388 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:43:57,398 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:44:18,977 utils.py[line:79] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 17:44:59,117 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:44:59,118 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:44:59,118 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:44:59,119 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:45:21,112 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:45:21,113 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 17:45:21,113 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 17:45:21,113 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:18:57,092 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:18:57,677 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:18:57,677 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:18:57,688 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:26:53,862 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:26:58,864 utils.py[line:300] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:03,865 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:08,865 utils.py[line:300] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:13,866 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:18,866 utils.py[line:300] - ERROR - <20><>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:23,867 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:28,868 utils.py[line:300] - ERROR - <20><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:33,868 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:38,869 utils.py[line:300] - ERROR - <20><>5<EFBFBD><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:43,870 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:48,870 utils.py[line:300] - ERROR - <20><>6<EFBFBD><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:27:53,870 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:27:58,871 utils.py[line:300] - ERROR - <20><>7<EFBFBD><37><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:28:03,872 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:28:08,872 utils.py[line:300] - ERROR - <20><>8<EFBFBD><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-12 21:28:34,518 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:28:35,533 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:28:35,534 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:28:35,587 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:28:52,207 utils.py[line:123] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
timed out
2024-04-12 21:28:57,207 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:28:59,211 utils.py[line:300] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 21:30:22,505 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:30:22,518 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:30:22,518 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:30:22,568 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:30:37,173 utils.py[line:123] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 21:30:39,173 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:30:41,187 utils.py[line:300] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-12 21:33:53,504 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:33:53,510 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:33:53,510 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:33:53,524 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:36:49,688 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:36:49,695 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:36:49,696 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-12 21:36:50,702 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-12 21:37:06,015 utils.py[line:123] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
timed out
2024-04-12 21:37:08,017 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:23:04,258 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:23:09,286 utils.py[line:300] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
timed out
2024-04-14 11:23:14,287 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:23:20,516 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:23:20,517 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:23:20,517 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:23:20,517 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:10,903 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:12,942 utils.py[line:300] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-14 11:27:17,952 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:17,962 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:17,962 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:17,973 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:38,723 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:38,723 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:38,723 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:38,723 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:41,504 utils.py[line:79] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-14 11:27:43,505 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:43,516 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:27:43,516 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:27:43,526 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:28:21,307 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:28:22,821 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-14 11:28:22,821 utils.py[line:294] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-14 11:28:22,831 utils.py[line:303] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:06:06,148 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:06:06,226 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:06:06,227 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:06:06,237 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:06:53,528 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:06:55,531 utils.py[line:303] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:07:00,531 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:07:00,542 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:07:00,542 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:07:00,553 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:09:43,540 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:09:43,541 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:09:43,541 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:09:43,552 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:11:13,523 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:11:15,527 utils.py[line:303] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:11:20,527 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:11:20,537 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:11:20,537 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:11:20,548 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:11:56,916 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:11:58,430 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:11:58,430 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:11:58,440 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:27:14,489 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:27:16,504 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:27:16,504 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:27:16,515 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:29:19,672 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:29:21,675 utils.py[line:303] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:29:26,676 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:29:26,686 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:29:26,686 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:29:26,697 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:31:30,113 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:31:32,117 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:31:32,117 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:31:32,118 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:34:32,487 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:34:34,490 utils.py[line:303] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:34:39,491 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:34:39,502 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:34:39,502 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:34:39,512 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:35:09,026 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:35:11,030 utils.py[line:303] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:35:16,031 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:35:16,041 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:35:16,041 utils.py[line:297] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:35:16,052 utils.py[line:306] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:39:41,098 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:39:43,111 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:39:43,111 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:39:43,122 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:42:09,905 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:42:11,407 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:42:11,407 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:42:11,418 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:42:39,954 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:42:41,958 utils.py[line:306] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:42:46,959 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:42:46,970 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:42:46,970 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:42:46,970 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:43:29,921 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:43:31,934 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:43:31,934 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:43:31,945 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:47:07,042 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:47:09,045 utils.py[line:306] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:47:14,046 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:47:16,049 utils.py[line:306] - ERROR - <20><>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:47:24,585 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:47:25,589 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:47:25,589 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:47:25,600 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:52:15,919 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:52:17,931 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:52:17,931 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:52:17,942 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:54:01,800 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:54:01,801 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:54:01,801 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:54:01,801 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:56:07,759 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:56:09,762 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:56:09,762 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:56:09,773 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:56:23,163 utils.py[line:85] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:56:50,540 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:56:52,544 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:56:52,544 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:56:52,555 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:57:16,989 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:57:17,992 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:57:17,992 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:57:18,003 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:57:50,728 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:57:52,745 utils.py[line:306] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:57:54,886 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:57:55,889 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:57:55,889 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:57:55,900 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:58:24,717 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:58:26,723 utils.py[line:306] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 14:58:31,724 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:58:31,735 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 14:58:31,735 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 14:58:31,745 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:01:50,862 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:01:52,865 utils.py[line:306] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:01:57,866 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:01:57,876 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:01:57,876 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:01:57,887 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:03:20,362 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:03:20,363 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:03:20,363 utils.py[line:300] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:03:20,363 utils.py[line:309] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:13:38,039 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:13:40,072 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:13:40,072 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:13:40,083 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:16:08,840 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:16:10,845 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:16:15,845 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:16:15,856 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:16:15,856 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:16:15,857 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:17:51,706 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:17:51,706 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:17:51,706 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:17:51,707 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:20:08,871 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:20:10,875 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:20:15,875 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:20:15,886 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:20:15,886 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:20:15,896 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:39:51,103 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:39:53,106 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:39:53,106 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:39:53,116 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:42:11,162 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:42:13,166 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:42:13,166 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:42:13,167 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:42:48,239 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:42:49,243 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:42:49,243 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:42:49,254 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:51:25,651 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:27,653 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:51:27,653 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:27,664 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:51:49,787 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:51,802 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:53,805 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:51:58,805 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:58,816 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:51:58,816 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:51:58,827 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:53:13,158 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:53:15,161 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:53:20,162 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:53:20,172 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:53:20,172 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:53:20,183 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:54:36,613 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:54:38,616 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:54:38,616 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:54:38,626 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:55:54,974 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:55:56,978 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:56:01,979 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:56:01,990 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:56:01,990 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:56:02,001 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:56:52,264 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:56:53,767 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:56:53,767 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:56:53,777 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:57:33,177 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:57:35,190 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:57:40,190 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:57:40,201 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:57:40,201 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:57:40,212 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:57:51,525 utils.py[line:86] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 15:57:58,151 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:57:58,152 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 15:57:58,152 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 15:57:58,162 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:08:25,860 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:08:27,862 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:08:27,862 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:08:27,873 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:09:39,183 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:09:40,698 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:09:40,698 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:09:40,709 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:13:45,822 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:13:47,827 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:13:47,827 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:13:47,838 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:15:07,888 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:15:09,891 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:15:09,891 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:15:09,892 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:17:17,434 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:17:19,439 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 16:17:24,439 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:17:24,450 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:17:24,450 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:17:24,461 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:19:45,946 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:19:47,959 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:19:47,959 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:19:47,970 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:21:41,825 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:21:42,826 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:21:42,826 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:21:42,837 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:21:50,789 utils.py[line:282] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-15 16:21:55,887 utils.py[line:282] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-15 16:24:56,215 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:24:58,223 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 16:25:03,223 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:25:05,440 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:25:06,941 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:25:06,941 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:25:06,941 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:25:17,396 utils.py[line:282] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-15 16:25:22,546 utils.py[line:282] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-15 16:28:22,439 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:28:22,440 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:28:22,440 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:28:22,452 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:28:29,646 utils.py[line:282] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-15 16:31:16,121 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:31:16,121 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:31:16,121 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:31:16,122 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:32:10,830 utils.py[line:86] - ERROR - <20><><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 16:32:28,367 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:32:28,368 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 16:32:28,368 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 16:32:28,378 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:02:55,008 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:02:57,012 utils.py[line:307] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 17:03:02,013 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:03:02,024 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:03:02,024 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:03:02,034 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:08:21,572 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:08:21,573 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:08:21,573 utils.py[line:301] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:08:21,574 utils.py[line:310] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:09:29,690 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:09:31,695 utils.py[line:309] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-15 17:09:36,695 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:09:36,696 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:09:36,696 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:09:36,708 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:10:18,170 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:10:20,172 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 17:10:20,172 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 17:10:20,183 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 19:11:12,109 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 19:11:12,138 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 19:11:12,138 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 19:11:12,149 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 19:40:16,318 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 19:40:18,323 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 19:40:18,323 utils.py[line:303] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 19:40:18,323 utils.py[line:312] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 20:07:58,511 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 20:08:00,015 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-15 20:08:00,015 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-15 20:08:00,016 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-18 15:11:54,688 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-18 15:11:54,709 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-18 15:11:54,709 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-18 15:11:54,719 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-18 15:15:38,439 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-18 15:15:40,459 utils.py[line:316] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-18 15:15:45,467 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-18 15:15:45,478 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-18 15:15:45,478 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-18 15:15:45,489 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 09:57:23,873 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 09:57:23,903 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 09:57:23,903 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 09:57:23,914 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:17:16,316 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:17:17,829 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:17:17,829 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:17:17,840 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:19:59,664 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:20:00,678 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:20:00,678 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:20:00,678 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:20:08,698 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:13,831 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:18,942 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:24,053 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:29,158 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:34,311 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:39,451 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:44,552 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:49,663 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:54,766 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:20:59,919 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:21:05,030 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:21:06,181 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:21:06,183 utils.py[line:130] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:21:08,183 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:21:10,183 utils.py[line:316] - ERROR - <20><>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>... 5<><35><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
[WinError 10061] <20><><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܾ<EFBFBD><DCBE><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:26:31,129 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:26:31,129 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:26:31,130 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:26:31,130 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:26:39,121 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:26:44,223 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:26:49,355 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:26:54,443 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:26:59,530 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:04,616 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:09,702 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:14,793 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:19,881 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:25,015 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:30,106 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:35,193 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:40,278 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:45,370 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:50,462 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:27:55,559 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:00,645 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:05,733 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:10,821 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:15,908 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:20,985 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:38,761 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:28:40,266 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:28:40,266 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:28:40,276 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:28:48,903 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:54,005 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:28:59,105 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:04,206 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:09,304 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:14,409 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:19,511 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:21,756 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:29:21,757 utils.py[line:130] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:29:27,034 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:29:29,037 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:29:29,037 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:29:29,048 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:29:36,287 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:41,391 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:46,488 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:29:50,960 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:29:50,962 utils.py[line:130] - ERROR - <20><><EFBFBD>ձ<EFBFBD><D5B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
[WinError 10054] Զ<><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD>ȹر<C8B9><D8B1><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ӡ<EFBFBD>
2024-04-19 13:29:52,963 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:36:00,029 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:36:00,030 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:36:00,030 utils.py[line:310] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:36:00,040 utils.py[line:319] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:36:07,629 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:36:12,719 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:36:17,807 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:36:22,939 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:36:28,031 utils.py[line:291] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:42:18,423 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:42:18,424 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:42:18,424 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:42:18,435 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:42:26,173 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:42:31,310 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:42:36,398 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:06,790 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:51:06,791 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:51:06,791 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 13:51:06,802 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 13:51:14,685 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:19,780 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:24,872 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:29,962 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:35,061 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:40,149 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:45,244 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:50,333 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:51:55,423 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:00,509 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:05,602 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:10,691 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:15,779 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:20,867 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:25,955 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:31,053 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:36,140 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:41,231 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:46,317 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:51,508 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 13:52:56,663 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:01:21,268 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:01:22,771 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:01:22,771 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:01:22,782 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:02:23,518 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:02:23,519 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:02:23,519 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:02:23,530 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:03:55,610 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:03:55,610 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:03:55,611 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:03:55,622 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:04:03,193 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:08,292 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:13,392 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:18,487 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:23,584 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:28,677 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:04:33,763 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:05:30,523 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:05:30,524 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:05:30,524 utils.py[line:316] - WARNING - <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...
2024-04-19 14:05:30,534 utils.py[line:325] - WARNING - <20><><EFBFBD>ӳɹ<D3B3>
2024-04-19 14:05:38,568 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out
2024-04-19 14:05:43,681 utils.py[line:293] - ERROR - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD>timed out

5
root_dir.py Normal file
View File

@ -0,0 +1,5 @@
import pathlib
file_path = pathlib.Path(__file__)
ROOT_DIR = file_path.parent

292
spectrum/01test.ipynb Normal file
View File

@ -0,0 +1,292 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 8,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2023-11-20T11:13:32.538976100Z",
"start_time": "2023-11-20T11:13:31.425375100Z"
}
},
"outputs": [
{
"ename": "AxisError",
"evalue": "axis 2 is out of bounds for array of dimension 1",
"output_type": "error",
"traceback": [
"\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"\u001B[1;31mAxisError\u001B[0m Traceback (most recent call last)",
"Cell \u001B[1;32mIn[8], line 49\u001B[0m\n\u001B[0;32m 46\u001B[0m tomato_spectrum_image \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39mzeros_like(spectrum_image)\n\u001B[0;32m 48\u001B[0m \u001B[38;5;66;03m# 将掩码图像扩展到和光谱图像形状相同,以便进行按位与操作\u001B[39;00m\n\u001B[1;32m---> 49\u001B[0m mask \u001B[38;5;241m=\u001B[39m \u001B[43mnp\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mstack\u001B[49m\u001B[43m(\u001B[49m\u001B[43m[\u001B[49m\u001B[43mmask\u001B[49m\u001B[43m]\u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43mbands\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43maxis\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m2\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m 51\u001B[0m \u001B[38;5;66;03m# 使用掩码提取西红柿区域的光谱图像\u001B[39;00m\n\u001B[0;32m 52\u001B[0m tomato_spectrum_image \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39mwhere(mask \u001B[38;5;241m==\u001B[39m \u001B[38;5;241m255\u001B[39m, spectrum_image, \u001B[38;5;241m0\u001B[39m)\n",
"File \u001B[1;32mD:\\TG\\Miniconda3\\envs\\tengg\\lib\\site-packages\\numpy\\core\\shape_base.py:452\u001B[0m, in \u001B[0;36mstack\u001B[1;34m(arrays, axis, out, dtype, casting)\u001B[0m\n\u001B[0;32m 449\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mall input arrays must have the same shape\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m 451\u001B[0m result_ndim \u001B[38;5;241m=\u001B[39m arrays[\u001B[38;5;241m0\u001B[39m]\u001B[38;5;241m.\u001B[39mndim \u001B[38;5;241m+\u001B[39m \u001B[38;5;241m1\u001B[39m\n\u001B[1;32m--> 452\u001B[0m axis \u001B[38;5;241m=\u001B[39m \u001B[43mnormalize_axis_index\u001B[49m\u001B[43m(\u001B[49m\u001B[43maxis\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mresult_ndim\u001B[49m\u001B[43m)\u001B[49m\n\u001B[0;32m 454\u001B[0m sl \u001B[38;5;241m=\u001B[39m (\u001B[38;5;28mslice\u001B[39m(\u001B[38;5;28;01mNone\u001B[39;00m),) \u001B[38;5;241m*\u001B[39m axis \u001B[38;5;241m+\u001B[39m (_nx\u001B[38;5;241m.\u001B[39mnewaxis,)\n\u001B[0;32m 455\u001B[0m expanded_arrays \u001B[38;5;241m=\u001B[39m [arr[sl] \u001B[38;5;28;01mfor\u001B[39;00m arr \u001B[38;5;129;01min\u001B[39;00m arrays]\n",
"\u001B[1;31mAxisError\u001B[0m: axis 2 is out of bounds for array of dimension 1"
]
}
],
"source": [
"import numpy as np\n",
"import cv2\n",
"import os\n",
"\n",
"# 指定文件夹路径\n",
"folder_path = 'data' # 替换成你的文件夹路径\n",
"mask_folder_path = 'result' # 替换成你的掩码图像文件夹路径\n",
"\n",
"# 获取文件夹中的所有文件\n",
"files = os.listdir(folder_path)\n",
"\n",
"# 遍历每个文件\n",
"for file in files:\n",
" # 检查文件是否是hdr文件\n",
" if file.endswith('.hdr'):\n",
" # 构建完整的hdr文件路径\n",
" hdr_file_path = os.path.join(folder_path, file)\n",
"\n",
" # 读取hdr文件\n",
" with open(hdr_file_path, 'r') as hdr_file:\n",
" lines = hdr_file.readlines()\n",
" for line in lines:\n",
" if line.startswith('lines'):\n",
" height = int(line.split()[-1])\n",
" elif line.startswith('samples'):\n",
" width = int(line.split()[-1])\n",
" elif line.startswith('bands'):\n",
" bands = int(line.split()[-1])\n",
"\n",
" # 构建对应的raw文件路径\n",
" raw_file_path = os.path.splitext(hdr_file_path)[0] + '.raw'\n",
"\n",
" # 读取raw光谱图像\n",
" raw_image = np.fromfile(raw_file_path, dtype='float32')\n",
"\n",
" # 使用从hdr文件中读取的宽度、高度和波段数来重塑raw光谱图像的形状\n",
" spectrum_image = raw_image.reshape((height, width, bands))\n",
"\n",
" # 构建对应的掩码图像路径\n",
" mask_file_path = os.path.join(mask_folder_path, os.path.splitext(file)[0] + '.tiff')\n",
"\n",
" # 读取掩码图像假设掩码图像是一个二值图像西红柿的区域为255其他区域为0\n",
" mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE)\n",
"\n",
" # 创建一个和光谱图像形状相同的全零数组,用于存储西红柿区域的光谱图像\n",
" tomato_spectrum_image = np.zeros_like(spectrum_image)\n",
"\n",
" # 将掩码图像扩展到和光谱图像形状相同,以便进行按位与操作\n",
" mask = np.stack([mask]*bands, axis=2)\n",
"\n",
" # 使用掩码提取西红柿区域的光谱图像\n",
" tomato_spectrum_image = np.where(mask == 255, spectrum_image, 0)\n",
"\n",
" # 计算每个谱段上西红柿的光谱信息均值\n",
" average_values_tomato = np.mean(tomato_spectrum_image, axis=(0, 1))\n",
"\n",
" # 打印结果\n",
" print(f\"文件 {file} 中西红柿区域各波段的平均值:\", average_values_tomato)"
]
},
{
"cell_type": "code",
"execution_count": 2,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]\n",
"\n",
" [[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]\n",
"\n",
" [[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]\n",
"\n",
" ...\n",
"\n",
" [[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]\n",
"\n",
" [[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]\n",
"\n",
" [[0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" ...\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]\n",
" [0. 0. 0. ... 0. 0. 0.]]]\n",
"西红柿区域各波段的平均值: [0.02331245 0.02331355 0.02331434 0.02330351 0.02328778 0.02329406\n",
" 0.02326228 0.02324953 0.02320422 0.02319987 0.02320639 0.02320258\n",
" 0.02320204 0.02322337 0.02322935 0.02323991 0.02326387 0.02327245\n",
" 0.02326593 0.02327108 0.02324165 0.02325363 0.02322353 0.02321509\n",
" 0.02317422 0.02317277 0.02317923 0.02317507 0.02318152 0.02320312\n",
" 0.02320597 0.02322854 0.02325159 0.02326882 0.02326178 0.02326993\n",
" 0.02324535 0.02325787 0.02323463 0.02322856 0.02319151 0.02319442\n",
" 0.02320041 0.02319903 0.02320681 0.02323294 0.02324102 0.02326111\n",
" 0.02328818 0.02330373 0.02330286 0.02330293 0.02328876 0.02330017\n",
" 0.02327968 0.0232756 0.0232363 0.02323936 0.02324224 0.02324493\n",
" 0.02325153 0.02327927 0.02328969 0.02330778 0.02333499 0.02334016\n",
" 0.02334813 0.02334237 0.0233291 0.02333678 0.02331344 0.02330263\n",
" 0.02326433 0.02325943 0.02326216 0.02326128 0.02326241 0.02328353\n",
" 0.023289 0.02329529 0.0233208 0.02332475 0.02332811 0.02332091\n",
" 0.02330128 0.02331001 0.02327851 0.02326897 0.02322166 0.02321757\n",
" 0.02322467 0.02322131 0.02321952 0.02323928 0.02324408 0.02325601\n",
" 0.02328104 0.02329077 0.02328341 0.02329056 0.02326275 0.02327192\n",
" 0.02324721 0.02323763 0.02319732 0.02319809 0.02320318 0.02319734\n",
" 0.0232041 0.02322625 0.02322948 0.02325055 0.02327887 0.02329449\n",
" 0.02329181 0.02329812 0.02327645 0.02328718 0.02326863 0.02325965\n",
" 0.02322663 0.02322855 0.02323177 0.02323323 0.02324393 0.02327164\n",
" 0.02328169 0.0233025 0.02333108 0.02334195 0.02334395 0.0233406\n",
" 0.02332718 0.02333372 0.02331317 0.02330532 0.02326252 0.02326255\n",
" 0.02326744 0.02326685 0.02326851 0.02328742 0.02329235 0.02330284\n",
" 0.02332182 0.02332215 0.02332292 0.02331406 0.02329648 0.02330398\n",
" 0.02327215 0.02326116 0.02321737 0.02320999 0.02321728 0.02321167\n",
" 0.02320731 0.02323294 0.02323689 0.02324381 0.02326807 0.02327303\n",
" 0.02327289 0.02326986 0.02324365 0.02325905 0.02322375 0.02321331\n",
" 0.02317007 0.02316415 0.02317228 0.02316663 0.02316599 0.02318855\n",
" 0.02318928 0.02320436 0.02322696 0.02323972 0.02323037 0.02323674\n",
" 0.02321082 0.02322122 0.02319865 0.02318867 0.02314706 0.02315172\n",
" 0.02315546 0.02315242 0.02316325 0.02318312 0.02318851 0.02321093\n",
" 0.02323843 0.02325755 0.0232583 0.02326134 0.02324466 0.02325552\n",
" 0.02324029 0.02323927 0.02320264 0.0232074 0.02321127 0.02321607\n",
" 0.02322524 0.02325411 0.02326476 0.0232875 0.02331666 0.02332832\n",
" 0.02333939 0.02333211 0.02332272 0.0233288 0.02330828 0.02329813\n",
" 0.0232588 0.02325521 0.02325736 0.02325919 0.02325801 0.02327962\n",
" 0.02328656 0.02329215]\n"
]
}
],
"source": [
"import numpy as np\n",
"import cv2\n",
"\n",
"# 指定raw光谱图像和mask掩码图像的路径\n",
"raw_file_path = 'data/39_ref.raw' # 替换成你的raw光谱图像路径\n",
"mask_file_path = 'result/39.tiff' # 替换成你的mask掩码图像路径\n",
"\n",
"# 读取raw光谱图像\n",
"raw_image = np.fromfile(raw_file_path, dtype='float32')\n",
"\n",
"# 使用图像的宽度、高度和波段数来重塑raw光谱图像的形状\n",
"height = 756 # 替换成你的图像高度\n",
"width = 1200 # 替换成你的图像宽度\n",
"bands = 224 # 替换成你的图像波段数\n",
"spectrum_image = raw_image.reshape((height, width, bands))\n",
"\n",
"# 读取mask掩码图像假设掩码图像是一个二值图像西红柿的区域为255其他区域为0\n",
"mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE)\n",
"\n",
"# 创建一个和光谱图像形状相同的全零数组,用于存储西红柿区域的光谱图像\n",
"tomato_spectrum_image = np.zeros_like(spectrum_image)\n",
"\n",
"# 将掩码图像扩展到和光谱图像形状相同,以便进行按位与操作\n",
"mask = np.stack([mask]*bands, axis=2)\n",
"\n",
"# 使用掩码提取西红柿区域的光谱图像\n",
"tomato_spectrum_image = np.where(mask == 255, spectrum_image, 0)\n",
"print(tomato_spectrum_image)\n",
"# 计算每个谱段上西红柿的光谱信息均值\n",
"average_values_tomato = np.mean(tomato_spectrum_image, axis=(0, 1))\n",
"\n",
"# 打印结果\n",
"print(\"西红柿区域各波段的平均值:\", average_values_tomato)\n",
"import pandas as pd\n",
"\n",
"# 创建一个DataFrame来存储结果\n",
"df = pd.DataFrame(average_values_tomato, columns=['Average Spectral Values'])\n",
"\n",
"# # 将DataFrame导出为Excel文件\n",
"# df.to_excel('39.xlsx', index=False)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-20T13:35:21.812410400Z",
"start_time": "2023-11-20T13:35:17.418971100Z"
}
},
"id": "8bee30bdaaf3385e"
},
{
"cell_type": "code",
"execution_count": 10,
"outputs": [],
"source": [
"import pandas as pd\n",
"\n",
"# 创建一个DataFrame来存储结果\n",
"df = pd.DataFrame(average_values_tomato, columns=['Average Spectral Values'])\n",
"\n",
"# 将DataFrame导出为Excel文件\n",
"df.to_excel('average_values_tomato.xlsx', index=False)"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-20T11:14:35.425251700Z",
"start_time": "2023-11-20T11:14:34.752973600Z"
}
},
"id": "28ec09f66baecac8"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "5d455acb1d6881e0"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

404
spectrum/02picture.ipynb Normal file
View File

@ -0,0 +1,404 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 2,
"id": "initial_id",
"metadata": {
"collapsed": true,
"ExecuteTime": {
"end_time": "2024-03-18T12:58:36.021344Z",
"start_time": "2024-03-18T12:58:35.489144Z"
}
},
"outputs": [],
"source": [
"import numpy as np\n",
"import cv2\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import cv2 as cv\n",
"import os"
]
},
{
"cell_type": "code",
"execution_count": 4,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'str'>\n",
"<class 'numpy.ndarray'>\n",
"(39911424,)\n",
"(87, 2048, 224)\n",
"<class 'numpy.ndarray'>\n",
"[[[1686. 1654. 1654. ... 1654. 1622. 1654.]\n",
" [1689. 1673. 1673. ... 1689. 1689. 1673.]\n",
" [1673. 1657. 1657. ... 1673. 1753. 1609.]\n",
" ...\n",
" [1609. 1689. 1721. ... 1657. 1705. 1577.]\n",
" [1718. 1702. 1654. ... 1574. 1638. 1686.]\n",
" [1686. 1670. 1686. ... 1590. 1686. 1670.]]\n",
"\n",
" [[1654. 1670. 1718. ... 1686. 1654. 1734.]\n",
" [1721. 1657. 1641. ... 1689. 1657. 1721.]\n",
" [1641. 1625. 1705. ... 1705. 1689. 1609.]\n",
" ...\n",
" [1625. 1673. 1689. ... 1673. 1673. 1641.]\n",
" [1686. 1622. 1654. ... 1686. 1654. 1606.]\n",
" [1734. 1654. 1670. ... 1510. 1654. 1654.]]\n",
"\n",
" [[1718. 1702. 1670. ... 1622. 1670. 1686.]\n",
" [1657. 1641. 1641. ... 1705. 1689. 1657.]\n",
" [1673. 1673. 1689. ... 1673. 1625. 1657.]\n",
" ...\n",
" [1625. 1673. 1705. ... 1625. 1609. 1625.]\n",
" [1702. 1686. 1654. ... 1638. 1670. 1654.]\n",
" [1638. 1702. 1686. ... 1670. 1702. 1638.]]\n",
"\n",
" ...\n",
"\n",
" [[1638. 1606. 1686. ... 1654. 1670. 1638.]\n",
" [1721. 1673. 1673. ... 1689. 1641. 1625.]\n",
" [1641. 1641. 1673. ... 1657. 1641. 1625.]\n",
" ...\n",
" [1625. 1609. 1689. ... 1657. 1657. 1673.]\n",
" [1638. 1606. 1702. ... 1622. 1622. 1654.]\n",
" [1574. 1654. 1622. ... 1718. 1670. 1622.]]\n",
"\n",
" [[1590. 1686. 1638. ... 1654. 1654. 1638.]\n",
" [1641. 1657. 1609. ... 1673. 1657. 1641.]\n",
" [1721. 1657. 1641. ... 1657. 1673. 1577.]\n",
" ...\n",
" [1657. 1673. 1641. ... 1593. 1609. 1609.]\n",
" [1622. 1670. 1670. ... 1686. 1734. 1622.]\n",
" [1670. 1590. 1670. ... 1638. 1590. 1638.]]\n",
"\n",
" [[1654. 1654. 1638. ... 1606. 1606. 1558.]\n",
" [1689. 1657. 1689. ... 1657. 1625. 1673.]\n",
" [1657. 1561. 1657. ... 1657. 1673. 1609.]\n",
" ...\n",
" [1657. 1625. 1689. ... 1657. 1609. 1625.]\n",
" [1638. 1654. 1654. ... 1622. 1606. 1590.]\n",
" [1590. 1686. 1606. ... 1574. 1686. 1686.]]]\n"
]
}
],
"source": [
"##合成真彩色图像\n",
"#读取raw文件\n",
"imagePath ='data/new/yellow/1.raw' \n",
"print(type(imagePath))\n",
"rawImage = np.fromfile(imagePath,\"uint16\")\n",
"print(type(rawImage))\n",
"rawShape = rawImage.shape\n",
"print(rawShape)\n",
"formatImage = np.zeros((87,2048,224))\n",
"for row in range(0,87):\n",
" for dim in range(0,224):\n",
" formatImage[row,:,dim] = rawImage[(dim + row*224) * 2048:(dim + 1 + row*224)* 2048]\n",
"print(formatImage.shape)\n",
"print(type(formatImage))\n",
"print(formatImage)\n",
"\n",
"#选择通道数为12/46/96的三个通道相当于rgb三通道的图片\n",
"# imgR = formatImage[:,:,88]\n",
"# imgG = formatImage[:,:,58]\n",
"# imgB = formatImage[:,:,31]\n",
"# \n",
"# rgbImg = cv.merge([imgR,imgG,imgB])\n",
"# print(rgbImg.shape)\n",
"# print(type(rgbImg))\n",
"# cv.imshow('test',rgbImg)\n",
"# cv.waitKey(0)\n",
"# cv.destroyAllWindows()\n",
"# plt.imshow(rgbImg)\n",
"# #保存\n",
"# plt.savefig('result/1_ref.png')\n",
"\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T13:06:05.055643Z",
"start_time": "2024-03-18T13:06:04.869067Z"
}
},
"id": "3443037608cc60f6"
},
{
"cell_type": "code",
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'str'>\n",
"<class 'numpy.ndarray'>\n",
"(50462720,)\n"
]
}
],
"source": [
"##合成真彩色图像\n",
"#读取raw文件\n",
"imagePath = 'data/数据/原光源(条光)/黄果(成熟)/1.raw' \n",
"print(type(imagePath))\n",
"rawImage = np.fromfile(imagePath,\"float16\")\n",
"print(type(rawImage))\n",
"rawShape = rawImage.shape\n",
"print(rawShape)\n",
"formatImage = np.zeros((110,2048,224))\n",
"# 假设 rawImage 已经正确读取\n",
"raw_length = len(rawImage) # 获取 rawImage 的实际长度\n",
"\n",
"for row in range(0, 110):\n",
" for dim in range(0, 224):\n",
" start_index = (dim + row*224) * 2048\n",
" end_index = (dim + 1 + row*224) * 2048\n",
" \n",
" # 检查索引是否在 rawImage 的边界内\n",
" if start_index < raw_length and end_index <= raw_length:\n",
" formatImage[row,:,dim] = rawImage[start_index:end_index]\n",
" else:\n",
" print(f\"索引超出范围: 行 {row}, 波段 {dim}\")\n",
"\n",
"# for row in range(0,110):\n",
"# for dim in range(0,224):\n",
"# # formatImage[row,:,dim] = rawImage[(dim + row*224) * 2048:(dim + 1 + row*224)* 2048]\n",
" \n",
"#选择通道数为12/46/96的三个通道相当于rgb三通道的图片\n",
"# imgR = formatImage[:,:,31]\n",
"# imgG = formatImage[:,:,58]\n",
"# imgB = formatImage[:,:,88]\n",
"# \n",
"# rgbImg = cv.merge([imgR,imgG,imgB])\n",
"# print(rgbImg.shape)\n",
"# print(type(rgbImg))\n",
"# cv.imshow('test',rgbImg)\n",
"# cv.waitKey(0)\n",
"# cv.destroyAllWindows()\n",
"# plt.imshow(rgbImg)\n",
"# #保存\n",
"# plt.savefig('result/1_ref.png')"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2024-03-18T03:26:37.014093Z",
"start_time": "2024-03-18T03:26:36.769031Z"
}
},
"id": "283f370b2401221b",
"execution_count": 5
},
{
"cell_type": "code",
"execution_count": 5,
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(928, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(848, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(902, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(795, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(783, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(708, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(747, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(630, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(709, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(699, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(796, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(865, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(791, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(723, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(797, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(760, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(701, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(770, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(637, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(729, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(762, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(732, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(839, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(760, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(711, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(736, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(758, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(772, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(744, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(775, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(821, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(775, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(820, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(772, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(772, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(747, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(770, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(645, 1200, 3)\n",
"<class 'numpy.ndarray'>\n",
"(756, 1200, 3)\n",
"<class 'numpy.ndarray'>\n"
]
}
],
"source": [
"##循环合成真彩色图像\n",
"# 指定文件夹路径\n",
"folder_path = 'data' # 替换成你的文件夹路径\n",
"# mask_out_path = 'result' # 替换成你的掩码图像文件夹路径\n",
"\n",
"# 获取文件夹中的所有文件\n",
"files = os.listdir(folder_path)\n",
"\n",
"\n",
"for i in range(1, 40):\n",
" with open(folder_path + '/' + str(i) + '_ref.hdr', 'r') as hdr_file:\n",
" lines = hdr_file.readlines()\n",
" for line in lines:\n",
" if line.startswith('lines'):\n",
" height = int(line.split()[-1])\n",
" elif line.startswith('samples'):\n",
" width = int(line.split()[-1])\n",
" elif line.startswith('bands'):\n",
" bands = int(line.split()[-1])\n",
" raw_image = np.fromfile(folder_path + '/' + str(i) + '_ref.raw', dtype='float32')\n",
" \n",
" formatImage = np.zeros((height, width, bands))\n",
" for row in range(0, height):\n",
" for dim in range(0, bands):\n",
" formatImage[row,:,dim] = raw_image[(dim + row*bands) * width:(dim + 1 + row*bands)* width]\n",
" #选择通道数为12/46/96的三个通道相当于rgb三通道的图片\n",
" imgR = formatImage[:,:,12]\n",
" imgG = formatImage[:,:,46]\n",
" imgB = formatImage[:,:,96]\n",
" \n",
" rgbImg = cv.merge([imgR,imgG,imgB])\n",
" print(rgbImg.shape)\n",
" print(type(rgbImg))\n",
" \n",
" Img_Name = \"./tcimage/\" + str(i)+ \".png\"\n",
" cv.imwrite(Img_Name, rgbImg*255)\n",
" # cv.imshow('test',rgbImg)\n",
" # cv.waitKey(0)\n",
" # cv.destroyAllWindows()\n",
"# #读取raw文件\n",
"# imagePath = 'data/1_ref.raw' \n",
"# print(type(imagePath))\n",
"# rawImage = np.fromfile(imagePath,\"float32\")\n",
"# print(type(rawImage))\n",
"# rawShape = rawImage.shape\n",
"# print(rawShape)\n",
"# formatImage = np.zeros((928,1200,224))\n",
"# for row in range(0,928):\n",
"# for dim in range(0,224):\n",
"# formatImage[row,:,dim] = rawImage[(dim + row*224) * 1200:(dim + 1 + row*224)* 1200]\n",
"# #选择通道数为12/46/96的三个通道相当于rgb三通道的图片\n",
"# imgR = formatImage[:,:,12]\n",
"# imgG = formatImage[:,:,46]\n",
"# imgB = formatImage[:,:,96]\n",
" \n",
"# rgbImg = cv.merge([imgR,imgG,imgB])\n",
"# print(rgbImg.shape)\n",
"# print(type(rgbImg))\n",
"# cv.imshow('test',rgbImg)\n",
"# cv.waitKey(0)\n",
"# cv.destroyAllWindows()\n",
"# plt.imshow(rgbImg)\n",
"# #保存\n",
"# plt.savefig('result/1_ref.png')\n",
"\n"
],
"metadata": {
"collapsed": false,
"ExecuteTime": {
"end_time": "2023-11-24T02:56:13.173734400Z",
"start_time": "2023-11-24T02:50:24.958389400Z"
}
},
"id": "15a3889f7bf1917f"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "17b929b3de3fa2ed"
},
{
"cell_type": "code",
"execution_count": null,
"outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
"id": "e00c8e929ee57b60"
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

789
spectrum/03mask.ipynb Normal file

File diff suppressed because one or more lines are too long

46873
spectrum/04average.ipynb Normal file

File diff suppressed because it is too large Load Diff

80
spectrum/PLS.py Normal file
View File

@ -0,0 +1,80 @@
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.cross_decomposition import PLSRegression
from sklearn.metrics import r2_score, mean_squared_error
import copy
from math import *
#载入数据
data_path = './/merged1124.xlsx' #数据
label_path = './/label.xlsx' #标签(反射率)
D = pd.read_excel(data_path)
L = pd.read_excel(label_path)
data = np.array(D)
label = np.array(L)
print(label.shape)
# 绘制原始后图片
plt.figure(500)
x_col = data[:,0] #数组逆序
y_col = data[:, 1:40]
plt.plot(x_col, y_col)
plt.xlabel("Wavenumber(nm)")
plt.ylabel("Absorbance")
plt.title("The spectrum of the tomato dataset",fontweight= "semibold",fontsize='x-large')
# plt.savefig('.//Result//MSC.png')
plt.show()
#随机划分数据集
x_data = np.transpose(data[:, 1:40])
print(x_data.shape)
y_data = copy.deepcopy(label)
print(y_data.shape)
test_ratio = 0.2
X_train,X_test,y_train,y_test = train_test_split(x_data,y_data,test_size=test_ratio,shuffle=True,random_state=2)
#载入数据
#PCA降维到10个维度,测试该数据最好
pca=PCA(n_components=28) #只保留2个特征
pca.fit(X_train)
X_train_reduction = pca.transform(X_train)
X_test_reduction = pca.transform(X_test)
# PCA降维后图片绘制
plt.figure(100)
plt.scatter(X_train_reduction[:, 0], X_train_reduction[:, 1],marker='o')
plt.xlabel("Wavenumber(nm)")
plt.ylabel("Absorbance")
plt.title("The PCA for tomato dataset",fontweight= "semibold",fontsize='large')
# plt.savefig('.//Result//PCA.png')
plt.show()
#pls预测
pls2 = PLSRegression(n_components=5)
pls2.fit(X_train_reduction, y_train)
train_pred = pls2.predict(X_train_reduction)
pred = pls2.predict(X_test_reduction)
#计算R2
train_R2 = r2_score(train_pred,y_train)
R2 = r2_score(y_test,pred) #Y_true, Pred
print('训练R2:{}'.format(train_R2))
print('测试R2:{}'.format(R2))
#计算MSE
print('********************')
x_MSE = mean_squared_error(train_pred,y_train)
t_MSE = mean_squared_error(y_test,pred)
print('训练MSE:{}'.format(x_MSE))
print('测试MSE:{}'.format(t_MSE))
#计算RMSE
print('********************')
print('训练RMSE:{}'.format(sqrt(x_MSE)))
print('测试RMSE:{}'.format(sqrt(t_MSE)))

22
spectrum/pinjie.py Normal file
View File

@ -0,0 +1,22 @@
import pandas as pd
import os
# 指定Excel文件的文件夹路径
folder_path = 'average_result' # 替换成你的文件夹路径
# 获取文件夹下所有Excel文件的文件名
excel_files = [file for file in os.listdir(folder_path) if file.endswith('.xlsx') or file.endswith('.xls')]
# 按照文件名排序,确保按照表格序号顺序读取
# 使用int函数将文件名转换为整数然后进行排序
# excel_files.sort(key=lambda x: int(x.split('.')[0]))
# 创建一个空列表用于存储每个Excel文件的数据框
dfs = []
for i in range(1,40):
df = pd.read_excel(folder_path + '/'+'test'+str(i) +'.xlsx')
# 将数据框添加到列表中
dfs.append(df)
# 使用pandas.concat函数将列表中的所有数据框按列合并
result = pd.concat(dfs, axis=1)
# 将结果保存为新的Excel文件
result.to_excel('merged.xlsx', index=False)

112
spectrum/test.py Normal file
View File

@ -0,0 +1,112 @@
import numpy as np
import cv2
import copy
import pandas as pd
import os
# 指定文件夹路径
folder_path = 'data' # 替换成你的文件夹路径
mask_folder_path = 'result' # 替换成你的掩码图像文件夹路径
# 获取文件夹中的所有文件
files = os.listdir(folder_path)
files1 = os.listdir(mask_folder_path)
D =[]
for i in range(39, 40):
with open(folder_path + '/' + str(i) + '_ref.hdr', 'r') as hdr_file:
lines = hdr_file.readlines()
for line in lines:
if line.startswith('lines'):
height = int(line.split()[-1])
elif line.startswith('samples'):
width = int(line.split()[-1])
elif line.startswith('bands'):
bands = int(line.split()[-1])
raw_image = np.fromfile(folder_path + '/' + str(i) + '_ref.raw', dtype='float32')
mask = cv2.imread(mask_folder_path + '/' + str(i) + '.tiff', cv2.IMREAD_GRAYSCALE)
formatImage = np.zeros((height, width, bands))
for row in range(0, height):
for dim in range(0, bands):
formatImage[row,:,dim] = raw_image[(dim + row*bands) * width:(dim + 1 + row*bands)* width]
# 创建一个和光谱图像形状相同的全零数组,用于存储西红柿区域的光谱图像
tomato_spectrum_image = np.zeros_like(formatImage)
# 将掩码图像扩展到和光谱图像形状相同,以便进行按位与操作
mask = np.stack([mask]*bands, axis=2)
# 使用掩码提取西红柿区域的光谱图像
tomato_spectrum_image = np.where(mask == 255, formatImage, 0)
# print(tomato_spectrum_image.shape)
# cv2.imshow('', tomato_spectrum_image[:, :, 145])
# cv2.waitKey(0)
data_save = []
for i in range(0, 224):
data = copy.deepcopy(tomato_spectrum_image[:, :, i])
data[data>0] = 1
num = np.sum(data)
print(num)
average_values_tomato = np.sum(tomato_spectrum_image[:, :, i])/num
print("西红柿区域各波段的平均值:", average_values_tomato)
data_save.append(average_values_tomato)
print(data_save)
D.append(data_save)
# 创建一个DataFrame来存储结果
D_array = np.array(D).reshape(224, 1)
df = pd.DataFrame(D_array)
# 将DataFrame导出为Excel文件
df.to_excel('test39.xlsx', index=False)
#选择通道数为12/46/96的三个通道相当于rgb三通道的图片
# imgR = formatImage[:,:,12]
# imgG = formatImage[:,:,46]
# imgB = formatImage[:,:,96]
#
# rgbImg = cv2.merge([imgR, imgG, imgB])
# cv2.imshow('test', rgbImg)
# cv2.waitKey()
#
# # 使用图像的宽度、高度和波段数来重塑raw光谱图像的形状
# height = 756 # 替换成你的图像高度
# width = 1200 # 替换成你的图像宽度
# bands = 224 # 替换成你的图像波段数
# spectrum_image = raw_image.reshape((height, width, bands))
# # 读取mask掩码图像假设掩码图像是一个二值图像西红柿的区域为255其他区域为0
# mask = cv2.imread(mask_file_path, cv2.IMREAD_GRAYSCALE)
# # 创建一个和光谱图像形状相同的全零数组,用于存储西红柿区域的光谱图像
# tomato_spectrum_image = np.zeros_like(spectrum_image)
#
# # 将掩码图像扩展到和光谱图像形状相同,以便进行按位与操作
# mask = np.stack([mask]*bands, axis=2)
#
# # 使用掩码提取西红柿区域的光谱图像
# tomato_spectrum_image = np.where(mask == 255, spectrum_image, 0)
# print(tomato_spectrum_image.shape)
# # data_save = []
# # for i in range(0, 224):
# # data = copy.deepcopy(tomato_spectrum_image[:, :, i])
# # data[data>0] = 1
# # num = np.sum(data)
# # print(num)
# # average_values_tomato = np.sum(tomato_spectrum_image[:, :, i])/num
# # print("西红柿区域各波段的平均值:", average_values_tomato)
# # data_save.append(average_values_tomato)
# # print(data_save)
# # 计算每个谱段上西红柿的光谱信息均值
# # average_values_tomato = np.mean(tomato_spectrum_image, axis=(0, 1))
#
# # print(tomato_spectrum_image[:, :, 145])
#
# # cv2.imshow('', tomato_spectrum_image[:, :, 145])
# # cv2.waitKey(0)
# # 打印结果
# # print("西红柿区域各波段的平均值:", average_values_tomato)
# # import pandas as pd
# #
# # # 创建一个DataFrame来存储结果
# # df = pd.DataFrame(average_values_tomato, columns=['Average Spectral Values'])
# # 将DataFrame导出为Excel文件
# df.to_excel('39.xlsx', index=False)

516
utils.py Normal file
View File

@ -0,0 +1,516 @@
import cv2
import numpy as np
from genetic_selection import GeneticSelectionCV
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import logging
import os
import shutil
import time
import socket
def read_envi_ascii(file_name, save_xy=False, hdr_file_name=None):
"""
Read envi ascii file. Use ENVI ROI Tool -> File -> output ROIs to ASCII...
:param file_name: file name of ENVI ascii file
:param hdr_file_name: hdr file name for a "BANDS" vector in the output
:param save_xy: save the x, y position on the first two cols of the result vector
:return: dict {class_name: vector, ...}
"""
number_line_start_with = "; Number of ROIs: "
roi_name_start_with, roi_npts_start_with = "; ROI name: ", "; ROI npts:"
data_start_with, data_start_with2, data_start_with3 = "; ID", "; ID", "; ID"
class_num, class_names, class_nums, vectors = 0, [], [], []
with open(file_name, 'r') as f:
for line_text in f:
if line_text.startswith(number_line_start_with):
class_num = int(line_text[len(number_line_start_with):])
elif line_text.startswith(roi_name_start_with):
class_names.append(line_text[len(roi_name_start_with):-1])
elif line_text.startswith(roi_npts_start_with):
class_nums.append(int(line_text[len(roi_name_start_with):-1]))
elif line_text.startswith(data_start_with) or line_text.startswith(data_start_with2) or line_text.startswith(data_start_with3):
col_list = list(filter(None, line_text[1:].split(" ")))
assert (len(class_names) == class_num) and (len(class_names) == len(class_nums))
break
elif line_text.startswith(";"):
continue
for vector_rows in class_nums:
vector_str = ''
for i in range(vector_rows):
vector_str += f.readline()
vector = np.fromstring(vector_str, dtype=float, sep=" ").reshape(-1, len(col_list))
assert vector.shape[0] == vector_rows
vector = vector[:, 3:] if not save_xy else vector[:, 1:]
vectors.append(vector)
f.readline() # suppose to read a blank line
if hdr_file_name is not None:
import re
with open(hdr_file_name, 'r') as f:
hdr_info = f.read()
bands = re.findall(r"wavelength = {[^{}]+}", hdr_info, flags=re.IGNORECASE | re.MULTILINE)
bands_num = re.findall(r"bands\s*=\s*(\d+)", hdr_info, flags=re.I)
if (len(bands) == 0) or len(bands_num) == 0:
Warning("The given hdr file is invalid, can't find bands = ? or wavelength = {?}.")
else:
bands = re.findall(r'{[^{}]+}', bands[0], flags=re.MULTILINE)[0][3:-2]
bands = bands.split(',\n')
bands = np.asarray(bands, dtype=float)
bands_num = int(bands_num[0])
if bands_num == bands.shape[0]:
bands = np.array(bands, dtype=float)
vectors.append(bands)
class_names.append("BANDS")
else:
Warning("The given hdr file is invalid, bands num is not equal to wavelength.")
return dict(zip(class_names, vectors))
def ga_feature_extraction(data_x, data_y):
'''
使用遗传算法进行特征提取
:param data_x: 特征
:param data_y: 类别
'''
Xtrain, Xtest, Ytrain, Ytest = train_test_split(data_x, data_y, test_size=0.3)
clf = DecisionTreeClassifier(random_state=3)
selector = GeneticSelectionCV(clf, cv=30,
verbose=1,
scoring="accuracy",
max_features=10,
n_population=500,
crossover_proba=0.6,
mutation_proba=0.3,
n_generations=300,
crossover_independent_proba=0.6,
mutation_independent_proba=0.1,
tournament_size=10,
n_gen_no_change=10,
caching=True,
n_jobs=-1)
selector = selector.fit(Xtrain, Ytrain)
Xtrain_ga, Xtest_ga = Xtrain[:, selector.support_], Xtest[:, selector.support_]
clf = clf.fit(Xtrain_ga, Ytrain)
print(np.where(selector.support_ == True))
y_pred = clf.predict(Xtest_ga)
print(classification_report(Ytest, y_pred))
print(confusion_matrix(Ytest, y_pred))
def read_raw(file_name, shape=None, setect_bands=None, cut_shape=None):
'''
读取raw文件
:param file_name: 文件名
:param setect_bands: 选择的波段
:return: 波段数据
'''
if shape is None:
shape = (692, 272, 384)
with open(file_name, 'rb') as f:
data = np.frombuffer(f.read(), dtype=np.float32).reshape(shape).transpose(0, 2, 1)
if setect_bands is not None:
data = data[:, :, setect_bands]
if cut_shape is not None:
data = data[: cut_shape[0], : cut_shape[1], :]
return data
def save_raw(file_name, data):
'''
保存raw文件
:param file_name: 文件名
:param data: 数据
'''
data = data.transpose(0, 2, 1)
# 将data转换为一维数组
data = data.reshape(-1)
with open(file_name, 'wb') as f:
f.write(data.astype(np.float32).tobytes())
def read_rgb(file_name):
'''
读取rgb文件
:param file_name: 文件名
:return: rgb数据
'''
data = cv2.imread(file_name)
data = cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
#给一个颜色对应的字典用于将rgb转换为类别白色对应0黄色对应1青色对应2红色对应3绿色对应4蓝色对应5
color_dict = {(255, 255, 255): 0, (255, 255, 0): 1, (0, 255, 255): 2, (255, 0, 0): 3, (0, 255, 0): 4, (0, 0, 255): 5}
# 保存图片的形状,用于将一维数组转换为三维数组
shape = data.shape
# 将rgb转换为类别
data = data.reshape(-1, 3).tolist()
# 将rgb转换为类别
mapped_data = []
for i, color in enumerate(data):
mapped_value = color_dict.get(tuple(color))
if mapped_value is None:
print("No mapping found for color", color, "at index", i)
else:
mapped_data.append(mapped_value)
# 将一维数组转换为三维数组
data = np.array(mapped_data).reshape(shape[0], shape[1])
return data
def read_data(raw_path, rgb_path, shape=None, setect_bands=None, blk_size=4, cut_shape=None, dp=False):
'''
读取数据
:param raw_path: raw文件路径
:param rgb_path: rgb文件路径
:param setect_bands: 选择的波段
:return: 波段数据rgb数据
'''
if shape is None:
shape = (692, 272, 384)
with open(raw_path, 'rb') as f:
raw = np.frombuffer(f.read(), dtype=np.float32).reshape(shape).transpose(0, 2, 1)
if setect_bands is not None:
raw = raw[:, :, setect_bands]
color_dict = {(255, 255, 255): 0, (255, 255, 0): 1, (0, 255, 255): 2, (255, 0, 0): 3, (0, 255, 0): 4,
(0, 0, 255): 5}
rgb = cv2.imread(rgb_path)
rgb = cv2.cvtColor(rgb, cv2.COLOR_BGR2RGB)
if cut_shape is not None:
raw = raw[ :cut_shape[0], :cut_shape[1], :]
rgb = rgb[ :cut_shape[0], :cut_shape[1], :]
data_x = []
data_y = []
for i in range(0, rgb.shape[0], blk_size):
for j in range(0, rgb.shape[1], blk_size):
x = raw[i:i + blk_size, j:j + blk_size, :]
y = rgb[i:i + blk_size, j:j + blk_size]
# # 取y的第三行第三列的像素值判断该像素值是否在color_dict中如果在则将x和y添加到data_x和data_y中
# y = tuple(y[2, 2, :])
# if y in color_dict.keys():
# data_x.append(x)
# data_y.append(color_dict[y])
# 取y的中心点像素值判断该像素值是否在color_dict中如果在则将x和y添加到data_x和data_y中
y = tuple(y[blk_size//2, blk_size//2, :])
if y in color_dict.keys():
data_x.append(x)
data_y.append(color_dict[y])
data_x = np.array(data_x)
data_y = np.array(data_y).astype(np.uint8)
return data_x, data_y
def try_connect(connect_ip: str, port_number: int, is_repeat: bool = False, max_reconnect_times: int = 50) -> (
bool, socket.socket):
"""
尝试连接.
:param is_repeat: 是否是重新连接
:param max_reconnect_times:最大重连次数
:return: (连接状态True为成功, Socket / None)
"""
reconnect_time = 0
while reconnect_time < max_reconnect_times:
logging.warning(f'尝试{"重新" if is_repeat else ""}发起第{reconnect_time + 1}次连接...')
try:
connected_sock = PreSocket(socket.AF_INET, socket.SOCK_STREAM)
connected_sock.connect((connect_ip, port_number))
except Exception as e:
reconnect_time += 1
logging.error(f'{reconnect_time}次连接失败... 5秒后重新连接...\n {e}')
time.sleep(5)
continue
logging.warning(f'{"重新" if is_repeat else ""}连接成功')
return True, connected_sock
return False, None
class PreSocket(socket.socket):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.pre_pack = b''
self.settimeout(5)
def receive(self, *args, **kwargs):
if self.pre_pack == b'':
return self.recv(*args, **kwargs)
else:
data_len = args[0]
required, left = self.pre_pack[:data_len], self.pre_pack[data_len:]
self.pre_pack = left
return required
def set_prepack(self, pre_pack: bytes):
temp = self.pre_pack
self.pre_pack = temp + pre_pack
class DualSock(PreSocket):
def __init__(self, connect_ip='127.0.0.1', recv_port: int = 21122, send_port: int = 21123):
super().__init__()
received_status, self.received_sock = try_connect(connect_ip=connect_ip, port_number=recv_port)
send_status, self.send_sock = try_connect(connect_ip=connect_ip, port_number=send_port)
self.status = received_status and send_status
def send(self, *args, **kwargs) -> int:
return self.send_sock.send(*args, **kwargs)
def receive(self, *args, **kwargs) -> bytes:
return self.received_sock.receive(*args, **kwargs)
def set_prepack(self, pre_pack: bytes):
self.received_sock.set_prepack(pre_pack)
def reconnect(self, connect_ip='127.0.0.1', recv_port:int = 21122, send_port: int = 21123):
received_status, self.received_sock = try_connect(connect_ip=connect_ip, port_number=recv_port)
send_status, self.send_sock = try_connect(connect_ip=connect_ip, port_number=send_port)
return received_status and send_status
def receive_sock(recv_sock: PreSocket, pre_pack: bytes = b'', time_out: float = -1.0, time_out_single=5e20) -> (
bytes, bytes):
"""
从指定的socket中读取数据.自动阻塞如果返回的数据为空则说明连接出现问题需要重新连接
:param recv_sock: 指定sock
:param pre_pack: 上一包的粘包内容
:param time_out: 每隔time_out至少要发来一次指令,否则认为出现问题进行重连小于0则为一直等
:param time_out_single: 单次指令超时时间单位是秒
:return: data, next_pack
"""
recv_sock.set_prepack(pre_pack)
# 开头校验
time_start_recv = time.time()
while True:
if time_out > 0:
if (time.time() - time_start_recv) > time_out:
logging.error(f'指令接收超时')
return b'', b''
try:
temp = recv_sock.receive(1)
except ConnectionError as e:
logging.error(f'连接出错, 错误代码:\n{e}')
return b'', b''
except TimeoutError as e:
# logging.error(f'超时了,错误代码: \n{e}')
logging.info('运行中,等待指令..')
continue
except socket.timeout as e:
logging.info('运行中,等待指令..')
continue
except Exception as e:
logging.error(f'遇见未知错误,错误代码: \n{e}')
return b'', b''
if temp == b'\xaa':
break
# 接收开头后,开始进行时间记录
time_start_recv = time.time()
# 获取报文长度
temp = b''
while len(temp) < 4:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(1)
except Exception as e:
logging.error(f'接收报文的长度不正确, 错误代码: \n{e}')
return b'', b''
try:
data_len = int.from_bytes(temp, byteorder='big')
except Exception as e:
logging.error(f'转换失败,错误代码 \n{e}')
return b'', b''
# 读取报文内容
temp = b''
while len(temp) < data_len:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(data_len)
except Exception as e:
logging.error(f'接收报文内容失败, 错误代码: \n{e}')
return b'', b''
data, next_pack = temp[:data_len], temp[data_len:]
recv_sock.set_prepack(next_pack)
next_pack = b''
# 进行数据校验
temp = b''
while len(temp) < 3:
if (time.time() - time_start_recv) > time_out_single:
logging.error(f'单次指令接收超时')
return b'', b''
try:
temp += recv_sock.receive(1)
except Exception as e:
logging.error(f'接收报文校验失败, 错误代码: \n{e}')
return b'', b''
if temp == b'\xff\xff\xbb':
return data, next_pack
else:
logging.error(f"接收了一个完美的只错了校验位的报文")
return b'', b''
def parse_protocol(data: bytes) -> (str, any):
'''
指令转换
:param data: 接收到的报文
:return: 指令类型指令内容
'''
try:
assert len(data) > 4
except AssertionError:
logging.error('指令转换失败长度不足5')
return '', None
cmd, data = data[:4], data[4:]
cmd = cmd.decode('ascii').strip().upper()
if cmd == 'IM':
n_rows, n_cols, img = data[:2], data[2:4], data[4:]
try:
n_rows, n_cols = [int.from_bytes(x, byteorder='big') for x in [n_rows, n_cols]]
except Exception as e:
logging.error(f'长宽转换失败, 错误代码{e}, 报文大小: n_rows:{n_rows}, n_cols: {n_cols}')
return '', None
try:
assert n_rows * n_cols * 3 == len(img)
except AssertionError:
logging.error('图像指令IM转换失败数据长度错误')
return '', None
img = np.frombuffer(img, dtype=np.uint8).reshape((n_rows, n_cols, -1))
return cmd, img
def ack_sock(send_sock: socket.socket, cmd_type: str) -> bool:
'''
发送应答
:param cmd_type:指令类型
:param send_sock:指定sock
:return:是否发送成功
'''
msg = b'\xaa\x00\x00\x00\x05' + (' A' + cmd_type).upper().encode('ascii') + b'\xff\xff\xff\xbb'
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送应答失败,错误类型:{e}')
return False
return True
def done_sock(send_sock: socket.socket, cmd_type: str, result = '') -> bool:
'''
发送任务完成指令
:param send_sock: 指定sock
:param cmd_type: 指令类型
:param result: 数据
:return: 是否发送成功
'''
cmd = cmd_type.strip().upper()
if cmd_type == 'IM':
result = result.encode()
# 指令4位
length = len(result) + 4
length = length.to_bytes(4, byteorder='big')
# msg = b'\xaa' + length + (' D' + cmd).upper().encode('ascii') + result + b'\xff\xff\xbb'
msg = result
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
return True
def simple_sock(send_sock: socket.socket, cmd_type: str, result) -> bool:
'''
发送任务完成指令
:param cmd_type:指令类型
:param send_sock:指定sock
:param result:数据
:return:是否发送成功
'''
cmd_type = cmd_type.strip().upper()
if cmd_type == 'IM':
if result == 0:
msg = b'S'
elif result == 1:
msg = b'Z'
elif result == 2:
msg = b'Q'
elif cmd_type == 'TR':
msg = b'A'
elif cmd_type == 'MD':
msg = b'D'
elif cmd_type == 'KM':
msg = b'K'
result = result.encode('ascii')
result = b',' + result
length = len(result)
msg = msg + length.to_bytes(4, 'big') + result
try:
send_sock.send(msg)
except Exception as e:
logging.error(f'发送完成指令失败,错误类型:{e}')
return False
return True
def mkdir_if_not_exist(dir_name, is_delete=False):
"""
创建文件夹
:param dir_name: 文件夹
:param is_delete: 是否删除
:return: 是否成功
"""
try:
if is_delete:
if os.path.exists(dir_name):
shutil.rmtree(dir_name)
print('[Info] 文件夹 "%s" 存在, 删除文件夹.' % dir_name)
if not os.path.exists(dir_name):
os.makedirs(dir_name)
print('[Info] 文件夹 "%s" 不存在, 创建文件夹.' % dir_name)
return True
except Exception as e:
print('[Exception] %s' % e)
return False
def create_file(file_name):
"""
创建文件
:param file_name: 文件名
:return: None
"""
if os.path.exists(file_name):
print("文件存在:%s" % file_name)
return False
# os.remove(file_name) # 删除已有文件
if not os.path.exists(file_name):
print("文件不存在,创建文件:%s" % file_name)
open(file_name, 'a').close()
return True
class Logger(object):
def __init__(self, is_to_file=False, path=None):
self.is_to_file = is_to_file
if path is None:
path = "Astragalins.log"
self.path = path
create_file(path)
def log(self, content):
if self.is_to_file:
with open(self.path, "a") as f:
print(time.strftime("[%Y-%m-%d_%H-%M-%S]:"), file=f)
print(content, file=f)
else:
print(content)