全国协议5人面授小班,企业级独立开发考核,零基础的软硬件工程师基地

登录/注册
当前位置:首页  >   > 计算机视觉研究人员必备的Linux命令行技巧

计算机视觉研究人员必备的Linux命令行技巧

来源:汉码未来
发布人:汉码未来
时间: 2024-11-01 00:23:56 1711417071

计算机视觉研究人员必备的Linux命令行技巧

2022-03-22 13:33
磐创AI
关注
发文

介绍

Jeroen Janssens在《命令行的数据科学》一书中对命令行优势进行了很好的分类:

命令行是灵活的:这个特性使它非常适合数据科学的探索性质。因为你想要及时得到结果。

命令行可以扩展:与其他技术很好地集成。(例如Jupyter笔记本、Colab等)

命令行是可伸缩的:因为你不使用GUI,你实际上输入命令,每个命令都有许多参数,所以它可以很容易地满足你的需要。

命令行是可扩展的:命令行本身与语言无关。因此,你可以开发和扩展它的功能,而不用担心语言。

命令行无处不在:命令行与任何类似Unix的操作系统一起提供。大多数超级计算机、嵌入式系统、服务器、笔记本电脑和云基础设施都使用Linux。

在这篇文章中,想介绍一些关于我经常用于项目的Linux命令

将命令分为两大类:

第一类包括在使用远程服务器和文件时有用

第二类命令包括有助于图像/视频操作。

使用远程服务器和文件

1.检查图像的尺寸

有时在远程服务器上,你正在处理数据,没有任何GUI来查看图像维度。可以使用以下命令检查图像尺寸:

linux@user-pc:~/some/path$ identify image_name.png

>>> image_name.png PNG 1920x1080 8bit sRGB 805918B 0.000u 0:00.000

如果你想将其用于目录中的多个图像(可能你想将它们合并为一个片段,但其中一些图像的维度与其他图像不同!),使用*.png而不是image_name.png

脚本:

import cv2

from pathlib import Path

images = Path('path').rglob('*.png')

