目录

🍓🍓1.效果

🍂🍂2.去雨功能实现

🍇2.1训练模型:

🍇2.2保存模型:

🙋🙋3.去雾功能实现

🐸🐸4.python代码实现可视化界面

🍋4.1完整代码        

🍋4.2代码解释

1. 创建主窗口

2. 创建原始图像显示区域

3. 创建去雨后图像显示区域

4. 创建去雾后图像显示区域

5. 创建按钮

6. 存储原始图像数据

7. 运行主循环

🍋4.3代码逻辑总结

💖💖5.打包成exe文件

🍉5.1.安装 PyInstaller

🍉5.2 使用 PyInstaller 打包脚本

1. 基本命令

2. 常用选项

🍉5.3打包后的文件结构

🍉5.4 测试打包后的程序

🍉5.5示例命令

🍉5.6注意事项

整理不易,欢迎一键三连!!!

送你们一条美丽的--分割线--


🍓🍓1.效果

去雨去雾小工具的实现成果是一个exe的可执行文件,打开效果如下:

完整代码获取请私信留言。

🍂🍂2.去雨功能实现

去雨功能是选用深度学习网络进行实现,具体为Attentive-GAN-Derainnet,其网络结构如下:

使用 tensorflow 实现深度卷积生成对抗网络 ,训练好的去雨网络模型权重文件存储在文件夹 weights/,可以按照如下方式在经过训练的模型上测试单个图像

python tools/test_model.py --weights_path ./weights/derain_gan/derain_gan.ckpt-100000
--image_path ./data/test_data/test_1.png

去雨结果如下:

输入图像:

输出去雨后的图像:

整理训练示例。将所有雨图和干净图像放在两个单独的文件夹中,分别以 SOURCE_DATA_ROOT_DIR/rain_image 和 SOURCE_DATA_ROOT_DIR/clean_image 命名。其余准备工作将通过运行以下脚本完成

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#f0f6fc"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cd PROJECT_ROOT_DIR
python data_provider/data_feed_pipline.py --dataset_dir SOURCE_DATA_ROOT_DIR
--tfrecords_dir TFRECORDS_SAVE_DIR
</code></span></span></span></span>

        训练样本由两部分组成:一张没有雨滴标签的干净图像和一张被雨滴污染的原始图像。

        所有训练图像将根据配置文件自动缩放为相同比例,并转换为 TensorFlow 记录,以实现高效的数据馈送管道。

🍇2.1训练模型:

         在我的实验中,训练周期为 100010,批量大小为 1,初始化学习率为 0.002。有关训练参数,您可以查看 global_configuration/config.py 了解详情。

        你可以调用以下脚本来训练你自己的模型:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#f0f6fc"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cd REPO_ROOT_DIR
python tools/train_model.py --dataset_dir SOURCE_DATA_ROOT_DIR
</code></span></span></span></span>

        还可以通过以下方式继续训练过程:

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#f0f6fc"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cd REPO_ROOT_DIR
python tools/train_model.py --dataset_dir SOURCE_DATA_ROOT_DIR 
--weights_path path/to/your/last/checkpoint</code></span></span></span></span>

🍇2.2保存模型:

        训练好的模型可以转换为 tensorflow 保存的模型和 tensorflow js 模型以供网络使用。如果你想将 ckpt 模型转换为 tensorflow 保存的模型,你可以运行以下脚本

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#f0f6fc"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cd PROJECT_ROOT_DIR
python tools/export_tf_saved_model.py --export_dir ./weights/derain_gan_saved_model 
--ckpt_path ./weights/derain_gan/derain_gan.ckpt-100000
</code></span></span></span></span>

        如果你想转换成 tensorflow js 模型,你可以修改 bash 脚本并运行它

<span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><span style="color:#f0f6fc"><span style="color:var(--fgColor-default, var(--color-fg-default))"><span style="background-color:var(--bgColor-muted, var(--color-canvas-subtle))"><code>cd PROJECT_ROOT_DIR
bash tools/convert_tfjs_model.sh</code></span></span></span></span>

