Web+图像目标检测项目—③后端代码逻辑

后端代码逻辑

1.URL->Function

①自带的admin路由不用管
②要在URL上访问文件得用document_root,用正则表达式匹配。
③homepage URL->views.py中的homepage函数,返回页面。
④upload URL->后端处理前端请求的函数,返回数据。

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    re_path(r'media/(?P<path>.*)$', serve, {'document_root': MEDIA_ROOT}),
    url(r'homepage', views.homepage),
    url(r'upload',views.upload),
]
2.views.py
这部分写的有点耦合(烂)了hhh,不过我奉行的是能运行就行(狗头)。

select三个任务的判断,每个分别有自己的运行逻辑,最后返回的数据要弄成Json格式返回。
@csrf_exempt
def upload(request):
    if request.method=='POST':
        file=request.FILES.get("files",None)
        file_select = request.POST.get("select", None)
        if not file:
            return render(request, "index.html")
        elif file_select == "":
            return render(request, "index.html")
        print(file, "  ", file_select)
        if file_select=="2":
            destination = open(os.path.join("/home/ubuntu/webdetect/dcdjango/upload", file.name), 'wb+')
            for chunk in file.chunks():  # 分块写入文件
                destination.write(chunk)
            destination.close()
            imgname=file.name
            img_path="/home/ubuntu/webdetect/dcdjango/upload/"+imgname
            out_put_imgname="/home/ubuntu/webdetect/dcdjango/static/exp/"+imgname
            ins = instanceSegmentation()
            ins.load_model("/home/ubuntu/remote-seg/pointrend_resnet50.pkl",confidence=0.3)
            target_classes = ins.select_target_classes(car = True,airplane=True,bus=True,train=True,truck=True,boat=True)
            result,output=ins.segmentImage(img_path, show_bboxes=True,segment_target_classes=target_classes,output_image_name=out_put_imgname)
            ctx={}
            data={}
            d1=[]
            cls_name_list=[]
            conf_list=[]
            cls_name_list=result["class_names"]
            for i in result["scores"]:
                conf_list.append(i/100)
            print(cls_name_list,conf_list)
            ctx['d1']=d1
            ctx['data']=data
            ss='/image/'
            ctx['imgs']=ss+imgname
            sstr='http://152.136.16.20:8001/static/exp/'+imgname
            print(sstr)
            rt_json={"img_url":sstr,"obj_list":cls_name_list,"conf_list":conf_list}
            return HttpResponse(json.dumps(rt_json), content_type="application/json")
        elif file_select=="0":
            destination = open(os.path.join("/home/ubuntu/webdetect/dcdjango/upload", file.name), 'wb+')
            for chunk in file.chunks():  # 分块写入文件
                destination.write(chunk)
            destination.close()
            imgname=file.name
            str1='python '
            str2='/home/ubuntu/remote-sensing-image-caption/classification/predict.py '
            str3='/home/ubuntu/webdetect/dcdjango/upload/ '
            str4=imgname
            txt_result="/home/ubuntu/webdetect/dcdjango/static/exp/labels/"+imgname[0:-4]+".txt"
            exestr1=str1+str2+str3+str4
            print(exestr1)
            r=os.system(exestr1)
            cp="cp -f /home/ubuntu/webdetect/dcdjango/upload/"+imgname+" /home/ubuntu/webdetect/dcdjango/static/exp/"
            os.system(cp)
            ctx={}
            data={}
            d1=[]
            with open(txt_result,"r") as f:
                for line in f.readlines():
                    cls_name,conf=line.split(' ')[0:2]
            print(cls_name," ",conf)
            cls_name_list=[]
            conf_list=[]
            cls_name_list.append(cls_name)
            conf_list.append(conf)
            print(cls_name_list,conf_list)
            ctx['d1']=d1
            ctx['data']=data
            ss='/image/'
            ctx['imgs']=ss+imgname
            sstr='http://152.136.16.20:8001/static/exp/'+imgname
            print(sstr)
            rt_json={"img_url":sstr,"obj_list":cls_name_list,"conf_list":conf_list}
            return HttpResponse(json.dumps(rt_json), content_type="application/json")
        elif file_select == "1":
            destination = open(os.path.join("/home/ubuntu/webdetect/dcdjango/upload", file.name), 'wb+')  # 打开特定的文件进行二进制的写操作
            # destination = open(os.path.join("C:\\Users\\liusir\\Desktop\\毕设\\论文刻盘\\毕设程序\\webdetect\\dcdjango\\upload", file.name), 'wb+')  # 打开特定的文件进行二进制的写操作
            for chunk in file.chunks():  # 分块写入文件
                destination.write(chunk)
            destination.close()
            imgname=file.name
            filename=imgname[:-4]+".txt"
            txt_path="/home/ubuntu/webdetect/dcdjango/static/exp/labels/"
            open(os.path.join(txt_path,filename), 'w').close()
            str1='python '
            str2 = '/home/ubuntu/yolov5_obb/detect.py ' 
            str4 = ' --project /home/ubuntu/webdetect/dcdjango/static'
            str3='--source /home/ubuntu/webdetect/dcdjango/upload/'+imgname
            str5=' --name exp'
            exestr=str1+str2+str3+str4+str5
            print(exestr)
            r=os.system(exestr)
            ctx={}
            data={}
            d1=[]
            d2=[]
            j=0
            obj_name=[]
            confidence=[]
            print(filename)
            obj_name,confidence=rt_textresult(os.path.join(txt_path,filename))
            print(obj_name,confidence)
            ctx['d1']=d1
            ctx['data']=data
            ss='/image/'
            ctx['imgs']=ss+imgname
            sstr='http://152.136.16.20:8001/static/exp/'+imgname
            print(sstr)
            rt_json={"img_url":sstr,"obj_list":obj_name,"conf_list":confidence}
            return HttpResponse(json.dumps(rt_json), content_type="application/json")
    return HttpResponse(rt_json)
