Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 28.34 KB | None | 0 0
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Mar 15 18:19:51 2019
  4.  
  5. @author: Luke
  6. """
  7. from PIL import Image, ImageDraw
  8. import glob
  9. import math
  10. import numpy as np
  11. import csv
  12. import ast
  13. import os
  14. import time
  15. from optparse import OptionParser
  16. #from patchify import patchify
  17.  
  18. def read_csv(url,scale):
  19. global frame_dict
  20. frame_dict = {}
  21. with open(url, mode='r') as csv_file:
  22. csv_reader = csv.DictReader(csv_file)
  23. line_count = 0
  24. for row in csv_reader:
  25. if row["Name"] not in frame_dict:
  26. frame_dict[row["Name"]] = []
  27. if line_count == 0:
  28. line_count += 1
  29. continue
  30. for key in row.items():
  31. if key[0] != "Name" and key[0] != "URL":
  32. if key[1:][0] is None:
  33. #print("None!")
  34. continue
  35. if type(key[1:][0]) == list:
  36. #print("ACTIVATING")
  37. #frame_dict[row["Name"]] +=
  38. coords = [ast.literal_eval(item) for item in key[1:][0]] #generate UL, UR, LL, LR coordinates
  39. frame_dict[row["Name"]] += [convert_data_coords(coord,scale) for coord in coords]
  40. else:
  41. #print("ACTIVATING 2")
  42. coords = [ast.literal_eval(item) for item in key[1:]]
  43. frame_dict[row["Name"]] += [convert_data_coords(coord,scale) for coord in coords]
  44.  
  45. #print("\n")
  46. return frame_dict
  47.  
  48. def convert_data_coords(coord,scale): #assume we took in a valid coord list
  49. coordinate = []
  50. coordinate.append([int(coord[0]/scale),int(coord[1]/scale)])
  51. coordinate.append([int((coord[0]+coord[3])/scale),int(coord[1]/scale)])
  52. coordinate.append([int(coord[0]/scale),int((coord[1]+coord[2])/scale)])
  53.  
  54. coordinate.append([int((coord[0]+coord[3])/scale),int((coord[1]+coord[2])/scale)])
  55.  
  56. return coordinate #returns (upper left, upper right, lower left, lower right)
  57.  
  58. def convert_back(coords):
  59. new_coords = []
  60. for coord in coords:
  61. print(coord)
  62. x0 = coord[0][0]
  63. y0 = coord[0][1]
  64. print(coord)
  65. print(coord[2][1])
  66. print(coord[0][1])
  67. w = coord[1][0] - coord[0][0]
  68. h = coord[2][1] - coord[0][1]
  69.  
  70. new_coords.append([x0,y0,h,w])
  71. return new_coords
  72.  
  73.  
  74. def resize(image, scale):
  75. width, height = image.size
  76.  
  77. new_width = int(width / scale)
  78. new_height = int(new_width * height / width)
  79.  
  80. new_height = int(height / scale)
  81. new_width = int(new_height * width / height)
  82.  
  83. image = image.resize((new_width, new_height), Image.ANTIALIAS)
  84.  
  85. return image
  86.  
  87. def load_images(url, scale=2):
  88. image_list = []
  89.  
  90. for filename in glob.glob(url):
  91. name = os.path.basename(filename)
  92. im=Image.open(filename)
  93. #print(im)
  94. im = resize(im, scale)
  95. print("name:", name)
  96. draw_rect(im, name)
  97. image_list.append((name,im))
  98. im.show()
  99. #raise ValueError("break!")
  100. return image_list
  101.  
  102. def draw_rect(image, name):
  103. draw = ImageDraw.Draw(image)
  104. print("frame_dict")
  105. print(frame_dict)
  106. print(name)
  107. for box in frame_dict[name]: #all bounding boxes for this image4
  108. upper_left = box[0]
  109. upper_right = box[1]
  110. lower_left = box[2]
  111. lower_right = box[3]
  112.  
  113. draw.ellipse((upper_left[0]-4,upper_left[1]-4,upper_left[0]+4,upper_left[1]+4), fill='red') #UPPER LEFT
  114. draw.ellipse((upper_right[0]-4,upper_right[1]-4,upper_right[0]+4,upper_right[1]+4), fill='orange') #UPPER RIGHT
  115. draw.ellipse((lower_left[0]-4,lower_left[1]-4,lower_left[0]+4,lower_left[1]+4), fill='yellow') #LOWER LEFT
  116. draw.ellipse((lower_right[0]-4,lower_right[1]-4,lower_right[0]+4,lower_right[1]+4), fill='green') #LOWER RIGHT
  117. draw.point(lower_left, 'yellow')
  118. draw.point(lower_right, 'green')
  119.  
  120. print(upper_left[0],upper_left[1],lower_right[0],lower_right[1])
  121. draw.rectangle((upper_left[0],upper_left[1],lower_right[0],lower_right[1]))
  122.  
  123. #image.show()
  124.  
  125. def crop(image, name, height, width):
  126. #all assuming imgheigh > height <- fix
  127. #iterate for each image
  128. patch_list = []
  129. imgwidth, imgheight = image.size
  130. print(imgwidth)
  131. #vertical-wise
  132. num_vert_boxes = math.ceil(imgheight/height)
  133. vertical_offset = (num_vert_boxes * height - imgheight)/num_vert_boxes + 1
  134.  
  135. #horizontal-wise
  136. num_horiz_boxes = math.ceil(imgwidth/width)
  137. horizontal_offset = int((num_horiz_boxes * width - imgwidth)/num_horiz_boxes + 1)
  138. horizontal_offset += int((1/3)*horizontal_offset + (2/3)*((2*num_horiz_boxes)**2)) #not sure why I had to hack it by adding that extra term. Will investigate later
  139. #horizontal_offset += int((1/3)*horizontal_offset)
  140. previous_right = None
  141. previous_top = None
  142. cropped_images_with_names = []
  143. vert = 0
  144. for i in range(num_vert_boxes):
  145. if previous_top is None:
  146. bottom = 0
  147. else:
  148. bottom = previous_top - vertical_offset
  149. top = bottom + height
  150.  
  151. #HORIZONTAL scan (left to right)
  152. previous_right = None
  153. horiz=0
  154. vert += 1
  155. for j in range(num_horiz_boxes):
  156. if previous_right is None:
  157. left = 0
  158. else:
  159. left = previous_right - horizontal_offset
  160. right = left + width
  161.  
  162. horiz += 1
  163. boundary = (left,top,right,bottom)
  164. #draw_patch_border(image,left,top,right,bottom)
  165. patch_list.append((left,top,right,bottom))
  166. print((left,top,right,bottom))
  167.  
  168. draw_patch_border(image,left,top,right,bottom)
  169.  
  170. previous_right = right
  171.  
  172. patch_name = name[:-4] + "_H" + str(horiz) + "_V" + str(vert)
  173. cropped = image.crop((left,bottom,right,top))
  174. cropped_images_with_names.append((patch_name,cropped,boundary))
  175.  
  176.  
  177. previous_top = top
  178.  
  179. #print(len(cropped_images))
  180. print("CROPPED IMAGES:", cropped_images_with_names)
  181. print("\n", image)
  182. image.show()
  183. #for image in cropped_images_with_names:
  184. #image[1].show()
  185. # print(image[1].size)
  186. #image.show()
  187. print("FINAL OUTPUT")
  188. return cropped_images_with_names
  189.  
  190. def draw_patch_border(image, left,top,right,bottom):
  191. draw = ImageDraw.Draw(image)
  192. print(left,top,right,bottom)
  193. draw.rectangle((left,top,right,bottom), outline=tuple(np.random.choice(range(256), size=3)))
  194.  
  195.  
  196. def check_if_in(cropped_image, patch_boundary, frame_name, coord_list): #patch_boundary = (left, bottom, right, top)
  197. #coord_list = frame_dict[frame_name] #coord = (upper_left, upper_right, lower_left, lower_right)
  198. left, bottom, right, top = patch_boundary[0], patch_boundary[1], patch_boundary[2], patch_boundary[3]
  199. coord_output = []
  200. for coord in coord_list:
  201. upper_left = coord[0] #in [][]
  202. upper_right = coord[1]
  203. lower_left = coord[2]
  204. lower_right = coord[3]
  205.  
  206. labeled_coords = [upper_left, upper_right, lower_left, lower_right]
  207.  
  208. print("COORD:", coord)
  209.  
  210. #generate corners_inside:
  211. corners_inside = []
  212. for elem in labeled_coords:
  213. if corner_in(patch_boundary, elem):
  214. corners_inside.append(elem)
  215.  
  216.  
  217. #upper left and lower right corner in patch - whole thing is in
  218. if corner_in(patch_boundary, upper_left) and corner_in(patch_boundary, lower_right):
  219. print("WE GOT IT")
  220. new_upper_left = [upper_left[0] - left, upper_left[1] - top]
  221. new_upper_right = [upper_right[0] - left, upper_right[1] - top]
  222. new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  223. new_lower_right = [lower_right[0] - left, lower_right[1] - top]
  224. #do nothing. it's all in here
  225. #do clip to get the others
  226. coord_output.append( [new_upper_left, new_upper_right, new_lower_left, new_lower_right] )
  227. #return final coord
  228.  
  229.  
  230. elif len(corners_inside) == 3:
  231. print("WEIRD CASE!")
  232. print("\n\nATTEMPTING ADVANCED CLIPPING")
  233.  
  234.  
  235. #new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  236. self_coord = lower_left
  237. self_x = self_coord[0]
  238. self_y = self_coord[1]
  239. output_scaled = []
  240. draw = ImageDraw.Draw(cropped_image)
  241. color_choice = ['pink', 'purple', 'white', 'blue']
  242. print("Labeled coords:", labeled_coords)
  243. for elem in labeled_coords:
  244. x = elem[0]
  245. y = elem[1]
  246. print("choice:", elem)
  247. el_x = np.clip(elem[0], left, right)
  248. el_y = np.clip(elem[1], top, bottom)
  249. print("el_x", el_x)
  250. print("el_y", el_y)
  251.  
  252. new_elem = [el_x - left, el_y - top]
  253.  
  254. output_scaled.append(new_elem)
  255.  
  256. draw.ellipse((new_elem[0]-4,new_elem[1]-4,new_elem[0]+4,new_elem[1]+4), fill=color_choice[output_scaled.index(new_elem)])
  257.  
  258.  
  259.  
  260. draw.rectangle((output_scaled[0][0]-1,output_scaled[0][1]-1,output_scaled[3][0]-1,output_scaled[3][1]-1), outline=tuple(np.random.choice(range(256), size=3)))
  261. output_coord = ([output_scaled[0],output_scaled[1],output_scaled[2],output_scaled[3]])
  262.  
  263. #generate area
  264. ul = output_coord[0]
  265. ur = output_coord[1]
  266. ll = output_coord[2]
  267. width = ur[0] - ul[0]
  268. height = ll[1] - ul[1]
  269. area = width * height
  270.  
  271.  
  272.  
  273. print("OUTPUT")
  274. print("original box:", coord)
  275. print("scaled (unsorted):", output_scaled)
  276.  
  277.  
  278. if area != 0:
  279. #do nothing
  280. cropped_image.show()
  281. coord_output.append(output_coord)
  282. #raise ValueError("Emptiness case!")
  283. else:
  284. print("area is zero! moving on.")
  285.  
  286.  
  287.  
  288. elif len(corners_inside) == 0:
  289. print("\n\nATTEMPTING ADVANCED CLIPPING")
  290.  
  291.  
  292. #new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  293.  
  294. self_coord = lower_left
  295. self_x = self_coord[0]
  296. self_y = self_coord[1]
  297. output_scaled = []
  298. draw = ImageDraw.Draw(cropped_image)
  299. color_choice = ['pink', 'purple', 'white', 'blue']
  300. print("Labeled coords:", labeled_coords)
  301. for elem in labeled_coords:
  302. x = elem[0]
  303. y = elem[1]
  304. print("choice:", elem)
  305. el_x = np.clip(elem[0], left, right)
  306. el_y = np.clip(elem[1], top, bottom)
  307. print("el_x", el_x)
  308. print("el_y", el_y)
  309.  
  310. new_elem = [el_x - left, el_y - top]
  311.  
  312. output_scaled.append(new_elem)
  313.  
  314. draw.ellipse((new_elem[0]-4,new_elem[1]-4,new_elem[0]+4,new_elem[1]+4), fill=color_choice[output_scaled.index(new_elem)])
  315.  
  316.  
  317.  
  318. draw.rectangle((output_scaled[0][0]-1,output_scaled[0][1]-1,output_scaled[3][0]-1,output_scaled[3][1]-1), outline=tuple(np.random.choice(range(256), size=3)))
  319. output_coord = ([output_scaled[0],output_scaled[1],output_scaled[2],output_scaled[3]])
  320.  
  321. #generate area
  322. ul = output_coord[0]
  323. ur = output_coord[1]
  324. ll = output_coord[2]
  325. width = ur[0] - ul[0]
  326. height = ll[1] - ul[1]
  327. area = width * height
  328.  
  329.  
  330.  
  331. print("OUTPUT")
  332. print("original box:", coord)
  333. print("scaled (unsorted):", output_scaled)
  334.  
  335.  
  336. if area != 0:
  337. #do nothing
  338. cropped_image.show()
  339. coord_output.append(output_coord)
  340. #raise ValueError("Emptiness case!")
  341. else:
  342. print("area is zero! moving on.")
  343.  
  344. elif len(corners_inside) == 1:
  345. print("\n\nATTEMPTING ADVANCED CLIPPING")
  346.  
  347.  
  348. #new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  349.  
  350. self_coord = lower_left
  351. self_x = self_coord[0]
  352. self_y = self_coord[1]
  353. output_scaled = []
  354. draw = ImageDraw.Draw(cropped_image)
  355. color_choice = ['pink', 'purple', 'white', 'blue']
  356. print("Labeled coords:", labeled_coords)
  357. for elem in labeled_coords:
  358. x = elem[0]
  359. y = elem[1]
  360. print("choice:", elem)
  361. el_x = np.clip(elem[0], left, right)
  362. el_y = np.clip(elem[1], top, bottom)
  363. print("el_x", el_x)
  364. print("el_y", el_y)
  365.  
  366. new_elem = [el_x - left, el_y - top]
  367.  
  368. output_scaled.append(new_elem)
  369.  
  370. draw.ellipse((new_elem[0]-4,new_elem[1]-4,new_elem[0]+4,new_elem[1]+4), fill=color_choice[output_scaled.index(new_elem)])
  371.  
  372.  
  373.  
  374. draw.rectangle((output_scaled[0][0]-1,output_scaled[0][1]-1,output_scaled[3][0]-1,output_scaled[3][1]-1), outline=tuple(np.random.choice(range(256), size=3)))
  375. output_coord = ([output_scaled[0],output_scaled[1],output_scaled[2],output_scaled[3]])
  376. print("OUTPUT")
  377. print("original box:", coord)
  378. print("scaled (unsorted):", output_scaled)
  379. cropped_image.show()
  380.  
  381. coord_output.append(output_coord)
  382. #raise ValueError("One corner only case!")
  383.  
  384. elif corner_in(patch_boundary, upper_right) and corner_in(patch_boundary, lower_right):
  385. #case 4 - perform clip
  386. print("\n\nATTEMPTING CLIPPING")
  387. new_upper_right = [upper_right[0] - left, upper_right[1] - top]
  388. new_lower_right = [lower_right[0] - left, lower_right[1] - top]
  389.  
  390.  
  391. print(new_upper_right)
  392. print(new_lower_right)
  393. #draw circles where it's happening
  394. draw = ImageDraw.Draw(cropped_image)
  395.  
  396. draw.ellipse((new_upper_right[0]-4,new_upper_right[1]-4,new_upper_right[0]+4,new_upper_right[1]+4), fill='white') #UPPER LEFT
  397. draw.ellipse((new_lower_right[0]-4,new_lower_right[1]-4,new_lower_right[0]+4,new_lower_right[1]+4), fill='white') #UPPER RIGHT
  398.  
  399. #draw.ellipse(new_upper_left)
  400. #print("BOTTOM", bottom)
  401. #print("TOP", top)
  402. #print("original ll_y:", lower_left[1])
  403. new_ul_x = np.clip(upper_left[0], left, right) #will need to change
  404. print("new_ur_x", new_ul_x)
  405. new_upper_left = [new_ul_x,upper_left[1]]
  406.  
  407. new_ll_x = np.clip(lower_left[0], left, right) #will need to change
  408. print("new_ll_x", new_ll_x)
  409. new_lower_left = [new_ll_x,lower_left[1]]
  410.  
  411. new_upper_left = [new_upper_left[0] - left, upper_left[1] - top] #not working!!!
  412. new_lower_left = [new_lower_left[0] - left, lower_left[1] - top]
  413.  
  414. #draw X over new things
  415. #draw.text(tuple(new_lower_left), "X", fill="white")
  416. #draw.text(tuple(new_lower_right), "X", fill="white")
  417. draw.ellipse((new_upper_left[0]-4,new_upper_left[1]-4,new_upper_left[0]+4,new_upper_left[1]+4), fill='red') #CLIPPED OFF UPPER RIGHT
  418. draw.ellipse((new_lower_left[0]-4,new_lower_left[1]-4,new_lower_left[0]+4,new_lower_left[1]+4), fill='blue') #CLIPPED OFF LOWER RIGHT
  419. print("OUTPUT")
  420. print("original box:", coord)
  421. print("clipped box:", (new_upper_left, new_upper_right, new_lower_left, new_lower_right))
  422. draw.rectangle((new_upper_left[0],new_upper_left[1],new_lower_right[0],new_lower_right[1]-2), outline=tuple(np.random.choice(range(256), size=3)))
  423. cropped_image.show()
  424.  
  425. coord_output.append( [new_upper_left, new_upper_right, new_lower_left, new_lower_right] )
  426. #if frame_name ==
  427. print("UR and LR case!")
  428.  
  429. elif corner_in(patch_boundary, lower_left) and corner_in(patch_boundary, lower_right):
  430. #case 4 - perform clip
  431. print("\n\nATTEMPTING CLIPPING")
  432. new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  433. new_lower_right= [lower_right[0] - left, lower_right[1] - top]
  434.  
  435.  
  436. print(new_lower_left)
  437. print(new_lower_right)
  438. #draw circles where it's happening
  439. draw = ImageDraw.Draw(cropped_image)
  440. draw.ellipse((new_lower_left[0]-4,new_lower_left[1]-4,new_lower_left[0]+4,new_lower_left[1]+4), fill='purple') #UPPER LEFT
  441. draw.ellipse((new_lower_right[0]-4,new_lower_right[1]-4,new_lower_right[0]+4,new_lower_right[1]+4), fill='pink') #UPPER RIGHT
  442.  
  443. #draw.ellipse(new_upper_left)
  444. #print("BOTTOM", bottom)
  445. #print("TOP", top)
  446. #print("original ll_y:", lower_left[1])
  447. new_ul_y = np.clip(upper_left[1], top, bottom)
  448. print("new_ul_y", new_ul_y)
  449. new_upper_left = [upper_left[0],new_ul_y]
  450.  
  451. new_ur_y = np.clip(upper_right[1], top, bottom) #remember that top < bottom
  452. print("new_ur_y", new_ur_y)
  453. new_upper_right = [upper_right[0], new_ur_y]
  454.  
  455. print("top:", top)
  456. print("bottom:", bottom)
  457. new_upper_left = [upper_left[0] - left, new_upper_left[1] - top] #not working!!!
  458. new_upper_right = [upper_right[0] - left, new_upper_right[1] - top]
  459.  
  460. #draw X over new things
  461. #draw.text(tuple(new_lower_left), "X", fill="white")
  462. #draw.text(tuple(new_lower_right), "X", fill="white")
  463. draw.ellipse((new_upper_left[0]-4,new_upper_left[1]-4,new_upper_left[0]+4,new_upper_left[1]+4), fill='blue') #CLIPPED OFF LOWER LEFT
  464. draw.ellipse((new_upper_right[0]-4,new_upper_right[1]-4,new_upper_right[0]+4,new_upper_right[1]+4), fill='blue') #CLIPPED OFF LOWER RIGHT
  465. draw.rectangle((new_upper_left[0],new_upper_left[1],new_lower_right[0],new_lower_right[1]-2), outline=tuple(np.random.choice(range(256), size=3)))
  466. print("OUTPUT")
  467. print("original box:", coord)
  468. print("clipped box:", (new_upper_left, new_upper_right, new_lower_left, new_lower_right))
  469. #cropped_image.show()
  470.  
  471. coord_output.append( [new_upper_left, new_upper_right, new_lower_left, new_lower_right] )
  472. print("LL and LR case!")
  473. #raise ValueError
  474.  
  475. elif corner_in(patch_boundary, upper_left) and corner_in(patch_boundary, upper_right):
  476. #case 4 - perform clip
  477. print("\n\nATTEMPTING CLIPPING")
  478. new_upper_left = [upper_left[0] - left, upper_left[1] - top]
  479. new_upper_right= [upper_right[0] - left, upper_right[1] - top]
  480.  
  481.  
  482. print(new_upper_left)
  483. print(new_upper_right)
  484. #draw circles where it's happening
  485. draw = ImageDraw.Draw(cropped_image)
  486. draw.ellipse((new_upper_left[0]-4,new_upper_left[1]-4,new_upper_left[0]+4,new_upper_left[1]+4), fill='purple') #UPPER LEFT
  487. draw.ellipse((new_upper_right[0]-4,new_upper_right[1]-4,new_upper_right[0]+4,new_upper_right[1]+4), fill='pink') #UPPER RIGHT
  488.  
  489. #draw.ellipse(new_upper_left)
  490. #print("BOTTOM", bottom)
  491. #print("TOP", top)
  492. #print("original ll_y:", lower_left[1])
  493. new_ll_y = np.clip(lower_left[1], 0, bottom)
  494. #print("new_ll_y", new_ll_y)
  495. new_lower_left = [lower_left[0],new_ll_y]
  496.  
  497. new_lr_y = np.clip(lower_right[1], 0, bottom)
  498. #print("new_lr_y", new_lr_y)
  499. new_lower_right = [lower_right[0], new_lr_y]
  500.  
  501. new_lower_left = [lower_left[0] - left, new_lower_left[1] - top] #not working!!!
  502. new_lower_right = [lower_right[0] - left, new_lower_right[1] - top]
  503.  
  504. #draw X over new things
  505. #draw.text(tuple(new_lower_left), "X", fill="white")
  506. #draw.text(tuple(new_lower_right), "X", fill="white")
  507. draw.ellipse((new_lower_left[0]-4,new_lower_left[1]-4,new_lower_left[0]+4,new_lower_left[1]+4), fill='blue') #CLIPPED OFF LOWER LEFT
  508. draw.ellipse((new_lower_right[0]-4,new_lower_right[1]-4,new_lower_right[0]+4,new_lower_right[1]+4), fill='blue') #CLIPPED OFF LOWER RIGHT
  509. draw.rectangle((new_upper_left[0],new_upper_left[1],new_lower_right[0],new_lower_right[1]-2), outline=tuple(np.random.choice(range(256), size=3)))
  510. #cropped_image.show()
  511.  
  512. coord_output.append( [new_upper_left, new_upper_right, new_lower_left, new_lower_right] )
  513. print("UL and UR case!")
  514.  
  515. elif corner_in(patch_boundary, upper_left) and corner_in(patch_boundary, lower_left):
  516. #case 4 - perform clip
  517. print("\n\nATTEMPTING CLIPPING")
  518. new_upper_left = [upper_left[0] - left, upper_left[1] - top]
  519. new_lower_left = [lower_left[0] - left, lower_left[1] - top]
  520.  
  521.  
  522. print(new_upper_left)
  523. print(new_lower_left)
  524. #draw circles where it's happening
  525. draw = ImageDraw.Draw(cropped_image)
  526. draw.ellipse((new_upper_left[0]-4,new_upper_left[1]-4,new_upper_left[0]+4,new_upper_left[1]+4), fill='purple') #UPPER LEFT
  527. draw.ellipse((new_lower_left[0]-4,new_lower_left[1]-4,new_lower_left[0]+4,new_lower_left[1]+4), fill='pink') #UPPER RIGHT
  528.  
  529. #draw.ellipse(new_upper_left)
  530. #print("BOTTOM", bottom)
  531. #print("TOP", top)
  532. #print("original ll_y:", lower_left[1])
  533. new_ur_x = np.clip(upper_right[0], 0, right)
  534. print("new_ur_x", new_ur_x)
  535. new_upper_right = [new_ur_x,upper_right[1]]
  536.  
  537. new_lr_x = np.clip(lower_right[0], 0, right)
  538. print("new_lr_x", new_lr_x)
  539. new_lower_right = [new_lr_x,lower_right[1]]
  540.  
  541. new_upper_right = [new_upper_right[0] - left, upper_right[1] - top] #not working!!!
  542. new_lower_right = [new_lower_right[0] - left, lower_right[1] - top]
  543.  
  544. #draw X over new things
  545. #draw.text(tuple(new_lower_left), "X", fill="white")
  546. #draw.text(tuple(new_lower_right), "X", fill="white")
  547. draw.ellipse((new_upper_right[0]-4,new_upper_right[1]-4,new_upper_right[0]+4,new_upper_right[1]+4), fill='red') #CLIPPED OFF UPPER RIGHT
  548. draw.ellipse((new_lower_right[0]-4,new_lower_right[1]-4,new_lower_right[0]+4,new_lower_right[1]+4), fill='blue') #CLIPPED OFF LOWER RIGHT
  549. print("OUTPUT")
  550. print("original box:", coord)
  551. print("clipped box:", (new_upper_left, new_upper_right, new_lower_left, new_lower_right))
  552. draw.rectangle((new_upper_left[0],new_upper_left[1],new_lower_right[0],new_lower_right[1]-2), outline=tuple(np.random.choice(range(256), size=3)))
  553. #cropped_image.show()
  554.  
  555. coord_output.append( [new_upper_left, new_upper_right, new_lower_left, new_lower_right] )
  556. #if frame_name ==
  557. #raise ValueError("UL and LL case!")
  558.  
  559. if coord_output == []:
  560. return [[[0,0],[0,0],[0,0],[0,0]]]
  561. else:
  562. return coord_output
  563.  
  564.  
  565.  
  566. def corner_in(patch_boundary, corner):
  567. left, bottom, right, top = patch_boundary[0], patch_boundary[1], patch_boundary[2], patch_boundary[3]
  568.  
  569. print("\n")
  570. print("CORNER:", corner)
  571. print("left", left)
  572. print(corner[0])
  573. print("right", right)
  574.  
  575. print("bottom", bottom)
  576. print(corner[1])
  577. print("top", top)
  578. print("\n")
  579.  
  580. return (left <= corner[0] <= right) and (bottom >= corner[1] >= top) #ordering here might be off. fix it
  581.  
  582.  
  583. def generate_dataset(images_path,csv_path,height,width,scale,image_output_path, csv_output_path):
  584. print("Generating images from " + str(images_path) + " at " + str(width) + "x" + str(height))
  585. read_csv(csv_path,scale)
  586. images = []
  587. images = load_images(images_path, scale)
  588.  
  589.  
  590. patch_dict = {}
  591. print("Iterating through " + str(len(images)) + " images...")
  592. time.sleep(1)
  593. for image in images: #large process - go through each image, create patches, generate new bounding boxes, post to csv
  594. print("Analyzing image " + str(image))
  595. patches = []
  596. name = image[0]
  597. patches += crop(image[1],image[0],height,width) #generates rectangles & crops - anything else?
  598. print("are there any patcches???")
  599. print("PATCHES!", patches)
  600. for patch in patches:
  601. #check if in bounds given boundaryy
  602. boundary = patch[2]
  603. cropped_image = patch[1]
  604. cropped_name = patch[0]
  605.  
  606. #output files into folder
  607. print("saving image...")
  608. print(image_output_path+cropped_name)
  609. cropped_image.save(image_output_path+"/"+cropped_name + ".jpg")
  610. print("saved!")
  611. #for box in frame_dict[name]:
  612. print(image)
  613. print(name)
  614. box_list = frame_dict[name]
  615. print("GETTING NEW COORDS")
  616. new_coords = check_if_in(cropped_image, boundary, cropped_name, box_list) #return new coords
  617. print(new_coords)
  618. if cropped_name not in patch_dict:
  619. patch_dict[cropped_name] = []
  620. if new_coords is not None:
  621. patch_dict[cropped_name] += new_coords
  622. if new_coords is None:
  623. continue
  624. #convert coords BACK TO (X,Y,H,W)
  625. #convert_back([new_coords]) #takes in list of coords
  626. #add to csv
  627. #patch_dict[cropped_name] = new_coords
  628.  
  629.  
  630. #convert patch_dict back into original supplied coordinate
  631. print("done:", patch_dict)
  632. for key in patch_dict:
  633. print("ABOUT TO CONVERT")
  634. print("\n", patch_dict[key])
  635. converted_list = convert_back(patch_dict[key])
  636. print("CONVERTED LIST")
  637. print(converted_list)
  638. patch_dict[key] = converted_list
  639. #patch_dict[key] = convert_back([patch_dict[key]])
  640. #print("done:", patch_dict)
  641.  
  642. print("\nGenerated dict of all coords!")
  643. print(patch_dict)
  644. print("\n")
  645. print("Generating CSV....\n\n")
  646. gen_csv(csv_output_path, patch_dict)
  647. print("DONE!")
  648.  
  649.  
  650.  
  651. def gen_csv(path, patch_dict):
  652. with open(path, 'w') as csvfile:
  653. print("Creating CSV")
  654. filewriter = csv.writer(csvfile, delimiter=',', quoting=csv.QUOTE_NONNUMERIC)
  655. filewriter.writerow(["Name", "URL", "X0 Y0 H0 W0"])
  656. print(patch_dict)
  657. for key in patch_dict:
  658. print(key)
  659. print([key, None] + [value for value in patch_dict[key]])
  660. filewriter.writerow([key, None] + [value for value in patch_dict[key]])
  661.  
  662. print("finished making CSV!")
  663.  
  664.  
  665.  
  666. #instantiate and configure parser
  667. parser = OptionParser()
  668.  
  669. parser.add_option("-images_path", ')
  670.  
  671. if __name__ == "__main__":
  672.  
  673.  
  674.  
  675. images_path = "C:/Users/Luke/Documents/mitdriverless/testbed/*.jpg"
  676. csv_path = "C:/Users/Luke/Documents/mitdriverless/data-labels_hive-ai-round-2.csv"
  677. output_path = "C:/Users/Luke/Documents/mitdriverless/testbed_output/"
  678. csv_output = "C:/Users/Luke/Documents/mitdriverless/hive-ai-round-2_scaled.csv"
  679.  
  680. generate_dataset(images_path, csv_path,256,800,1,output_path, csv_output)
  681.  
  682. #read_csv("C:/Users/Luke/Documents/mitdriverless/data-labels_hive-ai-round-2.csv")
  683. #images = load_images("C:/Users/Luke/Documents/mitdriverless/testbed/*.jpg")
  684. #print("csv read")
  685. #draw_rect(images[0], "vid_36_frame_117.jpg")
  686. #print(images[0])
  687. #images[0].show()
  688. #print(images)
  689. #crop(images[0][1],images[0][0],200,800,1)
  690. #print(frame_dict)
  691. #test_case()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement