diff --git a/app/api/business/project_api.py b/app/api/business/project_api.py index 9df5ade..e2f1af2 100644 --- a/app/api/business/project_api.py +++ b/app/api/business/project_api.py @@ -5,6 +5,7 @@ from app.model.crud import project_image_crud as pimc from app.service import project_service as ps from app.model.schemas.project_info_schemas import ProjectInfoIn, ProjectInfoPager from app.model.schemas.project_label_schemas import ProjectLabel +from app.model.schemas.project_image_schemas import ProjectImgLeaferLabel from app.model.bussiness_model import ProjectLabel as pl from app.db.db_session import get_db from app.common.jwt_check import get_user_id @@ -126,3 +127,26 @@ def get_image_list(project_id: int, session: Session = Depends(get_db)): return rc.response_success(data=image_list) +@project.post("/save_img_label") +def save_img_label(img_leafer_label: ProjectImgLeaferLabel, session: Session = Depends(get_db)): + """ + 保存图片的标签框选信息 + :param img_leafer_label: + :param session: + :return: + """ + ps.save_img_label(img_leafer_label, session) + return rc.response_success(msg="保存成功") + + +@project.get("/get_img_leafer/{imager_id}") +def get_img_leafer(image_id: int, session: Session = Depends(get_db)): + """ + 根据图片id查询图片的leafer信息 + :param image_id: + :param session: + :return: + """ + img_leafer_out = ps.get_img_leafer(image_id, session) + return rc.response_success(data=img_leafer_out) + diff --git a/app/model/bussiness_model.py b/app/model/bussiness_model.py index dc63ae2..ded46a4 100644 --- a/app/model/bussiness_model.py +++ b/app/model/bussiness_model.py @@ -41,3 +41,21 @@ class ProjectImage(DbCommon): image_url: Mapped[str] = mapped_column(String(255), nullable=False) thumb_image_url: Mapped[str] = mapped_column(String(255), nullable=False) project_id: Mapped[int] = mapped_column(Integer) + + +class ProjectImgLeafer(DbCommon): + """项目图片leafer表""" + __tablename__ = "project_img_leafer" + image_id: Mapped[int] = mapped_column(Integer, nullable=False) + leafer: Mapped[dict] = mapped_column(JSON) + + +class ProjectImgLabel(DbCommon): + """项目图片标签对应表,一张图片对应多个label""" + __tablename__ = "project_img_label" + image_id: Mapped[int] = mapped_column(Integer, nullable=False) + label_id: Mapped[int] = mapped_column(Integer, nullable=False) + mark_center_x: Mapped[str] = mapped_column(String(64), nullable=False) + mark_center_y: Mapped[str] = mapped_column(String(64), nullable=False) + mark_width: Mapped[str] = mapped_column(String(64), nullable=False) + mark_height: Mapped[str] = mapped_column(String(64), nullable=False) diff --git a/app/model/crud/project_image_crud.py b/app/model/crud/project_image_crud.py index a0ee5f6..5b30f0e 100644 --- a/app/model/crud/project_image_crud.py +++ b/app/model/crud/project_image_crud.py @@ -27,8 +27,7 @@ def add_image(image: ProjectImage, session: Session): def add_image_batch(images: List[ProjectImage], session: Session): - for image in images: - session.add(image) + session.add_all(images) session.commit() diff --git a/app/model/crud/project_img_leafer_label_crud.py b/app/model/crud/project_img_leafer_label_crud.py new file mode 100644 index 0000000..66b9efb --- /dev/null +++ b/app/model/crud/project_img_leafer_label_crud.py @@ -0,0 +1,32 @@ +from sqlalchemy.orm import Session +from typing import List + +from app.model.bussiness_model import ProjectImgLeafer +from app.model.bussiness_model import ProjectImgLabel + + +def get_img_leafer(image_id: int, session: Session): + """ + 根据图片id查询图片的leafer信息 + :param image_id: + :param session: + :return: + """ + img_leafer = session.query(ProjectImgLeafer).filter_by(image_id=image_id).first() + return img_leafer + + +def save_img_leafer(leafer: ProjectImgLeafer, session: Session): + leafer_saved = session.query(ProjectImgLeafer).filter_by(image_id=leafer.image_id).first() + if leafer_saved is not None: + session.delete(leafer_saved) + session.add(leafer) + session.commit() + return leafer + + +def save_img_label_batch(image_id: int, img_labels: List[ProjectImgLabel], session: Session): + session.query(ProjectImgLabel).filter_by(image_id=image_id).delete() + session.add_all(img_labels) + session.commit() + return len(img_labels) diff --git a/app/model/schemas/project_image_schemas.py b/app/model/schemas/project_image_schemas.py index 230d1cd..371bd4a 100644 --- a/app/model/schemas/project_image_schemas.py +++ b/app/model/schemas/project_image_schemas.py @@ -1,5 +1,5 @@ from pydantic import BaseModel, Field -from typing import Optional +from typing import Optional, List class ProjectImage(BaseModel): @@ -16,3 +16,25 @@ class ProjectImagePager(BaseModel): project_id: Optional[int] = Field(..., description="项目id") pagerNum: Optional[int] = Field(1, description="当前页码") pagerSize: Optional[int] = Field(10, description="每页数量") + + +class ProjectImgLabelIn(BaseModel): + label_id: int + mark_center_x: str + mark_center_y: str + mark_width: str + mark_height: str + + +class ProjectImgLeaferLabel(BaseModel): + image_id: Optional[int] = Field(..., description="图片id") + leafer: Optional[dict] = Field(..., description="保存的leafer") + label_infos: List[ProjectImgLabelIn] = Field(..., description="标签框选信息") + + +class ProjectImgLeaferOut(BaseModel): + image_id: Optional[int] = Field(..., description="图片id") + leafer: Optional[dict] = Field(..., description="保存的leafer") + + class Config: + orm_mode = True diff --git a/app/service/project_service.py b/app/service/project_service.py index ca3bea8..44f6478 100644 --- a/app/service/project_service.py +++ b/app/service/project_service.py @@ -1,8 +1,9 @@ -from app.model.bussiness_model import ProjectImage -from app.model.bussiness_model import ProjectInfo +from app.model.bussiness_model import ProjectImage, ProjectInfo, ProjectImgLeafer, ProjectImgLabel from app.model.schemas.project_info_schemas import ProjectInfoIn, ProjectInfoOut +from app.model.schemas.project_image_schemas import ProjectImgLeaferLabel, ProjectImgLeaferOut from app.model.crud import project_info_crud as pic from app.model.crud import project_image_crud as pimc +from app.model.crud import project_img_leafer_label_crud as pillc from app.util import os_utils as os from app.util import random_utils as ru from app.config.config_reader import datasets_url, runs_url, images_url @@ -54,5 +55,31 @@ def upload_project_image(project_info: ProjectInfoOut, files: List[UploadFile], pimc.add_image_batch(images, session) +def save_img_label(img_leafer_label: ProjectImgLeaferLabel, session: Session): + """ + 保存图片的标签框选信息,每次保存都会针对图片的信息全部删除,然后重新保存 + :param img_leafer_label: + :param session: + :return: + """ + img_leafer = ProjectImgLeafer(**img_leafer_label) + pillc.save_img_leafer(img_leafer, session) + label_infos = img_leafer_label.label_infos + img_labels = [] + for label_info in label_infos: + img_label = ProjectImgLabel(**label_info.dict()) + img_label.image_id = img_leafer_label.image_id + img_labels.append(img_label) + pillc.save_img_label_batch(img_leafer_label.image_id, img_labels, session) +def get_img_leafer(image_id: int, session: Session): + """ + 根据图片id查询图片的leafer信息 + :param image_id: + :param session: + :return: + """ + img_leafer = pillc.get_img_leafer(image_id, session) + img_leafer_out = ProjectImgLeaferOut.from_orm(img_leafer).dict() + return img_leafer_out