Alpha 冲刺 (3/3)

项目:基于Unet的图像噪声修复网站
声明:本博客为OUC2022秋季软件工程06组作业

组长:黎泉林

项目地址 https://github.com/xiaoli-guan/ImageRepairWeb-ING-202211.git

目录

  • 1.过去一周完成了哪些任务
  • 2.每个人的工作
    • 陈兆宇:
    • 黎泉林:
    • 邓驰:
    • 邓鑫:
    • 胡俊骥:
  • 3.燃尽图
  • 4.例会照片
  • 5.总结

1.过去一周完成了哪些任务

后端:

  • 解决了图片上传后处理的问题,通过进程的远程访问调用使java web应用可以调用python机器学习训练的模型
  • 优化NAFNet在个人电脑上的部署
  • 尝试使用Django做进一步拓展
  • 解决了pytorch版本不匹配导致模型出错问题
  • 配置Maven环境和pytorch环境

前端:

  • 设置背景主题
  • 编写图片展示
  • 优化显示界面

2.每个人的工作

陈兆宇:

1.本周完成的任务:

为CBD模型换了一个数据集,目前主流的去噪数据集大概就是SIDD,PolyU,DND等,每个数据集的侧重点不同,考虑到用户需求,我选择了使用摄影机拍照的SIDD数据集,但是最后的效果在字符处理上仍不理想。
尝试使用了NAFNet处理数据,效果不错,字符处理上优秀。
配置了ssm环境。
在pycharm上配置了pytorch环境
尝试使用Django为毕业设计做打算
练习使用numpy等工具对输出图片做切割
理论上的学习,虽然我也不可能直接提出一种新网络做到更好,但是多学学有助于项目搭建

2.下周计划的任务:

完善NAFNet
如果有时间就继续搞搞Django,毕竟python调用pytorch方便些
考虑别的方式连接前后端

3.代码签入&问题:

NAFNet在个人电脑上配置有问题

4.剩下的任务及遇到的困难

主体功能已经实现,下一步就是考虑增加去模糊,复原等技术
但是时间就是最大的困难

5.收获和疑问

感觉收获很多,但是时间实在是太紧了,我本来想要深入探讨一下一些比较有趣的trick,比如之前在ai研习社看到的投票机制,虽然是竞赛技巧,但是应该可以应用到这次项目里。

黎泉林:

1.本周完成的任务:

  • 1、实现进程的远程访问调用使java web应用可以调用python机器学习训练的模型

  • 2、配置pytorch环境

  • 3、配置tomcat环境

2.下周计划的任务:

继续完善项目,实现登陆验证、注册、用户管理等功能

3.代码签入&问题:

  • 实现进程的远程访问调用使java web应用可以调用python机器学习训练的模型

我们小组前后端是用javaweb写的,模型确实python训练的,也是够奇葩的那么,后端如何调用模型处理图片就成了大问题了。
幸好CSDN上也有和我一样的案例(笑)。
进程的远程访问调用的方法参考自
https://blog.csdn.net/u013185349/article/details/96767174

javaweb端

public String remoteCall(String content){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("content", content);
        String str = jsonObject.toJSONString();
        // 访问服务进程的套接字
        Socket socket = null;
        List questions = new ArrayList<>();
        System.out.println("调用远程接口:host=>"+HOST+",port=>"+PORT);
        try {
            // 初始化套接字,设置访问服务的主机和进程端口号,HOST是访问python进程的主机名称,可以是IP地址或者域名,PORT是python进程绑定的端口号
            socket = new Socket(HOST,PORT);
            // 获取输出流对象
            OutputStream os = socket.getOutputStream();
            PrintStream out = new PrintStream(os);
            // 发送内容
            out.print(str);
            // 告诉服务进程,内容发送完毕,可以开始处理
            out.print("over");
            // 获取服务进程的输入流
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
            String tmp = null;
            StringBuilder sb = new StringBuilder();
            // 读取内容
            while((tmp=br.readLine())!=null)
                sb.append(tmp).append('\n');
            // 解析结果
            System.out.println("sb:"+sb);
            /*JSONArray res = JSON.parseArray(sb.toString());*/

            return String.valueOf(sb);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {if(socket!=null) socket.close();} catch (IOException e) {}
            System.out.println("远程接口调用结束.");
        }
        return null;
    }