3.处理预测的文本结果
因为预测的结果是txt,最终要通过Json形式返回,所以必须读出来并且以合适的格式方便后续处理。
比如目标检测的结果,我们只需要第一列类别索引和最后一列的confidence置信度,那么就需要进行字符串处理。		

在这里插入图片描述

names = ['plane', 'baseball-diamond', 'bridge', 'ground-track-field', 'small-vehicle', 
        'large-vehicle', 'ship', 'tennis-court', 'basketball-court', 'storage-tank',  
        'soccer-ball-field', 'roundabout', 'harbor', 'swimming-pool', 'helicopter', 
        'container-crane']  # class names
def homepage(request):  #URL中homepage返回页面
    return render(request,'index.html')
def rt_textresult(file_name):    #处理预测的文本结果
    obj_name=[]
    confidence=[]
    with open(file_name,"r") as f:
        for line in f.readlines():
            r0,r1,r2,r3,r4,r5,r6,r7,r8,r9=line.split(' ')[0:10]
            r0=int(r0)
            if r0<=15:
                name=names[r0]
                r9=r9[:-1]
                obj_name.append(name)
                confidence.append(r9)
    return obj_name,confidence
查看交互的数据

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Java Servlet或JSP来实现图像上传功能: 1. 创建一个HTML文件,添加一个表单,其中包含一个文件上传控件,用于选择图像文件,并使用POST方法提交表单。 2. 在服务器端,创建一个Java Servlet,处理POST请求,从表单中获取图像文件,并存储到服务器上的某个位置。 3. 在服务器端,创建一个JSP文件,读取指定位置的图像文件,并将其转换为HTML格式,以便在Web浏览器中显示图像。 ### 回答2: 以下是一个基本的Java Web图像上传下载的功能代码示例: 1. 图像上传功能: 在页面上添加一个文件上传的表单,用户可以选择本地的图像文件进行上传。在后端使用Java代码处理图像上传的功能。 (1)创建一个HTML表单用于图像上传: ```HTML <form action="upload" method="POST" enctype="multipart/form-data"> <input type="file" name="image"> <input type="submit" value="Upload"> </form> ``` (2)创建一个Servlet来处理图像上传的请求: ```java @WebServlet("/upload") @MultipartConfig public class ImageUploadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Part filePart = request.getPart("image"); String fileName = filePart.getSubmittedFileName(); InputStream fileContent = filePart.getInputStream(); // 将图像文件保存到服务器上的某个目录中 // 例如:FileOutputStream outputStream = new FileOutputStream("upload/" + fileName); } } ``` 2. 图像下载功能: 当用户在页面上点击某个链接或按钮时,会触发一个请求,后端会将服务器上的图像文件发送给用户进行下载。 (1)创建一个包含下载链接的页面: ```html <a href="download?filename=image.jpg">Download Image</a> ``` (2)创建一个Servlet来处理图像下载的请求: ```java @WebServlet("/download") public class ImageDownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("filename"); // 设置响应的内容类型为图像类型 response.setContentType("image/jpeg"); // 从服务器上读取图像文件并发送给用户进行下载 // 例如:FileInputStream inputStream = new FileInputStream("upload/" + fileName); // OutputStream outputStream = response.getOutputStream(); // byte[] buffer = new byte[4096]; // while (inputStream.read(buffer) != -1) { // outputStream.write(buffer); // } } } ``` 以上代码是一个简单的图像上传下载的功能实现,实际应用中还需要进行错误处理、文件存储路径的配置等。 ### 回答3: 以下是一个实现Java web图像上传下载功能的示例代码: 1. 图像上传功能: ```java @WebServlet("/UploadImageServlet") @MultipartConfig(fileSizeThreshold = 1024 * 1024 * 2, // 2MB maxFileSize = 1024 * 1024 * 10, // 10MB maxRequestSize = 1024 * 1024 * 50) // 50MB public class UploadImageServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String savePath = "your-upload-folder-path"; File fileSaveDir = new File(savePath); if (!fileSaveDir.exists()) { fileSaveDir.mkdirs(); } String fileName = ""; for (Part part : request.getParts()) { fileName = extractFileName(part); part.write(savePath + File.separator + fileName); } // 保存文件成功后的逻辑处理 response.getWriter().write("Image uploaded successfully!"); } // 从Part的header中提取文件名 private String extractFileName(Part part) { String contentDisp = part.getHeader("content-disposition"); String[] items = contentDisp.split(";"); for (String s : items) { if (s.trim().startsWith("filename")) { return s.substring(s.indexOf("=") + 2, s.length()-1); } } return ""; } } ``` 2. 图像下载功能: ```java @WebServlet("/DownloadImageServlet") public class DownloadImageServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = "your-image-file-name.jpg"; String savePath = "your-upload-folder-path"; String filePath = savePath + File.separator + fileName; File file = new File(filePath); FileInputStream fis = new FileInputStream(file); OutputStream os = response.getOutputStream(); byte[] buffer = new byte[4096]; int bytesRead = -1; while ((bytesRead = fis.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } fis.close(); os.close(); } } ``` 在web.xml中配置一下URL映射,确保Servlet可以被访问到: ```xml <servlet> <servlet-name>UploadImageServlet</servlet-name> <servlet-class>com.example.UploadImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>UploadImageServlet</servlet-name> <url-pattern>/UploadImageServlet</url-pattern> </servlet-mapping> <servlet> <servlet-name>DownloadImageServlet</servlet-name> <servlet-class>com.example.DownloadImageServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>DownloadImageServlet</servlet-name> <url-pattern>/DownloadImageServlet</url-pattern> </servlet-mapping> ``` 请注意,在示例代码中的路径和文件名需要根据你的实际情况进行修改。此外,如果要确保上传的图像文件不会覆盖已有的文件,可以使用UUID或时间戳等方式生成唯一的文件名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值