gushoubang 4 месяцев назад
Родитель
Сommit
54484afabf

+ 0 - 61
change_detect copy.py

@@ -1,61 +0,0 @@
-from paddlers.deploy import Predictor
-import matplotlib.pyplot as plt
-import numpy as np
-from PIL import Image
-
-# 第一步:构建Predictor。该类接受的构造参数如下:
-#     model_dir: 模型路径(必须是导出的部署或量化模型)。
-#     use_gpu: 是否使用GPU,默认为False。
-#     gpu_id: 使用GPU的ID,默认为0。
-#     cpu_thread_num:使用CPU进行预测时的线程数,默认为1。
-#     use_mkl: 是否使用MKL-DNN计算库,CPU情况下使用,默认为False。
-#     mkl_thread_num: MKL-DNN计算线程数,默认为4。
-#     use_trt: 是否使用TensorRT,默认为False。
-#     use_glog: 是否启用glog日志, 默认为False。
-#     memory_optimize: 是否启动内存优化,默认为True。
-#     max_trt_batch_size: 在使用TensorRT时配置的最大batch size,默认为1。
-#     trt_precision_mode:在使用TensorRT时采用的精度,可选值['float32', 'float16']。默认为'float32'。
-#
-# 下面的语句构建的Predictor对象依赖static_models/目录中存储的部署格式模型,并使用GPU进行推理。
-predictor = Predictor("inference_model_change", use_gpu=True)
-
-def start(image1,image2):
-    # 第二步:调用Predictor的predict()方法执行推理。该方法接受的输入参数如下:
-    #     img_file: 对于场景分类、图像复原、目标检测和图像分割任务来说,该参数可为单一图像路径,或是解码后的、排列格式为(H, W, C)
-    #         且具有float32类型的图像数据(表示为numpy的ndarray形式),或者是一组图像路径或np.ndarray对象构成的列表;对于变化检测
-    #         任务来说,该参数可以为图像路径二元组(分别表示前后两个时相影像路径),或是两幅图像组成的二元组,或者是上述两种二元组
-    #         之一构成的列表。
-    #     topk: 场景分类模型预测时使用,表示选取模型输出概率大小排名前`topk`的类别作为最终结果。默认值为1。
-    #     transforms: 对输入数据应用的数据变换算子。若为None,则使用从`model.yml`中读取的算子。默认值为None。
-    #     warmup_iters: 预热轮数,用于评估模型推理以及前后处理速度。若大于1,会预先重复执行`warmup_iters`次推理,而后才开始正式的预测及其速度评估。默认值为0。
-    #     repeats: 重复次数,用于评估模型推理以及前后处理速度。若大于1,会执行`repeats`次预测并取时间平均值。默认值为1。
-    #
-    # 下面的语句传入两幅输入影像的路径
-    res = predictor.predict((image1, image2)):
-
-    # 第三步:解析predict()方法返回的结果。
-    #     对于图像分割和变化检测任务而言,predict()方法返回的结果为一个字典或字典构成的列表。字典中的`label_map`键对应的值为类别标签图,对于二值变化检测
-    #     任务而言只有0(不变类)或者1(变化类)两种取值;`score_map`键对应的值为类别概率图,对于二值变化检测任务来说一般包含两个通道,第0个通道表示不发生
-    #     变化的概率,第1个通道表示发生变化的概率。如果返回的结果是由字典构成的列表,则列表中的第n项与输入的img_file中的第n项对应。
-    #
-    # 下面的语句从res中解析二值变化图(binary change map)
-    cm = res['label_map']
-    # 将标签图(cm)转换为图像格式
-    change_map_image = Image.fromarray(np.uint8(cm * 255), 'L')
-
-    # # 展示变化图
-    # plt.imshow(change_map_image, cmap='gray')
-    # plt.axis('off')  # 不显示坐标轴
-    # plt.show()
-    # TODO: 保存变化图
-    savePath = 'predict/change_map1001.png'
-    # 保存变化图
-    change_map_image.save(savePath)
-
-    # import paddlers as pdrs
-
-    # predictor = pdrs.deploy.Predictor('./inference_model')
-    # result = predictor.predict(img_file='test.jpg',
-    #                            warmup_iters=100,
-    #                            repeats=100)
-    return savePath