python端

def main():
    # 创建服务器套接字
    serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 获取本地主机名称
    host = socket.gethostname()
    # 设置一个端口
    port = 12345
    # 将套接字与本地主机和端口绑定
    serversocket.bind((host, port))
    # 设置监听最大连接数
    serversocket.listen(5)
    # 获取本地服务器的连接信息
    myaddr = serversocket.getsockname()
    print("服务器地址:%s" % str(myaddr))
    # 循环等待接受客户端信息
    while True:
        # 获取一个客户端连接
        clientsocket, addr = serversocket.accept()
        print("连接地址:%s" % str(addr))
        try:
            t = ServerThreading(clientsocket)  # 为每一个请求开启一个处理线程
            t.start()
            pass
        except Exception as identifier:
            print(identifier)
            pass
        pass
    serversocket.close()
    pass


class ServerThreading(threading.Thread):
    # words = text2vec.load_lexicon()
    def __init__(self, clientsocket, recvsize=1024 * 1024, encoding="utf-8"):
        threading.Thread.__init__(self)
        self._socket = clientsocket
        self._recvsize = recvsize
        self._encoding = encoding
        self.cnt=1
        pass

    def run(self):
        print("开启线程.....")
        try:
            # 接受数据
            msg = ''
            while True:
                # 读取recvsize个字节
                rec = self._socket.recv(self._recvsize)
                # 解码
                msg += rec.decode(self._encoding)
                # 文本接受是否完毕,因为python socket不能自己判断接收数据是否完毕,
                # 所以需要自定义协议标志数据接受完毕
                if msg.strip().endswith('over'):
                    msg = msg[:-4]
                    break


            # 解析json格式的数据
            re = json.loads(msg)
            print(re['content'])
            # 调用神经网络模型处理请求
            device = torch.device("cuda:0")

            to_dir='D:/code/Java_web/ImageRepair/src/main/webapp/image/'+str(self.cnt)+'.bmp'#图片保存路径
            img = str(self.cnt) + '.bmp'
            self.cnt= self.cnt + 1
            noisy_img = cv2.imread(re['content'])

            noisy_img = noisy_img[:, :, ::-1] / 255.0
            noisy_img = np.array(noisy_img).astype('float32')
            temp_noisy_img_chw = hwc_to_chw(noisy_img)
            # 图像放到 gpu 上
            input_var = torch.from_numpy(temp_noisy_img_chw.copy()).type(torch.FloatTensor).unsqueeze(0).to(device)
            # 输入模型得到结果
            _, output = nnservice(input_var)
            output_np = output.squeeze().cpu().detach().numpy()
            output_np = chw_to_hwc(np.clip(output_np, 0, 1))
            tempImg = np.concatenate((noisy_img, output_np), axis=1) * 255.0
            Image.fromarray(np.uint8(tempImg)).save(fp=to_dir, format='JPEG')



            # sendmsg = json.dumps(to_dir)
            # 发送数据
            self._socket.send(("%s" % img).encode(self._encoding))
            print(("%s" % img).encode(self._encoding))
            pass
        except Exception as identifier:
            self._socket.send("500".encode(self._encoding))
            print(identifier)
            pass
        finally:
            self._socket.close()
        print("任务结束.....")

        pass

    def __del__(self):

        pass


if __name__ == "__main__":
    main()

javaweb和python都运行起来后,python的进程就会开始等待,直到有进程调用它,此时python进程就为他他分配一个线程开始处理

  • 配置pytorch环境

不得不说,配置环境是真的麻烦,一个不小心就能浪费一天时间。
配置pytorch时遇到的问题:

