deal_cutout.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. import time
  2. from concurrent.futures import as_completed, ThreadPoolExecutor, wait
  3. import threading
  4. from .remove_bg_pixian import RemoveBgPiXian
  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
  14. def urlPilImage(url):
  15. yzmdata = requests.get(url)
  16. tempIm = BytesIO(yzmdata.content)
  17. im = Image.open(tempIm)
  18. return im
  19. class DealCutout:
  20. def __init__(self, token):
  21. super().__init__()
  22. self.lock = threading.Lock()
  23. self.need_cutout_images = {}
  24. self.token = token
  25. self.state = 2 # 1进行中 2停止
  26. self.get_online_data = GetOnlineData(self.token)
  27. self.is_upload_pic_num = 0
  28. self.is_deal_num = 0
  29. self.output_type = 0
  30. # 图片列表
  31. self.upload_pic_dict = {}
  32. self.logger = MyLogger().logger
  33. def startDispose(self):
  34. self.get_online_data.refresh_headers()
  35. num = 0
  36. result_array = []
  37. save_root_path = ""
  38. for image_data in self.need_cutout_images:
  39. num += 1
  40. save_root_path = image_data["root_path"]
  41. upload_pic_dict = {}
  42. upload_pic_dict = DealOneImageBeforehand(
  43. image_data=image_data,
  44. lock=self.lock,
  45. windows=self,
  46. num=num,
  47. token=self.token,
  48. ).run(upload_pic_dict)
  49. result = DealOneImage(
  50. image_data=image_data,
  51. lock=self.lock,
  52. windows=self,
  53. num=num,
  54. token=self.token,
  55. ).run(image_data, upload_pic_dict)
  56. result_array.append(result)
  57. return result_array, save_root_path
  58. def normalMode(self):
  59. """普通模式"""
  60. self.get_online_data.refresh_headers()
  61. num = 0
  62. result_array = []
  63. print("self.need_cutout_images", self.need_cutout_images)
  64. save_root_path = ""
  65. for image_data in self.need_cutout_images:
  66. num += 1
  67. save_root_path = image_data["root_path"]
  68. result = DealOneImageBeforehand(
  69. image_data=image_data,
  70. lock=self.lock,
  71. windows=self,
  72. num=num,
  73. token=self.token,
  74. ).get_image_cut_noraml(image_data)
  75. result_array.append(result)
  76. return result_array, save_root_path
  77. class DealCloths:
  78. def __init__(self, token):
  79. super().__init__()
  80. self.lock = threading.Lock()
  81. self.need_cutout_images = {}
  82. self.token = token
  83. self.output_type = 0
  84. self.state = 2 # 1进行中 2停止
  85. self.get_online_data = GetOnlineData(self.token)
  86. self.is_upload_pic_num = 0
  87. self.is_deal_num = 0
  88. # 图片列表
  89. self.upload_pic_dict = {}
  90. self.logger = MyLogger().logger
  91. def startDispose(self):
  92. self.get_online_data.refresh_headers()
  93. num = 0
  94. result_array = []
  95. save_root_path = ""
  96. for image_data in self.need_cutout_images:
  97. num += 1
  98. save_root_path = image_data["root_path"]
  99. upload_pic_dict = {}
  100. hand = DealOneImageBeforehand(
  101. image_data=image_data,
  102. lock=self.lock,
  103. windows=self,
  104. num=num,
  105. token=self.token,
  106. )
  107. upload_pic_dict = hand.get_image_cut_cloths(image_data)
  108. result_array.append(upload_pic_dict)
  109. return result_array, save_root_path
  110. class DealModelForm:
  111. '''处理人台抠图'''
  112. csvName = 'record.csv'
  113. def __init__(self, token,params):
  114. super().__init__()
  115. self.lock = threading.Lock()
  116. self.need_cutout_images = {}
  117. self.token = token
  118. self.output_type = 0
  119. self.state = 2 # 1进行中 2停止
  120. self.get_online_data = GetOnlineData(self.token)
  121. self.is_upload_pic_num = 0
  122. self.is_deal_num = 0
  123. self.params = params
  124. # 图片列表
  125. self.upload_pic_dict = {}
  126. self.logger = MyLogger().logger
  127. def addData2Csv(self,data):
  128. name_list = ['file_name', 'file_e', 'file_path', 'file','root_path','need_cutout','image_url','generate_id','status']
  129. isExist = os.path.exists(self.csvName)
  130. csvfile = open(self.csvName,"a")
  131. writer = csv.writer(csvfile)
  132. #先写入columns_name
  133. if isExist == False:
  134. writer.writerow(name_list)
  135. writer.writerows(data)
  136. csvfile.close()
  137. def startDispose(self):
  138. self.get_online_data.refresh_headers()
  139. num = 0
  140. save_root_path = ""
  141. baseImages = []
  142. for index,image_data in enumerate(self.need_cutout_images):
  143. num += 1
  144. save_root_path = image_data["root_path"]
  145. file_path = image_data["file_path"]
  146. image_url = self.get_online_data.upload_pic(file_path)
  147. baseImages.append(image_url)
  148. self.need_cutout_images[index]["image_url"] = image_url
  149. data = {
  150. "base_image":baseImages,
  151. "out_width":self.params.out_width,
  152. "out_height":self.params.out_height,
  153. "size_mode":self.params.size_mode,
  154. "output_mode":self.params.output_mode,
  155. }
  156. result_json = self.get_online_data.model_form_segment(data)
  157. generate_ids = result_json.get("generate_ids")
  158. saveParams = []
  159. for idx,id in enumerate(generate_ids):
  160. self.need_cutout_images[idx]['generate_id'] = id
  161. # ['file_name', 'file_e', 'file_path',
  162. # 'file','root_path','need_cutout','image_url','generate_id','status']
  163. item = self.need_cutout_images[idx]
  164. saveParams.append([item['file_name'],
  165. item['file_e'],
  166. item['file_path'],
  167. item['file'],
  168. item['root_path'],
  169. item['need_cutout'],
  170. item['image_url'],
  171. item['generate_id'],
  172. False,
  173. ])
  174. self.addData2Csv(saveParams)
  175. return self.need_cutout_images, save_root_path,generate_ids
  176. def search_progress(self):
  177. try:
  178. csvData = pd.read_csv(self.csvName)
  179. except FileNotFoundError as e:
  180. raise UnicornException("不存在生成记录,请先提交抠人台抠图任务")
  181. '''进度查询'''
  182. print("self.params",self.params)
  183. search_generate_ids = self.params.generate_ids
  184. dataParams = {
  185. "generate_ids":search_generate_ids,
  186. "type":self.params.type,
  187. }
  188. responseData = self.get_online_data.search_progress(dataParams)
  189. generate_ids = csvData.loc[csvData['generate_id'].isin(search_generate_ids)]
  190. successCount = 0
  191. failCount = 0
  192. is_finished = False
  193. root_path = ""
  194. for idx,generate in generate_ids.iterrows():
  195. for respItem in responseData:
  196. if generate["generate_id"]!=respItem["id"]:
  197. continue
  198. status = respItem['status']
  199. if status == -1:
  200. failCount+=1
  201. csvData.drop(csvData.loc[csvData['generate_id'] == generate["generate_id"]].index,inplace=True)
  202. break
  203. if status == 2:
  204. successCount+=1
  205. result_image_url = respItem['result_image_urls'][0]
  206. result_image_pil = urlPilImage(result_image_url)
  207. root_path = generate["root_path"]
  208. file_name = generate["file"]
  209. result_image_pil.save(f"{root_path}/已扣图/{file_name}")
  210. csvData.drop(csvData.loc[csvData['generate_id'] == generate["generate_id"]].index,inplace=True)
  211. break
  212. csvData.to_csv(self.csvName)
  213. is_finished = True if len(search_generate_ids) == (successCount+failCount) else False
  214. return is_finished,successCount,failCount,root_path