Happy New Year! Hang on, it’s February…
Time seems to have got away on me since I started this holiday project that
turned out to be more complex than I had initially expected. What was
originally going to be a simple photo resizer tool for Active Directory,
Exchange and Lync/Skype for Business, turned into more of a complete photo
editor including face recognition based cropping, image filtering and
processing, written entirely in custom Powershell code… What can I say, sometimes
I can’t help myself…
So let’s begin by discussing the problem: Lync
and Skype for Business clients are used for communicating, and the best
experience for this is when you are able to easily see the people that you’re
communicating with. So within the Lync and Skype for Business client UI there
are many places where photos of users are shown. This is great because it makes
the software much more personal and approachable to users... and
ever since Bill Gates' mug shot silhouette was replaced as being the default missing photo image from Lync 2010 (yes, is
really was, see below!) to the generic Lync 2013 oval head silhouette, a
photoless client tends to look a bit boring.
Image Reference |
So for the best user experience we really
should be using profile photos for users in Lync and Skype for Business… but what does
that mean for us Lync Administrators? Well, usually it means that you are going
to get given thousands of random image files, in god knows what format, and at who
knows what quality, that you will be expected to magic into the system and have
displayed for all to see. So let us put our magicians' hats on and I will help
you with Part 1 of this trick… Turning a mess of image files into something that
will work when imported into Active Directory and/or Exchange for display within
Lync or Skype for Business…
Lync / Skype for Business Photo Editor
You will know by now, if you’ve ever read my
blog, that a custom written Powershell tool will always provide the solution
to our problems! I give you the Lync / Skype for Business Photo Editor Tool!
Features:
- Zero installation.
- Signed Powershell Script.
- Bulk conversion of a folder full of images files.
- Custom coded image processing!
- Manual editing and cropping of individual files. Simply Drag and Drop an image into the Picture Box area and then start selecting the crop box size and position you would like your output files to be based on. Set filter options and preview their effects on the image using the “Preview Filter” button. The size of the image crop box is shown under the scaling tools to allow you to know if you are cropping to a size smaller than image you are wanting to output (to avoid accidently upwards rescaling of the images).
- Accepts input files in the following formats: ".jpg", ".jpeg", ".gif", ".png", ".bmp" and ".tif”. All files get converted to “.jpg” format so they can be easily imported into Exchange/AD.
- Smart Crop / Centre Crop modes – By ticking this box (default) my Smart Cropping algorithm will be used to discover the subject's face and crop appropriately. The Margin setting is used in conjunction with Smart Crop to determine how loose or tight the framing will be around the subject. If unticked, a simple Centre Crop Method will be used. See the Smart Crop section for more details.
- Filters! Since Instagram became such a big hit, filters have become a must-have for all successful software projects. So why should this one be any different? Photo filters include: Colourise (Blue, Red, Green, Yellow, Orange, Pink, Purple), Contrast (Reduce Contrast, Light Contrast Boost, Medium Contrast Boost, Mega Contrast Boost, Ultra Contrast Boost), Brightness (Reduce Brightness, Light Brightness Boost, Medium Brightness Boost, Mega Brightness Boost, Ultra Contrast Boost), Effects (Old Film, Vignette, Light Leak, Vintage, and Slide Show).
- Output sizes. By default the tool will output 96x96 and 648x648 sized photos. These can be turned on or off using the checkboxes in the “Image Output Settings” area of the GUI. There is also the option to create custom sized photos by ticking the custom checkbox and selecting the pixel width/height of the photos to be outputted. It is generally recommended that 96x96 files are used for uploading to Active Directory and the 648 x 648 images are uploaded to Exchange 2013.
- Quality Control – The quality of the jpg images that the tool will output can be changed by reducing the Quality setting between 1-100. I suggest that you never actually reduce this in the process of creating the files that you are importing via Exchange, as the quality will be further reduced by Exchange as part of the import process.
Requirements:
- The script is supported on Powershell Version 3.0 and above. So if you're running Windows 7 you will need to make sure you've upgraded your Powershell version to at least Version 3.0.
- Drag and Drop only works when the filesystem and Powershell session have the same security level. So if you're running Powershell with Administrator privledges (ie. Run as Administrator) the Drag and Drop function will not work. To fix this just run the Powershell with regular privileges and it should be okay.
1.01 Update (23/4/2015):
- Added policing of the folder name to accept ending with a "\" or ending without a "\".
- Changed the output file name to use space (" ") instead of a minus ("-") character between the name and the image size ("648x648") to work with new Photo Importer Tool.
Features - Smart Crop
One of the main problems with Exchange / AD
/ Lync images are that they must be square in shape, and digital cameras don’t
usually take square photos (they are usually taken in a 4:3 or 3:2 ratio). So as a result, after taking a photo it inevitably
must be cropped before it can be used by Exchange or Active Directory as a Lync
/ Skype for Business photo. The way that Exchange handles this is to do (what I
call) a Centre Crop on the image. This is where you crop to a square that is
the width and height of the short side of the photo and then centre the square
in the middle of the long edge of the photo (see the Centre Crop example image
below). This works well when the image has been composed with the subject's face
right in the centre of the frame. However, what if the person taking the photo
decided to also include a large portion of the subject’s body in the frame? Or
it’s one of the user’s favourite photos of them at the beach with the majority
of frame consisting of landscape? Or what if, god forbid, the photographer decided to
use their arts degree and frame the subject using the Golden Ratio or the Rule of Thirds…
In these cases you can end up with a weird looking image if Centre Cropping is
used.
Centre Crop Example |
I realised all of this after starting this
project and tried to think of a better way… like, what if I was to detect where
the subject's face was within the image and then crop around it? That sounds
like fun! So I started reading about facial recognition techniques and
software. What I learnt was that there is no existing core Dot Net libraries
that I could leverage in Powershell that would supply me with facial
recognition. So I looked more broadly and discovered that there are a couple of open
source projects that had Dot Net ports and could be used if imported and
compiled into a Dot Net application… but I wanted this to be a pure
Powershell implementation and not some bulky application! So I then dug deeper
and started reading academic papers about different face and skin recognition
methods that exist. After doing much prototyping and testing with these skin
recognition concepts, I created my own skin thresholding algorithm in Powershell
that was quite fast (something learned whilst doing this was that Powershell is
slow at doing many mathematical operations, and especially slow when it comes
to recasting variable types and object creation).
The end result of this absurd amount of
work was an unassuming checkbox in the Bulk Import section of the tool’s GUI
called “Smart Crop”. Smart Crop is used in two places in the tool, the first is
when Bulk converting images from a folder. The tool will try and locate using
my skin recognition algorithm where the majority of skin is on the screen and
then try to appropriately frame the around this location. The (3:2 ratio) photo
below shows an example of what a better alignment for a centre cropped image
would look like as a result of recognising where the face is in the image.
Face Aligned Centre Crop |
As you can see in the above photo, the
image gets cropped around the more important part of image rather than the
centre of the image as seen in the earlier Centre Crop example.
So it’s pretty useful to be able to align a
full width crop around the subject's face like this, however, Lync photos end up
being reduced to very small sizes in most cases (96 x 96 pixels). So it would
also be nice to be able to crop even tighter to the subject's face so that you
can see it more clearly in your contacts list in Lync / Skype for
Business. Below is an example of a better crop to use in Lync:
Ideal Smart Crop for Lync |
In order make the photo more usable with
Lync/Skype for Business, I have tried to tune the algorithm to give a tight
crop around the face of the subject in the photo. A pitfall of doing a tight
crop like this, however, is that the cropping square should not be less than
the size of the image that is being outputted (ie. the crop square being 200 x
200 in size and the output size being 648 x 648 in size). If this happens then
the quality of the output photo will be significantly reduced due to the image
being blown up. For this reason you should always try and use source images that
are quite a bit larger than the largest size image you are trying to output. The
tool has been designed to understand this issue and will always attempt to crop
to at least the size of the output image file. This in some cases will result
in a looser crop that you might expect around the subject's face, however, it is
designed to maintain the quality of the output file.
The “Margin” setting in the tool can also
be used to tighten or loosen the Smart Crop frame around the subject's face.
This setting ranges between 1-50, with a default of 25. The lower the value,
the tighter the crop will be around the subject.
From the testing I've done so far I have found my Smart Crop detection algorithm works in the majority of cases (note: it does not work on greyscale images). However, it can have problems if there are background components in the image that fall into the same Luma and Chroma ranges as skin does. In these cases you can manually crop the individual files that were not detected accurately. In the end though I hope it saves you a bunch of time and effort!
From the testing I've done so far I have found my Smart Crop detection algorithm works in the majority of cases (note: it does not work on greyscale images). However, it can have problems if there are background components in the image that fall into the same Luma and Chroma ranges as skin does. In these cases you can manually crop the individual files that were not detected accurately. In the end though I hope it saves you a bunch of time and effort!
Features - Filters
Photo filters are all the rage at the
moment with every social media app in the world jumping on the bandwagon. However,
the idea of filters in this application is not just a gimmick: it offers you
the ability to do colour, brightness, and contrast correction to photos in
order to give them more pop so they look their best when displayed in
Lync/Skype for Business. When you are supplied photos by an organisation, it’s
fairly likely that they were taken in a room somewhere with bad or at least
uninspired lighting. As a result, all of the images can look washed out and
flat.
Below is an example of a washed out image
of a technology company CEO you may recognise. As you may be able to see, the
photo on the left does not look very vibrant and comes across as quite bland (especially
when reduced to 96 x 96 pixels in size). However, after applying a contrast and
brightness boost filter to the image (as can be seen in the picture on the
right) it looks much more dynamic.
The Lync / Skype for Business Photo Editor
Tool gives you the option to Colourise, Contrast Reduce/Boost, and Brightness Reduce/Boost
with various levels of intensity, and these settings can be chained to give you
175 different combinations to use!
In addition to the more subtle image
quality and dynamics filtering capabilities I decided that I too couldn’t
resist the challenge of implementing some grungy Instagram style filters. So if
you have been using Instagram too much and feel the need to make your images
look a little more vintage, try the Effects filters drop down box. Here’s some
examples of my custom effects filters:
Will these filters ever be used for a Lync
or Skype for Business deployment? Maybe not, but I had fun figuring out how to
write the image processing code to generate them J
The Wrap Up
Well there you have it: my holiday project
has finally made to a public release. You may have also noticed that this post
is only Part 1 of a series. Indeed it is! Because now that you have a tool to
easily create image files for Exchange and Active Directory, you will likely
also need a tool for easily uploading those files to these systems. So Part 2
of this series will supply you with just such a tool… So keep an eye out for that one. Cheers, and enjoy!