🙋🙋3.去雾功能实现

        图像去雾功能是通过ACE方法进行实现的。自动色彩均衡(Automatic Color Enhancement,ACE) 算法是Rizzi大神在Retinex算法的理论上提出的,它通过计算图像目标像素点和周围像素点的明暗程度及其关系来对最终的像素值进行校正,实现图像的对比度调整,产生类似人体视网膜的色彩恒常性和亮度恒常性的均衡,具有很好的图像增强效果。

        ACE算法包括两个步骤:

  • 一是对图像进行色彩和空域调整,完成图像的色差校正,得到空域重构图像。

        模仿视觉系统的侧抑制性和区域自适应性,进行色彩的空域调整。侧抑制性是一个生理学概念,指在某个神经元受到刺激而产生兴奋时,再刺激相近的神经元,后者所发生的兴奋对前者产生的抑制作用。

  • 二是对校正后的图像进行动态扩展。

        对图像的动态范围进行全局调整,并使图像满足灰度世界理论和白斑点假设。算法针对单通道,再延伸应用到RGB彩色空间的3通道图像,即对3个通道分别处理再进行整合完成。

        具体计算过程如下:

需要原文的可以移步这里 

去雾实现效果:

输入影像:

输出去雾结果影像:

🐸🐸4.python代码实现可视化界面

🍋4.1完整代码        

        python代码实现可视化界面主要是基于tkinter库,具体代码如下:

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk
import cv2
import numpy as np
import math
import matplotlib.pyplot as plt

# 加载图像并显示
def load_image():
    file_path = filedialog.askopenfilename()
    if file_path:
        # 加载图像
        image = cv2.imread(file_path)
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        
        # 调整图像大小以适应显示区域
        image = cv2.resize(image, (600, 400))
        
        # 显示原始图像
        original_image = Image.fromarray(image)
        original_photo = ImageTk.PhotoImage(original_image)
        original_canvas.create_image(0, 0, anchor='nw', image=original_photo)
        original_canvas.image = original_photo  # 保存对PhotoImage的引用
        
        # 保存原始图像数据
        global original_image_data
        original_image_data = image
# 去雨并显示结果
def remove_rain_and_display():
    global original_image_data
    if original_image_data is not None:
        # 去雨处理
        rain_removed_image = remove_rain(original_image_data)
        
        # 调整去雨后图像大小以适应显示区域
        rain_removed_image = cv2.resize(rain_removed_image, (600, 400))
        
        # 显示去雨后的图像
        rain_removed_image = Image.fromarray(rain_removed_image)
        rain_removed_photo = ImageTk.PhotoImage(rain_removed_image)
        rain_removed_canvas.create_image(0, 0, anchor='nw', image=rain_removed_photo)
        rain_removed_canvas.image = rain_removed_photo  # 保存对PhotoImage的引用
def remove_hazing_and_display():
    global original_image_data
    if original_image_data is not None:
        dedaze_image = zmIceColor(original_image_data/255.0)*255
        # 调整去雾后图像大小以适应显示区域
        dedaze_image = cv2.resize(dedaze_image, (600, 400))
        # 显示去雾后的图像
        dedaze_image = dedaze_image.astype('uint8')
        dedaze_image = Image.fromarray(dedaze_image)
        daze_removed_photo = ImageTk.PhotoImage(dedaze_image)
        daze_removed_canvas.create_image(0, 0, anchor='nw', image=daze_removed_photo)
        daze_removed_canvas.image = daze_removed_photo  # 保存对PhotoImage的引用


# 创建主窗口
root = tk.Tk()
root.title("图像去雨去雾工具")
root.geometry("1600x1000")  # 设置窗口大小为1600x800

# 创建原始图像显示区域
original_label = tk.Label(root, text="处理前:", font=("Arial", 16))
original_label.place(x=100, y=300)  # 设置标签位置
original_canvas = tk.Canvas(root, width=600, height=400)
original_canvas.place(x=100, y=350)  # 设置画布位置

# 创建去雨后图像显示区域
rain_removed_label = tk.Label(root, text="去雨后:", font=("Arial", 16))
rain_removed_label.place(x=800, y=50)  # 设置标签位置
rain_removed_canvas = tk.Canvas(root, width=600, height=400)
rain_removed_canvas.place(x=800, y=80)  # 设置画布位置

# 创建去雾后图像显示区域
haze_removed_label = tk.Label(root, text="去雾后:", font=("Arial", 16))
haze_removed_label.place(x=800, y=520)  # 设置标签位置
daze_removed_canvas = tk.Canvas(root, width=600, height=400)
daze_removed_canvas.place(x=800, y=550)  # 设置画布位置

# 创建按钮
load_button = tk.Button(root, text="选择图像", command=load_image, font=("Arial", 16))
load_button.place(x=200, y=900)  # 设置按钮位置

remove_button = tk.Button(root, text="去雨", command=remove_rain_and_display, font=("Arial", 16))
remove_button.place(x=400, y=900)  # 设置按钮位置

wu_button = tk.Button(root, text="去雾", command=remove_hazing_and_display, font=("Arial", 16))
wu_button.place(x=600, y=900)  # 设置按钮位置

