deal_cutout.py 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. import time
  2. from concurrent.futures import as_completed, ThreadPoolExecutor, wait
  3. import threading
  4. from .remove_bg_pixian import RemoveBgPiXian, Picture
  5. from .other.module_online_data import GetOnlineData
  6. from .deal_one_image import DealOneImage, DealOneImageBeforehand
  7. from .other.log import MyLogger
  8. from models import UnicornException
  9. import pandas as pd
  10. import csv
  11. from PIL import Image
  12. from io import BytesIO
  13. import os, requests, io
  14. def urlPilImage(url):
  15. yzmdata = requests.get(url)
  16. tempIm = BytesIO(yzmdata.content)
  17. im = Image.open(tempIm)
  18. return im
  19. def check_path(_path):
  20. if not os.path.exists(_path):
  21. os.mkdir(_path)
  22. return True
  23. class DealCutout:
  24. def __init__(self, token):
  25. super().__init__()
  26. self.lock = threading.Lock()
  27. self.need_cutout_images = {}
  28. self.token = token
  29. self.state = 2 # 1进行中 2停止
  30. self.get_online_data = GetOnlineData(self.token)
  31. self.is_upload_pic_num = 0
  32. self.is_deal_num = 0
  33. self.output_type = 0
  34. # 图片列表
  35. self.upload_pic_dict = {}
  36. self.logger = MyLogger().logger
  37. def startDispose(self):
  38. self.get_online_data.refresh_headers()
  39. num = 0
  40. result_array = []
  41. save_root_path = ""
  42. for image_data in self.need_cutout_images:
  43. num += 1
  44. save_root_path = image_data["root_path"]
  45. upload_pic_dict = {}
  46. upload_pic_dict = DealOneImageBeforehand(
  47. image_data=image_data,
  48. lock=self.lock,
  49. windows=self,
  50. num=num,
  51. token=self.token,
  52. ).run(upload_pic_dict)
  53. result = DealOneImage(
  54. image_data=image_data,
  55. lock=self.lock,
  56. windows=self,
  57. num=num,
  58. token=self.token,
  59. ).run(image_data, upload_pic_dict)
  60. result_array.append(result)
  61. return result_array, save_root_path
  62. def normalMode(self):
  63. """普通模式"""
  64. self.get_online_data.refresh_headers()
  65. num = 0
  66. result_array = []
  67. print("self.need_cutout_images", self.need_cutout_images)
  68. save_root_path = ""
  69. for image_data in self.need_cutout_images:
  70. if image_data["need_cutout"] == False:
  71. continue
  72. num += 1
  73. save_root_path = image_data["root_path"]
  74. result = DealOneImageBeforehand(
  75. image_data=image_data,
  76. lock=self.lock,
  77. windows=self,
  78. num=num,
  79. token=self.token,
  80. ).get_image_cut_noraml(image_data)
  81. result_array.append(result)
  82. return result_array, save_root_path
  83. class DealCloths:
  84. def __init__(self, token):
  85. super().__init__()
  86. self.lock = threading.Lock()
  87. self.need_cutout_images = {}
  88. self.token = token
  89. self.output_type = 0
  90. self.state = 2 # 1进行中 2停止
  91. self.get_online_data = GetOnlineData(self.token)
  92. self.is_upload_pic_num = 0
  93. self.is_deal_num = 0
  94. # 图片列表
  95. self.upload_pic_dict = {}
  96. self.logger = MyLogger().logger
  97. def startDispose(self):
  98. self.get_online_data.refresh_headers()
  99. num = 0
  100. result_array = []
  101. save_root_path = ""
  102. for image_data in self.need_cutout_images:
  103. if image_data["need_cutout"] == False:
  104. continue
  105. num += 1
  106. save_root_path = image_data["root_path"]
  107. upload_pic_dict = {}
  108. hand = DealOneImageBeforehand(
  109. image_data=image_data,
  110. lock=self.lock,
  111. windows=self,
  112. num=num,
  113. token=self.token,
  114. )
  115. upload_pic_dict = hand.get_image_cut_cloths(image_data)
  116. result_array.append(upload_pic_dict)
  117. return result_array, save_root_path
  118. class DealModelForm:
  119. """处理人台抠图"""
  120. csvName = "record.csv"
  121. def __init__(self, token, params):
  122. super().__init__()
  123. self.lock = threading.Lock()
  124. self.need_cutout_images = {}
  125. self.token = token
  126. self.output_type = 0
  127. self.state = 2 # 1进行中 2停止
  128. self.get_online_data = GetOnlineData(self.token)
  129. self.is_upload_pic_num = 0
  130. self.is_deal_num = 0
  131. self.params = params
  132. # 图片列表
  133. self.upload_pic_dict = {}
  134. self.logger = MyLogger().logger
  135. def addData2Csv(self, data):
  136. name_list = [
  137. "file_name",
  138. "file_e",
  139. "file_path",
  140. "file",
  141. "root_path",
  142. "need_cutout",
  143. "image_url",
  144. "generate_id",
  145. "status",
  146. ]
  147. isExist = os.path.exists(self.csvName)
  148. csvfile = open(self.csvName, "a", encoding="utf-8-sig")
  149. writer = csv.writer(csvfile)
  150. # 先写入columns_name
  151. if isExist == False:
  152. writer.writerow(name_list)
  153. writer.writerows(data)
  154. csvfile.close()
  155. def startDispose(self):
  156. self.get_online_data.refresh_headers()
  157. num = 0
  158. baseImages = []
  159. resize = 1600 # 定义标准
  160. root_path_list = []
  161. for index, image_data in enumerate(self.need_cutout_images):
  162. if image_data["need_cutout"] == False:
  163. continue
  164. num += 1
  165. root_path_list.append(image_data["root_path"])
  166. file_path = image_data["file_path"]
  167. original_pic = Picture(file_path)
  168. if original_pic.x > original_pic.y:
  169. if original_pic.x > resize:
  170. original_pic.resize(resize)
  171. else:
  172. if original_pic.y > resize:
  173. original_pic.resize_by_heigh(heigh=resize)
  174. buffer = io.BytesIO()
  175. if original_pic.im.mode == "RGBA":
  176. original_pic.im.save(buffer, format="PNG")
  177. else:
  178. original_pic.im.save(buffer, format="JPEG")
  179. buffer.seek(0)
  180. image_url = self.get_online_data.upload_pic(file_path=None, buffer=buffer)
  181. baseImages.append(image_url)
  182. self.need_cutout_images[index]["image_url"] = image_url
  183. data = {
  184. "base_image": baseImages,
  185. "out_width": self.params.out_width,
  186. "out_height": self.params.out_height,
  187. "size_mode": self.params.size_mode,
  188. "output_mode": self.params.output_mode,
  189. }
  190. result_json = self.get_online_data.model_form_segment(data)
  191. generate_ids = result_json.get("generate_ids")
  192. saveParams = []
  193. for idx, id in enumerate(generate_ids):
  194. if self.need_cutout_images[idx]["need_cutout"] == False:
  195. continue
  196. self.need_cutout_images[idx]["generate_id"] = id
  197. # ['file_name', 'file_e', 'file_path',
  198. # 'file','root_path','need_cutout','image_url','generate_id','status']
  199. item = self.need_cutout_images[idx]
  200. saveParams.append(
  201. [
  202. item["file_name"],
  203. item["file_e"],
  204. item["file_path"],
  205. item["file"],
  206. item["root_path"],
  207. item["need_cutout"],
  208. item["image_url"],
  209. item["generate_id"],
  210. False,
  211. ]
  212. )
  213. save_root_path = min(root_path_list)
  214. # self.addData2Csv(saveParams)
  215. return self.need_cutout_images, save_root_path, generate_ids
  216. def search_progress(self):
  217. # try:
  218. # csvData = pd.read_csv(self.csvName)
  219. # except FileNotFoundError as e:
  220. # raise UnicornException("不存在生成记录,请先提交抠人台抠图任务")
  221. """进度查询"""
  222. search_generate_ids = self.params.generate_ids
  223. dataParams = {
  224. "generate_ids": search_generate_ids,
  225. "type": self.params.type,
  226. }
  227. responseData = self.get_online_data.search_progress(dataParams)
  228. generate_ids = self.params.result
  229. successCount = 0
  230. failCount = 0
  231. is_finished = False
  232. save_root_path = ""
  233. if generate_ids is None:
  234. raise UnicornException("参数异常")
  235. if len(generate_ids) > 0:
  236. root_path_list = list(map(lambda x: x.get("root_path"), generate_ids))
  237. save_root_path = min(root_path_list)
  238. save_path = f"{save_root_path}/已扣图"
  239. check_path(save_path)
  240. else:
  241. return is_finished, successCount, failCount, ""
  242. for idx, generate in enumerate(generate_ids):
  243. for respItem in responseData:
  244. try:
  245. if generate["generate_id"] != respItem["id"]:
  246. continue
  247. except:
  248. continue
  249. status = respItem["status"]
  250. print("status", status)
  251. if status == -1:
  252. failCount += 1
  253. break
  254. if status == 2:
  255. successCount += 1
  256. result_image_url = respItem["result_image_urls"][0]
  257. result_image_pil = urlPilImage(result_image_url)
  258. # root_path = generate["root_path"]
  259. file_name = generate["file_name"]
  260. file_e = generate["file_e"]
  261. if result_image_pil.mode == "RGBA":
  262. result_image_pil.save(f"{save_path}/{file_name}.png")
  263. else:
  264. result_image_pil.save(f"{save_path}/{file_name}.jpg")
  265. break
  266. is_finished = (
  267. True if len(search_generate_ids) == (successCount + failCount) else False
  268. )
  269. return is_finished, successCount, failCount, save_root_path