+ 39 - 35
change_detect.py

@@ -1,7 +1,8 @@
 from paddlers.deploy import Predictor
-import matplotlib.pyplot as plt
+# import matplotlib.pyplot as plt
 import numpy as np
 from PIL import Image
+import uuid
 
 # 第一步:构建Predictor。该类接受的构造参数如下:
 #     model_dir: 模型路径(必须是导出的部署或量化模型)。
@@ -17,42 +18,45 @@ from PIL import Image
 #     trt_precision_mode:在使用TensorRT时采用的精度,可选值['float32', 'float16']。默认为'float32'。
 #
 # 下面的语句构建的Predictor对象依赖static_models/目录中存储的部署格式模型,并使用GPU进行推理。
-predictor = Predictor("E:\PaddleRS\inference_model", use_gpu=True)
+predictor = Predictor("inference_model_change", use_gpu=True)
 
-# 第二步:调用Predictor的predict()方法执行推理。该方法接受的输入参数如下:
-#     img_file: 对于场景分类、图像复原、目标检测和图像分割任务来说,该参数可为单一图像路径,或是解码后的、排列格式为(H, W, C)
-#         且具有float32类型的图像数据(表示为numpy的ndarray形式),或者是一组图像路径或np.ndarray对象构成的列表;对于变化检测
-#         任务来说,该参数可以为图像路径二元组(分别表示前后两个时相影像路径),或是两幅图像组成的二元组,或者是上述两种二元组
-#         之一构成的列表。
-#     topk: 场景分类模型预测时使用,表示选取模型输出概率大小排名前`topk`的类别作为最终结果。默认值为1。
-#     transforms: 对输入数据应用的数据变换算子。若为None,则使用从`model.yml`中读取的算子。默认值为None。
-#     warmup_iters: 预热轮数,用于评估模型推理以及前后处理速度。若大于1,会预先重复执行`warmup_iters`次推理,而后才开始正式的预测及其速度评估。默认值为0。
-#     repeats: 重复次数,用于评估模型推理以及前后处理速度。若大于1,会执行`repeats`次预测并取时间平均值。默认值为1。
-#
-# 下面的语句传入两幅输入影像的路径
-res = predictor.predict(("E:/PaddleRS/data/levircd/test/A/test_1.png", "E:/PaddleRS/data/levircd/test/B/test_1.png"))
-
-# 第三步:解析predict()方法返回的结果。
-#     对于图像分割和变化检测任务而言,predict()方法返回的结果为一个字典或字典构成的列表。字典中的`label_map`键对应的值为类别标签图,对于二值变化检测
-#     任务而言只有0(不变类)或者1(变化类)两种取值;`score_map`键对应的值为类别概率图,对于二值变化检测任务来说一般包含两个通道,第0个通道表示不发生
-#     变化的概率,第1个通道表示发生变化的概率。如果返回的结果是由字典构成的列表,则列表中的第n项与输入的img_file中的第n项对应。
-#
-# 下面的语句从res中解析二值变化图(binary change map)
-cm_1024x1024 = res['label_map']
-# 将标签图(cm_1024x1024)转换为图像格式
-change_map_image = Image.fromarray(np.uint8(cm_1024x1024 * 255), 'L')
+def start(image1,image2):
+    # 第二步:调用Predictor的predict()方法执行推理。该方法接受的输入参数如下:
+    #     img_file: 对于场景分类、图像复原、目标检测和图像分割任务来说,该参数可为单一图像路径,或是解码后的、排列格式为(H, W, C)
+    #         且具有float32类型的图像数据(表示为numpy的ndarray形式),或者是一组图像路径或np.ndarray对象构成的列表;对于变化检测
+    #         任务来说,该参数可以为图像路径二元组(分别表示前后两个时相影像路径),或是两幅图像组成的二元组,或者是上述两种二元组
+    #         之一构成的列表。
+    #     topk: 场景分类模型预测时使用,表示选取模型输出概率大小排名前`topk`的类别作为最终结果。默认值为1。
+    #     transforms: 对输入数据应用的数据变换算子。若为None,则使用从`model.yml`中读取的算子。默认值为None。
+    #     warmup_iters: 预热轮数,用于评估模型推理以及前后处理速度。若大于1,会预先重复执行`warmup_iters`次推理,而后才开始正式的预测及其速度评估。默认值为0。
+    #     repeats: 重复次数,用于评估模型推理以及前后处理速度。若大于1,会执行`repeats`次预测并取时间平均值。默认值为1。
+    #
+    # 下面的语句传入两幅输入影像的路径
+    res = predictor.predict((image1, image2))
 