for img_path in images:

   img = cv2.imread(img_path

   print(img_path, img.shape)

2.清点目录上的图像

在一些目录中创建数据集之后,我经常检查图像和标签的数量是否相等。(由于我使用jupyter notebook,有时会有一个名为.ipynotebook的隐藏目录,在使用ls命令时不会出现,当数据生成器开始从该目录获取数据时,会出现问题)。

要统计所有图像,请执行以下操作:

ls path/to/images | wc -l

要仅检查png格式文件,请执行以下操作:

find -name *.png -type | wc -l

要使用存储大小检查目录,请执行以下操作:

du -lh --max-depth=1

你还可以使用tree -du -h Path/to/images来检查映像及其占用的磁盘存储空间。命令树的输出更加直观,如下所示:

3.将文件从本地PC复制到远程服务器

我们经常需要将数据上传到远程服务器(或从远程服务器下载)。要做到这一点,你应该以以下方式使用scp命令:

首先,我建议你使用以下命令压缩文件夹:

zip -r output.zip path/to/images path/to/labels

要下载,你应该在本地PC上使用以下命令:

scp remote_user@remote_host:remote_path local_path

例如:

scp user_1@111.222.333.444:/home/user_1/path /home/local_user/path

要上传,请切换源和目标:

scp /home/local_user/path user_1@111.222.333.444:/home/user_1/path

4.在远程服务器上运行jupyter notebook

jupyter notebook帮助研究人员编写脚本和可视化。为了在本地PC上使用它,同时在远程主机上运行,我们在本地计算机和远程主机上使用以下命令,将jupyter notebook转发到本地:

在远程服务器上运行jupyter notebook:

jupyter notebook --no-browser --port=XXXX

端口将本地端口转发到远程端口:

ssh -N -f -L localhost:YYYY:localhost:XXXX remote_user@remote_host

5.使用TMUX运行ML模型训练/评估

在ML模型训练中,我经常遭受网络断开的痛苦,这有时会让我回到原点,重新开始训练模型!

因此,我发现tmux程序是一个非常好的解决方案,你可以将进程与其控制终端分离,从而允许远程会话在不可见的情况下保持活动状态。

使用tmux过程。

· 要启动tmux会话,只需键入tmux。

· 要重命名会话,请键入rename-session -t some_random_name(仅当你已激活会话时)。

· 然后你可以运行你的进程,按CTRL+B,然后按D,从中分离出来。

· 要附加会话,可以使用tmux attach -t some_random_name。

· 要终止会话,请执行tmux kill-session -t yolo

6. 查看GPU资源

如果你在一个团队中工作,你可能会和同事一起经历GPU资源的竞争!!要了解GPU的使用情况(了解其他人何时不使用GPU),请使用以下命令:

watch -n nvidia-smi

nvtop(更好的可视化):

gpustat(管理员更适合同时观看多个GPU)

有时,当你开始训练你的ML模型时,你会将结果记录在一些文本文件中。例如,Detectron2框架或YOLOV5记录度量(准确性、损失等)。

因此,如果我无法访问tensorboard,我将使用此命令检查最后5行的结果,每100秒更新一次:

watch -n 100 tail -n 5

我根据损失和准确度值保存检查点,并用相应的损失和准确度命名权重。因此,我可以在命令行中对它们进行排序,并使用以下命令检查最后一个检查点的准确度:

ls checkpoints | sort | tail -n 1

6.创建gif绘图以显示时间序列图像

我使用GradCam算法,使用tf-explain模块在测试图像上可视化激活层特征提取热图。我经常从图中生成gif,以了解训练过程如何影响模型的准确性。要将目录中的图像转换为绘图,可以使用以下命令:

convert -delay 10 -loop 0 *.png animation.gif

结果是:

如果要将视频转换为gif,可能会注意到输出的gif会变得非常大。因此,减少gif大小的最佳方法是从视频中采样。为此,请使用-r,即采样FPS:

ffmpeg -i video.mp4 -r 10 output.gif

视频/图像处理

ffmpeg是计算机视觉工程师的必备技能,因为她/他必须处理视频/图像数据。ffmpeg有很多技巧,在这里只分享其中的几个。

1.检查视频持续时间

使用以下命令:

ffmpeg -i file.mp4 2>&1 | grep “Duration”

输出结果如下:Duration: 00:05:03.05, start: 0.00000, bitrate:201 kb/s

2.转换视频格式:

为此:

ffmpeg -i video.mp4 video.avi

如果你只需要视频中的音频:

ffmpeg -i input.mp4 -vn output.mp3

3.从视频生成数据集

有时我们可能需要从视频中生成一个数据集,其中一些动作很少发生,比如检测罕见动作或罕见对象,这可以称为“异常检测”。为此,我们需要播放长达数小时的视频。我使用此命令剪切视频的某些部分:

ffmpeg -ss 00:10:00 -i input_video.mp4 -to 00:02:00 -c copy output.mp4

在该命令中:

-ss:开始时间

-i:输入视频

-to:大约2分钟。

-c:输出编解码器

如果你想要没有音频的视频:

ffmpeg -i input_video.mp4 -an -c:v copy output.mp4

-an:用于在没有音频的情况下进行输出。

4.为CONVLSM或3d CNN生成一系列帧

CONVLSM和3d CNN网络用于提取视频序列的时序特征。因此,为了使用这些网络,我们必须为它们的输入张量生成一系列帧。使用此命令从视频生成20秒的图像:

ffmpeg -ss 00:32:15 -t 20 -i videos.ts ~/frames/frame%06d.png

可以添加比例来重新缩放图像尺寸。我大部分的视频都是1028x540,它的宽度必须减半。这是执行此操作的命令:

ffmpeg -ss 00:10:00 -t 20 -i video.ts -vf scale=iw/2:ih output_path/frame%06d.png

或者你可以简单地输入尺寸:

ffmpeg -ss 00:10:00 -t 20 -i video.ts -vf scale=960x540 output_path/frame%06d.png

5.裁剪视频边框

裁剪视频边框:

ffmpeg -i input.mp4 -filter:v "crop=w:h:x:y" output.mp4

6.堆叠视频

在TVConal初创公司,我从事体育分析项目,有时我们想检查不同的视频源是否同步。

视频名称为a.mp4-b.mp4 c.mp4 d.mp4。

6.1-水平堆叠视频:

要沿水平堆叠,我们使用以下命令:

ffmpeg -i a.mp4 -i b.mp4 -filter_complex hstack output.mp4

6.2-垂直堆叠视频:

要沿垂直堆叠,我们使用以下命令:

ffmpeg -i a.mp4 -i b.mp4 -filter_complex vstack=inputs=2 end_vstack.mp4

6.3 2x2网格堆叠

现在让我们尝试更复杂的方法:

ffmpeg -i a.mp4 -i b.mp4 -i c.mp4 -i d.mp4 -filter_complex "[0:v][1:v][2:v][3:v]xstack=inputs=4:layout=0_0|w0_0|0_h0|w0_h0[v]" -map "[v]" 2x2.mp4

结论

相信命令行和python将为数据科学界提供一套强大的工具。因此,使用这些功能强大的工具,我们可以减少在简单任务上的时间浪费。

感谢阅读!

参考引用


       原文标题 : 计算机视觉研究人员必备的Linux命令行技巧

tags: it培训
【免责声明】由于政策等各方面情况的不断调整与变化,本网站所提供的信息仅供参考,请以权威部门公布的正式信息为准。本网站在文章内容来源出处标注为其他平台的稿件均为转载稿,免费转载出于非商业性学习目的,版权归原作者所有。如您对内容、版权等问题存在异议请与本站联系,我们会及时进行处理解决。删除,请联系客服。
相关推荐HOT
云计算是什么?为什么选择云计算
云计算是什么?为什么选择云计算

云计算是一种通过互联网提供计算资源(包括计算能力、存储能力和应用程序)的模式

2024-12-03 13:59:25
零基础如何学习云计算?云计算学习教程
零基础如何学习云计算?云计算学习教程

学习核心技术并通过实践操作来提高技能水平

2024-12-03 13:58:33
零基础学习云计算,个人的一点小看法!
零基础学习云计算,个人的一点小看法!

(1) Linux操作系统(2) vmware\KVM虚拟化(3) 网络\软件定义网络(4) 存储\分布式存储ceph(5) OpenStack云管平台

2024-12-03 13:57:44
究竟云计算就业前景好不好?零基础如何学云计算?
究竟云计算就业前景好不好?零基础如何学云计算?

各大企业都在抢夺专业云计算开发人才

2024-12-03 13:57:08
云计算专业好就业吗?
云计算专业好就业吗?

云计算专业人才可以从事数据分析与处理方面的工作

2024-12-03 13:56:36
云计算的就业方向及对应薪资
云计算的就业方向及对应薪资

云计算平台开发岗位

2024-12-03 13:55:58
云计算应用的五种技术
云计算应用的五种技术

资源复制、弹性扩展(很好地扩展、组合了各种功能)(5)微服务技术对云计算的弹性、高可用性等特性的支撑作用

2024-12-03 13:55:20
什么是云桌面,有什么优点?
什么是云桌面,有什么优点?

云桌面就是把用户桌面以虚拟化的方式运行在服务器上

2024-12-03 13:54:40
云计算的架构模式
云计算的架构模式

阿里云实现了真正的云计算

2024-12-03 13:54:01
用户如何使用云服务产品?
用户如何使用云服务产品?

SaaS 型消费者付款的计算因素包括最终用户数、使用时间的长短、消耗的网络带宽、存储的数据规模或者数据保存期限等

2024-12-02 09:27:03
FreeMarker template error (DEBUG mode; use RETHROW in production!): Template inclusion failed (for parameter value "./public/SingUp.ftl"): Template not found for name "./public/SingUp.ftl" (normalized: "public/SingUp.ftl"). The name was interpreted by this TemplateLoader: FileTemplateLoader(baseDir="/www/wwwroot/hanma/templatePath", canonicalBasePath="/www/wwwroot/hanma/templatePath/"). ---- FTL stack trace ("~" means nesting-related): - Failed at: #include "./public/SingUp.ftl" [in template "news.ftl" at line 451, column 3] ---- Java stack trace (for programmers): ---- freemarker.core._MiscTemplateException: [... Exception message was already printed; see it above ...] at freemarker.core.Include.accept(Include.java:164) at freemarker.core.Environment.visit(Environment.java:335) at freemarker.core.Environment.visit(Environment.java:341) at freemarker.core.Environment.process(Environment.java:314) at freemarker.template.Template.process(Template.java:383) at com.ruoyi.system.utils.FreeMarkerUtil.analysisTemplate(FreeMarkerUtil.java:39) at com.ruoyi.system.utils.MongoDBUtil.generateStaticFileAndSaveToMongoDBCommon(MongoDBUtil.java:488) at com.ruoyi.system.utils.MongoDBUtil.generateStaticFileAndSaveToMongoDBForTopic(MongoDBUtil.java:622) at com.ruoyi.system.utils.MongoDBUtil.updateTopic(MongoDBUtil.java:737) at com.ruoyi.system.service.impl.computerImpl.HanmaTopicDetailsServiceImpl.updateHanmaTopicDetails(HanmaTopicDetailsServiceImpl.java:179) at com.ruoyi.system.controller.HanmaTopicDetailsController.editSave(HanmaTopicDetailsController.java:180) at com.ruoyi.system.controller.HanmaTopicDetailsController$$FastClassBySpringCGLIB$$c9e76dc6.invoke() at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:64) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:57) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:58) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:175) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor$1.proceed(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:82) at org.apache.shiro.authz.aop.AuthorizingMethodInterceptor.invoke(AuthorizingMethodInterceptor.java:39) at org.apache.shiro.spring.security.interceptor.AopAllianceAnnotationsAuthorizingMethodInterceptor.invoke(AopAllianceAnnotationsAuthorizingMethodInterceptor.java:115) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707) at com.ruoyi.system.controller.HanmaTopicDetailsController$$EnhancerBySpringCGLIB$$1a45d8cd.editSave() at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:903) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:809) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108) at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66) at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:458) at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:373) at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:370) at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:154) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:114) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at com.ruoyi.system.filter.AppendSlashFilter.doFilter(AppendSlashFilter.java:43) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:926) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1791) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.base/java.lang.Thread.run(Thread.java:833) Caused by: freemarker.template.TemplateNotFoundException: Template not found for name "./public/SingUp.ftl" (normalized: "public/SingUp.ftl"). The name was interpreted by this TemplateLoader: FileTemplateLoader(baseDir="/www/wwwroot/hanma/templatePath", canonicalBasePath="/www/wwwroot/hanma/templatePath/"). at freemarker.template.Configuration.getTemplate(Configuration.java:2957) at freemarker.core.Environment.getTemplateForInclusion(Environment.java:3062) at freemarker.core.Include.accept(Include.java:162) ... 127 more