# 用于存储原始图像数据
original_image_data = None

# 运行主循环
root.mainloop()

         具体的界面按钮位置和字体大小可以自行调整。

🍋4.2代码解释

1. 创建主窗口

root = tk.Tk()
root.title("图像去雨去雾工具")
root.geometry("1600x1000")  # 设置窗口大小为1600x800
  • tk.Tk():创建一个Tkinter主窗口,这是GUI程序的根窗口。

  • root.title("图像去雨去雾工具"):设置窗口的标题为“图像去雨去雾工具”。

  • root.geometry("1600x1000"):设置窗口的大小为宽度1600像素、高度1000像素。

2. 创建原始图像显示区域

original_label = tk.Label(root, text="处理前:", font=("Arial", 16))
original_label.place(x=100, y=300)  # 设置标签位置
original_canvas = tk.Canvas(root, width=600, height=400)
original_canvas.place(x=100, y=350)  # 设置画布位置
  • tk.Label(root, text="处理前:", font=("Arial", 16)):创建一个标签(Label),用于显示“处理前:”文本。字体设置为Arial,字号为16。

  • original_label.place(x=100, y=300):将标签放置在窗口的(x=100, y=300)位置。

  • tk.Canvas(root, width=600, height=400):创建一个画布(Canvas),用于显示原始图像。画布的宽度为600像素,高度为400像素。

  • original_canvas.place(x=100, y=350):将画布放置在窗口的(x=100, y=350)位置。

3. 创建去雨后图像显示区域

rain_removed_label = tk.Label(root, text="去雨后:", font=("Arial", 16))
rain_removed_label.place(x=800, y=50)  # 设置标签位置
rain_removed_canvas = tk.Canvas(root, width=600, height=400)
rain_removed_canvas.place(x=800, y=80)  # 设置画布位置
  • tk.Label(root, text="去雨后:", font=("Arial", 16)):创建一个标签,显示“去雨后:”文本。

  • rain_removed_label.place(x=800, y=50):将标签放置在(x=800, y=50)位置。

  • tk.Canvas(root, width=600, height=400):创建一个画布,用于显示去雨后的图像。

  • rain_removed_canvas.place(x=800, y=80):将画布放置在(x=800, y=80)位置。

4. 创建去雾后图像显示区域

haze_removed_label = tk.Label(root, text="去雾后:", font=("Arial", 16))
haze_removed_label.place(x=800, y=520)  # 设置标签位置
daze_removed_canvas = tk.Canvas(root, width=600, height=400)
daze_removed_canvas.place(x=800, y=550)  # 设置画布位置
  • tk.Label(root, text="去雾后:", font=("Arial", 16)):创建一个标签,显示“去雾后:”文本。

  • haze_removed_label.place(x=800, y=520):将标签放置在(x=800, y=520)位置。

  • tk.Canvas(root, width=600, height=400):创建一个画布,用于显示去雾后的图像。

  • daze_removed_canvas.place(x=800, y=550):将画布放置在(x=800, y=550)位置。

5. 创建按钮

load_button = tk.Button(root, text="选择图像", command=load_image, font=("Arial", 16))
load_button.place(x=200, y=900)  # 设置按钮位置

remove_button = tk.Button(root, text="去雨", command=remove_rain_and_display, font=("Arial", 16))
remove_button.place(x=400, y=900)  # 设置按钮位置

wu_button = tk.Button(root, text="去雾", command=remove_hazing_and_display, font=("Arial", 16))
wu_button.place(x=600, y=900)  # 设置按钮位置
  • tk.Button(root, text="选择图像", command=load_image, font=("Arial", 16)):创建一个按钮,显示“选择图像”文本。点击按钮时会调用load_image函数。

  • load_button.place(x=200, y=900):将按钮放置在(x=020, y=900)位置。

  • 同理,创建了“去雨”和“去雾”按钮,分别调用remove_rain_and_displayremove_hazing_and_display函数。

6. 存储原始图像数据

original_image_data = None
  • original_image_data:用于存储加载的原始图像数据。初始值为None,表示尚未加载图像。

7. 运行主循环

root.mainloop()
  • root.mainloop():启动Tkinter的主事件循环,等待用户交互(如点击按钮、选择图像等)。这是Tkinter程序的标准结尾。


🍋4.3代码逻辑总结

  • 界面布局

    • 窗口分为三个部分:

      • 左侧显示原始图像。

      • 右侧上方显示去雨后的图像。

      • 右侧下方显示去雾后的图像。

    • 按钮位于窗口底部,用于加载图像、去雨和去雾操作。

  • 功能实现

    • 点击“选择图像”按钮时,调用load_image函数加载图像,并在左侧画布显示。

    • 点击“去雨”按钮时,调用remove_rain_and_display函数处理图像,并在右侧上方画布显示去雨后的图像。

    • 点击“去雾”按钮时,调用remove_hazing_and_display函数处理图像,并在右侧下方画布显示去雾后的图像。