-# 展示变化图
-plt.imshow(change_map_image, cmap='gray')
-plt.axis('off')  # 不显示坐标轴
-plt.show()
+    # 第三步:解析predict()方法返回的结果。
+    #     对于图像分割和变化检测任务而言,predict()方法返回的结果为一个字典或字典构成的列表。字典中的`label_map`键对应的值为类别标签图,对于二值变化检测
+    #     任务而言只有0(不变类)或者1(变化类)两种取值;`score_map`键对应的值为类别概率图,对于二值变化检测任务来说一般包含两个通道,第0个通道表示不发生
+    #     变化的概率,第1个通道表示发生变化的概率。如果返回的结果是由字典构成的列表,则列表中的第n项与输入的img_file中的第n项对应。
+    #
+    # 下面的语句从res中解析二值变化图(binary change map)
+    cm = res['label_map']
+    # 将标签图(cm)转换为图像格式
+    change_map_image = Image.fromarray(np.uint8(cm * 255), 'L')
 
-# 保存变化图
-change_map_image.save("E:\PaddleRS\predict\change_map.png")
+    # # 展示变化图
+    # plt.imshow(change_map_image, cmap='gray')
+    # plt.axis('off')  # 不显示坐标轴
+    # plt.show()
+    # TODO: 保存变化图
+    savePath = 'predict/'+str(uuid.uuid4())+'.png'
+    # 保存变化图
+    change_map_image.save(savePath)
 
-# import paddlers as pdrs
+    # import paddlers as pdrs
 
-# predictor = pdrs.deploy.Predictor('./inference_model')
-# result = predictor.predict(img_file='test.jpg',
-#                            warmup_iters=100,
-#                            repeats=100)
+    # predictor = pdrs.deploy.Predictor('./inference_model')
+    # result = predictor.predict(img_file='test.jpg',
+    #                            warmup_iters=100,
+    #                            repeats=100)
+    return savePath

+ 57 - 0
main.py

@@ -0,0 +1,57 @@
+from flask import Flask, request, jsonify
+import uuid
+from change_detect import start
+
+
+app = Flask(__name__)
+
+# GET 请求接口示例
+@app.route('/api/get_data', methods=['GET'])
+def get_data():
+    # 获取请求参数
+    param = request.args.get('param', default='default_value')
+    # 返回 JSON 响应
+    return jsonify({
+        "message": "GET 请求成功",
+        "param": param
+    })
+
+
+
+# POST 上传图片
+@app.route('/api/upload_image', methods=['POST'])
+def upload_image():
+    # 获取上传的文件
+    img1 = request.files['img1']
+    img2 = request.files['img2']
+    # 保存文件
+    filePath1 = 'predict/' + str(uuid.uuid4()) + img1.filename
+    filePath2 = 'predict/' + str(uuid.uuid4()) + img2.filename
+
+    img1.save(filePath1)
+    img2.save(filePath2)
+    return jsonify({
+        "message": "上传成功",
+        "data":{
+            "img1": filePath1,
+            "img2": filePath2
+        }
+    })
+
+# POST 分析图片
+@app.route('/api/detect_image', methods=['POST'])
+def detect_image():
+    # 获取图片路径
+    data = request.get_json()
+    img1 = data['img1']
+    img2 = data['img2']
+    getImgPath=start(img1,img2)
+    return jsonify({
+        "message": "分析成功",
+        "data":{
+            "img": getImgPath
+        }
+    })
+
+if __name__ == '__main__':
+    app.run(debug=True,port=4100)

BIN
predict/1d6d2393-7528-434c-887a-df39f6b48d2b图片1.png


BIN
predict/760f4b6d-cb65-4247-945c-5230b6c271a6图片1.png


+ 1 - 0
requirements.txt

@@ -4,6 +4,7 @@ cython
 easydict
 filelock
 foliume
+Flask
 # GDAL >= 3.1.3
 geojson
 # lap