mirror of
https://github.com/NanjingForestryUniversity/supermachine--tomato-passion_fruit.git
synced 2025-11-08 22:34:00 +00:00
feat:20240410RGBtest1为socket通信下包含番茄rgb检测模型的全流程上机代码;20240419RGBtest2为pipe命名管道通信下包含番茄rgb检测模型的全流程上机代码;spectrum为光谱数据预处理代码(果子区域谱段均值)
This commit is contained in:
commit
ea62ca237c
10
.idea/.gitignore
generated
vendored
Normal file
10
.idea/.gitignore
generated
vendored
Normal 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
|
||||
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
.idea/inspectionProfiles/profiles_settings.xml
generated
Normal 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
4
.idea/misc.xml
generated
Normal 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
8
.idea/modules.xml
generated
Normal 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>
|
||||
8
.idea/supermachine--tomato-passion_fruit.iml
generated
Normal file
8
.idea/supermachine--tomato-passion_fruit.iml
generated
Normal 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
6
.idea/vcs.xml
generated
Normal 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>
|
||||
444
20240410RGBtest1/01picturemask.ipynb
Normal file
444
20240410RGBtest1/01picturemask.ipynb
Normal 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
|
||||
}
|
||||
298
20240410RGBtest1/image_preprocessing.py
Normal file
298
20240410RGBtest1/image_preprocessing.py
Normal 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
217
20240410RGBtest1/main.py
Normal 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))
|
||||
129
20240410RGBtest1/parameter calculation.py
Normal file
129
20240410RGBtest1/parameter calculation.py
Normal 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
211
20240410RGBtest1/qt_test.py
Normal 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
8
20240410RGBtest1/super-tomato/.idea/.gitignore
generated
vendored
Normal 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
|
||||
48
20240410RGBtest1/super-tomato/.idea/inspectionProfiles/Project_Default.xml
generated
Normal file
48
20240410RGBtest1/super-tomato/.idea/inspectionProfiles/Project_Default.xml
generated
Normal 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>
|
||||
6
20240410RGBtest1/super-tomato/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
6
20240410RGBtest1/super-tomato/.idea/inspectionProfiles/profiles_settings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<settings>
|
||||
<option name="USE_PROJECT_PROFILE" value="false" />
|
||||
<version value="1.0" />
|
||||
</settings>
|
||||
</component>
|
||||
7
20240410RGBtest1/super-tomato/.idea/misc.xml
generated
Normal file
7
20240410RGBtest1/super-tomato/.idea/misc.xml
generated
Normal 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>
|
||||
8
20240410RGBtest1/super-tomato/.idea/modules.xml
generated
Normal file
8
20240410RGBtest1/super-tomato/.idea/modules.xml
generated
Normal 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>
|
||||
6
20240410RGBtest1/super-tomato/.idea/other.xml
generated
Normal file
6
20240410RGBtest1/super-tomato/.idea/other.xml
generated
Normal 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>
|
||||
8
20240410RGBtest1/super-tomato/.idea/super-tomato.iml
generated
Normal file
8
20240410RGBtest1/super-tomato/.idea/super-tomato.iml
generated
Normal 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>
|
||||
14
20240410RGBtest1/super-tomato/1111.py
Normal file
14
20240410RGBtest1/super-tomato/1111.py
Normal 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')
|
||||
65
20240410RGBtest1/super-tomato/3D.py
Normal file
65
20240410RGBtest1/super-tomato/3D.py
Normal 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')
|
||||
157
20240410RGBtest1/super-tomato/CNN_green.py
Normal file
157
20240410RGBtest1/super-tomato/CNN_green.py
Normal 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'])
|
||||
85
20240410RGBtest1/super-tomato/ML_green.py
Normal file
85
20240410RGBtest1/super-tomato/ML_green.py
Normal 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)
|
||||
169
20240410RGBtest1/super-tomato/U_net.py
Normal file
169
20240410RGBtest1/super-tomato/U_net.py
Normal 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')
|
||||
BIN
20240410RGBtest1/super-tomato/best_model.pth
Normal file
BIN
20240410RGBtest1/super-tomato/best_model.pth
Normal file
Binary file not shown.
57
20240410RGBtest1/super-tomato/defect.py
Normal file
57
20240410RGBtest1/super-tomato/defect.py
Normal 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()
|
||||
BIN
20240410RGBtest1/super-tomato/defect_big.bmp
Normal file
BIN
20240410RGBtest1/super-tomato/defect_big.bmp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 MiB |
295
20240410RGBtest1/super-tomato/image_preprocessing.py
Normal file
295
20240410RGBtest1/super-tomato/image_preprocessing.py
Normal 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()
|
||||
105
20240410RGBtest1/super-tomato/svm.py
Normal file
105
20240410RGBtest1/super-tomato/svm.py
Normal 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}秒')
|
||||
BIN
20240410RGBtest1/super-tomato/svm_green.joblib
Normal file
BIN
20240410RGBtest1/super-tomato/svm_green.joblib
Normal file
Binary file not shown.
56
20240410RGBtest1/super-tomato/test.py
Normal file
56
20240410RGBtest1/super-tomato/test.py
Normal 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
660
20240410RGBtest1/utils.py
Normal 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
|
||||
0
20240410RGBtest1/新建 Markdown.md
Normal file
0
20240410RGBtest1/新建 Markdown.md
Normal file
65
20240410RGBtest1/通信协议(旻哥暂时同意版).md
Normal file
65
20240410RGBtest1/通信协议(旻哥暂时同意版).md
Normal 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
|
||||
BIN
20240410RGBtest1/通信协议(旻哥暂时同意版).pdf
Normal file
BIN
20240410RGBtest1/通信协议(旻哥暂时同意版).pdf
Normal file
Binary file not shown.
228
20240419RGBtest2/main.py
Normal file
228
20240419RGBtest2/main.py
Normal 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
124
20240419RGBtest2/pipe.py
Normal 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
123
20240419RGBtest2/qt_test.py
Normal 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
579
20240419RGBtest2/utils.py
Normal 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
165
classfier.py
Normal 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为杂质2,3为杂质1,4为甘草片,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
197
main.py
Normal 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.array,categories是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
198
model.py
Normal 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
BIN
models/12.p
Normal file
Binary file not shown.
BIN
models/astragalin.p
Normal file
BIN
models/astragalin.p
Normal file
Binary file not shown.
BIN
models/dt.p
Normal file
BIN
models/dt.p
Normal file
Binary file not shown.
BIN
models/resNet34.pth
Normal file
BIN
models/resNet34.pth
Normal file
Binary file not shown.
167
qt_test.py
Normal file
167
qt_test.py
Normal 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
6
renovate.json
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended"
|
||||
]
|
||||
}
|
||||
840
report.log
Normal file
840
report.log
Normal 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
5
root_dir.py
Normal file
@ -0,0 +1,5 @@
|
||||
|
||||
import pathlib
|
||||
|
||||
file_path = pathlib.Path(__file__)
|
||||
ROOT_DIR = file_path.parent
|
||||
292
spectrum/01test.ipynb
Normal file
292
spectrum/01test.ipynb
Normal 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
404
spectrum/02picture.ipynb
Normal 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
789
spectrum/03mask.ipynb
Normal file
File diff suppressed because one or more lines are too long
46873
spectrum/04average.ipynb
Normal file
46873
spectrum/04average.ipynb
Normal file
File diff suppressed because it is too large
Load Diff
80
spectrum/PLS.py
Normal file
80
spectrum/PLS.py
Normal 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
22
spectrum/pinjie.py
Normal 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
112
spectrum/test.py
Normal 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
516
utils.py
Normal 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)
|
||||
Loading…
Reference in New Issue
Block a user