💖💖5.打包成exe文件

        将python文件打包成exe文件主要使用pyinstaller库。PyInstaller 是一个非常流行的工具,可以将Python脚本及其依赖项打包成独立的可执行文件。以下是使用 PyInstaller 将Python脚本打包成 .exe 文件的详细步骤:


🍉5.1.安装 PyInstaller

        首先,确保你已经安装了 PyInstaller。如果尚未安装,可以通过以下命令安装:

        bash复制

pip install pyinstaller

🍉5.2 使用 PyInstaller 打包脚本

        假设你的Python脚本文件名为 main.py,你可以使用以下命令将其打包成 .exe 文件:

       1. 基本命令

        bash复制

pyinstaller main.py

运行该命令后,PyInstaller 会在当前目录下生成以下文件夹和文件:

  • dist/:包含打包后的可执行文件(.exe)。

  • build/:包含打包过程中的中间文件。

  • main.spec:打包配置文件,用于自定义打包过程。


       2. 常用选项

        为了生成更符合需求的 .exe 文件,PyInstaller 提供了许多选项。以下是一些常用的选项:

  1. 生成单文件可执行文件
    默认情况下,PyInstaller 会生成一个包含多个文件的文件夹。如果你希望生成一个独立的单文件可执行文件,可以使用 --onefile 选项:

    bash复制

    pyinstaller --onefile main.py

    注意:单文件模式可能会导致启动时间稍长,因为程序运行时需要解压资源。

  2. 隐藏控制台窗口
    如果你的程序是一个图形界面程序(如使用 Tkinter),可以使用 --noconsole--windowed 隐藏选项控制台窗口:

    bash复制

    pyinstaller --onefile --noconsole main.py
  3. 指定图标
    如果你希望为 .exe 文件设置一个图标,可以使用 --icon 选项:

    bash复制

    pyinstaller --onefile --noconsole --icon=icon.ico main.py

    其中 icon.ico 是你的图标文件路径。

  4. 指定输出目录
    默认情况下,打包后的 .exe 文件会放在 dist/ 文件夹中。如果你希望指定输出目录,可以使用 -D--distpath 选项:

    bash复制

    pyinstaller --onefile --noconsole --distpath=Output main.py
  5. 添加额外文件或文件夹
    如果你的程序依赖于某些外部文件或文件夹(如配置文件、资源文件等),可以使用 --add-data 选项将它们打包到 .exe 文件中:

    bash复制

    pyinstaller --onefile --noconsole --add-data="data_folder;data_folder" main.py

    注意:在Windows系统中,路径分隔符使用分号 ;,而在Linux和macOS中使用冒号 :


🍉5.3打包后的文件结构

        打包完成后,dist/ 文件夹中会包含生成的 .exe 文件。如果使用了 --onefile 选项,该文件夹中只有一个独立的 .exe 文件;否则,会包含一个文件夹,其中包含 .exe 文件及其依赖项。


🍉5.4 测试打包后的程序

        在将 .exe 文件分发给用户之前,请务必在没有Python环境的机器上测试它,以确保程序可以正常运行。


🍉5.5示例命令

        以下是一个完整的示例命令,包含常用选项:

        bash复制

pyinstaller --onefile --noconsole --icon=icon.ico --add-data="data_folder;data_folder" main.py

🍉5.6注意事项

  1. 依赖项问题:如果程序依赖于某些特定的库或模块,确保这些依赖项在打包时被正确包含。如果遇到问题,可以查看 build/ 文件夹中的日志文件,或者在 main.spec 文件中手动指定依赖项。

  2. 路径问题:如果程序中使用了相对路径访问文件,打包后可能会出现问题。建议在程序中使用绝对路径或动态路径。

  3. Python版本兼容性:PyInstaller 的版本需要与你的 Python 环境版本兼容。如果遇到问题,可以尝试升级 PyInstaller 或切换 Python 环境。

整理不易,欢迎一键三连!!!


送你们一条美丽的--分割线--


🌷🌷🍀🍀🌾🌾🍓🍓🍂🍂🙋🙋🐸🐸🙋🙋💖💖🍌🍌🔔🔔🍉🍉🍭🍭🍋🍋🍇🍇🏆🏆📸📸⛵⛵⭐⭐🍎🍎👍👍🌷🌷

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