1、使用conda install命令下载巨慢
解决方法:配置镜像网站
2、安装完torch也无法使用GPU
解决方法:无,重置torch版本,结果包全乱了又删了环境重来。。。
3、安装好torch后import torch显示找不到torch模块
解决方法:https://blog.csdn.net/sunny_580/article/details/89476176
使用命令:conda install numpy pyyaml mkl cmake cffi
4、一切环境搞定后不报错了,结果跑代码时to(device)巨慢,跑了一节课才跑出结果,但在陈同学的电脑上是正常的。。。于是又开始找问题。。。
https://blog.csdn.net/m0_37738114/article/details/117535775
原来是我的torch版本太低了,可恶,又得重新配环境,幸好配了这么多次torch环境我已经轻车熟路了。

  • 配置tomcat环境

这个也搞了我好久时间,一直都不知道图片怎么让前端显示出来,因为浏览器不许直接读取本地图片,所以不能使用绝对路径。那么就只有配置tomcat的虚拟路径了。结果一直搞不清虚拟路径的文件在哪里。。。
最后另建一个文件夹直接部署在tomcat里了。。
4.剩下的任务及遇到的困难

5.收获和疑问

这一周花在软工的时间有点多了,基本都在改报错。。。不过也是有不少收获的,懂得了java进程如何调用python进程,以及anaconda的使用方法

邓驰:

1.本周完成的任务:

前端登录页面以及数据库的实现

2.下周计划的任务:

与其他组件组装完成整体的架构

3.代码签入&问题:

嵌入时在不同机器上可能会有路径改变的问题需要注意

4.剩下的任务及遇到的困难

构建一个美观的登录页面

5.收获和疑问

对ssm框架与神经网络的运行有了进一步的了解

邓鑫:

1.本周完成的任务:

完成了web网页的基本样式设计,解决了选择本地磁盘图片,但却在网页上无法打开图片的问题,左边是原图,右边是去噪后的图片

2.下周计划的任务:

继续优化网站页面,为网站配置一些新功能

3.代码签入&问题:

环境配置上有些问题

4.剩下的任务及遇到的困难

完善前端与后端的连接,以及实现模型训练图片后,图片的返回功能

5.收获和疑问

了解并熟悉了前端相关的编写知识

胡俊骥:

1.本周完成的任务:

与其他前端人员共同完善了登录注册页面

2.下周计划的任务:

搜集图片素材,逐步实验

3.代码签入&问题:

4.剩下的任务及遇到的困难

需要实现前后端的兼容,能处理多种数据

5.收获和疑问

对前后端的组成有了更深的了解

3.燃尽图

Alpha 冲刺 (3/3)_第1张图片
完结撒花

4.例会照片

请添加图片描述

5.总结

本人陈某人负责总结这周的进展,由于前几次的博客还没有这么卷,博客对于项目的介绍没有那么详实。现本人会对项目做一个阶段性总结。本人负责的部分是神经网络的搭建+后端的python部分,所以对于前端的一些进展没有那么了解。
一开始从老师那里接触到CBDNet,我回去后立马开始研究这个网络,网络不难理解,UNet是主体,大多数操作也不过是3*3的卷积或者不改大小的池化,唯一有些难理解的部分就是上采样部分,利用到的反卷积我只能知道个大概,但是这些并不影响使用,毕竟CBDNet是封装完毕的网络,我学习这些只是为了求知罢了。
Alpha 冲刺 (3/3)_第2张图片
在colab上我跑出了第一个model和图片,效果和老师的那个如出一辙。
于是接下来我开始思考提升空间,想要去更改网络很难,根据我前几次实验的经验,随意改动参数会降低效果,所以我只能从数据集上入手,因为老师的数据集只有15的train图片,所以我去尝试寻找新数据集。
新数据集训练模型并不难,只要看得懂训练代码和glob就行,但是训练出来的效果还是和老师的差不多,至少在字体上都比较模糊。
所以我选择尝试新网络
在paper with code网站(强力推荐推)上我找到了今年四月份去噪大赛冠军的模型,这个模型7月份发了paper
Alpha 冲刺 (3/3)_第3张图片于是我在colab上尝试了一下,效果很好。
但是在本地上遇到了一些问题,这也是我接下来需要解决的部分。
Alpha 冲刺 (3/3)_第4张图片
Alpha 冲刺 (3/3)_第5张图片
依次为原图,CBDNet和NAFNet。

你可能感兴趣的:(深度学习,人工智能)