项目:基于Unet的图像噪声修复网站
声明:本博客为OUC2022秋季软件工程06组作业
组长:黎泉林
项目地址 | https://github.com/xiaoli-guan/ImageRepairWeb-ING-202211.git |
---|
后端:
前端:
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.代码签入&问题:
我们小组前后端是用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时遇到的问题:
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里了。。
4.剩下的任务及遇到的困难
5.收获和疑问
这一周花在软工的时间有点多了,基本都在改报错。。。不过也是有不少收获的,懂得了java进程如何调用python进程,以及anaconda的使用方法
1.本周完成的任务:
前端登录页面以及数据库的实现
2.下周计划的任务:
与其他组件组装完成整体的架构
3.代码签入&问题:
嵌入时在不同机器上可能会有路径改变的问题需要注意
4.剩下的任务及遇到的困难
构建一个美观的登录页面
5.收获和疑问
对ssm框架与神经网络的运行有了进一步的了解
1.本周完成的任务:
完成了web网页的基本样式设计,解决了选择本地磁盘图片,但却在网页上无法打开图片的问题,左边是原图,右边是去噪后的图片
2.下周计划的任务:
继续优化网站页面,为网站配置一些新功能
3.代码签入&问题:
环境配置上有些问题
4.剩下的任务及遇到的困难
完善前端与后端的连接,以及实现模型训练图片后,图片的返回功能
5.收获和疑问
了解并熟悉了前端相关的编写知识
1.本周完成的任务:
与其他前端人员共同完善了登录注册页面
2.下周计划的任务:
搜集图片素材,逐步实验
3.代码签入&问题:
无
4.剩下的任务及遇到的困难
需要实现前后端的兼容,能处理多种数据
5.收获和疑问
对前后端的组成有了更深的了解
本人陈某人负责总结这周的进展,由于前几次的博客还没有这么卷,博客对于项目的介绍没有那么详实。现本人会对项目做一个阶段性总结。本人负责的部分是神经网络的搭建+后端的python部分,所以对于前端的一些进展没有那么了解。
一开始从老师那里接触到CBDNet,我回去后立马开始研究这个网络,网络不难理解,UNet是主体,大多数操作也不过是3*3的卷积或者不改大小的池化,唯一有些难理解的部分就是上采样部分,利用到的反卷积我只能知道个大概,但是这些并不影响使用,毕竟CBDNet是封装完毕的网络,我学习这些只是为了求知罢了。
在colab上我跑出了第一个model和图片,效果和老师的那个如出一辙。
于是接下来我开始思考提升空间,想要去更改网络很难,根据我前几次实验的经验,随意改动参数会降低效果,所以我只能从数据集上入手,因为老师的数据集只有15的train图片,所以我去尝试寻找新数据集。
新数据集训练模型并不难,只要看得懂训练代码和glob就行,但是训练出来的效果还是和老师的差不多,至少在字体上都比较模糊。
所以我选择尝试新网络
在paper with code网站(强力推荐推)上我找到了今年四月份去噪大赛冠军的模型,这个模型7月份发了paper
于是我在colab上尝试了一下,效果很好。
但是在本地上遇到了一些问题,这也是我接下来需要解决的部分。
依次为原图,CBDNet和NAFNet。